python量化策略——(单个和双均线)移动平均策略

量化投资——移动平均策略详细版

免费数据库
注:重要的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天的其他资产,效果会更好。

python量化策略——(单个和双均线)移动平均策略_第1张图片

股债轮动移动平均策略

为了方便展示,给的是固定利率的债券,只要是稳定的资产都可以,货币 /银行等。策略利用空头的时间投资债券,不考虑交易费用,假设轮转没有时间差,都是为了计算方便,且选用最好的参数值。实际效果会差很多。


#如果发现历史大概率均线策略有效,是否可以以此构造随机均线策略???

#单只股票以时间段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

python量化策略——(单个和双均线)移动平均策略_第2张图片

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

你可能感兴趣的:(python量化,python,sql,数据库,机器学习)