这是 Alpha 101 系列的最后一篇。流动性与复合因子有 23 个,是五类里公式最复杂的一组:嵌套层数多、用到 decay_linear 和 IndNeutralize 的频率最高、条件判断也更复杂。
但复杂不等于难理解。拆到底层,它们讲的还是同一个故事:跟着聪明钱走。
第一篇建立了分类框架,前三篇分别讲了量价背离、动量反转和波动率与日内结构。这篇在拆解 4 个经典因子之后,还会讨论怎么把 101 个因子从"单因子研究"推进到"因子组合"。
Alpha#7:条件流动性信号
$$\text{Alpha#7} = \begin{cases} -1 \times \text{ts_rank}(\text{abs}(\text{delta}(\text{close}, 7)),\ 60) \times \text{sign}(\text{delta}(\text{close}, 7)) & \text{if } \text{adv20} < \text{volume} \\ -1 & \text{otherwise} \end{cases}$$第一篇给了这个因子的概述,这里深入讲条件判断的设计思路。
条件 adv20 < volume:今天的成交量是否超过了 20 日均量。这是最简单的"放量"定义。
缩量分支给 -1(做空)。逻辑很直白:成交量低于均值,参与度不够,短期缺乏上涨动能。不管价格怎么走,缩量就是负面信号。这个"一刀切"的判断在实测中表现如何?对于美股大盘股,缩量确实和短期负收益弱相关。但对于本身成交清淡的小盘股,天天都"缩量",这个信号就失效了。论文的测试标的是约 1000 只美股大盘股,这类股票的日均成交量足够大,“低于均值"确实意味着市场兴趣下降。
放量分支的核心是 ts_rank(abs(delta(close, 7)), 60):过去 7 天价格绝对变化在过去 60 天里排第几。再乘以 sign(delta(close, 7))(涨跌方向),取反。
如果过去 7 天涨了很多(delta 为正,sign = +1),且绝对涨幅在 60 天里排名靠前(ts_rank 高),乘积为正,取反后为负(做空)。赌的是:放量暴涨,涨幅在两个月里排前列,过热了。
如果过去 7 天跌了很多(delta 为负,sign = -1),绝对跌幅 60 天排名靠前,乘积为负,取反后为正(做多)。赌的是:放量暴跌,跌幅创两个月之最,超卖了。
60 天的长窗口让这个因子不容易被短期噪音触发。一只股票连涨 7 天才涨 2%,ts_rank 可能只有 0.3,信号很弱。但如果 7 天涨了 15%(在 60 天里排名前 5%),ts_rank 高达 0.95,信号就很强了。
Alpha#31:多层嵌套的衰减流动性信号
$$\text{Alpha#31} = \text{rank}(\text{rank}(\text{rank}(\text{decay_linear}(\text{rank}(\text{rank}(\text{delta}(\text{close}, 10)))), 10)))) + \text{rank}(-1 \times \text{delta}(\text{close}, 3)) + \text{sign}(\text{scale}(\text{correlation}(\text{adv20}, \text{low}, 12)))$$这个公式嵌套了 5 层 rank,看起来吓人。但多层 rank 的效果其实会递减:第一次 rank 把值压到 [0, 1],第二次 rank 在已经是 [0, 1] 的值上再排名,分布会更加"均匀”,但信息不会增加太多。三层以上的 rank 基本是在做"超级均匀化",消除任何残留的非线性分布。
拆成三个加法项:
第一项:核心是 delta(close, 10) 的 decay_linear 衰减。10 天价格变化做线性衰减平均,然后多层 rank。含义是:近 10 天的价格趋势方向,用衰减加权让近期权重更大,多层 rank 确保分布极度均匀。
第二项 rank(-1 * delta(close, 3)):3 天价格变化取反做排名。跌了 3 天的股票排名高。短期反转信号。
第三项 sign(scale(correlation(adv20, low, 12))):过去 12 天均量和最低价的相关性,做 scale 再取 sign。如果均量和最低价正相关(量大的时候价格低点也高),sign = +1。负相关则 sign = -1。
三项相加,大致逻辑是:中期趋势的衰减信号 + 短期反转 + 量价相关性方向。这是一个典型的"复合因子",把不同时间尺度和不同维度的信号线性叠加。
实话说,多层 rank 的设计更像是过拟合的产物,而不是有清晰经济逻辑的刻意选择。如果你在实现这个因子时把 5 层 rank 简化成 2 层,效果大概率差不多。
Alpha#61:布尔型因子
$$\text{Alpha#61} = \text{rank}(\text{vwap} - \text{ts_min}(\text{vwap}, 16)) < \text{rank}(\text{correlation}(\text{vwap},\ \text{adv180},\ 18))$$这个因子的输出不是连续值,而是布尔值(0 或 1)。
左边 rank(vwap - ts_min(vwap, 16)):当前 vwap 距离 16 天最低 vwap 的距离排名。值大 = 这只股票的 vwap 远离近期低点,处于偏高位置。
右边 rank(correlation(vwap, adv180, 18)):vwap 和 180 天均量的 18 天相关性排名。值大 = vwap 走势和长期流动性高度同步。
因子值 = 1(做多信号)当且仅当:左边 < 右边,即 vwap 离近期低点的距离排名低于 vwap 与长期流动性的同步排名。
翻译:一只股票的 vwap 还在 16 天低位附近(没怎么涨),但它的 vwap 走势和长期均量高度正相关(流动性稳定同步)。这种组合意味着"流动性好但价格还在底部",是价值被低估的信号。
布尔因子在因子组合中的角色比较特殊。连续值因子可以精细排序(rank 0.95 的股票信号强于 0.85 的),布尔因子只分"有信号"和"没信号"两档。它更适合做过滤器而不是排序器:先用 Alpha#61 筛掉信号为 0 的股票,再用连续因子在剩下的股票里排序。
Alpha#75:双条件比较
$$\text{Alpha#75} = \text{rank}(\text{correlation}(\text{vwap},\ \text{volume},\ 4)) < \text{rank}(\text{correlation}(\text{rank}(\text{low}),\ \text{rank}(\text{adv50}),\ 12))$$和 Alpha#61 一样是布尔型,但比较的两个维度不同。
左边 rank(correlation(vwap, volume, 4)):4 天内 vwap 和成交量的相关性排名。vwap 和 volume 正相关 = 量大的时候价格(加权均价)也高,是正常的"量价齐升"。
右边 rank(correlation(rank(low), rank(adv50), 12)):12 天内最低价排名和 50 天均量排名的相关性排名。这个更 subtle:最低价排名高(日内底部支撑强)和均量排名高(流动性好)如果正相关,说明"流动性越好的时候,下方支撑越强"。
因子 = 1 当且仅当:短期量价同步程度的排名 < 中期流动性-支撑同步程度的排名。
经济含义:短期量价关系一般(没有明显的量价齐升),但中期流动性和价格支撑的关系很好。这种股票在短期可能被忽视(量价平淡),但中期基本面支撑扎实。
Alpha#75 和 #61 组合使用时,可以构建一个"双重流动性过滤":先用 #61 筛出"流动性好但价格在底部"的股票,再用 #75 确认"中期支撑强于短期热度"。两个布尔条件都满足的股票数量会很少,但信号质量更高。
从单因子到因子组合
拆完 101 个因子,下一步是组合。单因子研究是入门,因子组合才是实战。
因子正交性:为什么能组合
论文给了一个数字:101 个因子之间的平均相关性是 15.9%。这意味着大多数因子对捕捉的是不同维度的市场信息。相关性 15.9% 接近于"弱相关",组合后的分散化效果很好。
但"平均"15.9% 掩盖了分布:同类因子内部的相关性往往在 40~70%(比如 #3 和 #6 之间),跨类因子的相关性可能只有 5~10%。所以组合的时候不应该 101 个全放进去,而是每类挑 2~3 个代表性因子,总共 10~15 个就够了。
IC 衰减与再平衡
单因子的 IC(Information Coefficient,因子值和未来收益的截面相关性)在论文发表后一定会衰减。2016 年公开的因子,到 2026 年,单独使用的 IC 可能只剩论文时期的 30~50%。
但 IC 衰减的速度和因子类型有关。量价背离类因子衰减最快,因为它们的信号最直接、最容易被套利。波动率类因子衰减较慢,因为波动率均值回归是一个更底层的市场机制,不会因为几篇论文就消失。条件反转类因子(如 #9)衰减速度居中,条件判断增加了套利难度。
再平衡频率方面,论文里的因子持仓周期在 0.6~6.4 天。组合后建议用 3~5 天的再平衡频率:太短会被交易成本吃掉 alpha,太长则错过短期因子的时效性。
实操建议
推荐的因子组合起步配置(10 个因子,覆盖五类):
| 类别 | 因子 | 选择理由 |
|---|---|---|
| 量价背离 | #3, #55 | #3 最干净,#55 加入了价格位置维度 |
| 动量反转 | #9, #35 | #9 有条件判断,#35 多时间尺度 |
| 波动率 | #1, #34 | #1 条件波动率,#34 波动比 + 反转 |
| 日内结构 | #101, #42 | #101 最简 CLV,#42 看 VWAP |
| 流动性 | #7, #61 | #7 条件流动性,#61 布尔过滤 |
组合方式可以从最简单的等权开始:每个因子值做截面 rank,10 个 rank 值取平均作为综合得分,做多得分最高的 10% 股票,做空得分最低的 10%。
更进阶的做法是用 IC 加权:回测每个因子在过去 60 天的滚动 IC,IC 高的因子给更大权重。这比等权稍好,但也更容易过拟合。
不建议做的事:
- 把 101 个因子全算一遍然后用机器学习选最优子集。维度太高,样本太少,选出来的子集大概率是噪音
- 在 A 股上直接使用论文的原始参数。论文的参数是在美股大盘股上优化的,窗口长度和阈值需要本地化调整
- 忽视交易成本。持仓周期 0.6~6.4 天意味着高换手率,如果你的交易成本(佣金 + 滑点)超过单边 10bps,很多因子的 alpha 会被吃掉
策略评估请参考量化投资常用指标大全,用夏普比率、最大回撤、Calmar 比率等指标综合衡量。
系列导航
- Alpha 101 全解读:因子分类与算子速查
- 量价背离类因子详解(32 个因子)
- 动量与反转类因子详解(23 个因子)
- 波动率与日内结构类因子详解(23 个因子)
- 本篇:流动性与复合因子 + 因子组合实战(23 个因子)