因子层第二篇。承接 #36 的 IC 检验——即便 IC 好看,因子还会在三个地方悄悄失效。
一、这个方法解决什么投资问题
#36 用 IC 给因子打分,但 IC 只是"当前"的快照。真实的因子会在时间里变质:
有人拿着回测里年化翻倍的"圣杯因子"冲进实盘,三个月亏掉一半——问题往往不出在算错,而出在因子陷阱:回测窗口、时间漂移、交易拥挤,任一发作都能让漂亮曲线变废纸。
这篇用同一个 20 只股票池,把三个陷阱一个个打出来给你看。
二、核心思想:因子是会过期的"临期食品"
- 窗口敏感:因子值高度依赖"回看多少天"。换一个参数,IC 可能从正翻负。
- IC 漂移:前半段样本灵、后半段不灵,说明这根本不是同一个因子,只是某段行情的残影。
- 拥挤度:当所有人都用同一个因子,高分组股票会"长得很像"(同涨同跌),分散失效、踩踏加剧。
三个陷阱的共同点:它们都藏在"平均好看的 IC"背后,必须拆开看。
三、实操演示
def ic_series(kl, n, look):
"""给定回看窗口 look,滚出整串动量因子 IC"""
codes = list(kl.keys()); out, t = [], max(look, 60)
while t + 20 < n:
fv = [kl[c][t]["close"]/kl[c][t–look]["close"]–1 for c in codes]
fwd = [kl[c][t+20]["close"]/kl[c][t]["close"]–1 for c in codes]
out.append(spearman(fv, fwd)) # 只用 t 及之前数据,无前视
t += 20
return out
陷阱1 窗口敏感——同一动量因子,换回看窗口:
| 5 日 | −0.072 | −0.24 | 2/9 |
| 10 日 | −0.049 | −0.18 | 3/9 |
| 20 日 | −0.006 | −0.03 | 5/9 |
| 40 日 | −0.048 | −0.13 | 4/9 |
| 60 日 | −0.136 | −0.49 | 3/9 |
陷阱2 IC 漂移——动量20日的 IC 串,前半段(4期)均值 +0.002,后半段(5期)均值 −0.012 → 方向翻转。
陷阱3 拥挤度(真实输出 2026-08-06):
高分组(动量前5): 000725, 600276, 002415, 300059, 600030
低分组(动量后5): 601166, 000858, 600585, 601888, 601012
高分组内部平均相关性 0.2388
低分组内部平均相关性 0.3418
全池平均相关性 0.2394
→ 高分组并不比全池更抱团:本样本期动量因子未出现拥挤
四、结果解读
- 窗口敏感是致命的:5 日和 60 日动量 IC 分别是 −0.072 和 −0.136,连"反向有效"的结论都在不同窗口打架。回测里你挑的"最优窗口",往往只是恰好适配了那段历史。
- IC 漂移说明因子不稳定:前半段微弱正向、后半段转负,意味着它捕捉到的不是长期规律,而是某段特定行情。把这种因子当"永动机"最危险。
- 拥挤度这次没触发,但方法要会:高分组内部相关性(0.2388)只略等于全池(0.2394),没到"抱团"阈值。但换一段牛市,热门因子的高分组相关性会显著高于全池——那时一起跌的杀伤力远大于分散组合的预期。
五、常见陷阱
- 拿"最优窗口"当真理:回测里网格搜出来的最佳参数,实盘大多回撤(#27/#28 已演示)。
- 只看整段 IC 均值:前半段灵后半段崩,均值一平均就被掩盖。要分段看。
- 忽略拥挤:因子越有效越多人用,越用越失效——这是量化圈的"有效因子悖论"。
- 把某期方向当永恒:动量和反转周期性切换(#17),死守一个方向会被打脸。
- 因子没写失效判据:什么时候该下线?这是 #43 上线清单里最容易被漏掉的一项。
六、小结 + 下篇预告
因子的三个陷阱:窗口一换结论就变、IC 前后半段漂移、热门因子拥挤踩踏。它们都藏在"平均好看的 IC"背后,必须拆开、分段、算相关性来看。本样本期动量因子未拥挤,但方法必须掌握。
下篇 #39 从"选股"切到"组合"——就算单个因子不强,把几只低相关的股票拼在一起,波动也能大幅下降。怎么配权重才科学?
免责声明
本文为量化方法教学,标的为示例,不构成投资建议,不承诺收益。投资有风险,入市需谨慎。





