← 返回量化与 AI 投研概念库

IC 与 IR:怎么判断一个因子有没有用

最后更新 2026-08-18
R2 · 注意风险

你想出了一个判断股票好坏的算法——比如「最近二十天涨得多的,接下来更容易继续涨」。把这句话变成每只股票每天一个数值,这个可计算的判断依据,量化里叫因子

麻烦的问题紧接着就来:你怎么知道它有没有用?

大多数人的第一反应是拿去跑一遍回测,看最后赚不赚钱。但回测把太多东西搅在一块了——因子本身的好坏、你买了几只、什么时候换仓、手续费吃掉多少、大盘那几年是涨是跌。曲线向上,你说不清是因子聪明还是那年行情好;曲线向下,你也不知道是因子没用还是你换手太勤把利润磨光了。

所以在谈钱之前,量化系统里还有更早、更干净的一层检验。它只问一件事:这个因子排出来的名次,和后来真实涨跌的名次,对得上吗。

先说人话:一场每天都对一次的答案

想象一位班主任,每次月考前把全班五十个人的名次预测一遍写在纸上。考完,真实名次出来,两张名单一对——预测第一的考了第三,预测最后的考了第四十八,中间有几个错得离谱。你要给这位班主任的眼力打个分,最自然的办法就是问:这两张名单整体上像不像

衡量「两列数字排队像不像」的工具叫相关系数:结果是 1 表示两张名单完全一致,0 表示毫无关系(等于瞎猜),-1 表示完全反着来。

因子评价干的就是这件事,只是把「全班五十人」换成「全市场几百上千只股票」,把「下次考试成绩」换成「未来一段时间的涨跌幅」,把「一学期几次月考」换成「每个交易日都来一次」。这个相关系数有个名字,叫 IC(Information Coefficient,信息系数)。

这里有个容易被忽略、但极其要紧的细节:IC 是按天算的,不是把所有数据堆在一起算一个总的。

为什么?因为如果你把过去三年、几百只股票的所有数据点倒进一个池子里算相关,那么大盘本身的涨跌会把结果彻底带偏——大涨那天几乎所有股票都涨,大跌那天几乎所有股票都跌,这种「全体同涨同跌」会伪装成很高的相关性,而它跟你的因子会不会挑股票毫无关系。

正确的做法是:在同一天内部,横着比一比这些股票。今天这几百只票,因子给的名次和当天真实涨跌的名次像不像?这叫横截面比较——「横」的意思就是切一天出来看,不跨时间。每天算出一个数,一年下来就是两百多个 IC 值,再看它们的平均值。

qlib 里这段计算短得几乎不像一个核心概念该有的样子(groupby 就是「按天分组」):

ic = df.groupby(date_col, group_keys=False).apply(
    lambda df: df["pred"].corr(df["label"]))
ric = df.groupby(date_col, group_keys=False).apply(
    lambda df: df["pred"].corr(df["label"], method="spearman"))

两行,两个版本。上面一行是普通 IC,下面那行加了 method="spearman",算的是排序相关——不看数值差多少,只看名次对不对得上,业内一般叫 Rank IC

为什么 Rank IC 通常比 IC 更该看

普通相关系数吃数值。假设某天有一只票暴涨了 60%,而你的因子恰好给了它一个很高的分,那么这一天的 IC 会被这一个点拽得很高——哪怕剩下几百只票你全排反了。反过来,一个离谱的异常值也能把好好的一天砸成负数。

Rank IC 把所有数值先换成名次再算,暴涨 60% 和暴涨 6% 在它眼里都只是「排第一」。这样一来,结论不再被少数几个极端点绑架。

更重要的是,它跟你实际的用法更配。你拿到因子分数之后,通常不会按分数大小去分配资金,而是取排在最前面的一批。你关心的本来就是名次,不是分数的绝对大小。

这也是为什么正规的因子报告从来不只报一个数。qlib 的信号分析模块一次性吐出四个:

metrics = {
    "IC": ic.mean(),
    "ICIR": ic.mean() / ic.std(),
    "Rank IC": ric.mean(),
    "Rank ICIR": ric.mean() / ric.std(),
}

前两个是数值版,后两个是名次版。两版差得远,本身就是一条线索:说明有少数极端样本在主导结果。

0.03 也叫有用?是的,而且这才是常态

现在说这篇最反直觉的地方。

刚接触的人几乎都会有个预期:一个「有效」的因子,相关性总得有个零点五、零点六吧,不然凭什么说它管用。

不是的。差得很远。

qlib 公开的基准结果里,几十个模型(从线性回归到各种神经网络)在中国 A 股上跑出来的 IC,全都落在小数点后第二位这个量级——也就是零点零几,没有哪一个够到 0.1。这不是这些模型不行,这就是这个问题本身的天花板附近。二级市场上大部分价格波动是噪音,能被稳定预测的那一小块,本来就只有这么大。

