记录一下一个尝试,用类似双均线策略的思路来跟随北上资金,并计算策略收益。
整体思路是:当北上资金持股市值(5日)>北上资金持股市值变化(10日)时,买入该股,根据当日涨跌幅来计算策略收益率。
1、首先导入一些常用的后续需要的库
#首先导入各种需要的库
import akshare as ak #用akshare获取北上资金数据
import pandas as pd #
import numpy as np #
from matplotlib import pyplot as plt #用于后续交叉点做图
import xlrd
2、读取股票代码的excel表格
excel表格整理自同花顺ifind的导出数据,内容如下图:
下面为具体代码:
#读取股票代码的excel表格
worksheet= xlrd.open_workbook('D:\A USTC\jrsj\hgstdm1.xls')
#hsgtdm1为通过同花顺Ifind获取的陆股通持股市值大于0的股票的代码,使用时注意更改路径
sheet_names= worksheet.sheet_names()
sheet1 = worksheet.sheet_by_name('Sheet1')
dm=sheet1.col_values(0) #取第一列数据
dm.remove('股票代码') #去掉表格第一行"股票代码”
3、当北上资金持股市值(5日)>北上资金持股市值变化(10日)时,买入该股,根据当日涨跌幅来计算策略收益率。
因为想计算excel里面前500只股票应用该策略的收益,所以在akshare库导入即后续操作放入循环,依次读取各自股票的北上资金流入流出数据。
用stock_hsgt_individual_em_df.head()直观地看一下得到的数据,如下图:
(这里是跑完后面代码之后再看的,所以会有s-l,signal及stategy列)
定义data['s-l']为持股市值变化5日-持股市值变化10日,大于0赋值为1,小于0赋值为0。
用data[['持股市值变化-5日','持股市值变化-10日']].plot(grid=True,figsize=(18,15))看一下大概情况。
用print(data['signal'].value_counts())可以输出统计的交点的个数。
接着计算当赋值为1时买入的平均收益率,先累加涨跌幅再求平均。
最后输出得到每只股票执行该策略的结果。
#因为策略要应用于500只股票所以写一个循环
for x in range(0,500):
#AKshare库导入
stock_hsgt_individual_em_df = ak.stock_hsgt_individual_em(stock=dm[x]) #分别读取个股北上资金数据
#将短期(5日)持股市值变化-长期(10日)持股市值变化赋给data["s-l"]
data=pd.DataFrame(stock_hsgt_individual_em_df )
data['s-l']=data['持股市值变化-5日']-data['持股市值变化-10日']
#短期超过长期赋值1
data['signal']=np.where(data['s-l']>0,1,0)
#长期超过短期赋值-1
data['signal']=np.where(data['s-l']<0,-1,data['signal'])
#统计金叉死叉个数
data['signal'].value_counts()
#策略涨跌幅
data['stategy']=data['当日涨跌幅']*data['signal'].shift(1)
#计算平均收益率
rtn=[]
for i in range(0,data.shape[0]):
if data.iloc[i,10]==1: #如果s-l信号(第i行第10列数据)赋值为1,即金叉时买入
rtn.append(data.iloc[i,2]) #加上当日涨跌幅,data的第i行第2列
result=np.cumsum(rtn) #累加涨跌幅得收益率
np.mean(result) #求得平均收益率
print("%s的策略平均收益率为:"%(dm[x]),np.mean(result)) #打印平均收益率
4、最后得到输出结果
策略主要调用双均线的一些思路做了一个应用性的尝试,单纯应用该策略收益与实际股票未来涨跌相对比,发现该策略在一定程度还能预示股票未来涨跌,预测成功率在67%左右,进行收益回测也能够跑赢同期简单的买入持有策略。