拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【Python量化因子实战 #10】因子用了一个月失效了?用滚动 IC 监控稳定性

【Python量化因子实战 #10】因子用了一个月失效了?用滚动 IC 监控稳定性

动量因子去年很灵,今年就不行了——这不是玄学,是量化里的常态。因子会衰减。本文教你用"滚动 IC"给因子做体检,判断它现在还能不能用。

一、为什么因子会失效

A股的市场风格在切换:

  • 2020-2021:抱团蓝筹,大盘动量极强
  • 2022-2023:中小盘活跃,小市值因子碾压
  • 2024-2025:高波动环境,低波因子重新占优

一个因子在某段时期 IC 高达 0.08,换一段可能就跌到 0.01 甚至负值。如果不监控,你的选股模型会一直在用过期的信号。

二、本文你将得到什么

  1. 滚动 IC 的直观理解:不是看某一期,而是看最近 60 期的平均 IC
  2. 用 Python 实现"逐截面算 IC → 滚动平均 → 健康度判定"的完整流水线
  3. 一个简单的因子健康度红绿灯:有效 / 弱有效 / 失效或反转
  4. 代码可直接接入每日定时任务,输出因子体检报告

三、核心代码:滚动 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.nanreturnics

3.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_df

3.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 序列 / 滚动平均 / 健康度判定链路完整可用。

五、常见坑与注意

  1. 滚动窗口不是越宽越好:60 期约 3 个月(A股),能过滤噪声又不至于滞后太久;太短容易被单期异常拉偏。
  2. IC 和 Rank IC 的区别:本文用 Spearman(Rank IC),对极端值更鲁棒;Pearson 对量价因子的肥尾分布容易失真。
  3. 不要只看均值,要看标准差:IC 均值 0.05 但标准差 0.15,说明波动极大,实际很难用。
  4. 失效 ≠ 永远不用:有些因子是周期性有效的(如动量在趋势市有效、震荡市失效),可以配合市场状态开关。
  5. 样本量要够:滚动窗口内至少 10 个截面才有统计意义,否则判定不可靠。

六、小结

本文完成了因子实战系列的最后一环——监控。从构造因子(#01#03)、验证有效性(#04#05)、组合加权(#06~#08)、持久化存储(#09),到今天的滚动 IC 监控(#10),你已经拥有了一套可落地、可维护的量化因子工作流:

构造 → 验证 → 组合 → 存储 → 监控

系列持续更新中,后续将探索更多实战方向。


免责声明

本文仅供技术学习交流,不构成投资建议。文中示例数据来源于公开行情接口,历史表现不代表未来收益。投资有风险,决策需谨慎。

了解更多

  • 代码与文档:https://github.com/MaiRuiApi
返回列表