那零点零几意味着什么?意味着你排在最前面的那一批股票,平均表现比全体略微好一点点,仅此而已。它绝不意味着你能挑出必涨的票——排第一的那只明天可能跌得最狠,这在低 IC 的世界里完全正常,甚至经常发生。

微弱的倾斜为什么还值钱?因为这个游戏有两个特点:票足够多,天足够长。同一个微弱倾斜,今天在几百只股票上生效一次,明天再生效一次,一年两百多次。单次几乎看不出来的偏向,重复足够多次之后才会显形。

但这句话有三个绝不能省的前提,少一个整个逻辑就塌了:

  • 倾斜得真的存在,不是你从历史噪音里挖出来的巧合;
  • 单次下注不能致命,中途爆掉一次,后面再多次数也回不来;
  • 优势得撑得够久,一个只在特定几年成立的规律,会在你重仓押上去之后消失。

第三条尤其现实。因子并非永久有效,这件事本身就是个独立话题,见 信号衰减

IR:比「有多准」更要紧的是「有多稳」

到这里,真正的分水岭才出现。

设想两个因子。A 的 IC 均值 0.03,每天上下浮动不大,大多数日子都是小正数。B 的 IC 均值 0.06,看起来强一倍,但它的日度数值像过山车——有些日子 0.4,有些日子 -0.3。

只看均值,B 完胜。可拿真钱去做的人,几乎都会选 A。

原因是这样的:你并不知道自己正处在哪一段。 你拿着 B 开始做,很可能一上来就撞进它连续失灵的那几个月。等你亏到怀疑人生把它关掉,它才开始好转。而资金亏损是不对称的——跌掉一半要涨回来得翻倍,这个数学关系在 夏普与索提诺比率 那篇有更完整的展开。均值再高,路上把你颠下车了,均值就跟你没关系了。

所以要有一个数来描述「稳不稳」。做法非常朴素:把 IC 的平均值,除以 IC 自己的波动

写成代码就是上面那行 ic.mean() / ic.std(),叫 ICIR(IC 的信息比率)。分子是「平均有多准」,分母是「准得有多飘」。用上面的假设数字算:A 若日度波动是 0.10,ICIR 就是 0.3;B 若波动是 0.40,ICIR 只有 0.15。均值高一倍的 B,稳定性上输掉一半。

这个「均值除以波动」的结构,你会在量化的各个角落反复撞见——夏普比率是收益均值除以收益波动,信息比率是超额收益均值除以其波动,ICIR 是 IC 均值除以 IC 波动。换的是分子里那个东西,问的永远是同一句话:你这点优势,相对于它自己的抖动来说,算大还是算小。

🚧 避坑

两个「IR」不是一回事,别混着读。 因子报告里的 ICIR 说的是「因子预测能力的稳定性」,算的是 IC 序列;而组合业绩表里的 Information Ratio(信息比率)说的是「组合超额收益的稳定性」,算的是收益序列。qlib 的基准表格里两者同时出现在一行上,各占一列。ICIR 好不代表最终业绩就好——中间还隔着组合怎么构建、成本吃掉多少这一整层。把这两个数当成同一个东西看,会得出完全错误的结论。

系统层:一份完整的因子体检长什么样

只看均值是不够的,所以真实系统给的从来不是一个数,而是一组从不同角度戳同一个因子的图表。qlib 的模型表现分析模块里能看到这几类:

IC 的时间序列。 每天一个点连成线。你要看的不是它高不高,是它有没有长时间躺在零线以下。一个整体 IC 为正、但靠某三个月的暴利撑起来的因子,和一个天天小赢的因子,均值可能一样,能不能拿住完全是两回事。

月度 IC。 把日度 IC 按月取平均,铺成一张年-月的表。这张表最擅长揭穿「集中爆发型」的因子——如果绿色的格子只堆在某一两年,那个规律很可能属于当时那段特定行情,不属于市场本身。

IC 的分布与正态 Q-Q 图。 Q-Q 图是用来看「这堆数据的分布,跟标准的钟形曲线像不像」的。如果 IC 的分布有很粗的尾巴,说明极端日子的贡献远超想象,那么用「均值除以标准差」来概括它,本身就在低估风险——标准差这个工具默认世界是温和的。

分组收益。 把因子分数从高到低切成若干组(qlib 的默认切法是五组,可配置),看每组之后的平均收益。理想情况是一条整齐的阶梯:分数越高的组收益越高。现实中常见的却是「只有最差那一组特别差,中间几组分不出来」——这种因子的信息其实全在排除烂票上,而不在挑出好票上。如果你所在的市场没法做空,这类因子的价值就要打折。

