服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

【手把手教你】基于均线排列的价格动量策略回测

日期: 来源:Python金融量化收集编辑:CuteHand
01

引言


动量策略是通过利用市场波动从现有趋势的延续中获利。简单来说,高买高卖,反之亦然(“低买高卖”是均值回归策略思想,与动量策略相反)。价值投资通常基于均值的长期回归,而动量投资基于均值回归发生之前的时间间隔。通常而言,基于过去回报(价格动量策略)或收益意外(称为收益动量策略)的策略是利用市场对不同信息的反应不足。换句话说,收益动量策略是基于对短期收益相关信息的反应不足中获利,而价格动量策略是基于从市场对更广泛信息(包括长期盈利能力)的缓慢反应中获利。动量策略的构建有两种思路,一种是个股历史价格动量,即与过去价格相比计算涨跌幅,也叫时间动量;另一种是截面动量,即对当前市场所有个股进行某期间涨跌幅排序,如欧奈尔的RPS指标。下面以简单的均线为例,构建均线多头排列的时间动量进行历史回测。数据获取、可视化和回测均用到公众号开发的qstock包(免费),关于qstock的数据、可视化、选股等详细教程请参阅以下推文:

【qstock开源了】数据篇之行情交易数据

【qstock数据篇】行业概念板块与资金流

【qstock量化】数据篇之股票基本面数据

【qstock量化】数据篇之宏观指标和财经新闻文本

【qstock量化】动态交互数据可视化

【qstock量化】技术形态与概念热点选股池

【手把手教你】使用qstock实现量化策略选股


02

Python计算均线动量


使用汉明距离(scipy.spatial.distance)度量均线多头排列的动量趋势。汉明距离是信息论里的一个概念,它表示两个(相同长度)字符串对应位置的不同字符的数量。汉明距离对向量按元素进行比较,并对差异的数量进行平均,如果两个向量相同,得到的距离是0之间,如果两个向量完全不同,得到的距离是1。

import numpy as np
import pandas as pd
import scipy.stats as stats
from datetime import timedelta
import scipy.spatial.distance as distance
import matplotlib.pyplot as plt
import qstock as qs


使用qstock获取回测用数据,以中国平安为例,基准指数为沪深300指数,回测期间为2010-2022年。


#获取数据
#data_feed是qstock回测模块获取数据函数,默认基准指数为沪深300
#fqt=2表示后复权数据,等于1表示前复权
df=qs.data_feed('中国平安',index='hs300',start='20100101',end='202201216',fqt=2)
#计算10个均线序列
for i in np.linspace(10, 100, 10):
    df[str(i)+'日均线']=df['close'].rolling(window=int(i),center=False).mean()
df.dropna(inplace=True)

均线数据可视化。

#均线可视化
cols=['close']+[str(i)+'日均线' for i in np.linspace(10, 100, 10)]
qs.line(df['2020':][cols])


cols=[str(i)+'日均线' for i in np.linspace(10, 100, 10)]

for date in df.index:
    #围绕每一日的均线大小进行排序
    ranking = stats.rankdata(df.loc[date,cols].values)
    #计算每一日均线之间的汉明距离(scipy.spatial.distance)
    df.loc[date,'scores']= distance.hamming(ranking, range(1,11))

个股价格与均线汉明距离得分数据可视化。

#价格走势与均线排列的汉明距离得分可视化
df[['close','scores']].plot(figsize=(15,7),secondary_y='scores', alpha=0.6)
plt.show()

#描述性统计
df[['close','scores']].describe()


03

动量回测


策略思路:当短期均线大于长期均线呈现多条均线的多头排列时,买入做多,当均线呈现空头排列时卖出。使用汉明距离可以度量均线的多头与空头排列得分,当出现完美的均线多头时(短期均线依次大于长期均线,如10日MA > 20日MA >… 100日MA),得分为1;当出现完美的空头时,即短期均线依次小于长期均线,如10日MA < 20日MA <… <100日MA)得为0,其他均线排列得分位于0-1之间。可以根据得分设定一个门槛值,如当scores得分大于0.5,给出买入或持有的信号,否则为卖出或做空信号。

#封装成函数方便后面进行回测分析
def ma_momentum(code,benchmark='hs300',start='20100101',end='202201219',ma_list=None,threshold=0.8):
    df=qs.data_feed(code,index=benchmark,start=start,end=end,fqt=2)
    ss=np.linspace(10, 100, 10) if ma_list is None else ma_list
    for i in ss:
        df[str(i)+'日均线']=df['close'].rolling(window=int(i),center=False).mean()
    df.dropna(inplace=True)
    cols=[str(i)+'日均线' for i in ss]
    for date in df.index:
        ranking = stats.rankdata(df.loc[date,cols].values)
        df.loc[date,'scores']= distance.hamming(ranking, range(1,len(ss)+1))
    #当日均线多头排列scores=1发出买入信号设置为1
    df.loc[df['scores']>threshold, 'signal'] = 1
    #当日均线空头排列scores=0发出买入信号设置为0
    df.loc[df['scores']<=threshold, 'signal'] = 0
    df['position']=df['signal'].shift(1)
    df['position'].fillna(method='ffill',inplace=True)
    d=df[df['position']==1].index[0]-timedelta(days=1)
    df1=df.loc[d:].copy()
    df1['position'][0]=0
    #当仓位为1时,买入持仓,当仓位为0时,空仓,计算资金净值
    df1['capital_ret']=df1.rets.values*df1['position'].values
    #计算策略累计收益率
    df1['capital_line']=(df1.capital_ret+1.0).cumprod()
    return df1
#可以通过ma_list自定义设置ma均线计算周期
#如ma_list=[3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
#ma_list=None表示默认使用10-100日均线
data=ma_momentum('中国平安',ma_list=None,threshold=0.8)

