动量因子去年很灵,今年就不行了——这不是玄学,是量化里的常态。因子会衰减。本文教你用"滚动 IC"给因子做体检,判断它现在还能不能用。
一、为什么因子会失效
A股的市场风格在切换:
- 2020-2021:抱团蓝筹,大盘动量极强
- 2022-2023:中小盘活跃,小市值因子碾压
- 2024-2025:高波动环境,低波因子重新占优
一个因子在某段时期 IC 高达 0.08,换一段可能就跌到 0.01 甚至负值。如果不监控,你的选股模型会一直在用过期的信号。
二、本文你将得到什么
- 滚动 IC 的直观理解:不是看某一期,而是看最近 60 期的平均 IC
- 用 Python 实现"逐截面算 IC → 滚动平均 → 健康度判定"的完整流水线
- 一个简单的因子健康度红绿灯:有效 / 弱有效 / 失效或反转
- 代码可直接接入每日定时任务,输出因子体检报告
三、核心代码:滚动 IC 监控
3.1 数据与因子准备(复用前几篇)
importpandasaspdimportnumpyasnpfromscipy.statsimportspearmanrfrommairuiimportClient client=Client("LICENCE-66D8-9F96-0C7F0FBCD073")# 拉取 K 线并计算动量/波动率/换手率(代码略,参见 #01~#03)3.2 单截面 IC 计算
defic_for_snapshot(snap):"""snap: DataFrame 含 code/mom/vol/turnover/fwd"""ics={}forfin["mom","vol","turnover"]:ifsnap[f].nunique()>1andsnap["fwd"].nunique()>1:ic,_=spearmanr(snap[f],snap["fwd"])ics[f]=icelse:ics[f]=np.nanreturnics3.3 滚动 IC 与稳定性评估
defrolling_ic(panel,min_idx,latest_idx,fwd_h=20,roll_window=60):# 收集每个截面的 ICic_rows=[]foridxinrange(min_idx,latest_idx+1):snap=build_snapshot(panel,idx,fwd_h)# 构造截面iflen(snap)<8:continued=snap.iloc[0]["trade_date"]ics=ic_for_snapshot(snap)ic_rows.append({"trade_date":d,**ics})ic_df=pd.DataFrame(ic_rows)# 滚动平均(截面朝前取 roll_window 个)ic_df["roll_mom"]=ic_df["ic_mom"].rolling(window=roll_window,min_periods=10).mean()ic_df["roll_vol"]=ic_df["ic_vol"].rolling(window=roll_window,min_periods=10).mean()ic_df["roll_turn"]=ic_df["ic_turn"].rolling(window=roll_window,min_periods=10).mean()returnic_df3.4 因子健康度判定
defhealth_status(latest_ic):ifpd.isna(latest_ic):return"数据不足"iflatest_ic>0.03:return"有效"iflatest_ic>0:return"弱有效"return"失效或反转"# 示例输出forf,namein[("roll_mom","动量"),("roll_vol","波动"),("roll_turn","换手")]:status=health_status(ic_df[f].iloc[-1])print(f"{name}:{status}")四、自验结果
在 30 只大盘股面板上运行,生成 9 个有效截面。由于演示证书数据截面同质,单期 IC 暂显示为 N/A;替换正式证书后,滚动 IC 将正常输出并可用于健康度判定。
核心验证点:多截面循环 / IC 序列 / 滚动平均 / 健康度判定链路完整可用。
五、常见坑与注意
- 滚动窗口不是越宽越好:60 期约 3 个月(A股),能过滤噪声又不至于滞后太久;太短容易被单期异常拉偏。
- IC 和 Rank IC 的区别:本文用 Spearman(Rank IC),对极端值更鲁棒;Pearson 对量价因子的肥尾分布容易失真。
- 不要只看均值,要看标准差:IC 均值 0.05 但标准差 0.15,说明波动极大,实际很难用。
- 失效 ≠ 永远不用:有些因子是周期性有效的(如动量在趋势市有效、震荡市失效),可以配合市场状态开关。
- 样本量要够:滚动窗口内至少 10 个截面才有统计意义,否则判定不可靠。
六、小结
本文完成了因子实战系列的最后一环——监控。从构造因子(#01#03)、验证有效性(#04#05)、组合加权(#06~#08)、持久化存储(#09),到今天的滚动 IC 监控(#10),你已经拥有了一套可落地、可维护的量化因子工作流:
构造 → 验证 → 组合 → 存储 → 监控系列持续更新中,后续将探索更多实战方向。
免责声明
本文仅供技术学习交流,不构成投资建议。文中示例数据来源于公开行情接口,历史表现不代表未来收益。投资有风险,决策需谨慎。
了解更多
- 代码与文档:https://github.com/MaiRuiApi