news 2026/9/30 15:54:37

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 15:54:11

Go map的坑与实战:从键类型到并发安全一网打尽

如果让我选一个Go里“人人都用过、但没几个人真正吃透”的数据结构&#xff0c;那一定是map。它简单到什么程度&#xff1f;声明、赋值、遍历&#xff0c;三行代码就能跑起来。可线上出问题的时候&#xff0c;也基本都栽在它身上&#xff1a;明明只是并发读了一个键&#xff0c…

作者头像 李华
网站建设 2026/9/30 15:52:52

昆工891计算机综合C语言真题解码:指针、快排与内存管理核心考点

1. 这份“回忆版真题”到底值不值得花时间啃&#xff1f;——从命题逻辑反推复习重心昆明理工大学891计算机综合这门课&#xff0c;每年考完都有人蹲在贴吧、QQ群、小红书上扒回忆版题目。25年刚考完那会儿&#xff0c;我刷到一条消息&#xff1a;“快排手写代码占了15分&#…

作者头像 李华
网站建设 2026/9/30 15:50:47

Altium Designer实战避坑:从库管理到PCB出图全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 15:50:36

Stable Diffusion提示词:权重、负面词、词库与75 token

玩 Stable Diffusion 有段时间的人大概都有这个体会&#xff1a;同一个模型、同一张显卡、同一组采样参数&#xff0c;别人甩出来一张光影层次分明的图&#xff0c;你照着参数抄一遍&#xff0c;出来的东西像被搅拌机打过。多数时候问题不在显卡&#xff0c;也不在模型&#xf…

作者头像 李华
网站建设 2026/9/30 15:48:41

微信小程序多语言实战:状态管理、真机兼容与按需加载

1. 为什么微信小程序的多语言不是“加个配置就完事”&#xff1f; 在微信小程序开发圈里&#xff0c;我见过太多人把多语言当成一个“开关型需求”——产品经理一句“要支持中英文切换”&#xff0c;前端就去 npm install i18n&#xff0c;配个 language 字段&#xff0c;写两组…

作者头像 李华
网站建设 2026/9/30 15:46:12

Spring面试核心考点解析:IOC、AOP、事务与自动配置

1. 面试前的整体规划&#xff1a;Spring考察的底层逻辑我做了这么多年技术面试官&#xff0c;也陪跑过不少候选人准备面试&#xff0c;先说一个最核心的观察&#xff1a;Spring相关的题&#xff0c;表面上考的是“知识点”&#xff0c;实际上考的是“有没有真的用Spring写过东西…

作者头像 李华