回测结果。

qs.start_backtest(data)


修改均线参数,同时以贵州茅台个股为例重新进行回测。

fib=[3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
data=ma_momentum('贵州茅台',ma_list=fib,threshold=0.5)
qs.start_backtest(data)

此外,介绍一个非常简单易上手的回测框架quantstats,下面使用它展示历史回测结果。注意quantstats要先使用"pip install QuantStats"进行安装,注意安装的时候包含大写字母,导入使用小写字母。quantstats与pyfolio类似,一行代码可以实现丰富的回测图表,下面只展示部分结果。如下面输入qst.reports.html(data.capital_ret),可以生成本地基于web的html回测结果。关于pyfolio的回测用法可以参照推文:《Pyfolio一行代码实现专业量化回测图表》

import quantstats as qst
qst.reports.full(data.capital_ret)


04

结语


本文利用汉明距离计算均线排列的得分来评估股价的动量趋势,并以此构建择时交易策略,即当呈现多头均线排列的趋势时买入,空头排列时卖出。以中国平安和贵州茅台个股为例进行了历史回测,结果显示该交易策略优于买入持有和基准指数。


对于历史上证明有效的任何策略,通常有两种解释,该策略已经补偿了它所承担的额外风险,或者存在溢价行为因素。那为什么动量策略有效?动量策略起作用的逻辑在于,投资者表现出一长串行为偏见和情绪错误。然而,这说起来容易做起来难,因为趋势不会永远持续下去,并且在达到顶峰和结束时可能会迅速逆转。动量交易比大多数其他策略具有更高程度的波动性,并试图利用市场波动性。通过使用适当的风险管理技术和止损,正确安排买卖时间以避免损失非常重要。


最后为有意加入知识星球的新用户送上100张89元的优惠券,新用户或续费用户在加入前可先添加星主微信 “sky2blue2” 了解更多优惠信息。


关于Python金融量化








专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取qstock源代码、30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、与博主直接交流、答疑解惑等。添加个人微信sky2blue2可获取相关优惠。

相关阅读

  • 晨报|房地产政策如何“出实招”

  • >>>晨会聚焦<<<陈聪|中信证券基础设施和现代服务产业首席分析师S1010510120047地产|房地产政策如何“出实招”我们相信,不利于消费需求释放的限制性政策将有望很快放开,各地的限
  • 因诺资产:因为承诺,所以全力以赴

  • 截至2022年10月底,存续私募基金管理人23967 家,存续基金规模近20万亿元,其中私募证券投资基金管理人9068家,存续私募证券投资基金89390只,存续基金规模近6万亿。日常我们经常看到
  • 因子动量和动量因子

  • 作者:石川,北京量信投资管理有限公司创始合伙人,清华大学学士、硕士,麻省理工学院博士。《因子投资:方法与实践》领衔作者,《机器学习与资产定价》译者。封面来源:https://www.pexe
  • 为什么我们要善良

  • ‍点击图标可收听喜马拉雅主播【如梦2017】朗读音频‍‍本文全长10221字我从小就不是一个诚实的孩子,偷家里钱、偷外面小摊上的东西、抄作业、考试作弊、骗家长骗老师……这
  • 2023,什么是投资的确定性

  • 2022总算过去了,借用一句上周听来的话,那是体无完肤的一年、也是充满不确定性的一年。投资本就是一门在不确定性中寻找确定性的学问,去年的不确定性让我对什么是确定性有了些许
  • 《頂尖設計師的跨域對談》設計策略篇|曾國榕

  • 类型:对谈收集:毫克//////////●○曾國榕- justfont 字體設計師若把字體比喻為演員,那麼感受不同演員的演出,那是社會大眾都該欣賞的。至於創造演員的重責大任,就由字型設計師們
  • 《頂尖設計師的跨域對談》設計策略篇|何庭安

  • 类型:品牌收集:毫克//////////●○何庭安- 平面設計師因大學時校方自薦重新設計校方識別,自此開始深入藝術指導工作。認為世上一切事物與體驗都與設計息息相關,致力於提供具品牌

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 【手把手教你】基于均线排列的价格动量策略回测

  • 01引言动量策略是通过利用市场波动从现有趋势的延续中获利。简单来说,高买高卖,反之亦然(“低买高卖”是均值回归策略思想,与动量策略相反)。价值投资通常基于均值的长期回归,而动
  • 数据治理体系建设与数据资产路线图规划

  • 须知公众号推文规则变了,读者会错过文章更新,点击上方 "企业数字化咨询"关注, 设为星标后台回复【技术】,申请加入行业技术交流与资料分享群加入会员服务可获取更敏捷服务企业
  • 中国智慧企业发展报告(2022年)

  • 须知公众号推文规则变了,读者会错过文章更新,点击上方 "企业数字化咨询"关注, 设为星标微信公众号后台(非留言)回复“资料”可获得该文章PDF资料获取方式~~~加入会员服务可获取
  • 如何进行高质量年终总结?

  • 须知公众号推文规则变了,读者会错过文章更新,点击上方 "企业数字化咨询"关注, 设为星标后台回复【技术】,申请加入行业技术交流与资料分享群加入会员服务可获取更敏捷服务2022
  • 2022年数字化工厂转型调研报告(满分)

  • 须知公众号推文规则变了,读者会错过文章更新,点击上方 "企业数字化咨询"关注, 设为星标微信公众号后台(非留言)回复“资料”可获得该文章PDF资料获取方式~~~加入会员服务可获取
  • 谈PDM与PLM之关系

  • 须知公众号推文规则变了,读者会错过文章更新,点击上方 "企业数字化咨询"关注, 设为星标后台回复【技术】,申请加入行业技术交流与资料分享群加入会员服务可获取更敏捷服务导读:P