Tushare金融数据包实战SEPA选股策略
Posted 302????
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tushare金融数据包实战SEPA选股策略相关的知识,希望对你有一定的参考价值。
【Tushare金融数据实战】SEPA选股策略
Tushare ID : 459953
1.Tushare接口包简介
Tushare是一个免费,开源的python财经数据接口包.拥有丰富的数据内容,如股票、基金、期货、数字货币等行情数据,公司财务、基金经理等基本面数据。
对于大学生而言!!完全免费!不像winxxd等数据库难以企及。
2.SEPA选股策略简介
SEPA策略源于《股票魔法师》,作者Mark Minervini,美国投资冠军,全美最成功的股票交易者之一,浸淫华尔街近30 年。他设立了Minervini Private Access公司,一个在线注册制平台网站,**提供实 时SEPA分析。**同时,他也设立了Master Trader Program项目,为参与人传授他的投 资理论。
SEPA策略为趋势性投资策略,通过该策略有助于选择出强趋势正股标的,该策略的具体决策流程是(均线系统个人结合行为偏好有所修改):
- 收盘价>MA34>MA60>MA120>MA200
- 收盘价>0.75*一年内最高价格
- 收盘价>1.3*一年内最低价格
3. 代码实现
import warnings
import pandas as pd
import numpy as np
# import chinese_calendar
import seaborn as sns
import tushare as ts
import datetime as dt
from dateutil.parser import parse
warnings.filterwarnings('ignore')
sns.set()
#获取使用接口
def get_token():
ts.set_token('xxx')
pro = ts.pro_api()
return pro
# 获取当前时间点下的股票列表、时间用以计算MA(50)、MA(150)、MA(200)
def get_date(date):
pro = get_token()
#获取观测时间点之前的一年内的交易日日期
end_date = dt.datetime.strftime(dt.datetime.strptime(date,'%Y%m%d') , '%Y%m%d')
start_date = dt.datetime.strftime(dt.datetime.strptime(date_final,'%Y%m%d') , '%Y%m%d')
date_all = pro.trade_cal(exchange='', start_date = start_date ,end_date = end_date)
date_list =( (date_all[date_all['is_open'] == 1]).cal_date.tolist())[1:]
#获取当前时间节点下的可交易股票数据,上市日期超过一年
stock_all = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,industry,list_date')
stock_list = (stock_all[stock_all['list_date'].apply(lambda x: dt.datetime.strptime(x, '%Y%m%d')) <= dt.datetime.strptime(start_date,"%Y%m%d")]).ts_code.tolist()
return date_list , stock_list
#获取所有状态下行情信息
def data_price(date_list , stock_list):
pro = get_token()
data_al = pd.DataFrame()
for code in stock_list:
single_data_price = pro.daily(ts_code= code , start_date= date_list[0], end_date=date_list[-1])
data_al = data_al.append(single_data_price)
data_all = data_before.append(data_al)
data_all.to_csv('xxx/基础股票池'.format(date_list[-1])+'.csv')
return data_all
# # 计算SEPA相关指标
def indicator_computate(stock_list, date_list):
result = pd.DataFrame()
for code in stock_list:
result.loc[code, "close_price"] = data_all.loc[date_list[-1], code] # 收盘价
result.loc[code, "MA5"] = data_all.loc[date_list[-4]:date_list[-1], code].mean() if data_all.loc[date_list[-4], code] is not np.nan else np.nan # 当前日期的5日均线
result.loc[code, "MA10"] = data_all.loc[date_list[-9]:date_list[-1], code].mean() if data_all.loc[date_list[-9], code] is not np.nan else np.nan# 当前日期的10日均线
result.loc[code, "MA20"] = data_all.loc[date_list[-19]:date_list[-1], code].mean() if data_all.loc[date_list[-19], code] is not np.nan else np.nan# 当前日期的20日均线
result.loc[code, "MA34"] = data_all.loc[date_list[-33]:date_list[-1], code].mean() if data_all.loc[date_list[-33], code] is not np.nan else np.nan # 当前日期的60日均线
result.loc[code, "MA60"] = data_all.loc[date_list[-59]:date_list[-1], code].mean() if data_all.loc[date_list[-59], code] is not np.nan else np.nan#当前日期的60日均线
result.loc[code, "MA120"] = data_all.loc[date_list[-119]:date_list[-1], code].mean() if data_all.loc[date_list[-119], code] is not np.nan else np.nan#当前日期的120日均线
result.loc[code, "MA200"] = data_all.loc[date_list[-199]:date_list[-1], code].mean() if data_all.loc[date_list[-199], code] is not np.nan else np.nan #当前日期的200日均线
result.loc[code, "max"] = data_all.loc[date_list[-249]:, code].max() #近一年最高价
result.loc[code, "min"] = data_all.loc[date_list[-249]:, code].min() #近一年最低价
#统计200日均线连续上涨天数
MA_200_list = []
MA_200_count = 0
for t in range(60):
MA_200 = data_all.loc[date_list[-199 - t]:date_list[-1 - t], code].mean()
MA_200_list.append(MA_200)
if len(MA_200_list) > 1:
if MA_200_list[-2] > MA_200_list[-1]:
MA_200_count += 1
else:
break
else:
continue
result.loc[code, "MA_200_cumulative"] = MA_200_count # 200日均线连续上涨天数
return result
#读取原有基础数据
data_before = pd.read_csv("C:/Users/xxx/Desktop/xxx/选股结果/20211215基础股票池.csv",index_col = 0)
date_final = str(sorted(data_before.trade_date.tolist(),reverse= False)[-1] )# 最后更新日期
#更新原有数据
date_list , stock_list = get_date("20211222")
data_basic= data_price(date_list , stock_list)
# #数据预处理,将收盘价按照代码与日期展开
data_basic.set_index('ts_code',inplace = True)
data_all = data_basic.groupby(["trade_date","ts_code"])["close"].mean().unstack()
data_all.index = data_all.index.astype(str) #将列的数字类型转为字符串
date_list = data_all.index.tolist()
# #SEPA策略 -- 输出最后的结果
data = indicator_computate(stock_list, date_list)
result = data[(data.close_price > data.MA20)&(data.MA20 > data.MA34)&(data.MA34 > data.MA60)&(data.MA60 > data.MA120)&(data.MA120 > data.MA200)&(data["MA_200_cumulative"] >=30)&((data["close_price"]/ data["max"]) >= 0.75 )&((data["close_price"]/ data["min"]) >= 1.3)]
result.to_excel('C:/Users/xxx/Desktop/xxx/选股结果/SEPA策略股票筛选结果'.format(date_list[-1])+'.xlsx')
以上是关于Tushare金融数据包实战SEPA选股策略的主要内容,如果未能解决你的问题,请参考以下文章