IC 回测很高、实盘却拉胯?gs-quant 多因子模型 IC 与 Rank IC 预测精度怎么选
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
回测里 IC 一直有 0.06,实盘一个月收益却接近 0,问题出在哪?gs-quant 是高盛出品的 Python 量化工具包,因子风险模型一个接口就能拉出因子数据与因子收益。这篇文章把多因子模型里 IC 与 Rank IC 的预测精度差异讲透,并给你一条挑选路径。
📉 高 IC 常常"死"在这两个场景
场景一:一只股票绑架了整个样本。假设 500 只股票的某因子分值大多在 1 以内,只有一只大盘股是 50。Pearson 相关对这种极端值极其敏感,一只票的走势就能把当期 IC 整体拉高或拉低。实盘里这只票的表现不会重演,IC 自然就"塌"了。
场景二:收益率根本不是正态分布。真实市场收益有肥尾和跳空,回测窗口若恰好覆盖两三个极端交易日,算出来的 IC 会被这几个日子"托高"。这种托高属于那几天,不属于因子。
所以做因子选择时先问一句:我的 IC 里有多少是被异常值撑起来的?
🧮 IC vs Rank IC:原始分相关 vs 名次相关
IC(信息系数)是因子取值与未来收益的 Pearson 相关。类比:比较两个学生的原始分数,其中一个人突然考了 100 分,全组"分数与排名的相关"都会被带偏。
Rank IC 先把因子值和收益都换成名次——"500 只里排第 10"——再算名次间的相关,即 Spearman 相关。类比:看考试的百分位排名,最后一名考 100 分也不影响你的位次判断。
差异根源一句话:IC 看数值的量级,Rank IC 只看排序。所以有异常值、非正态分布或极端行情时,两者会分叉,数据越极端分叉越大。
这张图展示按流动性、成交量、波动率等多维因子对股票做聚类的效果,是因子分析中典型的"不同因子组合把股票分成几类"的视角。
📦 gs-quant 里因子数据在哪拿:一个文件跑通
实现集中在gs_quant/models/risk_model.py,FactorRiskModel类(第 1540 行)是股票因子风险模型的入口。拉因子数据的方法是get_factor_data,从第 682 行开始:
def get_factor_data( self, start_date: dt.date = None, end_date: dt.date = None, identifiers: list[str] = None, include_performance_curve: bool = False, category_filter: list[str] = None, name_filter: list[str] = None, factor_type: FactorType = None, format: ReturnFormat = ReturnFormat.DATA_FRAME, ) -> Union[list[dict], pd.DataFrame]:人话:给个日期区间,它把因子数据装进 DataFrame 还给你;可以按类别、按名字、按因子类型筛。
拿到因子值后还需要收益序列。第 794 行有现成的get_factor_returns_by_name,用法直接取自方法文档示例:
model = FactorRiskModel.get("MODEL_ID") factor_returns = model.get_factor_returns_by_name(start_date, end_date)人话:这个取因子收益序列,和因子数据配成一对后,一行corr()算出 IC,先rank()再corr()就是 Rank IC。
图中展示了股票相关性在不同时段日内漂移的曲线——相关是随时间漂移的量,IC 就是它按截面算出来的版本。
⚖️ 怎么选:按分布形态、波动、周期三步走
别背口诀,按顺序过三关:
- 分布形态:画因子值直方图,或看最大值与中位数之比。接近正态、无离群点 → IC 可用;有肥尾或极端值 → 优先 Rank IC。
- 市场波动:平稳行情、因子排序稳定 → IC 够用;波动大、量级失真但先后顺序仍可信 → Rank IC 更稳。
- 投资周期:短周期(天到周)因子排序翻得快,Rank IC 更抗扰动;中长期(月到年)样本积累足够,两者收敛,IC 即可。
对仗着记:
- IC 适合:分布接近正态、行情平稳、周期偏长的多因子模型因子选择
- Rank IC 适合:因子值带离群、收益肥尾、高波动与极端行情期
✅ 读完就能做的事
- 用
get_factor_data和get_factor_returns_by_name拉一段同期数据,把 IC 与 Rank IC 并排算出来,先看两者差得多不多。 - 对每个因子先检查分布有无离群(直方图、最大值/中位数比),有离群就把 Rank IC 设成默认口径。
- 筛选因子时分别按 IC、Rank IC 给因子打分排序,优先保留两边都稳定的因子。
今天就从第一步开始:拉近 6 个月的数据,把两个指标各算一遍,差距超过 0.02 就先去查异常值。
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考