Skip to content

8.4 单因子检验:IC 和 RankIC

课前导读

本章目标

学完能解决什么困惑:看到一个新因子后,能用最小方法判断它和后续收益有没有关系,而不是凭感觉说“好像有用”。 难度:中级入门,适合刚学完 Python、pandas、因子概念的读者。 用时:约 40 分钟。


知识正文

一、先用“考试成绩”理解因子检验

想象一所学校想判断“模拟考成绩”有没有参考价值。

如果模拟考排在前面的学生,期末考试大多也排在前面,我们会说:模拟考成绩有一定预测作用。

如果模拟考第一名期末垫底,模拟考倒数第一期末第一,而且经常这样反着来,我们会说:模拟考成绩可能方向反了。

如果模拟考名次和期末名次完全乱成一团,我们会说:这次模拟考对期末表现帮助不大。

把这个类比搬到 A 股:

学校场景因子研究场景
模拟考成绩某一天的因子值
期末考试表现之后一段时间的股票收益
学生成绩排名股票因子排名
判断模拟考是否有用判断因子是否值得继续研究

所以,单因子检验的第一问不是“它能不能立刻赚钱”。

第一问应该是:因子值高低,和后续收益高低,有没有稳定的方向关系?

这个问题,就是 IC 和 RankIC 要回答的核心。

关键直觉

IC 和 RankIC 不是交易按钮,而是研究筛子。它们帮你把“看起来有道理”的因子,先筛成“值得继续研究”和“暂时放一放”两类。

二、正式认识 IC 和 RankIC

IC 的英文是 Information Coefficient,直译是“信息系数”。

你可以先把它理解成:因子值与未来收益之间的相关程度

如果某个因子越高,之后收益通常越高,IC 往往偏正。

如果某个因子越高,之后收益通常越低,IC 往往偏负。

如果因子高低和之后收益没什么关系,IC 往往接近 0。

RankIC 则更适合新手先理解。

RankIC 不太关心“数值差多少”,更关心“排序是否一致”。

就像老师不一定关心模拟考 92 分和 90 分差了 2 分,而更关心前排学生期末是不是仍然大多在前排。

在股票里,RankIC 会先把股票按因子值排队,再把股票按未来收益排队,然后比较两条队伍像不像。

这就是“排序相关”的直觉。

指标更关注什么新手理解方式
IC原始数值之间的相关因子数值变大时,收益数值是否也倾向变大
RankIC排名之间的相关因子排名靠前的股票,未来收益排名是否也靠前

A 股里经常会遇到极端值。

比如某只小盘股因为公告涨停,未来 20 日收益特别高。

又比如某只股票因为停牌复牌出现异常收益。

这类极端值可能让普通 IC 被少数股票影响得很厉害。

RankIC 因为看的是排名,通常更稳一点。

所以本节建议你先用 RankIC 做第一道判断。

三、用 5 只股票手算“方向感”

先看一个非常小的例子。

假设我们在某个周五,对 5 只 A 股计算了一个“质量分”。

分数越高,代表公司盈利质量越好。

随后我们观察它们未来 20 个交易日的收益。

股票质量分因子因子排序未来20日收益收益排序
600519 贵州茅台92第14.8%第1
600036 招商银行86第23.1%第2
000333 美的集团73第3-0.6%第4
600887 伊利股份61第40.4%第3
601398 工商银行55第5-2.2%第5

你不需要马上计算复杂公式。

先用眼睛看方向。

质量分前两名,未来收益也排在前两名。

质量分最后一名,未来收益也最弱。

中间两只股票有一点交换,但不影响整体方向。

这说明这个小样本里,“质量分越高,未来收益越好”的方向是存在的。

如果把这个过程扩展到更多股票、更多日期,并且方向仍然稳定,因子就值得继续研究。

但如果只靠这 5 只股票下结论,就太草率了。

这也是专业研究和随手看图的区别。

专业研究一定要问:样本够不够多?日期够不够多?方向是否反复出现?

