【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策略为趋势性投资策略,通过该策略有助于选择出强趋势正股标的,该策略的具体决策流程是(均线系统个人结合行为偏好有所修改):

  1. 收盘价>MA34>MA60>MA120>MA200
  2. 收盘价>0.75*一年内最高价格
  3. 收盘价>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')

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
)">
下一篇>>