python量化策略——改进的美林时钟轮动策略(二)

这里是在改进美林时钟一的基础上做了一些优化,改进。
只要针对经济变动(差分),通货膨胀变动(差分),(发布数据需要一个月)来判断接下来三个月的大类资产的选择。定期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.改进的美林时钟策略(三)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李、不姓李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值