四、最小可用检验流程

单因子检验可以先做得很小,不必一上来搭建复杂系统。

你只需要准备一张表。

这张表至少包含四列:日期、股票代码、因子值、未来一段时间收益。

字段含义注意点
date因子观察日必须是当时已经能看到因子的日期
code股票代码例如 600519、000333
factor因子值可以是 ROE、低估值分、动量分等
future_20d_return未来20日收益只能用于检验,不能在当日选股时偷看

最小流程如下:

mermaid
flowchart TD
    A[准备某日所有股票因子值] --> B[计算这些股票未来20日收益]
    B --> C[在同一天横向比较因子和收益排序]
    C --> D[得到当天RankIC]
    D --> E[对很多日期重复]
    E --> F[看平均值、正值比例和稳定性]

注意“同一天横向比较”这几个字。

IC 和 RankIC 通常是在一个交易日的截面上计算。

也就是说,在同一个日期,把一批股票放在一起比。

不要把 2021 年的贵州茅台、2022 年的招商银行、2023 年的美的集团随意混在一起比。

那样会把市场环境变化也混进去。

五、pandas 示例:几行代码得到 RankIC

下面的代码不是完整回测引擎。

它只是把“同一天比较排序关系”翻译成 pandas 操作。

假设你的 DataFrame 名叫 df,已经有 datecodefactorfuture_20d_return 四列。

python
import pandas as pd


def calc_rank_ic(one_day: pd.DataFrame) -> float:
    valid = one_day.dropna(subset=["factor", "future_20d_return"])
    if len(valid) < 20:
        return float("nan")

    factor_rank = valid["factor"].rank(method="average")
    return_rank = valid["future_20d_return"].rank(method="average")
    return factor_rank.corr(return_rank)


rank_ic_by_date = df.groupby("date").apply(calc_rank_ic)

summary = pd.Series(
    {
        "平均RankIC": rank_ic_by_date.mean(),
        "RankIC为正比例": (rank_ic_by_date > 0).mean(),
        "有效期数": rank_ic_by_date.count(),
    }
)

print(summary)

逐步解释一下:

第一步,dropna 删除因子或未来收益缺失的股票。

这很重要,因为停牌、上市时间太短、财务字段缺失,都会让某些股票没有可用数据。

第二步,rank 把因子值变成排名。

因子原始值可能是 3.5、12.8、0.7,也可能是百分比。

排名会把它们统一成“谁更靠前”。

第三步,未来收益也做排名。

我们要看的是“因子排名”和“收益排名”是不是同方向。

第四步,corr 计算两组排名之间的相关程度。

这个结果就是当天的 RankIC。

第五步,groupby("date") 对每个观察日重复计算。

最后得到一串 RankIC,而不是一个孤零零的数字。

常见误区

future_20d_return 是事后用来检验的列,不能在当日选股时使用。真实研究时,因子日期必须早于未来收益区间,否则就是“偷看未来”。

六、怎样判断一个因子值得继续研究

新手最容易犯的错,是看到一次 RankIC 为正就激动。

但一次为正,可能只是运气。

更稳妥的判断可以看四个问题。

第一,方向是否符合常识。

例如“盈利质量越高,未来表现越好”,正 RankIC 比较符合直觉。

如果你定义的是“PE 越高越贵”,那它可能应该是负方向。

这时不是因子没用,而是方向需要重新整理。

第二,平均 RankIC 是否长期偏离 0。

量化研究里,RankIC 不需要大到夸张。

很多有效因子的平均 RankIC 也可能只是小正数。

关键是它是否在足够多日期里反复出现,而不是某一天特别漂亮。

第三,正值比例是否稳定。

如果 60% 以上的月份方向都对,通常比只有少数月份暴涨更有研究价值。

这里的数字不是铁律,只是帮助你建立检查习惯。

第四,样本是否合理。

只看 10 只股票、3 个月数据,结论很脆弱。

