改进美林时钟代码
1.python量化——alpha股票-指数期货对冲策略
2.多因子选股策略
3.海龟交易策略
4.移动平均策略——单/双均线策略
5.改进的美林时钟策略(一)
5.改进的美林时钟策略(二)
6.改进的美林时钟策略(三)
这里获取token码

""" 2020.08.28  9:57
zp
宏观经济指标和大类资产收益的相关性"""# 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('19fbtoken码5e0')
pro = ts.pro_api()class read_data:def fetchData(self, query, q, name, db, host='192.168.0.153', user='jcyj', password='jcyjQwer'):'get data from mysql database'conn = pymysql.connect(host, user, password, database=db, charset='utf8', cursorclass=pymysql.cursors.DictCursor)cursor = conn.cursor()res = cursor.execute(query)fetch = cursor.fetchall()data = pd.DataFrame(fetch)q.put((name, data))def multithread(self, dataList, db):threads = []q = Queue()for key, value in dataList.items():t = threading.Thread(target=self.fetchData, args=(value, q, key, db))  # initiate a threadt.start()  # activate a threadthreads.append(t)  # collect threads listfor thread in threads:thread.join()result = []for _ in range(len(threads)):result.append(q.get())result = {i[0]: i[1] for i in result}return resultdef readhgyz(self, db='py_daziguan_2_1'):baseQuery = "select report_date , shibor_1w "\" from py_hgyz_pbc_shanghai_shibor_statistics_month  where DATE(report_date) > '2005-12-01' and DATE(report_date) < '2020-04-01' "data = self.multithread({'base': baseQuery},db)return datadef readetl1(self, db='py_etl'):baseQuery = "select trading_date , bond_1y "\" from py_etl_risk_free_rate_daily_2_1 where DATE(trading_date) > '2006-04-30' and DATE(trading_date) < '2020-08-01' "data = self.multithread({'base2': baseQuery},db)return data
BO1=read_data()
BO1=BO1.readetl1()["base2"]
BO1.set_index('trading_date',inplace=True)
BO1.index = pd.to_datetime(BO1.index)
BO1.bond_1y
R_B=BO1.bond_1y#############################七天回购利率###############################def CP(x):#转换CPI为季度数据return C[3*x]############################读取数据类###################################
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='201609'dc=pro.cn_ppi(start_m=star, end_m=end,fields='month,ppi_yoy')return dcdef read_GDP(self,star,end):#时间格式star='2016Q4'df1 = pro.cn_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 dfdef readshibor(self,star,end):return pro.shibor(start_date=star, end_date=end)
#####################################################################    start_time='20000430'#发布GDP需要时间,我们延迟1个月,即第一季度的GDP4月份才发布。
end_time="20200731"
star_GDP='2005Q1'#延后一年,因为我们找的是差分
end_GDP='2020Q1'#不是以3 4季度结尾
star_CPI='200501'
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)
##########################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 G
G=GDP_fun(df1)
####################################################################
###########################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=dc2.ppi_yoy.index)for j in range(len(dc2.ppi_yoy)):if (3+j)%3==0:if dc2.ppi_yoy[j]>0:C[j]=1elif dc2.ppi_yoy[j]<0:C[j]=0else:C[j]=C[j-1] else:pass return C
C=CPI_fun(dc)
########################################################################
##############################利率处理##################################
DF=read_data()
DF2=DF.readhgyz()
DF=DF2['base']def LV_fun(dc):dc=dc.sort_index()dc.set_index('report_date',inplace=True)dc2=(dc.shift(12)-dc.shift()).shift(-12).dropna()C=pd.Series(0,index=G.index)for j in range(len(dc2.shibor_1w)):if (3+j)%3==0:for i in range(int(j/3),int((3+j)/3)):if dc2.shibor_1w[j]+dc2.shibor_1w[j+1]+dc2.shibor_1w[j+2]  >0:C[i]=1elif dc2.shibor_1w[j]+dc2.shibor_1w[j+1]+dc2.shibor_1w[j+2]<0:C[i]=0else:C[i]=C[i-1] else:pass return C
LV=LV_fun(DF)
#####################################################################################################计算收益率+索引函数##########################
class ZC_fun:def ret_function(self,ds):#standard_base=pro.index_daily( ts_code='000300.SH', start_date='20081031', end_date="20200430")standard_base=ds.sort_index()standard_base.index=pd.to_datetime(standard_base.trade_date,format='%Y-%m-%d')#设置日期索引close_base= standard_base.closestandard_ret=standard_base.change/standard_base.close.shift(-1)ret=standard_ret.sort_index(axis=0,ascending=True)ret=ret.dropna()return ret#,close_base/close_base[start_time_jz].values#=str(RETT.index[0])[:4]+str(RETT.index[0])[5:7]+str(RETT.index[0])[8:10]###############
#有点问题,上面一行def bsc_fun(self,ds):dsc=ds.drop(['ts_code'],axis=1)dsc=dsc.sort_index()dsc.index=pd.to_datetime(dsc.trade_date,format='%Y-%m-%d')#设置日期索引dsc=dsc.drop(['trade_date'],axis=1)return dsc
#########################################################################    gc=ZC_fun()
R_c=gc.ret_function(dsc1)#股票的利
gb=ZC_fun()
R_b=gb.ret_function(dsb)#债券的利
gp=ZC_fun()
R_p=gp.ret_function(dsp)#商品的利
R_B=pd.DataFrame(R_B,dtype=np.float).bond_1y/100#无风险利率   ############R_B=R_B[start_time_jz:]
#Close_c=gc.ret_function(dsc1)[1]#股票的利
#Close_b=gb.ret_function(dsb)[1]#债券的利
#Close_p=gp.ret_function(dsp)[1]#商品的利
#Close_B=np.cumprod(R_B+1)############################对应季度的收益####################################
def RET_sig(sig_c,i):#输入ret,输出i对应的时间段收益#####截取收益段if G.index[i][5:6] =='1':a=G.index[i][0:4]+'0501'b=G.index[i][0:4]+'0731'at1=pd.to_datetime(a,format='%Y-%m-%d')bt1=pd.to_datetime(b,format='%Y-%m-%d')sig_c=sig_c[ sig_c.index<=bt1]  sig_c=sig_c[ sig_c.index>=at1]elif G.index[i][5:6] =='2':a=G.index[i][0:4]+'0801'b=G.index[i][0:4]+'1031'at1=pd.to_datetime(a,format='%Y-%m-%d')bt1=pd.to_datetime(b,format='%Y-%m-%d')sig_c=sig_c[ sig_c.index<=bt1]  sig_c=sig_c[ sig_c.index>=at1]elif G.index[i][5:6] =='3':a=G.index[i][0:4]+'1101'a1=G.index[i][0:4]+'1231'at1=pd.to_datetime(a,format='%Y-%m-%d')bt1=pd.to_datetime(a1,format='%Y-%m-%d')sig_c1=sig_csig_c1=sig_c1[ sig_c1.index<=bt1]  sig_c1=sig_c1[ sig_c1.index>=at1]sig_c1=sig_c1b=G.index[i-2][0:4]+'0101'b1=G.index[i-2][0:4]+'0131'at11=pd.to_datetime(b,format='%Y-%m-%d')bt11=pd.to_datetime(b1,format='%Y-%m-%d')sig_c=sig_c[ sig_c.index<=bt11]  sig_c=sig_c[ sig_c.index>=at11]sig_c=sig_c1.append(sig_c)else:a=G.index[i-1][0:4]+'0201'b=G.index[i-1][0:4]+'0430'at1=pd.to_datetime(a,format='%Y-%m-%d')bt1=pd.to_datetime(b,format='%Y-%m-%d')sig_c=sig_c[ sig_c.index<=bt1]  sig_c=sig_c[ sig_c.index>=at1]return sig_c
############################################################################################################策略条件##################################
def quanzhong_fun(R_c,R_p,R_b,R_B):RETT=Nonefor i in range(len(G)):if  G[i]>0 and CP(i)>0 and LV[i]>0:RETT=( 1*RET_sig(R_c,i)+0*RET_sig(R_p,i) +0*RET_sig(R_b,i)+0*RET_sig(R_B,i)  ).append(RETT)elif   G[i]==0 and CP(i)>0 and LV[i]>0:RETT=( 0*RET_sig(R_c,i)+0*RET_sig(R_p,i)+1*RET_sig(R_b,i) +0*RET_sig(R_B,i)  ).append(RETT)#elif  G[i]>0 and CP(i)==0 and LV[i]>0:#   RETT=( 0*RET_sig(R_c,i)+0.9*RET_sig(R_p,i)  +0*RET_sig(R_b,i)+0.1*RET_sig(R_B,i)  ).append(RETT)elif  G[i]==0 and CP(i)==0  and LV[i]>0:RETT=( 1*RET_sig(R_c,i)+0*RET_sig(R_p,i)+0*RET_sig(R_b,i)+0*RET_sig(R_B,i)  ).append(RETT)elif  G[i]>0 and CP(i)>0 and LV[i]==0:RETT=( 1*RET_sig(R_c,i)+0*RET_sig(R_p,i) +0*RET_sig(R_b,i)+0*RET_sig(R_B,i)  ).append(RETT)elif   G[i]==0 and CP(i)>0  and LV[i]==0:RETT=( 1*RET_sig(R_c,i)+0*RET_sig(R_p,i)+0*RET_sig(R_b,i) +0*RET_sig(R_B,i)  ).append(RETT)elif  G[i]>0 and CP(i)==0 and LV[i]==0:RETT=( 1*RET_sig(R_c,i)+0*RET_sig(R_p,i)  +0*RET_sig(R_b,i)+0*RET_sig(R_B,i)  ).append(RETT)else:RETT=( 1*RET_sig(R_c,i)+0*RET_sig(R_p,i)+0*RET_sig(R_b,i)+0*RET_sig(R_B,i)  ).append(RETT)return RETTRETT=quanzhong_fun(R_c,R_p,R_b,R_B)
RETT=RETT.sort_index(axis=0)
cum=np.cumprod(1+RETT)
cum=cum.dropna()#################################策略条件##################################
def quanzhong_fun1(R_c,R_p,R_b,R_B):RETT=Nonefor i in range(len(G)):if  G[i]>0 and CP(i)>0 and LV[i]>0:RETT=( 0.4*RET_sig(R_c,i)+0.3*RET_sig(R_p,i) +0.1*RET_sig(R_b,i)+0.2*RET_sig(R_B,i)  ).append(RETT)elif   G[i]==0 and CP(i)>0 and LV[i]>0:RETT=( 0.1*RET_sig(R_c,i)+0.2*RET_sig(R_p,i)+0.4*RET_sig(R_b,i) +0.3*RET_sig(R_B,i)  ).append(RETT)#elif  G[i]>0 and CP(i)==0 and LV[i]>0:#   RETT=( 0*RET_sig(R_c,i)+0.9*RET_sig(R_p,i)  +0*RET_sig(R_b,i)+0.1*RET_sig(R_B,i)  ).append(RETT)elif  G[i]==0 and CP(i)==0  and LV[i]>0:RETT=( 0.4*RET_sig(R_c,i)+0.3*RET_sig(R_p,i)+0.2*RET_sig(R_b,i)+0.1*RET_sig(R_B,i)  ).append(RETT)elif  G[i]>0 and CP(i)>0 and LV[i]==0:RETT=( 0.4*RET_sig(R_c,i)+0.1*RET_sig(R_p,i) +0.2*RET_sig(R_b,i)+0.3*RET_sig(R_B,i)  ).append(RETT)elif   G[i]==0 and CP(i)>0  and LV[i]==0:RETT=( 0.4*RET_sig(R_c,i)+0.2*RET_sig(R_p,i)+0.3*RET_sig(R_b,i) +0.1*RET_sig(R_B,i)  ).append(RETT)elif  G[i]>0 and CP(i)==0 and LV[i]==0:RETT=( 0.4*RET_sig(R_c,i)+0.3*RET_sig(R_p,i)  +0.1*RET_sig(R_b,i)+0.2*RET_sig(R_B,i)  ).append(RETT)else:RETT=( 0.4*RET_sig(R_c,i)+0.3*RET_sig(R_p,i)+0.2*RET_sig(R_b,i)+0.1*RET_sig(R_B,i)  ).append(RETT)return RETTRETT1=quanzhong_fun1(R_c,R_p,R_b,R_B)
RETT1=RETT1.sort_index(axis=0)
cum1=np.cumprod(1+RETT1)
cum1=cum1.dropna()
def quanzhong_fun11(R_c,R_p,R_b,R_B):RETT=Nonefor i in range(len(G)):if  G[i]>0 and CP(i)>0 and LV[i]>0:RETT=( 0.5*RET_sig(R_c,i)+0.3*RET_sig(R_p,i) +0*RET_sig(R_b,i)+0.2*RET_sig(R_B,i)  ).append(RETT)elif   G[i]==0 and CP(i)>0 and LV[i]>0:RETT=( 0*RET_sig(R_c,i)+0.2*RET_sig(R_p,i)+0.5*RET_sig(R_b,i) +0.3*RET_sig(R_B,i)  ).append(RETT)#elif  G[i]>0 and CP(i)==0 and LV[i]>0:#   RETT=( 0*RET_sig(R_c,i)+0.9*RET_sig(R_p,i)  +0*RET_sig(R_b,i)+0.1*RET_sig(R_B,i)  ).append(RETT)elif  G[i]==0 and CP(i)==0  and LV[i]>0:RETT=( 0.5*RET_sig(R_c,i)+0.3*RET_sig(R_p,i)+0.2*RET_sig(R_b,i)+0*RET_sig(R_B,i)  ).append(RETT)elif  G[i]>0 and CP(i)>0 and LV[i]==0:RETT=( 0.5*RET_sig(R_c,i)+0*RET_sig(R_p,i) +0.2*RET_sig(R_b,i)+0.3*RET_sig(R_B,i)  ).append(RETT)elif   G[i]==0 and CP(i)>0  and LV[i]==0:RETT=( 0.5*RET_sig(R_c,i)+0.2*RET_sig(R_p,i)+0.3*RET_sig(R_b,i) +0*RET_sig(R_B,i)  ).append(RETT)elif  G[i]>0 and CP(i)==0 and LV[i]==0:RETT=( 0.5*RET_sig(R_c,i)+0.3*RET_sig(R_p,i)  +0*RET_sig(R_b,i)+0.2*RET_sig(R_B,i)  ).append(RETT)else:RETT=( 0.5*RET_sig(R_c,i)+0.3*RET_sig(R_p,i)+0.2*RET_sig(R_b,i)+0*RET_sig(R_B,i)  ).append(RETT)return RETTRETT11=quanzhong_fun11(R_c,R_p,R_b,R_B)
RETT11=RETT11.sort_index(axis=0)
cum11=np.cumprod(1+RETT11)
cum11=cum11.dropna()############################指数基准图#########################################
start_time_jz=str(RETT.index[0])[:4]+str(RETT.index[0])[5:7]+str(RETT.index[0])[8:10]
end_time_jz=str(RETT.index[-1])[:4]+str(RETT.index[-1])[5:7]+str(RETT.index[-1])[8:10]
def bj_standard(code,lab='沪深300指数',col='k'):#针对沪深股票,直接画出比较基准(收益情况)standard_base = pro.index_daily( ts_code=code, start_date=start_time_jz, end_date=end_time_jz)standard_base=standard_base.sort_index()standard_base.index=pd.to_datetime(standard_base.trade_date,format='%Y-%m-%d')#设置日期索引close_base= standard_base.closestandard_ret=standard_base.change/standard_base.close.shift(-1)standard_sig=pd.Series(0,index=close_base.index) standard_trade=standard_sig.shift(1).dropna()/100#shift(1)整体下移一行standard_SmaRet=standard_ret*standard_trade.dropna()standard_cum=np.cumprod(1+standard_ret[standard_SmaRet.index[0:]])-1plt.plot(close_base/close_base[-1],label=lab,color=col)return close_base/close_base[-1] #standard_cum
###########################################################################   #############################策略的年化统计######################################
def Tongji(RET,cum):RET1 = RET*100 - (4/252)NH=(cum[-2]-1)*100*252/len(RET.index)BD=np.std(RET)*100*np.sqrt(252)SR=(NH-400/252)/BDreturn_list=cumMHC=((np.maximum.accumulate(return_list) - return_list) / np.maximum.accumulate(return_list)).max()*100print("年化收益率:{:.2f}%:,年化夏普率:{:.2f},波动率为:{:.2f}%,最大回撤:{:.2f}%".format( NH,SR,BD,MHC))
############################################################################if __name__=="__main__":bj_standard('000300.SH')#比较基准函数(图)bj_standard('000012.SH',lab='上证国债',col='b')bj_standard('NHCI.NH',lab='南华商品指数',col='y')Tongji(RETT,cum)plt.plot( np.cumprod(1+R_B),label="一年期国债",color='g',linestyle='-')plt.plot(cum1,label="多资产策略",color='c',linestyle='-')plt.plot(cum11,label="避险策略",color='r',linestyle='-')plt.plot(cum,label="单资产策略",color='m',linestyle='-')plt.title("利率+GDP+CPI下各个策略净值走势对比图")plt.legend()      
年化收益率:66.71%:,年化夏普率:2.57,波动率为:25.30%,最大回撤:46.70%

