因子信号回测漂亮、实盘失灵?IC 与 Rank IC 这样选
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
你大概率遇到过这种情况:某个因子回测里 IC 曲线一路向上,等拿到实盘信号就衰减得很快。多数时候,问题不在数据,而在你用来衡量预测力的指标本身。gs-quant 的因子风险模型和时序模块,正好提供了一对互补的检验工具:Pearson IC 和 Rank IC(信息系数,用来量化"因子值对未来收益的预测力",前者取相关系数,后者先排名再取相关)。
从因子风险模型手里拿到什么数据
判断一个因子有没有用,前提是先把它的历史表现取出来。gs-quant 里这套东西集中在gs_quant/models/risk_model.py,模型对象上可以直接取到因子收益、因子暴露,以及因子之间的协方差矩阵(描述一组因子彼此相关程度的一堆数字)——有了这份矩阵,组合层面的风险归因才算完整。
取数入口是get_factor_data,大约在第 682-726 行。你只需要关心三个参数:
from gs_quant.models.risk_model import FactorRiskModel import datetime as dt model = FactorRiskModel.get("MODEL_ID") data = model.get_factor_data( start_date=dt.date(2024, 1, 1), end_date=dt.date(2024, 6, 1), identifiers=["FACTOR_ID"], )这几行做的事:加载一个因子风险模型,然后按日期区间和因子 ID 拉出它的历史数据,返回的 DataFrame 就是后面算 IC 的原料。
Pearson IC 和 Rank IC 到底差在哪
- Pearson IC:拿某一截面的因子值和这些股票下一期的收益,直接算相关系数。计算快、信息全,但一个离群点就能把整条曲线拽歪。
- Rank IC:先把两边都换成横截面排名,再算相关。相当于把"涨了多少"压缩成"排第几",极端行情基本伤不到它。
gs-quant 的gs_quant/timeseries/econometrics.py里有个现成的correlation函数(第 767 行起),传一个滚动窗口就能算出逐期的 IC 序列,不用自己写循环。
📊 什么时候信 IC,什么时候信 Rank IC
- 单票单日出现 ±30% 这种收益时,Pearson IC 很容易被这一只票拉偏——离群点同时抬高两个序列的波动和相关值,算出来虚高;Rank IC 对这种冲击基本无感,留下的是因子对大多数股票的真实预测力。
- 反过来,如果你的因子暴露接近正态分布,而且尾部那几只票的幅度本身就是信号的一部分,Pearson IC 保留了幅度信息,读数更"值钱"。
比较稳妥的分工是:日常监控看 Rank IC 判断信号健康度,做归因时再看 Pearson IC 拆尾部贡献。
执行环节里,因子暴露同样要用
模型说"该买该卖",执行时还要看成本。gs-quant 的 APEX 模块会在调仓前分析订单的因子暴露结构,并按流动性聚类估计市场冲击,决定怎么拆单。它的聚类逻辑就是用队列时间、点差、成交规模这些特征把股票分成若干组,每组的市场冲击特征差别很大:
执行方式选得不好,因子结构会在下单过程中被悄悄改变。
下一步建议:用get_factor_data拉出你手上因子的历史序列,用滚动窗口同时算 Pearson 和 Rank 两条 IC 曲线放在一起看——两条线的背离程度,往往比单条线的水平更早暴露信号的问题。
【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考