跳转到内容

截面动量

前面两篇的策略——趋势跟踪和均值回复——有一个共同点:每只股票只跟自己比。趋势策略问「这只股票今天是不是比它自己过去 20 天都强」,均值回复问「这只股票是不是比它自己的均值便宜了两个标准差」。这种「自己跟自己比」的动量,文献里叫时间序列动量(time-series momentum)。

这一篇换一个问法:股票之间互相比。不看某只股票自己涨没涨,而是把所有股票放在一起排队——过去一个月谁涨得最多?这就是截面动量(cross-sectional momentum)。用考试打比方:时间序列动量是跟自己上次月考比有没有进步;截面动量是全班排名,赌下次月考前几名还是前几名。

A 股交易者对这种感觉不陌生:涨幅榜上的股票好像总能再强几天,「强者恒强」。截面动量策略就是把这句感觉写成机械规则:定期给全市场股票按近期涨幅排序,买排名最靠前的一组,定期重排、换仓。同样必须先泼冷水:「强者恒强」在 A 股是不是普遍成立,学术界是有争议的(常见坑一节细说,短期尺度上 A 股恰恰是「弱者反弹」的反转效应更出名)。本章的任务是先把这个策略类型的标准做法讲透——它是所有多因子策略的基本功,下一篇的多因子入门会直接沿用本章的框架。

方法论:排序 → 分组 → 等权 → 月末再平衡

Section titled “方法论:排序 → 分组 → 等权 → 月末再平衡”
  • R1(标的池):全市场股票。本章演示用 30 只合成股票;实盘的池子必须用当时的成分,用今天的名单回测过去是第 1 章讲过的幸存者偏差。
  • R2(打分):每月末(演示简化为每 20 个交易日)收盘后,计算每只股票过去 20 个交易日的累计收益(形成期收益)。只用收盘后已知的数据,无前视。
  • R3(分组):把 N 只股票按形成期收益从高到低排序,均分成 5 组:排名最高的 20% 是 G5(最强组),最低的 20% 是 G1(最弱组)。30 只股票每组恰好 6 只。
  • R4(建仓):等权买入 G5 的全部成员,每只占 1/6 仓位,次一交易日收盘价成交(T+1,与前两篇一致)。学术界的经典做法是多腿之外再做空 G1(多空对冲),A 股现货不能做空,本章只跑多腿。
  • R5(再平衡):持有满一个月(20 个交易日)后,收盘重新打分、重新分组:卖出已跌出 G5 的持仓,买入新进入 G5 的股票,恢复等权。持有期内不盯盘、不交易。
  • 成功标准(第 3 章的可检验三要素之「成功标准」):重复多期后,G5 的平均下期收益显著高于 G1,且五组收益大体单调排列。写成假设:「过去 20 日收益最高的 20% 的股票,未来 20 日的平均收益显著高于最低的 20%」——「显著」的判据是第 2 章的假设检验,在碰数据之前写死。

本章演示数据是 30 只合成股票(截面动量演示:30 只合成股票,各藏真实动量强度 m_i ~ N(0,1)(不输出,实盘不可观测);过去 20 日收益 = 0.07·m_i + 0.09·噪声,下期 20 日收益 = 0.05·m_i + 0.04·噪声;按过去收益升序五分位分组(每组 6 只),avgNextReturn 为各组下期收益的等权平均(%)。排序只用了过去收益,分组平均是真实下期收益——无前视)。生成剧本里每只股票暗藏一个「真实动量强度」mim_i,过去收益携带 mim_i 的信息但噪声占大头,下期收益正比于 mim_i 再加噪声。两个要点:第一,排序依据(过去收益)只是真实强度的带噪代理——所以分组的意义不是「挑出最好的那 6 只」,而是「挑出平均而言偏好的一群」,单只股票的运气在等权平均里被摊掉;第二,mim_i 本身不会出现在数据里——实盘里你永远看不到一只股票的「真实强度」,只能用可观测的代理变量去逼近它,这是因子投资的宿命。

数学:排名、分位组与等权组合的期望收益

Section titled “数学:排名、分位组与等权组合的期望收益”

