策略篇:残差项的均值回归——实证部分
由polll创建,最终由polll 被浏览 69 用户
写在前面
这一篇是基于上篇文章提出的方法的实证部分:
Wu Kevin:策略篇——残差项的均值回归zhuanlan.zhihu.com
之前承诺的对于上篇的实证现在才兑现,主要原因是我前期一直忙于秋招,无瑕顾及更新了。目前总算是定下来了,庆幸的是我还在量化这条路上,只不过今后的研究会更加偏向宏观层面,以后的分享也是偏宏观一些的量化研究,这篇研究也算是我原创性的job market research之一,特此分享。
这篇文章的一大贡献是,提供了(实证了)均值回复建模的一个参考方法,对于任何具有均值回复特征(全局均值回复或局部均值回复)的序列都可以套用。
在已知股票价格序列本身不平稳的前提下,本文通过线性回归得到股票收益的“残差项”后,重新构造了一个新的价格序列。在假设这个价格序列符合平稳特征,用时间序列方法OU过程对其建模。识别其渐进均值和方差后建立置信区间,当价格偏离置信区间时,对个股持有相反头寸,构建了一个A股多空组合。回测来看,组合年化Sharpe 达3.22,最大回撤仅3.2%(不考虑手续费)。该方法的面临的问题是A股做空的限制和达28倍的年化换手率。继续发现,本文OU过程建模方法优于布林带方法。
一、 前言
均值回归广泛存在于金融市场,均值回复在行为金融学上的解释为:投资者的过度反应(De Bondt and Thaler 1984)
技术面指标中,布林带就有应用:当股价偏离上带或者下带时,认为股价会回复。布林带由于简单(回看定长区间计算均值和标准差)和实用性自1980年提出以来广受欢迎。
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='443' height='354'></svg>)
图1:标普500指数20日移动平均和移动两倍标准差构造布林带,来源维基百科
但是布林带存在的问题是:价格序列并不平稳[1],这导致简单样本平均和取标准差的做法缺乏严格的统计意义。
构建平稳价格序列的一种方法是对两个价格序列做差分,对差分序列均值回归(配对交易):Elliott et al (2005) 应用了OU过程(Ornstein–Uhlenbeck Process),提出了对一组协整的价格序列建模的方法。
股价的非平稳原因之一是市场风格的持续性,自然想到个股的特质收益率(剔除掉市场的解释后个股剩下的收益,也即“误差项”)
个股的“误差项”是本文研究的对象,“误差项”即为在套利定价理论(arbitrage pricing theory)框架下的个股特质收益率,或者说线性模型假设下的误差项:
其中 为个股 的收益, 为横截面定价因子, 为我们的研究对象:“误差项”。
误差项在线性模型中外生于解释变量,在个股定价模型中,被称为“特质收益率”。很自然的,特质收益率对应了价格,设特质收益率的价格为 ,那么X_{i,t}=X_{i,t-1}(1+\hat{\varepsilon}{i,t}),\forall \n e1;X{i,0}=1 。
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='480' height='288'></svg>)
图2:贵州茅台(600519.SH)股价净值和特质收益率净值
图2中蓝线是贵州茅台的根据真实收益率绘制的净值曲线,红线为根据特质收益率(误差项)绘制的净值曲线。可以看出,即使股价自14年开始一直是趋势效应,特质收益率净值却依然很平稳。
Yeo and Papanicolaou (2017)用了多个公共因子对个股进行线性回归获得残差项,利用了OU过程对残差价格曲线建模,对标普500成分股从2005年到2014年进行择时并构建组合,回测结果显示该策略可以获得年年正收益且年华收益平均近10%。但文章组合优化的参数过多。
本文采用OU过程对特质收益率价格序建模,构建识别序列上下界的类“布林带”的择时指标。并在A股市场实证。
二、 模型设定
2.1 OU过程OU过程的正式表达式为:
其中:
- 为随机变量 的渐进均值
- 为随机变量 的回归速度
- 为维纳过程增量的标准差
- 为维纳过程
OU过程描述了这样一个过程:当 大于 ,在不考虑随机项 的情况下, ,使得 在那一瞬间有一个向下的斜率,符合均值回复的直觉。
下面展示三组不同参数下的OU过程的模拟:
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='625' height='150'></svg>)
图3:OU过程在不同参数下的模拟
图3的第一和第二幅图可以看出:在随机项的波动率一样的情况,回归速度 越小(子图(1)),回归的周期越长。
由于真实世界的价格信息是离散的,所以可以考虑OU过程的离散形式(更重要的原因是离散情况下更简单):
(需要注意的是:在离散的情况下 里面的 应该为 , 因为离散情况下没有办法通过求导刻画“瞬时”状态,只有通过前后期的差分体现)。
离散的维纳过程描述了这样一个情景: 时间序列的每一个增量 (increment) 都是独立同分布的(服从 的正太分布,本文中 )。
所以(3)式可以化简为
(4)式中 由上一期值 与均值的偏离度 ,和回归速度 决定。
进一步可以化简成AR(1)过程:
其中
可以证明 为弱平稳过程, (证明见附录1)
值得注意的是: 当假设了 的正态性后, 的独立同分布性质与序列白噪声(white noise)或者是鞅差分序列(Martingale difference sequence)是等价的,所以独立同分布在这儿可以放松到最弱的白噪声过程。
2.2 误差项的构建
误差项通过回归以下线性模型得到:
自变量为Fama-French 6因子加一个行业因子一共7个因子。行业因子由于和市场因子存在共线性,遂将行业收益与市场收益回归得到的残差项作为正交化的行业收益率。
我们研究的对象是误差项本身,任何的市场风格都会干扰的误差项的纯度,所以需要尽可能多的因子来控制市场风格。虽然多解释变量会而增大估计量的方差,但是我认为这种牺牲是有必要的。
(注:以上回归是时间序列回归,也可以用截面回归,对于到底控制多少变量是个值得讨论的话题)
三、 数据描述和可视化
3.1 数据来源
个股数据来源于wind数据,样本包括自2008年1月至2018年8月的全A股约3500支个股日行情数据,中信一级行业日收益率;Fama-French 6因子数据来源于中央财经大学官网[1],国泰安数据库,因子构建的过程见附录2
由于行业风格必须要得到控制,我剔除掉不能被中信一级行业归类的和上市不足一年(日历日365天)的股票,剩下2629支个股作为样本池。
图4为6因子从09年开始的净值曲线。
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='524' height='320'></svg>)
图4:6因子净值
3.2 构建残差净值
残差项净值序列 的构建如下:
1. 对于任意一个时期t,回看125个交易日OLS回归模型(6)得到参数估计量( ),继而计算“残差项”:
2. 根据估计得到的特质收益率 ,按照累计复利计算 ,
选择125个交易日的原因如下:我认为回归的时间窗口过长(1年)会导致估计量滞后,不能及时反映当前市场变化;时间窗口太短(3个月)导致估计量不稳定,所以考虑半年的时间窗口是合意的。
通过计算:平均来看7因子对个股回归的调整R方达0.4以上,具有较高的解释力度。
由于误差项是通过(5)式子OLS回归得到,在经典的线性模型假设下,(5)式的误差项是独立同分布的。把误差项(特质收益率)做成价格的做法类似于把误差项累计求和(对数收益率求和为累计收益率),那么独立正态分布的随机变量的求和序列是随机游走的,似乎和均值回复的特征相矛盾。
但是现实是:截面定价的残差项(不再是理论上的误差项)彼此并不是独立的,而是存在序列相关性,此相关性来源于被解释变量也就是个股收益率在时间序列上的相关性,所以该相关性导致随机游走的说法不成立。在已知特质收益率价格序列不是随机游走的情况下,我们不关心特质收益率的任何性质,只需要关注误差项合成的价格序列 的性质。
这里需要引用一篇启发本文的文章, @石川 在文章次世代均值回归策略中提到:
“‘价格呈现均值回归’等价于‘收益率呈现序列负相关性’。这是一种非常好的、可以被拿来构建优秀策略的特性。 ‘收益率呈现均值回归(即收益率围绕 0 随机的上下波动)’等价于‘价格呈现随机游走’。这是投资品最差的一种形态(不幸的是,这也恰恰是实际中的情况),在这种情况下不存在有效的赚钱策略(运气除外)。”
所以我认为:均值回复策略只能建立在价格序列上。
3.3 检验
由于对 的弱平稳的协方差的推导中,使用了 cov(\varepsilon_t,\varepsilon_{s})=0,\forall \n e s 这个条件,也即 和 不存在线性相关性,满足白噪声过程。要认为模型是正确的,需要对 进行白噪声检验。当证明了线性无关性,在给定正太的假设下,同时证明了独立性
另一个事实是:特质收益与市场收益依然存在相关性,原因如下:
- 滚动时序回归的方法不能完全剔除市场效应(参数估计存在滞后性);
- 截面定价模型并不能刻画被解释变量和误差项的时间序列上的自相关性,而自相关性与市场环境相关。
以上原因导致 的分布是和时间相关的,所以对 的参数的样本选取也要随时间变化,这导致我们的白噪声检验也是发生在局部而不是全局。
于是我在样本窗口内随机抽取个股连续252个交易日做Box-ljung白噪声检验,发现全样本2629支股票中有2049支不能拒绝白噪声原假设。
总的来说:大部分个股特质波动率建模后的 局部来看还是能够满足白噪声过程。一个正式的表达如下:
根据过去估计出来关于 的参数:渐进均值 ,回归速度 和随机项的波动率 和时间相关,变为 , 和 ,并且具有一定的稳定性,可以据此对未来短期内做统计推断。
3.4 建立置信区间
当序列满足模型的假设时,便可以建立置信区间用来刻画序列运动的预期通道。
对每一支个股站在t时刻回看252个交易日滚动做如下的操作:
- 采用OLS估计 ,并计算渐进均值 和回归速度 ;
- 建立置信区间:
这里的数字2表示:当一个服从正太分布的随机变量偏离原假设期望(可正可负)的2倍(严格为1.96,文章实证采用1.96)标准差时,在5%的显著性水平下拒绝原假设期望。5%的显著性水平也是在实证计量经济学公认的显著性水平,将其固定后不再是一个参数。
下面对比布林带方法,试图将置信区间可视化。
布林带方法构造如下:
- 计算252个交易日移动均值和移动标准差(布林带构造方法)
- 建立置信区间: 20日移动平均 2倍20日移动标准差
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1713' height='481'></svg>)
图6:OU过程(左)布林带(右)建立置信区间方法的对比:贵州茅台(600519.SH)
可以看出:用简单移动平均的建立的置信区间虽然平稳,但是滞后性太强,对当前价格变动不敏感,而OU过程置信区间克服了这一缺点。
由于模型设定中 , 当 ( ,意味着回归速度为负)会导致方差识别失败( 分母根号内为负),举个例子:
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='881' height='471'></svg>)
从图7中可以看到在12年至13年间价格急升和13年至14年的明显趋势价格下,方差识别失败,说明样本并不满足均值回复的特征,这时对其做均值回复策略的时候需要谨慎。
四、 回测
4.1 开平仓信号
构建这样的投资组合:每天根据昨天产生的多/空/平信号,在今天的收盘价做多/做空/平仓构建一个投资组合,该投资组合的每支个股开平仓信号产生如下:
- 股票的样本池为全样本2629支股票按照市值剔除前后10%的股票[1]
- 开仓:当特质收益率价格向上偏离置信区间,产生卖空信号;向下偏离,产生买多信号
- 平仓:当特质收益率价格回到0.67倍标注差时产生平仓信号
第3步中:0.67倍标准差的含义是:一个服从正态分布的随机变量偏离均值0.67倍标注差以内的概率为0.5。
也就是当我们只有50%的把握认为特质收益率净值偏离均值时,平仓。这里的0.67倍固定下来不再是参数。
( [1] 为了得到不同参数下的稳健性,往往需要做市值控制。即使控制其他条件不变,剔除市值排前后1%的个股,回测年化夏普比仍可达到2.91。为了前后一致性,选择前后10%)
4.2 开仓信号限定
由于样本池为全A股,同时我们需要对组合规模有所掌控。所以在每次开仓时,需要对进入组合的个股进行限制:
- 在产生开仓信号的个股中, 如果排在横截面上所有个股90以外,不开仓
-
- 3个月内存在长达5个交易日的回归速度 为负的不开仓
第1步中的 是回复速度,我认为回复速度越快的,在未来有更大的概率做均值回复;第2步:回忆图中的置信区间缺失部分,置信区间缺失表面当前特质收益率价格以趋势为主,均值回复的概率小。
4.3 回测结果
回测设定如下:
- 每天按照收盘价计算个股加权平均收益率,每天调整权重使得总多空头寸持平,多/空内部等权
- 分别考虑不算手续费和手续费双边0.002(千二),手续费包括开平仓手续费和权重调整费用
- 计算每天的组合收益率,设定初始投资额为1按照累计复利计算组合净值
回测结果如下:
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1332' height='436'></svg>)
图8:组合净值和同期沪深300净值(左为0手续费,右为千二手续费)
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1232' height='162'></svg>)
表1:组合表现统计量
图8中的蓝线是组合的绝对收益净值(不是超额),红线为沪深300从2010-7-28开始的净值。可以看到构建的组合可以实现年年正回报,回测期8年内(2010-7-28至2018-7-5)跑赢沪深300(超额125.0%)。最大回撤仅3.3%!但是由于策略本身的个股择时的属性,导致其年化换手率高。
目前的疑问是:我们建模的对象是特质收益率价格,并不是股价,这种关系是怎么对应上去的呢?
以为鄂武商A(000501.SZ)为例:
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='602' height='586'></svg>)
图9:鄂武商A(000501.SZ)特质收益率价格择时、开平仓信号对应股价净值,择时个股净值曲线
其中图9第一幅子图是特质收益率价格(蓝线),均值(中间红线),置信区间(浅红色区间),择时信号产生的持有头寸(红色:买;绿色:卖),中间的空白区域为均值回复平仓区域(0.67倍标准差);第二幅子图是对应到用个股收盘价收益算出来的净值上的头寸分布情况;第三幅图是根据信号择时的股票净值。
这种策略的有效性源于线性模型中误差项 与被解释变量 的相关性,我的策略仅仅是抓住了个股本身的特质波动率,所以从个股上来看(鄂武商A,000501.SZ)没有抓住14年后半年到15年年初的市场收益;从组合上来看,在14年10月份开始的牛市也跑输了市场。但是beta收益不是任何时候都有的,残差项的收益却是时时刻刻都存在的。
4.4截面验证
从组合净值曲线可以看出:组合收益最大的是在15年到16年第一季度(泡沫期和泡沐破裂期)
我认为是由于在泡沫期动量效应明显,在能够识别动量方向的时候,能够获得相比非泡沫期更高的收益,而我们构建的置信区间或多或少地抓住了个股动量的方向。
还可以从截面相关性来进一步验证,动量期的收益依然来源于均值回复效应。
在因子投资里IC被用来检验横截面个股因子值和下一期收益的相关性,于是我构建一个因子:这个因子用来刻画当前特质收益率价格偏离了多少倍标准差[1],偏离的倍数就是因子值。该因子值是有方向性的,比如向上偏离了两倍标注差,因子值为2;向下偏离了两倍标注差,因子值为-2。所以预期因子值和下期收益率存在负相关
我借助Quantopian平台下的模块Alphalens来计算IC(Information Coefficient)
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='643' height='243'></svg>)
图10:标准差偏离度因子以持有22个交易日的IC值时间序列分布
图10描述了当期个股当期因子值和22个交易日后累计收益的相关性(IC值)。可以看到在15年至16年第一季度一个月移动平均IC值稳定为负,且连续为负的持续时间也是其他时间段不具备的。
所以可以认为15年的高收益也是由于残差项的均值回复导致的,泡沫期和泡沫破裂期的市场环境使得均值回复的效果更加稳定。
五、 对照组合表现
我用布林带的方法来构建一个对照组合:
控制其他条件不变,置信区间通过简单计算移动平均和移动样本标注差来建立。
考虑两组滚动时间窗口:
- 252个交易日。为了和我们的组合识别窗口一致
- 22个交易日。这个是普遍认为的布林带最优窗口期
布林带官方建议采用2倍标注差构建置信区间,为了和我们的识别方法可比较,仍采用1.96倍标注差作为开仓条件(0.67倍标准差平仓),不考虑手续费;由于布林带方法不存在 这个参数,所以关于 的组合控制方法都不考虑,下面是以上两组参数的布林带方法回测表现:
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='828' height='380'></svg>)
图11:布林带方法对照组合净值和同期沪深300净值
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1560' height='220'></svg>)
表2:布林带方法组合表现统计量
图11和表2显示:布林带方法在两个参数下能获得的年化夏普比最大只有1.50,且最大回撤为4.8%,也比我们的组合高出不少,但年化换手率更低。总的来说布林带方法构建的组合在表现上远不如OU过程组合。
六、 稳健性检查
6.1 参数有哪些?
到目前为止还没有讨论过参数优化的问题,梳理一下所有的参数:
- 滚动建立置信区间的天数(252个交易日)
- 产生开仓信号时:按照均值回归速 度排序选取最大的多少支个股(90支)
- 产生信号时:过去三个月内存在累计多少个交易日置信区间识别失败(均值回归速度 ),即使产生信号也不开仓(10个交易日)
对于(1)滚动天数的设定上,我认为1年是一个合意的时间区间,所以不再考虑对252这个数字的参数问题。
对于(2)选取前多少支股票这个要根据具体实盘上组合规模的限制,和基金经理认为合适股票数量的股票池来选择,但是组合规模确实会影响策略收益,是一个参数。
(3)对个股的均值回复“质量”进行把关:过去一段时间特质收益率价格存在趋势特征:那么就不应该开仓,但是判断的天数却是一个典型的参数。
所以现在只剩下2个参数:
1. 产生信号时 从大到小排序取前n支股票中的n;
2. 三个月内k天或以上 不开仓的k
本文不对参数优化做更多的深究。
6.2 网格参数稳健性检查
我对n和k设一个上下界:n设置为从30到120(间隔为5),k设置为从1到22(间隔为1),稳健性的评价指标选取年化夏普比。
n、k的值从小到大是一个开仓条件逐渐放宽的过程。
下面在保持其他条件不变,计算每一个n,k对应的年化夏普比,并画出网格图:
![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='642' height='300'></svg>)
图12:不同n(30到120)、k(1到22)值对应的回测年化夏普比
图12可以看出:
1. 当n值大于60的时候,年化夏普对于n的变动不再敏感。具体的区间范围还有依股票样本池的容量而定。
2. 年化夏普比在k取1到2时变动十分剧烈,由于k=1意味着过去三个月只要存在一天 ,就不开仓,是一个非常严格的约束,反而会损害组合表现。k从1到2年化夏普比陡增是由于边际约束的放松在前期更明显,所以随着k逐渐增大,在后期年化夏普比的边际贡献逐渐减小,在k=4时为极大值,之后年化夏普比随着k增大平稳地降低直至收敛。
3. 在网格图的最右上端的年华夏普比对n和k的变动敏感度几乎为0。因为右上端n、k数值最大,代表着几乎不对个股过去一段时间是否是趋势态和进入样本容量进行限制,也就是0参数。即便如此,年化夏普比依然接近2.7!
4. 总的来看,夏普比曲面十分平整,我们的组合对参数不敏感,结论稳健!
七、 总结
本文的直觉源于个股特质收益率的外生性质,策略成功的关键也在于特质收益率的时间序列上的相关性。我将特质收益率合成新的价格,假设其均值回复并建模,通过并识别渐进均值和渐进标注差建立置信区间。认为当特质收益率价格突破置信区间时,在未来短期会回复。我于是构建一个个股择时的组合,组合表现上:年化夏普比高达2.90,最大回测仅3.3%。
我发现15年至16年第一季度的组合表现(年化收益47%)远优于其他时间,我进一步进行截面验证,通过构造因子并计算IC值发现该时间段因子与收益的截面相关性相比其他时间更加稳定,说明了均值回复策略在动量期反而有更好的表现。
我认为策略表现的原因除了均值回复假设成立之外,还要归功于模型(OU过程)能够准确地估计序列的置信区间,我进一步采用简单样本均值和样本标注差的方法(布林带方法)来估计置信区间,在控制其他条件不变的情况下来构建组合,发现布林带方法组合表现(年化夏普比1.5)远逊于OU过程建模方法。
组合网格参数方法显示:组合的夏普比对参数的不敏感,结论稳健。
OU过程建模优于布林带方法建模
布林带方法对股价本身简单样本均值和样本标注差的置信区间构建完全不顾及股价的非平稳特性,即使把该方法用在符合均值回复假设的特质收益率价格序列上,其构建方法忽略序列的自相关性导致表现平平。可见OU过程和其他时间序列模型在A股的应用大有可为。
基于大样本的组合构建是策略稳定的关键
如果仅仅从单只个股择时的角度去做回测,结果有时候往往不如一直持有(buy and hold)。但是在大样本(我把满足条件的全A股(2629支个股)纳入我们的选股样本池)和组合管理下(在资金分配方面多空头寸持平,每日调整),组合收益持续稳定。
复杂的组合控制方法反而会损害组合表现
我也考虑过其他的组合控制方法:包括,在个股产生开仓信号时,该个股的当日滚动回归的调整R方只有到达一定的阈值才纳入开仓股里;当开仓后超过一个星期特质收益率站在置信区间外提前平仓;个股收益的止损和止盈;当识别的均值和当前特质收益率价格偏差过大不开仓等。但是这些组合控制方法不仅不会提高组合表现,反而会因为“风险控制”降低组合表现。
基于此模型的其他应用场景
我们的择时策略也可以用于在指数成分股里择股择时,进行指数增强,但是某些指数无法满足对于大样本的需求,比如上证50(000016.SH);OU过程建模方法也有想象空间,可应用于任何具有均值回复属性的序列,比如日内高频股价序列;正如我在截面验证提到的一样,还可以从因子的角度来审视残差项的均值回复特性,这样可以避免个股择时频繁开平仓导致的高换手率,也是一个值得研究的方向。
参考文献
Box, G. E. P.; Pierce, D. A. (1970). "Distribution of Residual Autocorrelations in Autoregressive-Integrated Moving Average Time Series Models". Journal of the American Statistical Association. 65: 1509–1526
De Bondt, W. F. M. and R. Thaler (1984). Does the stock market overreact? The Journal of Finance, Vol. 40(3), 793 – 805.
Elliott, R., van der Hoek, J. and Malcolm, W. (2005) “Pairs Trading”, Quantitative Finance, Vol. 5(3), pp. 271-276.
G. M. Ljung; G. E. P. Box (1978). "On a Measure of a Lack of Fit in Time Series Models". Biometrika. 65 (2): 297–303.
"Python: Ljung-Box Tests". statsmodels.org.
Uhlenbeck, G. E.; Ornstein, L. S. (1930). "On the theory of Brownian Motion". Phys. Rev. 36: 823–841.
Yeo, J. and G. Papanicolaou (2017). Risk control of mean-reversion time in statistical arbitrage.Risk and Decision Analysis, Vol. 6(4), 263 – 290.
Alphalens官网:https://www.quantopian.com/posts/alphalens-a-new-tool-for-analyzing-alpha-factors
布林带维基百科:https://en.wikipedia.org/wiki/Bollinger_Bands
中央财经大学金融学院官网下载页:http://sf.cufe.edu.cn/kxyj/kyjg/zgzcglyjzx/zlxzzq/index.htm
附录:
1. 证明 为弱平稳过程,
证明:
均值:
方差
协方差