数值型因子的大规模分层测试---WorldQuant 101、国泰191、Sundays100+


(kikidai) #1

最近行情还不错想必大家都赚到零花钱了。对于这波牛市,一些老饕们觉得太早了。虽不是老饕,但我也这样认为。多个经济周期底部对准了今明两年不假,虽然大周期来说差个半年也不算差,但是从各路资金的博弈反应来看,还是熊市操作。所以说这次的大涨是否只是市场过快的修复了对估值与消息的定价,而底还是要磨呢?谁也说不好,不过该敬畏还是要敬畏的,别太嚣张。

上上一篇文章实现并讨论了WorldQuant 101 Alphas因子。之后呢,我又把国泰君安的191 Alphas因子实现了,接着耗时把能找到的16~18年所有因子类的研报都看了一遍,再加上自己总结的一些东西实现了Sundays Alpha 100+。在这里就讨论一下测试过程与测试结果。

先吐个槽。

![](data:image/svg+xml;utf8,)

国泰191 Alphas的研报《基于短周期价量特征的多因子选股体系》于2017年6月份公布,其中191个alphas有70个是WorldQuant 101因子原样照抄或者是小改一下(因为我在实现每个191之前都会去wq101里面查一下,毕竟不写重复代码嘛,也顺手加了注释)。其实天下文章一大抄,借鉴倒也没事,巨人也要站在巨人的肩膀上。只是在国泰研报也不注明引用wq101,这就有点过分了。券商研报都很少有加引用的习惯,这真不是一个好习惯,可能领导们不喜欢看引用吧。

单因子测试

因子从数值类型上可以分为两类

  • 数值型,就是普通的那些;
  • 布尔型(Boolean型?哑变量?二值型?名称无所谓)的因子我喜欢分成两种: 一种是事件驱动因子(异常检测类),很久都是0突然出现一个1的那种;另一种是变动类,0和1交替出现。

事件驱动因子的测试方法通常是计算事件出现前后的收益,然后统计得出是否有超额收益的结论。这里推荐国泰20160527《事件驱动的因子化特征》。我个人认为事件驱动因子+NLP可以很强,但是没有深入研究过结合方法。变动类因子的测试方法暂不明确,可以统计N日内出现1的次数,然后用数值型那一套来做;应该也可以用贝叶斯。

按照需求与个人喜好不同,两种因子混用的处理方法见仁见智。可以连续变量离散化,也可以不做改变直接用树方法强怼。如果特征工程能力强,将所有变量one-hot encoding得出一个好结果我也是佩服的。

三个因子集的因子类型统计(数值/二值):

  • wq_alpha:88/13。其中056需要市值数据。共测试87个。
  • gt_alpha:187/4。其中030 FAMA三因子,075、149、181、182需要大盘数据,143的公式看不懂。共测试181个。
  • sd_alpha:124/11。其中42个需要别的数据(自己坑自己)。共测试82个。

数值型因子有效性测试

主流单一因子测试方法也就分层法和IC法,具体方法就不赘述了。不过需要注意的是,通常金工研究认为,测试单一因子的有效性应考虑市场因子、市值因子和行业因子的风险暴露,也即用线性回归残差替代因子本身。但我jio着不一定必须用,毕竟之后的因子库还要降维的。虽然可解释性上更低了一点,也更不符合金融行业的习惯,但在不深入挖掘某一因子的风险(收益)来源时,此举加大了工作量,说到底还是看需求。

我就这么偷懒的使用了没有剔除风险暴露的因子值进行了月度调仓的分层法测试。分层法判断标准讲究显著性(TOP20%与BOTTOM20%差值的期望大不大)与稳健性(TOP20%与BOTTOM20%差值的方差小不小),在一条线上可以理解为收益率与回撤。但有很多因子你会发现,尾部的超额收益怎么都比不上中间两组。这就要用全市场的几条线来看了。

下面选择几个因子讨论一下:

先用著名的低价因子举例子 Alpha = - close

![](data:image/svg+xml;utf8,)

![](data:image/svg+xml;utf8,)