横截面排名:把 N 只股票的形成期收益 RipastR_i^{past} 从小到大排序,第 ii 只股票的排名记为 ranki\text{rank}_i(rank=1\text{rank}=1 最弱,rank=N\text{rank}=N 最强)。第 qq 组分位组的定义:

Gq={ i  :  (q−1)N5<ranki≤qN5 },q=1,2,…,5G_q = \left\{\, i \;:\; \frac{(q-1)N}{5} < \text{rank}_i \le \frac{qN}{5} \,\right\}, \qquad q = 1, 2, \dots, 5

等权买入 GqG_q 中的 kk 只股票(k=N/5k = N/5),组合收益的期望:

E[Rp]=E ⁣[1k∑i∈GqRi]=1k∑i∈GqE[Ri]E[R_p] = E\!\left[\frac{1}{k}\sum_{i \in G_q} R_i\right] = \frac{1}{k}\sum_{i \in G_q} E[R_i]

本章 N=30N = 30、k=6k = 6。

人话解释:第一行是分组定义——排名落在哪一段,就进哪一组,没有模糊地带。第二行说:等权组合的期望收益,就是成员期望收益的算术平均。它用的是期望的线性性质,不需要假设股票之间相互独立——哪怕这 6 只股票高度相关,「平均的期望 = 期望的平均」依然成立(相关的代价体现在组合的波动上,不体现在期望上)。这个式子也是分组检验的根基:单只股票的下期收益里噪声太大,看不出规律;把一组股票的收益平均起来,噪声互相抵消,组与组之间的系统性差异——如果存在——就会留在柱状图上。

手算一遍:演示数据里 G5 组的 S13(9.73%)、S05(13.45%)、S30(10.62%)。假如等权持有这三只:

E[Rp]=13(RS13+RS05+RS30)E[R_p] = \frac{1}{3}\left(R_{\mathrm{S13}} + R_{\mathrm{S05}} + R_{\mathrm{S30}}\right)

代入数值:(9.73% + 13.45% + 10.62%) ÷ 3 = 33.80% ÷ 3 ≈ 11.27%。等权的含义就是这么简单:谁的收益都不多算、不少算。G5 全组 6 只的等权平均——42.03% 除以 6——就是下图最右边那根柱子的高度 +7.01%(图上数值由未舍入的原始数据算出,手算尾差来自显示值的四舍五入)。

伪代码:月度再平衡的完整流程

Section titled “伪代码:月度再平衡的完整流程”
输入:N 只股票的日收盘价、形成期 F = 20、持有期 H = 20、组数 Q = 5、初始资金 C₀、费率 fee、滑点 slip
cash ← C₀;持仓 ← 空;lastRebalance ← F
对 t 从 F 到 n:
# ① 再平衡日:收盘后用 t 及之前的数据打分、分组(无前视:分数此刻已确定)
若 t − lastRebalance = H 或 持仓为空:
对每只股票 i:past[i] ← close[i][t] / close[i][t−F] − 1
按 past 从高到低排序,均分 Q 组
新目标组 ← 排名前 N/Q 的股票名单 # 最强一组
# ② 次日以收盘价调仓(T+1:昨日收盘生成的名单,今日成交)
若 上一步产生了新目标组:
卖出所有不在新目标组里的持仓(成交价 ×(1−slip),扣手续费)
把总资产(cash + 留存持仓市值)均分成 N/Q 份
对目标组每只股票:市值不足一份的补仓、不在持仓中的买入(买入价 ×(1+slip),扣手续费)
lastRebalance ← t
# ③ 结算当日净值;持有期内不交易
净值[t] ← cash + Σ(持仓市值)
输出:净值序列、每期分组名单

三处容易写错的地方:① 的打分窗口右端点是 tt(收盘后可知,无前视),但调仓发生在 t+1t+1——打分和成交不共用同一根 K 线,和前两篇的约定一致;② 里「恢复等权」意味着留存的老持仓也要调整份额,不是只买卖进出名单的股票;③ 持有期内什么都不做——月度策略的纪律恰恰体现在「不看盘」上,每天根据盘中涨跌操作就变成另一个策略了。

把 30 只股票按过去 20 日收益分成五组,每组的下期 20 日等权平均收益画成柱子:

