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

本文深入探讨了量化投资中移动平均策略的应用,包括单/双均线策略、股债轮动策略等,通过Python代码实例展示了如何利用tushare和talib库进行数据处理和策略回测,比较了不同策略的累积收益率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

免费数据库
注:重要的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]=1      #更新序列,买入 为1
        k+=1  #前面K不要,这里也就不要,下面的s同理
        #print("买一次")
    elif all([close[i]<close10[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天的其他资产,效果会更好。

收益拿来YY的,别介意---

股债轮动移动平均策略

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


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

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

搜索后的最好效果,YY一下

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、付费专栏及课程。

余额充值