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 | 第1 | 4.8% | 第1 |
| 600036 招商银行 | 86 | 第2 | 3.1% | 第2 |
| 000333 美的集团 | 73 | 第3 | -0.6% | 第4 |
| 600887 伊利股份 | 61 | 第4 | 0.4% | 第3 |
| 601398 工商银行 | 55 | 第5 | -2.2% | 第5 |
你不需要马上计算复杂公式。
先用眼睛看方向。
质量分前两名,未来收益也排在前两名。
质量分最后一名,未来收益也最弱。
中间两只股票有一点交换,但不影响整体方向。
这说明这个小样本里,“质量分越高,未来收益越好”的方向是存在的。
如果把这个过程扩展到更多股票、更多日期,并且方向仍然稳定,因子就值得继续研究。
但如果只靠这 5 只股票下结论,就太草率了。
这也是专业研究和随手看图的区别。
专业研究一定要问:样本够不够多?日期够不够多?方向是否反复出现?
四、最小可用检验流程
单因子检验可以先做得很小,不必一上来搭建复杂系统。
你只需要准备一张表。
这张表至少包含四列:日期、股票代码、因子值、未来一段时间收益。
| 字段 | 含义 | 注意点 |
|---|---|---|
| date | 因子观察日 | 必须是当时已经能看到因子的日期 |
| code | 股票代码 | 例如 600519、000333 |
| factor | 因子值 | 可以是 ROE、低估值分、动量分等 |
| future_20d_return | 未来20日收益 | 只能用于检验,不能在当日选股时偷看 |
最小流程如下:
flowchart TD
A[准备某日所有股票因子值] --> B[计算这些股票未来20日收益]
B --> C[在同一天横向比较因子和收益排序]
C --> D[得到当天RankIC]
D --> E[对很多日期重复]
E --> F[看平均值、正值比例和稳定性]注意“同一天横向比较”这几个字。
IC 和 RankIC 通常是在一个交易日的截面上计算。
也就是说,在同一个日期,把一批股票放在一起比。
不要把 2021 年的贵州茅台、2022 年的招商银行、2023 年的美的集团随意混在一起比。
那样会把市场环境变化也混进去。
五、pandas 示例:几行代码得到 RankIC
下面的代码不是完整回测引擎。
它只是把“同一天比较排序关系”翻译成 pandas 操作。
假设你的 DataFrame 名叫 df,已经有 date、code、factor、future_20d_return 四列。
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公司 | 80 | 5.0% | 因子高,收益较高 |
| B公司 | 75 | 1.2% | 待填写 |
| C公司 | 60 | -2.0% | 待填写 |
| D公司 | 55 | 0.4% | 待填写 |
| E公司 | 40 | -3.5% | 待填写 |
操作步骤:
先按因子值从高到低排序。
再按未来 20 日收益从高到低排序。
比较两种排序是否大致一致。
写一句结论:这个小样本里,因子方向是正、负,还是看不清。
参考结论可以这样写:
因子值较高的股票,未来收益整体也更高,虽然中间个股有波动,但方向偏正。样本太小,只能作为练习,不能作为投资结论。
练习二:把自己的因子跑出第一版 RankIC
如果你已经有 pandas 表格,可以按下面清单操作。
- [ ] 确认每一行代表“某日期、某股票”的观察。
- [ ] 确认因子值在该日期已经可见。
- [ ] 用未来 20 日收益只做检验,不参与当日筛选。
- [ ] 按日期分组计算 RankIC。
- [ ] 记录平均 RankIC、正值比例和样本期数。
- [ ] 写下“继续研究 / 暂缓研究 / 因子方向需调整”。
如果你还没有真实数据,可以先用 30 只自己熟悉的 A 股做一张练习表。
这张表不追求完美。
它的目标是让你真正走完“因子值 → 未来收益 → 排序相关 → 初步结论”的过程。
核心复盘
知识清单:
- [ ] IC 关注因子值与未来收益之间的相关程度。
- [ ] RankIC 关注因子排名与未来收益排名是否同方向。
- [ ] 单因子检验要按同一日期的股票截面计算,不能随意混合不同日期。
- [ ] 一个因子是否值得继续研究,要看方向、平均值、稳定性和样本合理性。
- [ ]
future_20d_return只能用于事后检验,不能在当日选股时偷看。 - [ ] RankIC 是研究筛子,不是买卖信号。
金句总结
“好因子不是讲故事讲出来的,而是在一次次排序检验里留下证据的。”