读图三要点:

  1. 看两端。G1(过去最弱的 6 只)下期平均 -5.82%,G5(最强的 6 只)下期平均 +7.01%,价差 12.83 个百分点。G5 − G1 的价差就是截面动量策略(多 G5 空 G1 的多空版本)的毛利润空间。
  2. 看形态:单调递增是因子有效的第一证据。如果「过去收益」这个排序变量对未来收益毫无信息,五根柱子应该差不多高、高低排列随机;柱子从 G1 到 G5 大体由低到高排开,说明排序变量确实携带了关于未来的信息。真实因子的分组图很少像台阶一样完美——本图 G3(-0.65%)就略低于 G2(0.44%)。样本少、噪声大时,中间组最容易乱序;判断看整体形态和两端价差,不苛求每根柱子严格递增。
  3. 一个数字概括:IC。排序变量与未来收益的整体相关性可以用截面相关系数概括,本期 IC = 0.617(过去收益与下期收益的 Pearson 相关,30 只股票)。这是合成数据刻意调强的;真实因子单期 IC 能有 0.05 上下就算可用。下一篇多因子入门会正式讲 IC 的定义、正负号和「看很多期的平均 IC」。

两个必须记住的限制:第一,这是合成数据,剧本里 mim_i 真实存在,分组有效是安排好的——它演示的是「因子有效时图长什么样」,不是「A 股动量有效」的证据;第二,这只是一期分组,相当于第 4 章说的 N=1N=1 的一条历史路径——真实因子检验要把同样的分组流程重复几十上百期,看各组收益的平均形态和统计显著性。

  1. A 股的尺度问题:短期反转强,中期动量才偶尔露头——别把本章的图当成「追涨必胜」。学术界对 A 股的实证结论大体是:月度尺度上反转效应更稳——过去一个月涨得多的股票,下个月平均而言反而跑输(这和本章演示的方向恰好相反);动量效应要用更长的形成期(6–12 个月)、并跳过最近一个月才偶有证据,且弱于美股市场。换句话说,同样的分组流程,换个持有期,结论可能整个倒过来:本章用 20 日形成、20 日持有只是教学演示,不是推荐参数。有分寸地说:这不是「A 股动量一定是假的」,而是动量与反转谁占上风取决于形成期、持有期和市场环境——这正是为什么假设要写死、用数据检验(第 3 章),而不是拿一句「强者恒强」或「涨多了要跌」的口头禅当依据。
  2. 交易成本吃掉分组价差。月度再平衡意味着每个月都要换掉相当一部分持仓:演示里随便一期 G5 就可能换掉一半成员,实盘全市场策略月换手率 50% 以上不罕见。佣金万三双边、万五印花税(卖出)、滑点和冲击成本加起来,一次全换手的成本约 0.2%–0.5%,一年 12 次就是 3–6 个百分点的拖累。分组价差(G5 − G1)是毛价差,扣费后所剩可能无几——第 4 章的回测必须如实计费,评价一个因子先看净价差活不活得下来。
  3. 把一次分组当成因子有效的证明。本期 G5 跑赢 G1,完全可能是运气——排序变量里噪声占大头,30 只股票的一次抽样什么都证明不了(第 2 章:小样本、第 4 章:N=1N=1)。标准做法是重复多期看平均单调性、算 t 值或 p 值,再在样本外和别的市场复核(第 6 章)。只展示一期好看的分组图,是研报里最常见的遮羞布。
  4. 等权买入的可执行性。等权买「最强 6 只」在小资金下可行,但强势小盘股买进的冲击成本大;遇到涨停板根本买不进去(第 1 章的涨跌停约束),回测里假设成交的单子实盘可能落空。资金量越大,「最强组」往往越买不到图上的价格。

截面动量回答的是「一群股票里,谁未来更强」——排序、分组、等权、定期重排,整套动作不依赖任何对单只股票的看法,只依赖排名。到这里,单标的择时(趋势、均值回复)和多标的选股(截面动量)两大范式都齐了。下一篇把「过去收益」这个排序变量推广成一般意义上的因子:任何能给股票打分的变量都可以走本章的流程,而 IC 就是衡量打分质量的尺子。