您的位置:首页 > 快讯 > 资讯 >

天天速递!使用Python怎样按指定算法判断买卖点计算股票收益?

来源: 科技时刻远 时间: 2022-08-27 21:44:24

炒股票的小伙伴们一般都有一个神奇的愿景,总认为按照自己的方法选择股票的买卖点,就一定能赚钱,今天小编用程序模拟了一把买卖点和收益的实测,结果显示,但无论使用什么买卖点判断方法,总是有些股票赚钱,有些股票赔钱。比如按20日线的价格作为买卖点、10日线、5日线,以及3日线,交易量递增法、交易量递减法等等。


【资料图】

法判断买卖点计算股票收益

如下为一种买卖点的判断示例,以及验证在某时间段内使用该方法的收益:

# Author Zhanhai

import tushare as ts

import datetime as dt

import json

import os

import time

class StockAnylize():

def __init__(self, stock_code):

self.stock_code = stock_code

def _get_today(self):

today = dt.datetime.today()

return str(today.strftime("%Y-%m-%d"))

def get_start_from_end(self, endday, day_duration):

edate = dt.datetime.strptime(endday, "%Y-%m-%d")

delta = dt.timedelta(days = day_duration)

sdate = edate - delta

return str(sdate.strftime("%Y-%m-%d"))

def get_suggests(self, date_day):

return "keep"

def down_load_data(self, date_day_start, date_day_end):

date_day_start = self.get_start_from_end(date_day_start, 20)

stock_data = ts.get_hist_data(self.stock_code, start = date_day_start, end = date_day_end)

if not stock_data is None:

stock_data.to_json("d:\\stock/single_data/" + self.stock_code + ".json", orient = "index", force_ascii = False)

def get_date_day_start(self, date_day_start, stock_info):

if date_day_start in stock_info:

return date_day_start

else:

for i in range(1, 8):

early_day = self.get_start_from_end(date_day_start, - i)

if early_day in stock_info:

return early_day

return None

def get_days_duration_from_start_to_end(self, date_day_start, date_day_end):

if date_day_start is None:

return 0

if date_day_end is None:

return 0

date1 = time.strptime(date_day_start, "%Y-%m-%d")

date2 = time.strptime(date_day_end, "%Y-%m-%d")

date1 = dt.datetime(date1[0],date1[1],date1[2])

date2 = dt.datetime(date2[0],date2[1],date2[2])

duration = date2 - date1

return duration.days

def get_early_day(self, cur_day, stock_info):

for i in range(1, 20):

early_day = self.get_start_from_end(cur_day, i)

if early_day in stock_info:

break

if not early_day in stock_info:

return None

return early_day

def get_next_day(self, cur_day, stock_info):

for i in range(1, 20):

early_day = self.get_start_from_end(cur_day, -i)

if early_day in stock_info:

break

if not early_day in stock_info:

return None

return early_day

def is_day_can_buy(self, judge_day, stock_info):

if self.is_day_can_sale(judge_day, stock_info):

return False

cur_close_price = stock_info[judge_day].get("close")

cur_open_price = stock_info[judge_day].get("open")

ma_5_price = stock_info[judge_day].get("ma5")

if cur_close_price > cur_open_price:

if ((cur_close_price + cur_open_price) / 2) > ma_5_price:

return True

else:

return False

return False

def get_price(self, day, stock_info):

open_price = stock_info[day].get("open")

close_price = stock_info[day].get("close")

if open_price > close_price:

return (close_price + open_price) / 2

else:

return close_price

def is_day_can_sale(self, judge_day, stock_info):

if judge_day == "2019-09-17":

print(stock_info[judge_day])

cur_price = self.get_price(judge_day, stock_info)

ma5_price = stock_info[judge_day].get("ma20")

#print("cur_price", cur_price, " ma5_price", ma5_price)

if cur_price < ma5_price:

return True

return False

def get_buy_date(self, date_day_start, date_day_end, stock_info):

date_day_start = self.get_date_day_start(date_day_start, stock_info)

duration = self.get_days_duration_from_start_to_end(date_day_start, date_day_end)

if duration < 3:

return None

for i in range(duration):

# 卖了不要马上买,至少要晚3天后再买

judge_day = self.get_start_from_end(date_day_start, -i - 3)

if not judge_day in stock_info:

continue

if self.is_day_can_buy(judge_day, stock_info):

return judge_day

return None

def get_sale_date(self, buy_date, date_day_end, stock_info):

date_day_start = self.get_date_day_start(buy_date, stock_info)

duration = self.get_days_duration_from_start_to_end(date_day_start, date_day_end)

for i in range(duration):

# -2的原因是买了不能马上卖,必须至少隔一天

judge_day = self.get_start_from_end(date_day_start, -2 - i)

if not judge_day in stock_info:

continue

if self.is_day_can_sale(judge_day, stock_info):

return judge_day

return None

def get_duration_income(self, buy_date, sale_date, stock_info):

buy_action_day = self.get_next_day(buy_date, stock_info)

sale_action_day = self.get_next_day(sale_date, stock_info)

if sale_action_day is None:

sale_action_day = sale_date

buy_price = stock_info[buy_action_day].get("open")

sale_price = stock_info[sale_action_day].get("open")

print("buy_action_day:", buy_action_day, " sale_action_day:", sale_action_day, " buy_price", buy_price, " sale_price", sale_price)

return sale_price - buy_price

def get_detail_transaction_data(self, detail_transaction_data, date_day_start, date_day_end, stock_info):

buy_date = self.get_buy_date(date_day_start, date_day_end, stock_info)

if not buy_date is None:

sale_date = self.get_sale_date(buy_date, date_day_end, stock_info)

if not sale_date is None:

income = self.get_duration_income(buy_date, sale_date, stock_info)

detail_transaction_data[buy_date] = {"buy_date_flag":buy_date, "sale_date_flag":sale_date, "income":income}

self.get_detail_transaction_data(detail_transaction_data, self.get_start_from_end(sale_date, -1), date_day_end, stock_info)

def get_income(self, detail_transaction_data):

total_income = 0

for (k, v) in detail_transaction_data.items():

total_income = total_income + v.get("income")

return total_income

def caculate_income(self, date_day_start, date_day_end):

self.down_load_data(date_day_start, date_day_end)

detail_transaction_data = {}

stock_file_name = stock_base_folder + "/single_data/" + self.stock_code + ".json"

stock_info = json.load(open(stock_file_name))

self.get_detail_transaction_data(detail_transaction_data, date_day_start, date_day_end, stock_info)

income = self.get_income(detail_transaction_data)

return income

if __name__ == "__main__":

stock_base_folder = "D:\\stock"

stock_list_file_name = stock_base_folder + "/stock_list.json"

print(StockAnylize("600249").caculate_income("2022-05-06", "2022-08-26"))

责任编辑:

标签: 股票收益 self return 经验教程