
gs-quant 因子 IC 半衰期计算 3 步走从诊断到定调仓频率【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant上季度,某动量因子在历史回测里表现亮眼,实盘 PL 却持续掉队。常见原因无非两种:执行衰减,或者因子 IC因子暴露与未来收益的相关系数,可理解为因子预测力的刻度本身在衰减。关键问题是:衰减有多快?我们用 gs-quant 的风险模型与时间序列模块,算出 IC 半衰期IC 衰减到初始值一半所需时间,把凭感觉调仓变成有数字依据的决策。问题与指标:IC 半衰期是什么IC 半衰期衡量因子有效性的持续时间:从信号产生之日起,IC 序列按指数规律回落,跌到峰值一半所用的天数就是半衰期。直观例子:某因子 t 日 IC 为 0.06,若第 20 个交易日后同口径 IC 只剩 0.03,则半衰期约为 20 个交易日——月频调仓期间信号将损失约一半。准备工作:环境与数据前提本机可访问 gs-quant 数据环境有风险模型与数据集读取权限,依赖pandas、scipy、matplotlib。核心导入:import datetime as dt import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit from gs_quant.models.risk_model import FactorRiskModel # 风险模型数据入口 from gs_quant.data import Dataset, Fields from gs_quant.timeseries import correlation, returns, lagH3 拉数据:风险模型因子暴露 基准收益目的:拿到一条信号序列和一条被预测序列。get_factor_data按日期区间拉取指定因子的暴露度,Dataset.get_data拉取基准指数价格。# 替换为实际值:风险模型 ID、日期区间、数据集 ID 与字段名 model FactorRiskModel.get(MODEL_ID) fd model.get_factor_data( start_datedt.date(2025, 1, 1), end_datedt.date(2025, 12, 31), name_filter[MOMENTUM], ) factor_exposure fd[MOMENTUM] # 宽表取单列,得到日频暴露 Series bench Dataset(BENCH_INDEX_ID).get_data( startdt.date(2025, 1, 1), enddt.date(2025, 12, 31), tickerBENCH_TICKER, fields[Fields.price_close], ) benchmark_returns returns(bench[close], obs1) # 价格转日度简单收益name_filter只保留目标因子,避免返回整张宽表;若两序列日期口径不一致,先reindex对齐。H3 算指标:60 日滚动 IC 序列目的:把预测力随时间变化变成一条 IC 曲线。correlation按滚动窗口计算 Pearson 相关系数,lag制造一期错位,实现t 日暴露预测 t1 日收益。ic_series correlation( factor_exposure, lag(benchmark_returns, obs1), w60, # 滚动窗口:60 个交易日 type_SeriesType.RETURNS, # 两序列按收益率口径计算 )窗口建议 20–60 个交易日:太小噪声大,太旧又追不上市场风格切换。H3 出结果:指数衰减拟合 画图目的:用IC(t)ic0*exp(-lambda*t)拟合曲线,由衰减系数 lambda 反推半衰期ln2/lambda。def decay(t, ic0, lam): return ic0 * np.exp(-lam * t) # 指数衰减模型 valid ic_series.dropna() # 窗口未满处为 NaN,必须先剔除 t np.arange(len(valid)) params, _ curve_fit(decay, t, valid.values) half_life np.log(2) / params[1] # 半衰期(交易日) plt.figure(figsize(9, 5)) plt.plot(ic_series.index, ic_series, label滚动 IC) plt.plot(valid.index, decay(t, *params), r--, labelf拟合曲线 (半衰期≈{half_life:.0f} 个交易日)) plt.legend(); plt.title(因子 IC 衰减诊断) plt.show()curve_fit内部用最小二乘求ic0与lam,数据点少于 2 个会直接报错,拉更长的历史区间即可。结果怎么看正常:IC 曲线在 0 轴上方缓慢下行,半衰期(如本例拟合约 18 个交易日)显著大于你的调仓周期——信号衰减慢,月频调仓可接受。异常:曲线 10 个交易日内跌掉一半以上,或整体跌到 0 轴下方——因子预测力已失效,该换因子而不是调仓。仓库里这类先快后平的衰减形态,和 IC 诊断图的典型长相一致,可对照判断衰减速度。模块速查功能代码路径一句话说明风险模型因子数据gs_quant/models/risk_model.pyFactorRiskModel.get_factor_data按日期/因子名拉取暴露序列滚动相关与收益率gs_quant/timeseries/econometrics.pycorrelation滚动窗口相关、returns价格转收益数据集读取gs_quant/data/dataset.pyDataset.get_data按区间与字段取数避坑IC 全是 NaN:两序列日期对不上;先reindex到同一交易日日历。correlation的w单位混淆:传整数 60 是 60 个交易日,传 1m 才是日历月。相关结果虚高:把价格直接传入,趋势会制造虚假相关;先returns()转收益。curve_fit报 NaN 错误:前 60 日窗口未满,必须先dropna()再拟合。lam拟合为负:说明 IC 在增强而非衰减,警惕前视偏差,别硬套半衰期。以上把拉数—算 IC—拟合串成了固定动作:gs-quant 里 60 日滚动窗口加指数拟合,就能给一个因子定出半衰期数字。下一步可把同一流程跑成多因子矩阵,用各自半衰期约束调仓频率与因子权重。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考