覆盖沪深 300 或中证 500 的较长时间样本,会更有参考意义。

七、A 股案例:动量因子的第一道体检

假设你想研究一个简单动量因子。

定义为:过去 60 个交易日涨幅越高,因子值越高。

你想问的是:过去一段时间更强的股票,未来 20 个交易日是否仍然更强?

在 A 股中,这个问题很常见。

因为强势股有时会继续强,有时也会快速回落。

你可以在每个月最后一个交易日,取沪深 300 成份股作为样本。

每只股票计算过去 60 日涨幅。

再观察未来 20 日收益。

然后每个月计算一次 RankIC。

如果多数月份 RankIC 为正,说明“强者恒强”在样本期内有一定影子。

如果多数月份 RankIC 为负,说明强势股可能更容易回落。

如果结果忽正忽负,就说明这个因子单独使用不稳。

这时专业投资者不会立刻否定它。

他会继续问:是否只在某些市场环境有效?是否需要和估值、质量因子搭配?

但这些后续问题必须建立在第一道检验之后。

八、量化开发视角:先保存研究日志

每次计算 RankIC,都建议保存一条研究日志。

日志不需要复杂,可以像这样:

项目记录内容
因子名称过去60日涨幅
因子方向数值越高代表越强
股票池沪深300成份股
观察频率每月末
未来收益窗口20个交易日
平均RankIC由代码输出填写
正值比例由代码输出填写
初步结论继续研究 / 暂缓 / 方向需调整

这样做的好处是,你以后不会只记得“好像有效”。

你会清楚知道自己当时用了什么股票池、什么时间窗口、什么方向定义。

量化研究最怕结论无法复现。

一个能复查的普通结果,胜过一个说不清来源的漂亮结果。


交互实验室

练习一:手工判断排序方向

请先不要写代码。

用下面这张小表练习“因子排序”和“未来收益排序”的直觉。

股票因子值未来20日收益你的判断
A公司805.0%因子高,收益较高
B公司751.2%待填写
C公司60-2.0%待填写
D公司550.4%待填写
E公司40-3.5%待填写

操作步骤:

  1. 先按因子值从高到低排序。

  2. 再按未来 20 日收益从高到低排序。

  3. 比较两种排序是否大致一致。

  4. 写一句结论:这个小样本里,因子方向是正、负,还是看不清。

参考结论可以这样写:

因子值较高的股票,未来收益整体也更高,虽然中间个股有波动,但方向偏正。样本太小,只能作为练习,不能作为投资结论。

练习二:把自己的因子跑出第一版 RankIC

如果你已经有 pandas 表格,可以按下面清单操作。

  • [ ] 确认每一行代表“某日期、某股票”的观察。
  • [ ] 确认因子值在该日期已经可见。
  • [ ] 用未来 20 日收益只做检验,不参与当日筛选。
  • [ ] 按日期分组计算 RankIC。
  • [ ] 记录平均 RankIC、正值比例和样本期数。
  • [ ] 写下“继续研究 / 暂缓研究 / 因子方向需调整”。

如果你还没有真实数据,可以先用 30 只自己熟悉的 A 股做一张练习表。

这张表不追求完美。

它的目标是让你真正走完“因子值 → 未来收益 → 排序相关 → 初步结论”的过程。


核心复盘

知识清单

  • [ ] IC 关注因子值与未来收益之间的相关程度。
  • [ ] RankIC 关注因子排名与未来收益排名是否同方向。
  • [ ] 单因子检验要按同一日期的股票截面计算,不能随意混合不同日期。
  • [ ] 一个因子是否值得继续研究,要看方向、平均值、稳定性和样本合理性。
  • [ ] future_20d_return 只能用于事后检验,不能在当日选股时偷看。
  • [ ] RankIC 是研究筛子,不是买卖信号。

金句总结

“好因子不是讲故事讲出来的,而是在一次次排序检验里留下证据的。”

本文档仅供学习交流用途,不构成任何投资建议。股市有风险,入市需谨慎。