群友说,行业指数不行,没办法跟买。这次我换成了etf进行动量策略,选择本周上涨最强的5个etf,平均持仓,一周后移仓。查看回测效果。
不废话,上传代码,但还是有点毛糙。下次加上日期这些数据,做成df格式,然后用pyfolio进行查看。
导包:
import akshare as ak
import pandas as pd
import numpy as np
import matplotlib
换成周线(也可以换成月线,年线):
#日线换为周线数据
def transferToWeekLine(df,period='W'):
data1=df
stock_data = pd.DataFrame(data1)
#设定转换周期period_type 转换为周是'W',月'M',季度线'Q',五分钟'5min',12天'12D'
stock_data["date"] = pd.to_datetime(stock_data["date"])
period_type = period
stock_data.set_index('date',inplace=True)
#进行转换,周线的每个变量都等于那一周中最后一个交易日的变量值
period_stock_data = stock_data.resample(period_type).last()
period_stock_data['chg_pct'] = stock_data['chg_pct'].resample(period_type).last()
#计算周线turnover
period_stock_data.reset_index(inplace=True)
data = np.array(period_stock_data) #先将数据框转换为数组
data_list = data.tolist() #其次转换为列表
for i in data_list:
i[0]=str(i[0]).split(" ")[0]
return data_list
获取公募数据
#公募基本数据
fund_name_em_df = ak.fund_name_em()
print(fund_name_em_df)
#获取公募净值历史行情
#策略1,公募轮动现象的直观表征:相对强弱
ind = pd.DataFrame()
fund_name_em_df = fund_open_fund_daily_em_df
for i in range(len(fund_name_em_df[:])):
print(fund_name_em_df.iloc[i,0])
sw_index_daily_df = ak.fund_open_fund_info_em(fund=fund_name_em_df.iloc[i,0], indicator="累计收益率走势")
sw_index_daily_df['code'] = fund_name_em_df.iloc[i,0]
sw_index_daily_df.rename(columns={'净值日期':'date','累计收益率':'chg_pct'},inplace=True)
sw_index_daily_df = pd.DataFrame(transferToWeekLine(fund_open_fund_info_em_df,'W'))
sw_index_daily_df.rename(columns={0:'date',1:'chg_pct'},inplace=True)
#print(sw_index_daily_df.head())
# stock_data.rename(columns={0:'date',1:'code',2:'name',3:'close',4:'volume',5:'chg_pct'},inplace=True)
# stock_data=stock_data.iloc[:,:6]
sw_index_daily_df['ret'] = sw_index_daily_df['chg_pct'].shift(-1)
ind = ind.append(sw_index_daily_df)
计算每周净值:
last = pd.DataFrame()
l = []
#获取每个交易周的行业指数,并买入排名前五,(均值买入),并计算持仓一个礼拜的收益。
for i in ind['date'].unique():
d = ind.loc[ind['date']==i].sort_values('chg_pct',ascending=True).head(20)
l = (l+[d.ret.mean()/100])
绘图:
pd.DataFrame(l).cumsum().plot()