其实我认为也就17下半年到18年比较差,估计19、20年还是比较强的。市值因子一般认为是CAPM的漏洞,定价时就没考虑这个;市场对小公司的信息也没有挖掘得很充分。对于我国的低价因子还有两点,一是市场监管不到位导致的财务造假,二是注册制不到位导致的壳资源预期。这些都是制度问题,制度带来的收益必然随制度变化而变化。因此当我国退市、注册两个制度变化的时候,必然会对小市值策略产生影响,但不至于颠覆。我的愚见,对于一个所谓的好因子,首先应看是不是市值暴露带来的收益,即有没有市值味儿。wq_alpha和gt_alpha中,十分显著且稳定的基本上都有市值暴露。

比如wq_alpha042与gt_alpha120,rank(vwap - close) / rank(vwap + close)

![](data:image/svg+xml;utf8,)

![](data:image/svg+xml;utf8,)

看似是成交量均价高于收盘价的全市场强度的归一化,实际上还是市值暴露。

讨论一下其他还行的

wq_alpha016与gt_alpha083,- rank(covariance(rank(high), rank(volume), 5))

![](data:image/svg+xml;utf8,)

![](data:image/svg+xml;utf8,)

短期价量背离程度的强度。价量背离之前说过了是一个不错的因子,除了牛市中后期(加速)的时候,基本都有稳定的反向关系,无论参数从5到20。加入rank()函数之后,牛市中后期也不会影响因子的稳定性,反而会得到超额收益,个中缘由比较复杂,不只是归一化那么简单,明白人可以给我讲讲。所以说,“放量大涨能延续”说的是大盘,而不是个股(甚至大盘也不对)。缩量才是王道!!!

wq_alpha018与gt_alpha054,

- rank( std(abs(close - open), 5) + (close - open) + correlation(close, open, 10))

![](data:image/svg+xml;utf8,)

![](data:image/svg+xml;utf8,)

这个好长不过幸好都是加法,可以拆解来看。

  • std (abs(close - open), 5),波动越大收益越高,这个正向因子显著性和鲁棒性都不错,但有很明显的市值味道。
  • close – open就比较厉害了,最小的一组收益最差没问题,但是收益最大的一组是中间的那组,也算是半个正向因子吧。
  • correlation(close, open, 10)是共振程度,共振程度越小≈背离程度越大,所以是个比较强的反向因子。这一部分把第一项和第二项部分抵消了,所以会差一点。

如果这个因子变成下面这样就会比较好了。不过会不会改变因子作者的核心逻辑我就不知道了。但是因为去掉了负号所以会反向。

rank(std(abs(close - open), 5) + (close - open) - correlation(close, open, 10))

![](data:image/svg+xml;utf8,)

![](data:image/svg+xml;utf8,)

为什么举wq和gt同时出现的呢。其实国泰也有很多好因子,不过对于分层测试来说,市值味太重了,wq的因子市值味没那么重。不过需求为王,国泰那篇研报中使用这些因子是用来“预测”短期价格变动的,不是用来月度调仓的。gt_alpha中比较显著且稳定的因子有50多个(50/181),wq_alpha中有30多个(30/87)。

**举一个sd_alpha里面的8。**说实在的我编的这些因子还凑合吧,有些市值味的和gt_alpha的冲突了。但还是有些技术指标啥的,测试下来结果还算过得去,技术指标调参可见上一篇…

sd_alpha001,max (high - low, abs(high - delay(close, 1)), abs(low - delay(close, 1)))

这个叫真实波幅?真实实体?我以为市值味会重,但却是个正向指标,收益来源或许是反转。因为绝对值处理之后无论涨得多还是跌得多的都会分到一组,然而我国反转效应更强,因此会这样?

![](data:image/svg+xml;utf8,)

![](data:image/svg+xml;utf8,)

还有一些指标比如adx值,obv的变动率,std的std都比较显著而稳定。

究竟这两个因子库好不好用,真的是仁者见仁智者见智。说到底这只是一坨感知方法,感知方法有没有用还是要看符不符合逻辑与需求。需求不同—>数据集不同—>特征工程不同—>模型不同,整个建模过程还要必须符合逻辑。在金融数据中游泳,真实的迷茫鸭。

最后推荐研报中的一些圣经(我看的研报还是比较少的,这只是在我的鼠目寸光下闪着光的研报,海涵,勿喷)

  • 事件因子圣经:20160527-国泰-事件驱动的因子化特征
  • 价值投资圣经:20170831-东方-质优股量化投资
  • 资金流因子圣经?:20180611-长江-资金流因子全测试
  • 多因子模型组合圣经:20171117-中信-多因子模型的组合优化与风险

P.S. 到现在没有见一篇写出来的研报ML、DL、RL用得好的