分数的自相关与换手。 把今天的因子分数和昨天的比一比,看排名变了多少。变得越猛,意味着你要越频繁地调仓,交易成本就越高。一个 IC 亮眼但每天把持仓翻个底朝天的因子,很可能在扣掉成本后什么都不剩。从分数到实际持仓中间要跨的那一整层,见 模型吐出一列分数之后呢

它会怎么骗你

标签没定义清楚,IC 就没有意义。 IC 是「因子」和「未来收益」的相关,可「未来收益」到底指什么?明天开盘到后天开盘?今天收盘到十天后收盘?扣不扣掉大盘涨幅?换一个定义,同一个因子的 IC 能差出好几倍。看到一个漂亮的 IC,第一句该问的永远是「你的未来收益是怎么定义的」。

样本内的 IC 不算数。 用同一段数据既调参数又算 IC,得到的数字只是「你把这段历史背得多熟」。这层区分在 样本内与样本外 讲得更细。

未来数据混进来了。 如果计算因子时用上了当时还拿不到的信息,IC 会异常地高,高到让你觉得自己发现了新大陆。IC 高得反常时,先查这个,别先算仓位——前视偏差 那篇专门讲它为什么极难自查。

IC 来自你买不到的地方。 如果因子的预测能力主要集中在成交极其清淡的小票上,那这份 IC 在纸面上成立,在真实下单时会被冲击成本吃掉。相关性不区分「能不能买到」。

符号反了当成宝。 一个稳定的负 IC 确实也是信息,但在你把它反过来用之前,得先想明白:这个反向关系有没有一个说得通的道理?如果只是数据挖出来的,反过来用大概率是把过拟合又做了一遍。

IC 为正不等于赚钱。 这条最该记住。IC 描述的是排序的吻合度,中间隔着换手成本、冲击成本、能否成交、仓位如何分配。一个正 IC 的因子完全可能在扣完成本后是亏的。

失效边界与常见误用

拿不同市场、不同标的池的 IC 直接比高低。 股票数量、市场结构、时间段都不一样,IC 的量级本来就不可比。同一个因子换个标的池,数字就不同。

只看均值,不看分布。 均值 0.03 可以是「天天 0.03」,也可以是「三百天 0,五天 1.8」。前者能做,后者不能——但它们的均值一模一样。

把 IC 当成胜率。 IC=0.05 不等于「五成多的票会涨」。它是一个相关系数,描述整体倾斜程度,不能翻译成任何一只具体股票的涨跌概率。

用 IC 决定单笔买卖。 因子评价从头到尾是一群股票、一大段时间的统计结论。它对「我手上这一只明天怎么样」这个问题,能给出的答案是零。

小结

  • IC = 因子分数的排名和后来真实涨跌的排名,在同一天内部横着比,对得上多少;每天一个数,看的是它们的平均值。按天算而不是全堆一起算,是为了不让大盘同涨同跌冒充预测能力。
  • Rank IC 只比名次不比数值,不容易被少数极端股票绑架,也更贴合「取排名靠前一批」的实际用法。
  • 零点零几就是常态,公开基准里的模型 IC 普遍落在这个量级。它意味着一批股票的平均表现有微弱倾斜,不意味着你能挑出必涨的票。这点优势要变成结果,前提是次数足够多、单次不致命、优势本身撑得够久。
  • IR 类指标(这里是 ICIR = IC 均值 ÷ IC 波动)问的是「你这点优势相对于它自己的抖动算不算大」。稳定的弱信号通常比不稳定的强信号值钱,因为你不知道自己会从哪一段进场,而中途被颠下车的人拿不到长期均值。
  • 因子报告里的 ICIR 和业绩表里的信息比率是两个东西,前者好不代表后者好。
  • 一份 IC 报告至少要看四层:时间序列(有没有长期躺在零线下)、月度表(是不是靠某一两年撑着)、分布形态(是不是靠极端日子)、分组阶梯(信息在挑好票还是在排除烂票)。
  • IC 为正 ≠ 赚钱。它只描述排序吻合度,成本、冲击、能否成交都在它的视野之外。

一句话记住这篇:判断一个想法有没有用,别问它最好的时候有多准,问它平时有多稳。

本文所引源码与文档均来自上述快照版本,是阅读代码得出的机制说明,不是运行结果;文中用于对比的 IC、ICIR 数值均为便于说明而假设,不代表任何真实产品的表现。回 量化与 AI 投研概念库 看其它概念各自在说什么;本站内容为投资教育,不构成任何投资建议,边界见 免责声明

内容有错、看不懂、或想看下一篇?告诉我们 →

本文为投资教育整理,不构成任何投资建议;不荐个股/基金、不预测点位、不承诺收益。关键数据与结论请结合权威来源自行验证,并见风险免责声明