ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用 gs-quant 算出因子还能撑多久:IC 半衰期实战指南

用 gs-quant 算出因子还能撑多久:IC 半衰期实战指南 用 gs-quant 算出因子还能撑多久IC 半衰期实战指南【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant上周组里刚评完一批候选因子紧接着就有人追问动量因子按月调仓够不够它的因子有效性还能撑多久这正是 IC 半衰期要回答的问题。拿 gs-quant 的风险模型和时序工具走一遍二十分钟就能把答案算出来。 先说人话IC 和半衰期在衡量什么打个比方因子就像一块给策略供电的电池。IC信息系数就是它此刻的输出电流——每个交易日因子暴露对下期收益的预测有多准。电流强预测可信电流掉到 0.05 以下基本等于没在供电。电池的电还会随时间漏掉漏到只剩一半要多久这就是半衰期。假设因子 IC 按指数规律衰减$IC(t) IC_0 e^{-\lambda t}$那么半衰期 $t_{1/2} \ln 2 / \lambda$。用大白话拆一下符号$IC_0$ 是初始电量$\lambda$ 是漏电速度漏电越快因子越不耐放。数据侧因子暴露由风险模型提供gs_quant/markets/factor.py 里的 Factor 类负责把模型中的因子取出来。说白了半衰期就是因子有效性的保质期它直接框定了调仓频率的上限保质期 21 个交易日的因子按月调仓大致刚好按周调仓多半是白花钱。三步把半衰期算出来整条链路就三件事数据拿进来、IC 序列滚出来、衰减参数解出来。1. 加载因子暴露与收益数据先回答数据从哪来Marquee 这类风险模型暴露和收益都能直接取。import datetime as dt from gs_quant.models.risk_model import FactorRiskModel # 用模型 ID 取模型对象按实际权限替换 model FactorRiskModel.get(MODEL_ID) # 取一段区间内的因子数据并带上因子收益曲线 factor_perf model.get_factor_data( start_datedt.date(2022, 1, 1), end_datedt.date(2024, 12, 31), include_performance_curveTrue, )个股维度的暴露可用 get_universe_exposure 批量取单名收益用 get_daily_return入口都集中在 gs_quant/models/risk_model.py。2. 滚动计算 IC 序列这一步把预测力变成一个随时间走的序列。from gs_quant.timeseries import correlation # exposure_ret当日因子暴露收益next_ret下期组合收益 # w60 表示 60 个交易日滚动窗口若输入的是收益序列 # 用 SeriesType.RETURNS 显式声明别让它当价格再求一次收益 ic correlation(exposure_ret, next_ret, w60)correlation 定义在 gs_quant/timeseries/econometrics.py窗口参数 w 支持 Window 对象前 N 天可设 ramp-up避开冷启动带来的噪声。3. 拟合衰减系数解出半衰期把干净的 IC 点拟合成一条指数曲线λ 一出来半衰期就是道算术题。import numpy as np from scipy.optimize import curve_fit def exp_decay(t, ic0, lam): # 指数衰减模板ic0 初始值lam 衰减速度 return ic0 * np.exp(-lam * t) clean ic.dropna() t np.arange(len(clean)) (ic0, lam), _ curve_fit(exp_decay, t, clean.values, p0[clean.iloc[0], 0.05]) half_life np.log(2) / lam # 半衰期 ln2 ÷ 衰减速度 print(f拟合半衰期约 {half_life:.0f} 个交易日)p0 一定要给初值ic0 用首值、lam 给个小正数能明显降低拟合跑飞的概率。 结果怎么读只盯两个数字画图只是把两条曲线叠在一起实线是滚动 IC虚线是拟合的 IC 衰减曲线。import matplotlib.pyplot as plt plt.plot(clean.index, clean, label滚动 IC) plt.plot(t, exp_decay(t, ic0, lam), r--, labelf拟合 半衰期 {half_life:.0f} 天) plt.legend() plt.show()看完图真正要带走的是两个数。拟合半衰期本身它是调仓频率的天花板。半衰期 15 天的因子按季调仓等于大部分时间捏着块漏电的电池半衰期 60 天以上月度调仓绰绰有余。残差的方向拟合线长期压在实际点上方说明真实衰减前慢后快单指数会把半衰期估长持续在下方则相反。残差有系统性方向时把样本切成两段分别再拟一次。仓库里这张图展示的也是同类随时间走弱的相关性曲线读法一致先找衰减起点再看衰减斜率。经验清单四个误区对照误区IC 窗口越大越稳 → 正确大窗口会把衰减本身抹平20~60 交易日是常用区间再用两档窗口交叉验证半衰期是否稳定。误区拟合一次就定案 → 正确残差有方向就分样本重拟必要时给衰减函数加漂移项或改分段拟合。误区半衰期等于调仓频率 → 正确它只是上限叠上交易成本后多数情况按不高于半衰期调仓才划算。误区拿单只股票的时间序列直接算 → 正确IC 本质是截面统计量先按日在股票间做秩相关得到 IC 序列再谈衰减。收尾下一步可以按因子分组把每个因子的半衰期作为权重输入长寿命因子降频、短寿命因子提频就是一条动态调仓的路线。gs-quant 的 markets 模块里有现成的组合与优化接口接上优化器这次分享就能长成一个完整策略。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表