净值走势图:

python量化策略——改进的美林时钟代码(代码版)相关推荐

  1. python量化策略——混合择时策略(动量效应+pe_ttm、pb估值+美林时钟)——股债轮动

    将下面三个策略结合判断, 动量策略 估值策略 改进美林时钟 三个策略都判断股票上涨(做多股票,则股:债=0.5:0.5 三个中有两个策略判断做多股票信号 ,则股:债=0.4:0.6 三个中有一个策略判 ...

  2. python量化策略——大类资产配置模型(最小方差模型)

    最小方差模型 寻求风险最小的大类资产组合. max⁡=XTΣX\max=X^{T}\Sigma Xmax=XTΣX s.t.ΣX=1,Xi≥0,i=1,2,3...s.t. \quad \Sigma ...

  3. python量化策略——Fama-French三因子模型(回归获取alpha)阿尔法α策略。

    简单的alpha策略, 选取某一时间点所有股票的相关信息ps.pb.pe等. 用三因子回归获取alpha,分别用每只股票计算. 选取排名靠前的n只股票 计算组合净值 计算结果和画图 注:代码运行需安装 ...

  4. python量化策略——最简单的动量策略,简单趋势追踪策略

    趋势性动量策略有效性验证及实现 1相关性验证 2策略概要 3其他回测结果 其他量化策略 1相关性验证 选取上证指数000001.SH,获取收盘价 以50为单位,计算每个55天的收益序列. 使用shif ...

  5. python量化策略—— alpha 策略 股票-融资融券对冲(3)

    将反向操作由1.python量化--alpha股票-指数期货对冲策略的股指期货,换成筛选的后T只股票的做空(融资融券业务). 大概思路就是选择排名前T只股票做多,后T只做空. 所用库 # coding ...

  6. python 量化策略回测_在python中创建和回测对交易策略

    python 量化策略回测 Pairs trading is one of the many mean-reversion strategies. It is considered non-direc ...

  7. 基于Python量化策略牛市行情下的盈利与风险策略管理

    基于Python量化策略 牛市行情下的盈利与风险策略管理 牛市行情下的盈利策略与风险管理 1 项目背景 2 数据探索 2.1 数据获取 2.2 数据处理与分析 3 盈利策略量化建模与风险管理 3.1 ...

  8. python获取时间周数_【手把手教你】Python量化策略风险指标

    如何衡量一个量化策略的好坏?一是比较稳定的收益,二是有严谨的回测,三是有清晰的逻辑.--刘富兵 引言 引言尽管过去不能代表未来,通过历史回测来评估量化策略仍然是量化投资非常重要的一环.量化回测过程中常 ...

  9. python金融量化风险_【手把手教你】Python量化策略风险指标

    如何衡量一个量化策略的好坏?一是比较稳定的收益,二是有严谨的回测,三是有清晰的逻辑.--刘富兵 引言 尽管过去不能代表未来,通过历史回测来评估量化策略仍然是量化投资非常重要的一环.量化回测过程中常用到 ...

  10. 百倍加速!Python量化策略的算法性能提升指南

    性能问题 Python在2016年里可以说是风靡国内量化投资圈,目前整个生态链已经初具规模: 交易:vn.py.easytrader.at_py 数据:tushare 回测:rqalpha 在线平台: ...

最新文章

  1. 单卡手机怎么变双卡双待全过程
  2. CSS 负边距自适应布局
  3. Mybatis操作主体流程
  4. 代码和产品发布的几种方式
  5. Win8.1无法安装更新,提示0x800*****错误的解决方法
  6. k8s sealos应用安装及应用包制作教程
  7. deepin-安装问题:unable to find a medium containing a live file
  8. 一次性汇总了 30+ 字符串常用处理方法
  9. python 数据驱动接口自动化框架_python接口自动化测试 - 数据驱动DDT模块的简单使用...
  10. linux常用操作符,Shell常用操作符总结
  11. python中读写excel_python读写Excel
  12. vs工程 vcproj和开发环境定义宏
  13. mysql复制表结构并创建新表_mysql ---复制表结构---创建新表
  14. 22年字节跳动飞书人力套件二面面经
  15. mac用brew安装mysql报错1045(28000)
  16. python中获取网页元素
  17. 幻14 连不上无线网 网卡掉驱动
  18. 如何一键制作DTS Audio DVD、AC3 Audio DVD、WAV Audio DVD纯音乐碟片
  19. 这156套PS笔刷合集!两天时间给大家盘来了!
  20. 基于EAST+CRNN实现集装箱箱号识别

热门文章

  1. 爬虫出现selenium.common.exceptions.NoSuchWindowException: Message: Browsing context has been discarded
  2. Browsing HDFS报错
  3. CCF考试——201312-5I’m stuck!
  4. linux之shell的一些基础
  5. php 走马灯轮播,JavaScript_js实现DOM走马灯特效的方法,本文实例讲述了js实现DOM走马 - phpStudy...
  6. 17python实操案例五
  7. MySQL-python安装遇到的各种问题
  8. 远程桌面桌面无法找到计算机,Windows – 远程桌面客户端找不到远程计算机
  9. 11.22 点餐APP第一阶段总结
  10. Photoshop学习(一)Ps基础