gs-quant因子IC半衰期计算:调仓前3步摸清因子的剩余保质期【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant季度调仓会前,你习惯先翻一遍因子表现表:哪些因子还扛得住,哪些已经快失效了。IC均值能告诉你它“有多强”,而IC半衰期告诉你“还能撑多久”。本文用gs-quant完成数据加载、滚动IC计算和衰减曲线拟合,3步拿到半衰期数值,并据此确定下一次的调仓频率。IC(Information Coefficient,信息系数)是因子暴露与未来收益的相关系数,代表因子对下段行情的预测力。先看一张主动与被动资金长期流向的趋势图,作为调仓决策的市场背景:原理速览:药物半衰期的思路搬到因子上 药物有半衰期:一段时间过去后,体内只剩一半有效成分,所以医生按它定给药间隔。因子也一样——t日发布的暴露,对未来收益的“药效”会随时间递减,IC半衰期就是这个效力掉到一半所需的时间长度。工程上一般假设它按指数规律衰减:IC(t)IC0·e^(-λt),λ是衰减速度,半衰期 t½ln2/λ。不用自己推导,把λ从IC序列里拟合出来再除一下就完事。安装依赖并加载因子暴露数据先把环境搭好,再取一年因子暴露。暴露数据通过风险模型接口 gs_quant/models/risk_model.py 里的FactorRiskModel.get_factor_data拉取,收益取任意日收益pd.Series,注意两者日期索引必须对齐,否则后面全是NaN。pip install gs-quant # 终端执行 import datetime as dt from gs_quant.models.risk_model import FactorRiskModel # 拉取目标因子一整年的暴露(换成你的真实模型ID) model FactorRiskModel.get(MODEL_ID) exposures model.get_factor_data( start_datedt.date(2023, 1, 1), end_datedt.date(2023, 12, 31), name_filter[Momentum], ) # returns: 日收益序列(pd.Series),按自己的数据源取三步拿到半衰期:滚动IC、拟合衰减、提取参数第一步,滚动IC。用当前时点的暴露对齐未来收益,取60日窗口的相关性。correlation在 gs_quant/timeseries/econometrics.py 里,窗口参数传整数即可;lag(returns, -1)把收益整体前移一天,实现“当期暴露对下期收益”。第二步,拟合衰减。去掉NaN后,用scipy.optimize.curve_fit对指数形式拟合出 IC0 和 λ。第三步,提取半衰期。ln2 除以拟合出的 λ,得到的就是交易日口径的半衰期。import numpy as np from scipy.optimize import curve_fit from gs_quant.timeseries import correlation, lag from gs_quant.timeseries.helper import SeriesType # 60日滚动IC: 当期暴露 vs 次一交易日收益 ic correlation(exposures, lag(returns, -1), w60, type_SeriesType.RETURNS).dropna() # 拟合指数衰减 IC(t) IC0 * e^(-lam * t) t np.arange(len(ic)) (ic0, lam), _ curve_fit(lambda t, a, b: a * np.exp(-b * t), t, ic.values, p0[ic.mean(), 0.01]) print(fIC半衰期 {np.log(2) / lam:.1f} 个交易日)结果怎么读:对照表直接定调仓频率 图上盯两个东西:原始IC线说明因子还在不在干活(若长期贴着0震荡,半衰期就没意义);拟合衰减线说明它衰减得多快。半衰期数值本身就是“保质期”——越短,你手里的权重偏离最优解的速度越快,调仓频率就得相应提上去。把各因子的关键指标导出成表后,直接对号入座:IC半衰期调仓频率建议≤ 5个交易日周度或更高频调仓,同时核对交易成本5~20个交易日月度(月末)调仓20~40个交易日季度调仓足够 40个交易日半年调仓,或先复查因子构造逻辑避坑清单:4个高频翻车点 ⚠️IC上蹿下跳,半衰期每次算都不一样→ 窗口太小,单只股票的收益就能带偏相关系数 → 把 w 调到20~60个交易日区间,并用多个窗口算半衰期取中位数对比。IC序列出现长段NaN→ 暴露与收益的索引没对齐(交易日历、退市处理不一致) → 先用gs_quant.timeseries.datetime的align对齐两条序列,只取连续区段参与拟合。IC里冒出几个极端尖峰→ 极端样本主导了相关性 → 拟合前用winsorize截尾,它在 gs_quant/timeseries/statistics.py 里,默认把z分数限制在±2.5σ。拟合出半衰期小于1天或大于500天→ 样本跨度太短,或衰减根本不是指数形态 → 把样本扩到1年以上,并检查拟合优度R²再下结论。延伸一步:从单因子保质期到动态权重单因子半衰期拿到后,下一步是把几个因子的半衰期拼起来当作“信号新鲜度”:慢衰减的因子给稳定权重,快衰减的因子配合更高频的再平衡,整体带约束进优化流程,如下图所示:多因子组合与持仓管理可以直接从 gs_quant/markets/portfolio.py 入手,那里有现成的构建与定价入口。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
