免费数据库
注:重要的talib函数,注意安装时再官网装,选择合适的版本,64位/32位,还要对应自己python的版本。
注释都很清楚了!
看代码!
# coding=utf-8
import math
import tushare as ts #老版的用不了,需要下载tushare pro 在这里: https://tushare.pro/register?reg=385920
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import talib #计算均线的库,随便学一下,几分钟就懂
matplotlib.rcParams['axes.unicode_minus']=False #调整图像,可以注释掉,一般还是可以运行
ts.set_token('这里填入tushare pro 的token码,注册就会送')
#读取数据的代码
pro = ts.pro_api()#
df = pro.query('daily', ts_code='000001.SZ', start_date='20140801', end_date='20200810')
#####如果有其他数据库,可以直接从这开始####
#设置日期索引
df=df.sort_index()
df.index=pd.to_datetime(df.trade_date,format='%Y-%m-%d')
#收市股价
close= df.close
#每天的股价变动百分率
ret=df.change/df.close
# 8日的移动均线为目标,也可以时其他时间,8日最好了。。。哈哈
df1 = talib.MA(np.array(close), timeperiod=8)#调用talib的移动平均函数,很方便的
close8=df1
#处理信号
SmaSignal=pd.Series(0,index=close.index)#建立一个值全是0,索引为对应收盘价序列的时间Series序列
s=0#初始化参数,统计多头天数 可以不要
k=0#t统计触发次数 可以不要
for i in range(8,len(close)):#从第8天才开始判断操作条件,因为这时才有8天的第一个均值
if all([close[i]>close8[i],close[i-1]close10[i-1]]):#卖出信号 可换
SmaSignal[i]=0 #卖出为空
k+=1
else:
SmaSignal[i]=SmaSignal[i-1] #两个if都没执行,那就是和前一天状态一样,即不做任何操作
s=s+SmaSignal[i] #做多天数
ds=len(close)-s #做空天数
SmaTrade=SmaSignal.shift(1).dropna()#shift(1)表示整体下移一行 ,dropna表示删除NAN数据
SmaBuy=SmaTrade[SmaTrade==1]#这行没啥卵用,解释作用,注释掉一样的
SmaSell=SmaTrade[SmaTrade==-1]#也没啥用
SmaRet=ret*SmaTrade.dropna() #关键一行,将股价变动×信号序列,信号序列只有0 或 1 ,对应做多,做空。
#股票累积收益率
cumStock=np.cumprod(1+ret[SmaRet.index[0:]])-1
#策略累积收益率
cumTrade=np.cumprod(1+SmaRet)-1
#plt.rcParams['font.sans-serif']=['SimHei']
plt.plot(cumTrade,label="cumTrade",color='r',linestyle=':')
plt.plot(cumStock,label="cumStock",color='k')
plt.title("股票累积收益率与8日平均策略收益率")
plt.legend()
print("组合年化收益率:{}".format(cumTrade[-2]*250/len(close)))
print("操作{}次,,空头天数{},多头天数{}".format(k,s,ds))
打印结果:组合年化收益率:0.16512713439004603,高于长期持有
操作293次,空头天数740,多头天数728
这个结果还可以优化,毕竟空头728天,期间可以购买低于8天的其他资产,效果会更好。
为了方便展示,给的是固定利率的债券,只要是稳定的资产都可以,货币 /银行等。策略利用空头的时间投资债券,不考虑交易费用,假设轮转没有时间差,都是为了计算方便,且选用最好的参数值。实际效果会差很多。
#如果发现历史大概率均线策略有效,是否可以以此构造随机均线策略???
#单只股票以时间段T频率 判断是否调仓 T=49表现最好
# 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
matplotlib.rcParams['axes.unicode_minus']=False
ts.set_token('填入tushare pro平台的 token码')#获取地址 https://tushare.pro/register?reg=385920
pro = ts.pro_api()
#读取数据
df = pro.query('daily', ts_code='002526.SZ', start_date='20110801', end_date='20200810')
#这里之前是读取数据,可以换其他接口,公司内部数据库
#df=ts.get_hist_data('600848',start='2015-01-01',end='2015-12-31')
df=df.sort_index()
df.index=pd.to_datetime(df.trade_date,format='%Y-%m-%d')#设置日期索引
#收市股价
close= df.close
#每天的股价变动百分率
ret=df.change/df.close
for i in range(49,50):
T=5+i
# 10日的移动均线为目标
df = talib.MA(np.array(close), timeperiod=T)
close10=df
#处理信号
SmaSignal=pd.Series(0,index=close.index) #
s=0
k=0
for i in range(1, math.floor(len(close)/T) ):
if close[i*T]>close10[i*T]:
for j in range(i*T,i*T+T):
SmaSignal[j]=1
k+=1
s=s+SmaSignal[j]
#print("买一次")
else:
for m in range(i*T,i*T+T):
SmaSignal[m]=0
#多头天数
ds=len(close)-s #空头天数
SmaTrade=SmaSignal.shift(1).dropna()#shift(1)整体下移一行
SmaTrade2=(1-SmaSignal.shift(1)).dropna()
#SmaBuy=SmaTrade[SmaTrade==1]
#SmaSell=SmaTrade[SmaTrade==-1]
SmaRet=ret*SmaTrade.dropna()
ret2=ret*0+0.00015
SmaRet2=ret2*SmaTrade2.dropna()
#累积收益表现
#股票累积收益率
cumStock=np.cumprod(1+ret[SmaRet.index[0:]])-1
#策略累积收益率
cumTrade=np.cumprod(1+SmaRet)-1+np.cumprod(1+SmaRet2)-1
plt.rcParams['font.sans-serif']=['SimHei']
plt.plot(cumTrade,label="cumTrade",color='r',linestyle=':')
plt.plot(cumStock,label="cumStock",color='k')
plt.title("49日平均线调仓策略收益率")
plt.legend()
f=(cumTrade[-2]+1.00015**(ds)-1)*250/len(close)
print(f)
print("多头{}天,空头{}天".format(k,ds))
#print("组合年化收益率:{},高于长期持有".format(f)
#print( ",空头天数{},多头天数{}".format(s,ds) )
结果:股票972天,债券1019天
组合年化收益率:0.16348548234233906
1.python量化——alpha股票-指数期货对冲策略
2.多因子选股策略
3.海龟交易策略
4.移动平均策略——单/双均线策略
5.改进的美林时钟策略(一)
5.改进的美林时钟策略(二)
6.改进的美林时钟策略(三)