gs-quant 因子IC半衰期:3步怎么算出来?
2026/9/13 7:49:30 网站建设 项目流程

gs-quant 因子IC半衰期:3步怎么算出来?

【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant

当回测里的动量因子突然不灵,你更想先知道它还能撑多久——IC半衰期就是回答这个问题的那把尺子。gs-quant 把拉因子收益和算滚动相关的函数都备齐了,几行代码就能画出 IC 衰减曲线、算出半衰期,不用自己搭数据管道。

核心概念速览

IC半衰期衡量的是因子预测力衰减到一半需要多久,它直接决定调仓频率——半衰期 20 天的因子按月调就够了,5 天的得按周。gs-quant 里拉因子收益、算滚动相关都是现成函数,拼起来就是一套完整的 IC 衰减分析。

上图展示了因子层面的分析面板,我们这条流程的原料就来自这类风险模型数据。

从数据到结果:三步跑通

整条链路就三次函数调用,跟着做一遍。

拉取风险模型因子收益

先从风险模型里把因子收益取回来,它是后面 IC 计算的原料,前提是会话已配置好 GS 认证。

import datetime as dt from gs_quant.models.risk_model import FactorRiskModel model = FactorRiskModel.get("MODEL_ID") factor_data = model.get_factor_data( start_date=dt.date(2023, 1, 1), end_date=dt.date(2023, 12, 31), name_filter=["Momentum"], )

此时你会看到一张按因子分行的 DataFrame,name列筛出 Momentum 后,日期对收益就是我们需要的序列。

拿到因子序列后,IC 本身不用手算,时间序列模块里的滚动相关就能顶。

怎么算滚动IC序列

IC 的定义是因子值与下期收益的相关性,把收益左移一期、再套 60 日滚动窗口即可。

from gs_quant.timeseries import correlation, lag, generate_series, SeriesType exposure = generate_series(300) # 示例暴露,可换成上一步的因子列 fwd_ret = lag(generate_series(300), -1) # 未来一期收益 ic = correlation(exposure, fwd_ret, w=60, type_=SeriesType.RETURNS)

此时ic是日期索引的序列,前 60 个点为 NaN,之后在 [-1, 1] 之间毛刺波动;实际跑的时候把两条随机序列换成第 1 步的因子收益列即可。

曲线有了,接下来把它压成一个数——半衰期。

用指数衰减拟合半衰期

假设 IC 按指数规律衰减,拟合出衰减系数 λ 之后,半衰期就是 ln2 除以 λ。

import numpy as np from scipy.optimize import curve_fit vals = ic.dropna() p, _ = curve_fit(lambda t, a, l: a * np.exp(-l * t), np.arange(len(vals)), vals.values) half_life = np.log(2) / p[1] # 半衰期(观测期数)

此时half_life是个标量,比如 18 就代表 IC 大约 18 个交易日衰减一半;再用 matplotlib 把ic和拟合曲线叠到一张图上,衰减趋势一眼可见。

模块相对路径一句话作用
FactorRiskModel 因子数据gs_quant/models/risk_model.py拉取风险模型因子收益
correlation 滚动相关gs_quant/timeseries/econometrics.py计算滚动 IC 序列
lag 序列位移gs_quant/timeseries/analysis.py取出未来一期收益

跑通之后能看到什么

输出是一张图:毛刺状的滚动 IC 实线压着一条光滑的指数衰减虚线;半衰期一般落在 10~60 个交易日,IC 长期贴 0 或变号,说明预测力已经耗尽。

上图展示了风险模型里相关系数随时间变化的形态,读法和我们的 IC 衰减曲线一致。

⚠️ 容易踩的坑 & 还能往哪走

  • 半衰期算出负数或夸张的大数 → IC 均值接近 0、被噪声主导 → 先看 IC 均值与标准差,不显著就别拟合。
  • 滚动 IC 前段一片 NaN → 窗口内样本不足 → 调小w或保留缺失,别用前值填充。
  • name_filter筛不到数据 → 过滤按模型内真实命名精确匹配 → 先不加过滤拉一次,看name列再筛。

换掉因子名,同一流程就能复用到整个因子库;再往前一步,可以把半衰期交给gs_quant/markets/optimizer.py的求解器,让它反过来决定调仓频率。

跑通这套流程之后,你的因子库就有了一把统一的尺子。觉得顺手,顺手给仓库点个 star。

【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询