这里是在改进美林时钟一的基础上做了一些优化,改进。
只要针对经济变动(差分),通货膨胀变动(差分),(发布数据需要一个月)来判断接下来三个月的大类资产的选择。定期3个月判断一次,既然现在国内是“美林电风扇”一样紊乱,那我们就不管时钟顺序,就看上个季度的宏观经济状态,为接下来的配置做依据。
肯定先要统计历史数据表现情况,然后策略才设置对应的资产配置。
这里先用历史数据找各个情况的大类资产排序。
1.需要用到的库
# coding=utf-8import mathimport tushare as tsimport pandas as pdimport matplotlibimport matplotlib.pyplot as pltimport numpy as npimport talibimport pandas as pdfrom datetime import datetime, dateimport pymysqlimport threadingfrom queue import Queuematplotlib.rcParams['axes.unicode_minus']=Falseplt.rcParams['font.sans-serif']=['SimHei']ts.set_token('token码')#需要注册tushare pro 这里 https://tushare.pro/register?reg=385920pro = ts.pro_api()#读取数据
2.读取数据
############################读取数据类###################################class readData:def read_index_daily(self,code,star,end):#指数数据dsb = pro.index_daily(ts_code=code, start_date=star, end_date=end,fields='ts_code,trade_date,close,change')#默认#读取三个数据return dsbdef read_daily(self,code,star,end):dsc1 = pro.daily(ts_code=code, start_date=star, end_date=end,fields='ts_code,trade_date,close,change')return dsc1def read_CPI(self,star,end):#时间格式start_cpi='09'dc=_cpi(start_m=star, end_m=end,fields='month,nt_yoy')return dcdef read_GDP(self,star,end):#时间格式star='Q4'df1 = _gdp(start_q=star, end_q=end,fields='quarter,gdp_yoy')return df1def read_bond(self,code,star,end):df=pro.cb_daily(ts_code=code,start_date=star,end_date=end)return df#####################################################################
3.设置时间,所需数据的代码。上债 沪深300 等
start_time='0430'#发布GDP需要时间,我们延迟1个月,即第一季度的GDP4月份才发布。end_time="2031"star_GDP='Q1'#延后一年,因为我们找的是差分,实际是从01开始的 end_GDP='Q1'star_CPI='01'#end_CPI='20'df1=readData()#读取dc=readData()dsc1=readData()dsp=readData()dsb=readData()df1=df1.read_GDP(star_GDP,end_GDP)dc=dc.read_CPI(star_CPI,end_CPI)dsc1=dsc1.read_index_daily('000300.SH',start_time,end_time) dsb=dsb.read_index_daily('000012.SH',start_time,end_time)dsp=dsp.read_index_daily('NHCI.NH',start_time,end_time)
4.GDP数据的处理
##########################GDP信号处理################################def GDP_fun(df1):df1.set_index('quarter',inplace=True)#设置日期索引df2=(df1.shift(4)-df1).shift(-4)df2=df2.dropna()G=pd.Series(0,index=df2.gdp_yoy.index)for i in range(len(df2.gdp_yoy)):if df2.gdp_yoy[i]>0:G[i]=1elif df2.gdp_yoy[i]<0:G[i]=0else:G[i]=G[i-1]return GG=GDP_fun(df1)####################################################################
6.cpi数据的处理
###########################CPI信号函数##############################def CPI_fun(dc):dc=dc.sort_index()dc.set_index('month',inplace=True)dc2=(dc.shift(12)-dc.shift()).shift(-12).dropna()C=pd.Series(0,index=G.index)for j in range(len(dc2.nt_yoy)-3):if (3+j)%3==0:for i in range(int(j/3),int((3+j)/3)):if dc2.nt_yoy[j]+dc2.nt_yoy[j+1]+dc2.nt_yoy[j+2] >0:C[i]=1elif dc2.nt_yoy[j]+dc2.nt_yoy[j+1]+dc2.nt_yoy[j+2]<0:C[i]=0else:C[i]=C[i-1] else:pass return CC=CPI_fun(dc)########################################################################
7.计算三个大类资产的月平均收益
def jidu(d):###得到每个月的平均收益d.set_index('trade_date',inplace=True)d=d.drop(['ts_code'],axis=1)d.index = pd.to_datetime(d.index)d=(d-d.shift(-12))/d.shift(-12)d=d.groupby([d.index.year.rename('year'),d.index.month.rename('month')])['close'].mean()return ddp2=jidu(dsp)dz2=jidu(dsb)ds2=jidu(dsc1)
8.获得季度收益
def jidu_(ds,i):#将每三个月的收益转化成一个季度收益st=ds[i*3]+ds[i*3+1]+ds[i*3+2]return st
9.设置初始值,及判断条件和打印结果。
ST1=0 SP1=0SZ1=0k1=0 ST2=0 SP2=0SZ2=0k2=0ST3=0 SP3=0SZ3=0k3=0ST4=0 SP4=0SZ4=0k4=0tj_st=0tj_sp=0tj_sz=0for i in range(len(G)):if G[i]>0 and C[i]==0:ST1=ST1+jidu_(ds2,i)SP1=SP1+jidu_(dp2,i)SZ1=SZ1+jidu_(dz2,i)k1+=1print('经济↑+通货↓时,股票:{:.2f}%,商品:{:.2f}%,债券:{:.2f}%'.format(jidu_(ds2,i)*100,jidu_(dp2,i)*100,jidu_(dz2,i) *100 ))print('经济↑+通货↓时,股票的平均收益:{:.2f}%,v,商品的平均收益:{:.2f}%,债券的平均收益:{:.2f}%'.format(100*ST1/k1,100*SP1/k1,100*SZ1/k1))for i in range(len(G)): if G[i]>0 and C[i]>0:ST2=ST2+jidu_(ds2,i)SP2=SP2+jidu_(dp2,i)SZ2=SZ2+jidu_(dz2,i)k2+=1print('经济↑+通货↑时,股票:{:.2f}%,商品:{:.2f}%,债券:{:.2f}%'.format(jidu_(ds2,i)*100,jidu_(dp2,i)*100,jidu_(dz2,i) *100 ))print('经济↑+通货↑时,股票的平均收益:{:.2f}%,v,商品的平均收益:{:.2f}%,债券的平均收益:{:.2f}%'.format(100*ST2/k2,100*SP2/k2,100*SZ2/k2))for i in range(len(G)):if G[i]==0 and C[i]==0:ST3=ST3+jidu_(ds2,i)SP3=SP3+jidu_(dp2,i)SZ3=SZ3+jidu_(dz2,i)k3+=1print('经济↓+通货↓时,股票:{:.2f}%,商品:{:.2f}%,债券:{:.2f}%'.format(jidu_(ds2,i)*100,jidu_(dp2,i)*100,jidu_(dz2,i) *100 ))print('经济↓+通货↓时,股票的平均收益:{:.2f}%,商品的平均收益:{:.2f}%,债券的平均收益:{:.2f}%'.format(100*ST3/k3,100*SP3/k3,100*SZ3/k3))for i in range(len(G)):if G[i]==0 and C[i]>0:ST4=ST4+jidu_(ds2,i)SP4=SP4+jidu_(dp2,i)SZ4=SZ4+jidu_(dz2,i)k4+=1print('经济↓+通货↑时,股票:{:.2f}%,商品:{:.2f}%,债券:{:.2f}%'.format(jidu_(ds2,i)*100,jidu_(dp2,i)*100,jidu_(dz2,i) *100 ))print('经济↓+通货↑时,股票的平均收益:{:.2f}%,商品的平均收益:{:.2f}%,债券的平均收益:{:.2f}% '.format(100*ST4/k4,100*SP4/k4,100*SZ4/k4))
运行得到结果:
经济↑+通货↓时,股票:-26.86%,商品:-21.03%,债券:2.68%经济↑+通货↓时,股票:7.76%,商品:1.38%,债券:1.13%经济↑+通货↓时,股票:17.91%,商品:9.09%,债券:0.02%经济↑+通货↓时,股票:18.84%,商品:3.66%,债券:0.03%经济↑+通货↓时,股票:-2.49%,商品:1.59%,债券:0.63%经济↑+通货↓时,股票的平均收益:3.03%,v,商品的平均收益:-1.06%,债券的平均收益:0.90%经济↑+通货↑时,股票:-1.50%,商品:1.10%,债券:0.49%经济↑+通货↑时,股票:8.45%,商品:2.19%,债券:0.39%经济↑+通货↑时,股票:-2.79%,商品:-7.08%,债券:0.61%经济↑+通货↑时,股票:-4.94%,商品:-2.24%,债券:1.04%经济↑+通货↑时,股票:-7.74%,商品:-1.36%,债券:0.96%经济↑+通货↑时,股票:1.98%,商品:12.04%,债券:0.58%经济↑+通货↑时,股票:0.99%,商品:3.26%,债券:0.56%经济↑+通货↑时,股票:-6.17%,商品:3.25%,债券:0.43%经济↑+通货↑时,股票:0.31%,商品:-2.35%,债券:1.10%经济↑+通货↑时,股票:16.61%,商品:3.38%,债券:0.53%经济↑+通货↑时,股票的平均收益:0.52%,v,商品的平均收益:1.22%,债券的平均收益:0.67%经济↓+通货↓时,股票:14.00%,商品:-2.43%,债券:-0.76%经济↓+通货↓时,股票:6.77%,商品:-1.72%,债券:0.64%经济↓+通货↓时,股票:-3.89%,商品:0.49%,债券:0.45%经济↓+通货↓时,股票:-8.37%,商品:-9.08%,债券:0.68%经济↓+通货↓时,股票:-2.61%,商品:2.01%,债券:0.68%经济↓+通货↓时,股票:4.26%,商品:1.51%,债券:0.48%经济↓+通货↓时,股票:-4.93%,商品:-3.63%,债券:0.56%经济↓+通货↓时,股票:-6.87%,商品:-1.93%,债券:0.43%经济↓+通货↓时,股票:4.61%,商品:1.93%,债券:0.29%经济↓+通货↓时,股票:-4.53%,商品:-3.43%,债券:0.34%经济↓+通货↓时,股票:-0.07%,商品:-2.63%,债券:0.41%经济↓+通货↓时,股票:1.05%,商品:-1.23%,债券:0.61%经济↓+通货↓时,股票:4.96%,商品:-4.07%,债券:0.86%经济↓+通货↓时,股票:1.83%,商品:5.38%,债券:0.89%经济↓+通货↓时,股票:0.41%,商品:10.13%,债券:-0.28%经济↓+通货↓时,股票:2.27%,商品:-4.16%,债券:0.34%经济↓+通货↓时,股票:4.00%,商品:3.36%,债券:-0.06%经济↓+通货↓时,股票:4.09%,商品:-0.19%,债券:0.20%经济↓+通货↓时,股票:4.74%,商品:2.14%,债券:0.09%经济↓+通货↓时,股票的平均收益:1.14%,商品的平均收益:-0.40%,债券的平均收益:0.36%经济↓+通货↑时,股票:6.19%,商品:-4.81%,债券:-0.24%经济↓+通货↑时,股票:4.59%,商品:-0.20%,债券:1.11%经济↓+通货↑时,股票:32.74%,商品:-2.50%,债券:0.12%经济↓+通货↑时,股票:19.53%,商品:5.04%,债券:-0.22%经济↓+通货↑时,股票:18.28%,商品:5.19%,债券:-0.04%经济↓+通货↑时,股票:-4.73%,商品:-0.22%,债券:0.85%经济↓+通货↑时,股票:-19.04%,商品:2.51%,债券:0.98%经济↓+通货↑时,股票:-10.94%,商品:2.08%,债券:0.17%经济↓+通货↑时,股票:-2.59%,商品:4.96%,债券:0.68%经济↓+通货↑时,股票:0.97%,商品:5.47%,债券:0.14%经济↓+通货↑时,股票:-3.71%,商品:-0.85%,债券:1.10%经济↓+通货↑时,股票:-7.99%,商品:-4.25%,债券:0.77%经济↓+通货↑时,股票:14.90%,商品:9.88%,债券:0.14%经济↓+通货↑时,股票:-6.29%,商品:4.76%,债券:0.00%经济↓+通货↑时,股票:21.64%,商品:-2.17%,债券:0.98%经济↓+通货↑时,股票:16.06%,商品:0.90%,债券:0.81%经济↓+通货↑时,股票:-5.67%,商品:-4.36%,债券:0.63%经济↓+通货↑时,股票:-8.90%,商品:-2.09%,债券:1.02%经济↓+通货↑时,股票:-4.50%,商品:1.04%,债券:0.83%经济↓+通货↑时,股票的平均收益:3.19%,商品的平均收益:1.07%,债券的平均收益:0.52%
接下来可以自由的选择所想要的策略了。
比如每次季度数据知道以后,我们配置平均收益最高的资产,实列:经济↑,通胀↑,配置:宗商品。
其他策略:
1.python量化——alpha股票-指数期货对冲策略
2.多因子选股策略
3.海龟交易策略
4.移动平均策略——单/双均线策略
5.改进的美林时钟策略(一)
5.改进的美林时钟策略(二)
6.改进的美林时钟策略(三)