1引言
大部分量化策略都可以归类为均值回归与动量策略。事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利。否则,价格是随机游走的,交易将无利可图。均值回归是金融学的一个重要概念,指股票价格无论高于或低于价值中枢都会以很高的概率向价值中枢回归的趋势。中国古语“盛极而衰,否极泰来”,就暗含着均值回归的思想。如果说要为均值回归寻找一个比较合理的理论解释,不妨借鉴一下索罗斯的“反身性理论”。索罗斯认为。市场中存在正反馈和负反馈组成的反馈环(系统理论里的概念),其中正反馈是自我强化的过程(惯性或趋势),而负反馈是一个自我纠正的过程,倾向于把价格带回到均值附近,如股票经过大幅上涨后,总有一些交易者会因为股票价格过高而抛售,一旦没有足够的买盘跟进,少数人的抛售就会引起价格下跌,而价格的下跌会引起更多人的抛售,从而形成下跌的正反馈效应。本文以Zscore为指标构建均值回归的交易策略,并使用Pandas搭起基于研究的量化回测框架,以后将逐渐转向使用面向对象的编程方法来搭建基于事件驱动的量化回测系统(基于事件驱动的回测框架是主流)。
2策略思想
均值回归策略的思想在引言中已有所介绍, 此处不详细展开。其实,大家熟知的巴菲特价值投资策略和索罗斯的“反身”交易策略,从本质上来看都是均值回归理论的应用,所不同的是前者是基于价值低点向高点回归做多获得收益,后者则是通过泡沫破灭价值从高点向低点回归时做空进行投机获利。均值回归策略的思想很容易理解,实际操作中有很多构建的方法,比较常见的利用股价收益率偏离某段期间均值的若干个标准为阈值作为均值回归策略的买入卖出信号。下面将基于该原理,计算股价收益率的Zscore值,即以标准差为单位来衡量某一日收益率与平均收益率之间的离差情况。Talk is cheap, show your code!下面直接给出使用Python构建量化回测框架的过程和回测结果。
3使用Python进行策略回测
01
数据准备与探索分析
全文使用tushare获取股票数据,在Jupyter notebook上运行代码。长期关注本公众号的朋友不难发现,第一段代码基本上在每篇文章中都会出现,引入可能用到的库以及从tushare上下载数据,这一段可以作为数据分析的模板,在以后的文章中可能会省略掉,直接上核心代码。
从中国平安的股价走势来看,其单边趋势强于震荡趋势,因此均值回归策略可能不是中国平安在这段期间的最优策略,下面的回测结果将进一步展示。下面先来看看中国平安股票日收益率的波动及对标准差的偏离情况。日收益率图显示存在明显波动集聚的情况。日收益率标准化图是计算日收益率的滚动20日Zscore值,即当前收益率对其20日均值的标准差偏离度,此时波动集聚的情况不存在了。图中设定1.5倍标准差为阈值,偏离绿色线的点将作为买入卖出信号。
02
策略设计与回测
回测结果分析
下面分别选择中国平安、奥马电器和九州通股票进行均值回归策略回测,时间区间为2015年10月9日至2019年10月11日,跨度四年左右。结果显示出均值回归策略对不同标的表现差异较大。值得注意的是奥马电器由于2018年出现19亿巨亏的黑天鹅事件,股价从16.53跌至3.19,最大回撤高达86%,回测期间总收益-29%;策略回撤也达到56%,但是总收益为正2.4%。总体而言,均值回归策略应用了股市投资中经典的高抛低吸思想,该类型策略一般在震荡市中表现优异(九州通);但是在单边趋势行情中一般表现糟糕(中国平安),往往会大幅跑输市场(奥马电器)。#对中国平安股票进行策略回测
stock='中国平安'd1,trade=main(stock,'20151009','20191011')
plot_strategy_signal(d1,trade,stock)
输出回测结果
回测标的:中国平安
==============每笔交易收益率及同期股票涨跌幅===============
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
stock='奥马电器'
d1,trade=main(stock,'20151009','20191011')
plot_strategy_signal(d1,trade,stock)
回测标的:奥马电器
回测期间:20151009—20191011
==============每笔交易收益率及同期股票涨跌幅===============
略
====================账户交易的各项指标=====================
交易次数为:24 最长持有天数为:65
每次平均涨幅为:0.014195
单次最大盈利为:0.491054 单次最大亏损为:-0.452403
年均买卖次数为:6.522710
最大连续盈利次数为:4 最大连续亏损次数为:2
策略年胜率为:40.0%
策略月胜率为:65.0%
策略周胜率为:51.89%
总收益率: 策略8.18%,股票-68.03%, 指数22.43%
年化收益率:策略2.46%, 股票-29.7%,指数6.45%
最大回撤: 策略56.72%, 股票86.1%,指数26.39%
策略Alpha: -0.01, Beta:0.59,夏普比率:0.37
stock='九州通'
d1,trade=main(stock,'20151009','20191011')
plot_strategy_signal(d1,trade,stock)
回测标的:九州通
回测期间:20151009—20191011
==============每笔交易收益率及同期股票涨跌幅===============
略
====================账户交易的各项指标=====================
交易次数为:33 最长持有天数为:50
每次平均涨幅为:0.006272
单次最大盈利为:0.103585 单次最大亏损为:-0.142085
年均买卖次数为:8.665468
最大连续盈利次数为:6 最大连续亏损次数为:3
策略年胜率为:60.0%
策略月胜率为:58.54%
策略周胜率为:51.69%
总收益率: 策略16.93%,股票-27.96%, 指数1.57%
年化收益率:策略4.21%, 股票-8.28%,指数0.41%
最大回撤: 策略25.56%, 股票49.51%,指数32.46%
策略Alpha: 0.04, Beta:0.39,夏普比率:0.31
4结语
本文主要介绍了均值回测策略的基本思想,以及使用Pandas构建基于研究的量化回测框架对策略进行回测,回测结果比较直观(感兴趣的朋友可以把交易费用和滑点价差考虑进去,文中设置为0了)。当然,上述回测框架还存在一些细节问题需要完善,而且基于研究的回测框架和基于pandas的向量式编程存在一定的局限性,尽管容易理解,但不适合用于处理更复杂的交易情形。以后有机会将为大家介绍使用面向对象编程(Class类)的方法构建基于事件驱动的量化回测框架,可以借鉴backtrader、zipline等开源框架。尽管均值回归非常普遍,但要准确回测一个盈利的均值回归策略却存在很多陷阱。比如,许多历史金融数据库中都包含报价错误,而这些错误可能会抬高均值回归策略的业绩。另外,存活偏差也会影响均值回归策略的回测,即那些股价一直下跌最后退市而没有出现均值回归的股票早已从数据库中剔除。对于均值回归策略而言,典型的结果就是套利机会的逐步消失,从而使得收益率逐渐降低至零。当套利机会消失殆尽时,均值回归策略就变得没那么有效,因为越来越多的交易信号来自于股票估值的基本面变化,而这并不会均值回归。