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),仅供参考