gs-quant 多因子模型:IC 与 Rank IC 怎么选,附 5 步落地清单
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
因子回测里 IC=0.08 看着挺漂亮,一上实盘仓位就被打脸。这种落差往往不是策略的问题,是"测量方式"的问题。本文用 gs-quant 的多因子模型把因子 IC 与 Rank IC 拆清楚:两者怎么算、什么时候各自可信、如何验证。
🧭 结论先行:什么场景用 IC,什么场景用 Rank IC
一段话版答案:
- IC(Pearson 相关系数):因子值和未来收益率都接近正态、没有极端值时,用 IC。它保留了数值量级信息,能区分"因子高 1 分"和"因子高 10 分"。
- Rank IC(Spearman 相关系数,即先把两个序列换成排名再算相关):因子分布偏斜(比如对数市值天然右偏)、收益率里有单日大起大落时,用 Rank IC。
- 快速判别法:同一窗口里两个指标差值连续超过 0.02~0.03,基本可以断定有异常值或分布偏斜在污染 IC,此时以 Rank IC 为准。多数情况下 IC ≥ Rank IC,除非你的因子被极端值"撑大"了。
概念讲成人话:IC 看分数,Rank IC 看名次
想象一次全班考试:
- IC 像直接拿原始分数算相关——老师把分数和平时预测的"这次谁考好"做相关。谁考了 100 分,这一天的结果就被这个人主导。
- Rank IC 像先换算成班级排名再算相关——100 分也好、98 分也好,都只记"第 1 名"。极端值被压成一个位置,相关性由整体排序决定。
所以在正常考试(正态分布、没有 0 分 100 分)里两者几乎一样;一旦出现"某人交了白卷但平时表现极佳"这种异常,看排名比看分数靠谱。
上面这张图来自 gs-quant 的事件材料:左侧把 Book Queue、Volatility、Spread 等多个因子聚成一类,右侧按 13 个簇标注交易难度。多因子分析里因子先分群、再逐个群内检验预测力,而 IC 就是检验"这个簇里的因子到底有没有用"的那把尺子。
代码里到底怎么算的:econometrics.py 的滚动相关一处就够
不用通读整个仓库,看两处就懂全貌。
第一处:滚动相关函数correlation,位于 gs_quant/timeseries/econometrics.py 第 767-774 行:
def correlation( x: pd.Series, y: pd.Series, w: Union[Window, int, str] = Window(None, 0), type_: SeriesType = SeriesType.PRICES, returns_type: Returns = Returns.SIMPLE, assume_zero_mean: bool = False, ) -> pd.Series:第二处:它的核心只有一行,在第 884 行:
# gs_quant/timeseries/econometrics.py 第 884 行:滚动 Pearson corr = clean_ret1.rolling(w.w, 0).corr(clean_ret2)看什么:这就是 IC 的全部实现——因子序列和收益序列在一个窗口(w.w,常用 22 个交易日)里逐日算滚动 Pearson。Rank IC 没有单独函数,做法是把两个序列先各做一遍rank()(换成名次),再跑同一个correlation,数学上等价于 Spearman。
因子数据从哪来:gs_quant/models/risk_model.py 第 682-789 行的get_factor_data,传start_date/end_date/category_filter即可拉回因子暴露,拿到 DataFrame 后接上面的滚动相关就是完整的 IC 计算链。
⚠️ 踩坑记录:算因子 IC 最容易掉的 3 个坑
坑 1:因子和收益的日期错位。因子是 T 日收盘更新,收益却用了 T 日,整条 IC 序列系统性偏移一天,实测幅度能直接腰斩甚至变号。对策:先做滞后检验——对 lag ∈ {-1, 0, 1} 各算一次 IC,取绝对值最大的那个滞后作为基准,并把结论写进报告。
坑 2:单日极端行情。窗口里出现一个 ±30% 的极端收益时,滚动 IC 可以瞬时摆动 0.05~0.15,而同一天的 Rank IC 几乎不动(极端值排序后只是"最后一名")。对策:含极端值的窗口两个指标并排报告,决策以 Rank IC 为准;IC 只用于观察量级。
坑 3:因子本身分布偏斜。对数市值、波动率类因子天然右偏,Pearson 会系统性误判方向或幅度。对策:偏斜因子默认用 Rank IC;若某段时间 IC 与 Rank IC 差值在 0.01~0.02 以内,说明该区间分布尚可,两种口径可互换。
✅ 落地清单:验证因子预测力的 5 步
- 对齐数据:因子取 T 日、收益取 T+1 日。判断标准:抽查 20 行,0 行日期重叠。
- 双指标同算:用 22 日窗口同时算滚动 IC 和 Rank IC。判断标准:两者差值 < 0.02;持续超过 0.03 就回去查异常值。
- 看平均强度与稳定性:统计 |IC| 均值和分季度符号。判断标准:|均值| ≥ 0.03,且各季度符号一致,才算"预测力存在"。
- 实盘一致性核对:实盘跑满 1 个月后,把实盘 IC 放回回测分布。判断标准:落在回测 IC 的 [10%, 90%] 分位区间内;跌出区间先查执行滑点,再怀疑模型。
- 固定决策口径:正态因子用 IC、偏斜因子用 Rank IC,写进因子卡片。判断标准:换口径不导致季度结论反转;若反转,说明该因子处于"擦边有效"状态,降级观察。
IC 和 Rank IC 打架的时候,别急着站队——先看收益分布:偏斜存在时 Rank IC 通常更接近真实预测力,两者长期一致时再用 IC 看量级。一个值得继续追的问题:因子如果按小时更新,滚动窗口还该按 22 天算吗?risk_model.py 里的get_intraday_factor_data就是这条路的入口,值得自己跑一遍。
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考