这里是在改进美林时钟一的基础上做了一些优化,改进。
只要针对经济变动(差分),通货膨胀变动(差分),(发布数据需要一个月)来判断接下来三个月的大类资产的选择。定期3个月判断一次,既然现在国内是“美林电风扇”一样紊乱,那我们就不管时钟顺序,就看上个季度的宏观经济状态,为接下来的配置做依据。
肯定先要统计历史数据表现情况,然后策略才设置对应的资产配置。
这里先用历史数据找各个情况的大类资产排序。
1.需要用到的库
# coding=utf-8
import math
import tushare as ts
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import talib
import pandas as pd
from datetime import datetime, date
import pymysql
import threading
from queue import Queue
matplotlib.rcParams['axes.unicode_minus']=False
plt.rcParams['font.sans-serif']=['SimHei']
ts.set_token('token码')#需要注册tushare pro 这里 https://tushare.pro/register?reg=385920
pro = 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 dsb
def 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 dsc1
def read_CPI(self,star,end):#时间格式start_cpi='201609'
dc=pro.cn_cpi(start_m=star, end_m=end,fields='month,nt_yoy')
return dc
def read_GDP(self,star,end):#时间格式star='2016Q4'
df1 = pro.cn_gdp(start_q=star, end_q=end,fields='quarter,gdp_yoy')
return df1
def 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='20060430'#发布GDP需要时间,我们延迟1个月,即第一季度的GDP4月份才发布。
end_time="20200731"
star_GDP='2006Q1'#延后一年,因为我们找的是差分,实际是从200701开始的
end_GDP='2020Q1'
star_CPI='200601'#
end_CPI='202003'
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]=1
elif df2.gdp_yoy[i]<0:
G[i]=0
else:
G[i]=G[i-1]
return G
G=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]=1
elif dc2.nt_yoy[j]+dc2.nt_yoy[j+1]+dc2.nt_yoy[j+2]<0:
C[i]=0
else:
C[i]=C[i-1]
else:
pass
return C
C=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 d
dp2=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=0
SZ1=0
k1=0
ST2=0
SP2=0
SZ2=0
k2=0
ST3=0
SP3=0
SZ3=0
k3=0
ST4=0
SP4=0
SZ4=0
k4=0
tj_st=0
tj_sp=0
tj_sz=0
for 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+=1
print('经济↑+通货↓时,股票:{:.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+=1
print('经济↑+通货↑时,股票:{:.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+=1
print('经济↓+通货↓时,股票:{:.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+=1
print('经济↓+通货↑时,股票:{:.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.改进的美林时钟策略(三)