绝大多数量化投资策略都可以被归入均值回归或动量策略的范畴。事实上,只有当股票价格呈现出明显的均值回归或趋势特征时,交易策略才有可能实现盈利。否则,如果价格走势呈现随机游走状态,那么交易活动将难以获得正向收益。均值回归是金融学中的一个核心概念,它指的是股票价格无论处于价值中枢的上方还是下方,都有很大概率向该中枢回归的动态过程。中国古老的谚语“物极必反,否极泰来”就蕴含着均值回归的深刻哲理。如果需要为均值回归提供一个相对合理的理论支撑,不妨参考一下索罗斯的“反身性理论”。索罗斯认为市场中存在着由正反馈和负反馈构成的复杂反馈环(系统理论中的专业术语),其中正反馈代表着自我强化的机制(即惯性或趋势效应),而负反馈则是一个自我修正的过程,其作用是将价格拉回到均值附近。例如,当股票经历大幅上涨后,总会有部分交易者因为觉得价格过高而选择抛售,一旦买方力量不足,少数人的抛售行为就可能引发价格下跌,而价格的下跌又会吸引更多交易者加入抛售行列,从而形成下跌的正反馈循环。本文将采用Zscore指标来构建均值回归的交易策略,并利用Pandas构建一个基于研究的量化回测框架,未来计划逐步转向使用面向对象的编程方法来开发基于事件驱动的量化回测系统(目前主流的回测框架多采用事件驱动模式)。
关于均值回归策略的基本思想,在部分已有简要介绍,此处不再赘述。实际上,广为人知的巴菲特价值投资策略和索罗斯的“反身性”交易策略,本质上都是均值回归理论的实践应用,二者的区别在于前者侧重于价值低点向高点回归时做多获利,而后者则是在泡沫破裂、价值从高点向低点回归时做空以获取投机收益。均值回归策略的核心思想相对容易理解,但在实际操作中存在多种构建方法。比较常见的一种方法是利用股价收益率偏离特定时期均值的若干标准差作为阈值,以此作为均值回归策略的买入卖出信号。下面将基于这一原理,计算股价收益率的Zscore值,即以标准差为衡量单位来评估某一日收益率与平均收益率之间的偏离程度。空谈误事,实践出真知!接下来将直接展示使用Python构建量化回测框架的具体过程和回测结果。
01 数据准备与探索性分析
全文采用tushare获取股票数据,在Jupyter notebook环境中执行代码。对于长期关注本公众号的读者来说,不难发现,第一段代码几乎在每篇文章中都会出现,主要功能是导入可能用到的库以及从tushare下载数据,这一部分可以作为数据分析的通用模板,在后续文章中可能会简化,直接呈现核心代码。
从中国平安的股价走势图可以看出,其单边趋势特征比震荡趋势更为显著,因此均值回归策略可能并非中国平安在此期间的最优选择,接下来的回测结果将对此进行验证。首先,让我们观察中国平安股票日收益率的波动情况及其对标准差的偏离程度。日收益率图显示出明显的波动集聚现象。而日收益率标准化图(即计算日收益率的滚动20日Zscore值,表示当前收益率对其20日均值的标准差偏离度)则表明,波动集聚现象已经不存在。在图中,我们设定1.5倍标准差为阈值,偏离绿色参考线的点将被视为买入或卖出的信号。
02 策略设计与回测
加载数据
此处加载open、close、low、high和vol等数据主要是为了后续的可视化分析。在数据获取过程中,以沪深300指数作为参考基准,读者可以根据自己的需求进行调整。
交易策略
计算日收益率的滚动20日Zscore值,当Zscore小于-1.5且第二天开盘价未触及涨停板时,于第二天开盘时买入;当Zscore大于1.5且第二天开盘价未触及跌停板时,于第二天开盘时卖出,每次交易均采用全仓操作。
计算策略的评估指标
完整代码仅在知识星球上分享,有意向的读者可扫描页面底部二维码加入。
输出回测结果
回测标的:中国平安
回测期间:20151009—20191011
==============每笔交易收益率及同期股票涨跌幅===============
start_date end_date trade_return stock_return
16 2015-11-30 2015-12-03 0.054617 0.062943
21 2015-12-07 2015-12-15 0.014286 0.008871
37 2015-12-29 2016-02-01 -0.155182 -0.172830
74 2016-02-26 2016-03-03 0.031370 0.049032
123 2016-05-09 2016-05-13 0.005099 0.010190
156 2016-06-27 2016-07-13 0.046194 0.040052
180 2016-07-29 2016-08-10 0.001848 0.002772
193 2016-08-17 2016-09-20 0.033013 0.033413
220 2016-09-27 2016-10-31 0.004965 0.006689
242 2016-11-03 2016-11-22 0.035270 0.043629
262 2016-12-01 2017-01-17 -0.007703 -0.009634
303 2017-02-06 2017-02-21 0.030497 0.032285
346 2017-04-10 2017-04-26 0.000273 0.024861
365 2017-05-08 2017-05-11 0.068169 0.067365
391 2017-06-15 2017-07-06 0.068447 0.088540
418 2017-07-24 2017-08-02 0.052418 0.040032
502 2017-11-24 2017-12-11 -0.039784 -0.014396
526 2017-12-28 2018-01-16 0.104979 0.106040
548 2018-01-30 2018-02-14 -0.074074 -0.060932
582 2018-03-26 2018-04-11 -0.013005 -0.037411
604 2018-04-27 2018-05-09 -0.007082 -0.002692
626 2018-05-31 2018-06-01 0.013092 0.016323
639 2018-06-20 2018-07-02 -0.058481 -0.110647
648 2018-07-03 2018-07-10 0.061150 0.053605
670 2018-08-02 2018-08-08 0.002356 -0.022110
680 2018-08-16 2018-09-05 0.142426 0.101175
695 2018-09-06 2018-09-25 0.077294 0.080475
712 2018-10-09 2018-10-22 0.021354 0.048627
727 2018-10-30 2018-11-05 0.108334 0.073872
799 2019-02-18 2019-02-19 0.026291 0.038420
806 2019-02-27 2019-04-01 0.109530 0.122698
851 2019-05-07 2019-05-13 -0.030937 -0.031403
912 2019-08-01 2019-08-13 -0.017714 -0.034963
930 2019-08-27 2019-09-16 0.057058 0.052755
====================账户交易的各项指标=====================
交易次数为:34 最长持有天数为:47
每次平均涨幅为:0.022540
单次最大盈利为:0.142426 单次最大亏损为:-0.155182
年均买卖次数为:8.953824
最大连续盈利次数为:8 最大连续亏损次数为:3
策略年胜率为:80.0%
策略月胜率为:77.5%
策略周胜率为:59.26%
总收益率: 策略102.33%,股票177.87%, 指数5.55%
年化收益率:策略20.19%, 股票30.56%,指数1.42%
最大回撤: 策略19.17%, 股票28.54%,指数32.46%
策略Alpha: 0.2, Beta:0.43,夏普比率:1.92
本文主要阐述了均值回归策略的基本理念,并展示了如何运用Pandas构建基于研究的量化回测框架对策略进行实证检验。回测结果较为直观(对结果感兴趣的朋友可以尝试考虑交易费用和滑点价差等因素,本文中这些成本均设为零)。当然,上述回测框架仍存在一些细节问题需要进一步完善,而且基于研究的回测框架与Pandas的向量式编程在处理复杂交易场景时存在一定局限性。尽管它们易于理解,但并不适合应对更复杂的交易情形。未来计划采用面向对象编程(Class类)的方法来开发基于事件驱动的量化回测框架,可以参考backtrader、zipline等开源框架的设计思路。尽管均值回归策略应用广泛,但要精确回测出一个盈利的均值回归策略却充满挑战。例如,许多历史金融数据库中可能存在报价错误,这些错误可能会虚增均值回归策略的业绩表现。此外,存活偏差也会对均值回归策略的回测结果产生影响,即那些股价持续下跌最终退市的股票往往被数据库排除在外。对于均值回归策略而言,随着套利机会的逐渐消失,收益率可能会逐渐趋近于零。当套利机会几乎消失时,均值回归策略的有效性就会大打折扣,因为越来越多的交易信号源于股票估值的基本面变化,而这类变化并不符合均值回归的预期。
关于Python金融量化
专注于分享Python在金融量化领域的应用。加入知识星球,即可免费获取量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,并与博主直接交流、结识圈内朋友等。