【Python量化因子实战 #10】因子用了一个月失效了?用滚动 IC 监控稳定性
动量因子去年很灵,今年就不行了——这不是玄学,是量化里的常态。因子会衰减。本文教你用"滚动 IC"给因子做体检,判断它现在还能不能用。
一、为什么因子会失效
A股的市场风格在切换:
- 2020-2021:抱团蓝筹,大盘动量极强
- 2022-2023:中小盘活跃,小市值因子碾压
- 2024-2025:高波动环境,低波因子重新占优
一个因子在某段时期 IC 高达 0.08,换一段可能就跌到 0.01 甚至负值。如果不监控,你的选股模型会一直在用过期的信号。
二、本文你将得到什么
- 滚动 IC 的直观理解:不是看某一期,而是看最近 60 期的平均 IC
- 用 Python 实现"逐截面算 IC → 滚动平均 → 健康度判定"的完整流水线
- 一个简单的因子健康度红绿灯:有效 / 弱有效 / 失效或反转
- 代码可直接接入每日定时任务,输出因子体检报告
三、核心代码:滚动 IC 监控
3.1 数据与因子准备(复用前几篇)
import pandas as pd
import numpy as np
from scipy.stats import spearmanr
from mairui import Client
client = Client("LICENCE-66D8-9F96-0C7F0FBCD073")
拉取 K 线并计算动量/波动率/换手率(代码略,参见 #01~#03)
3.2 单截面 IC 计算
def ic_for_snapshot(snap):
"""snap: DataFrame 含 code/mom/vol/turnover/fwd"""
ics = {}
for f in ["mom", "vol", "turnover"]:
if snap[f].nunique() > 1 and snap["fwd"].nunique() > 1:
ic, _ = spearmanr(snap[f], snap["fwd"])
ics[f] = ic
else:
ics[f] = np.nan
return ics
3.3 滚动 IC 与稳定性评估
def rolling_ic(panel, min_idx, latest_idx, fwd_h=20, roll_window=60):
# 收集每个截面的 IC
ic_rows = []
for idx in range(min_idx, latest_idx + 1):
snap = build_snapshot(panel, idx, fwd_h) # 构造截面
if len(snap) < 8:
continue
d = 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()
return ic_df
3.4 因子健康度判定
def health_status(latest_ic):
if pd.isna(latest_ic):
return "数据不足"
if latest_ic > 0.03:
return "有效"
if latest_ic > 0:
return "弱有效"
return "失效或反转"
示例输出
for f, name in [("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),你已经拥有了一套可落地、可维护的量化因子工作流:
构造 → 验证 → 组合 → 存储 → 监控
系列持续更新中,后续将探索更多实战方向。
免责声明
本文仅供技术学习交流,不构成投资建议。文中示例数据来源于公开行情接口,历史表现不代表未来收益。投资有风险,决策需谨慎。
了解更多

浙公网安备 33010602011771号