3步算出因子IC半衰期:用 gs-quant 拟合衰减曲线

发布时间:2026/9/13 4:33:31
3步算出因子IC半衰期:用 gs-quant 拟合衰减曲线 3步算出因子IC半衰期用 gs-quant 拟合衰减曲线【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant某动量因子回测曲线漂亮三个月后IC悄悄腰斩——这是量化团队最常遇到的因子有效性塌方。与其反复换因子不如先用 gs-quant 把它的 IC 半衰期算出来定位衰减到底快还是慢。IC 是信息系数Information Coefficient衡量当期因子暴露与下期收益的相关强度。它不是静态数字而是一条会随时间走低的时间序列。把这条序列拟合到指数上就能得到一个有业务含义的参数因子信号半衰到一半所需的时间也就是 IC 半衰期。为什么值得盯住IC衰减把因子想成一管药。药效打进去后不会永远维持峰值而是按时间一点点消退。IC 也是同理刚计算出来的那一期信息系数最高往后每一期都在衰减。这种衰减在多数因子上接近指数形式可以写成 $IC(t)IC_0,e^{-\lambda t}$其中 $IC_0$ 是起始强度$\lambda$ 是衰减速度。$\lambda$ 越大曲线掉得越快。把半衰这件事翻译成参数令 $IC(t)IC_0/2$解出来就是 $t_{1/2}\ln 2/\lambda$。这个 $t_{1/2}$ 直接把因子还有多有用变成了一个可比较的数字——它告诉你信号在多久之后只剩下原来一半也就决定了你多久必须重新调仓。盯住IC衰减的价值在于它把这个因子还灵不灵从主观判断变成了一条可回测的曲线。曲线掉得快说明信号被市场消化得很快拖得越久越接近噪声曲线掉得慢说明信息还在缓慢释放低频调仓也不亏。从取数到半衰期的三步落地取数与IC序列先取因子收益和资产收益两条时间序列再用滚动相关算出逐期的IC。gs-quant 的 gs_quant/models/risk_model.py 里FactorRiskModel负责取数gs_quant/timeseries/econometrics.py 的correlation负责滚动相关窗口大小用参数w控制缺值自动处理。from datetime import date import numpy as np from gs_quant.models.risk_model import FactorRiskModel from gs_quant.timeseries import correlation model FactorRiskModel.get(MODEL_ID) # 换成你的模型ID fret model.get_factor_returns_by_name( # 因子收益序列 start_datedate(2023, 1, 1), end_datedate(2023, 12, 31), factors[MOMENTUM]) ar model.get_daily_return( # 资产日收益 start_datedate(2023, 1, 1), end_datedate(2023, 12, 31)) # 取单只资产/组合的下一期收益与当期因子收益做滚动相关 ic correlation(fret, ar[GS US 005].shift(-1), w20).dropna()跑完你会得到一条带日期索引的ic序列横轴是时间纵轴是每期的信息系数这正是拟合衰减的原料。指数拟合求λ原始IC噪声大、且会在零附近来回跳直接对整条曲线拟指数经常失败。稳妥做法是先滚动平滑、只取正半轴那段再拟合$IC(t)IC_0,e^{-\lambda t}$ 在这里用scipy.optimize.curve_fit求 $\lambda$。from scipy.optimize import curve_fit import numpy as np ic_s ic.rolling(10).mean().dropna() # 平滑噪声 ic_s ic_s[ic_s 0] # 只拟合衰减正值段 def decay(t, ic0, lam): return ic0 * np.exp(-lam * t) t np.arange(len(ic_s)) popt, _ curve_fit(decay, t, ic_s.values, p0[abs(ic_s.iloc[0]), 0.05], maxfev20000) half_life np.log(2) / popt[1] # 半衰期 ln2 / λ print(fλ{popt[1]:.4f}, 半衰期≈{half_life:.1f} 期)结果是一个具体的期数比如半衰期≈24期含义是因子信号大约一个月后只剩一半。画图验证拟合完务必画图确认曲线形状确实向下弯、而不是拟合到了噪声上。下面把原始IC、平滑IC和拟合曲线叠在一起一眼就能判断衰减是否成立。import matplotlib.pyplot as plt plt.figure(figsize(10, 6)) plt.plot(ic.index, ic, alpha0.5, label滚动 IC) plt.plot(ic_s.index, ic_s, label平滑 IC) plt.plot(t, decay(t, *popt), r--, labelf拟合曲线 (半衰期≈{half_life:.1f})) plt.xlabel(日期); plt.ylabel(IC 值) plt.legend(); plt.title(因子 IC 衰减与半衰期) plt.show()如果拟合曲线明显贴着平滑IC的下降段说明指数假设成立如果拟合线飘到数据外面多半是这段IC根本不在衰减该重新切样本。 半衰期数字怎么读算出来的 $t_{1/2}$ 要落到调仓动作上才有意义。经验对应关系大致如下半衰期区间建议调仓节奏 5 期约一周高频信号消耗快交易成本敏感5–20 期一两周到一个月月度或双周调仓20–60 期一个月到季度季度或低频再平衡 60 期低频即可重点看稳定性而非频率两个容易踩的坑一是IC窗口太短噪声盖过真信号半衰期会被随机拉得忽长忽短建议先在 20–60 期之间对照着试。二是别只看单段因子有效性会随行情切换gs_quant/models/risk_model_utils.py 里的工具函数可以在拟合前后对因子序列做稳定性校验确认衰减不是某段行情的偶发。从单因子到组合的延伸单因子算完 $t_{1/2}$ 只是起点。真正上线时多因子之间的相关与半衰期差异可以直接喂给 gs_quant/markets/ 里的组合优化模块让每个因子的权重随其信号半衰期动态衰减把调仓频率和成本一并纳入约束。IC 半衰期把因子还灵不灵变成了一条可回测的曲线和一个可调仓的数字。拿你手里因子的近一年数据跑一遍看看衰减是快是慢再决定是加仓还是收手。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询