← 返回模块
4.2.3.1beta 可读 · 未来免费校验通过内容版本 2026-05-24

IC、IR 与主动管理基本定律

4.2.3 · 信号评估与合成 · 量化全流程

周一上午,你在上海的一家 量化 私募。研究主管 在桌边停下来,看了一眼你 上周提交的 12-1 动量 信号的 DSL,问了一句话:「IC 是 多少?」这就是 4.2.3 模块 整个 评估 工序的 起点。你 已经 按 4.2.2 的 规范 把 信号 构造 完毕——alpha 公式 写好了,标准化 流水 跑通了,T+1 滞后 处理过了——下一步 不是 再 优化 信号,而是 给它 一个 可辩护的 数字 让 团队 决定 要不要 上线。本课 教 你 怎么 回答 那 一句话:用 信息系数(IC)、信息比率(IR)、以及 Grinold-Kahn 主动管理基本定律 构成的 单 信号 评估 工具包。

IC 是什么

在 单个 调仓 日期 t,信号 s_t 是 一个 长度 N 的 横截面 向量(N = 沪深300 的 成分股 数量),前瞻收益 r_{t, t+h} 是 同样 长度 的 横截面 向量——这里 h 是 前瞻 视界,通常 取 21 个 交易日(月度 调仓)。 IC 就是 这 两个 向量 的 横截面 相关系数:

ICt=corr(st,  rt,t+h)\text{IC}_t = \mathrm{corr}(s_t,\; r_{t, t+h})

注意:IC 是 每个 调仓 日期 一个 数字,横跨 T 个 调仓 日 后,得到 一条 长度 TIC 时间序列,而不是 一个 单点 标量。

工程 上 选 哪种 相关系数?Pearson IC 是 线性 相关,对 公式驱动 信号 那些 重尾分布(一个 5 日 反转 信号 99 分位 可能 是 中位数 的 50 倍)非常 敏感; 排序 IC(rank IC, 又称 Spearman IC)在 排名 转换后 的 输入 上 计算,对 尾部 异常值 稳健。​​业内 默认 报告 rank IC​​;若 报告 Pearson IC, 必须 同步 声明 winsorise 策略。

IC_t = corr(s_t, r_{t, t+h})rank_IC(Spearman 变体——业内 默认)、 IR = mean(IC) / std(IC) * sqrt(annualisation_factor)(年化 IC 信噪比)、 t_stat = mean(IC) / NeweyWest_SE(IC, lag=h)(HAC 调整 t 统计量)、 IR ≈ IC * sqrt(BR)(Grinold-Kahn 主动管理 基本定律,BR = 广度 = 每年 独立 押注 数)——这 五 个 名字 就是 单 信号 评估 的 字母表,每个 信号 上线 前 都要 全部 报出。

IC 时间序列 与 t 统计量

把 IC 时间序列 IC_t 算 出来 之后,头条 数字 是 mean(IC_t)。但 离散度 std(IC_t) 同样 重要——mean(IC) = 0.05std(IC) = 0.20 的 信号 不可靠;mean(IC) = 0.03std(IC) = 0.05 反而 更 可取。IC t 统计量 mean(IC) / SE(IC) 检验 均值 IC 是否 显著 不等于 零。 朴素 标准误 std(IC) / sqrt(T) 在 这里 不可用:IC 几乎 必然 自相关(本月 的 IC 预测 下月 的 IC),朴素 SE 会 过度 拒绝 零 假设。

业内 通用 修正 是 Newey-West / HAC (heteroskedasticity-and-autocorrelation-consistent) 标准误,滞后 lag = h——即 设为 前瞻 收益 的 视界,也是 IC 自相关 的 最大 理论 滞后 阶数。四 步 计算:

  1. mean_ic = mean(IC_t)
  2. hac_se = NeweyWest_SE(IC_t, lag=h)(HAC 标准误,滞后 设为 前瞻 视界)
  3. t_stat = mean_ic / hac_se
  4. p_value = 2 * (1 - Phi(|t_stat|))(两 侧 p 值,假设 渐近 正态)

四 步 的 顺序 是 固定 的,规则 是「朴素 SE = std(IC) / sqrt(T) 在 IC 自相关 时 过度 拒绝 零 假设」。每个 信号 必须 同时 报告 (mean IC, median IC, std IC, HAC 调整 t 统计量)。

下面 是 一个 可以 直接 复用 的 IC 计算 函数:

import pandas as pd
from scipy.stats import spearmanr, pearsonr

def compute_ic(signal: pd.DataFrame, forward_return: pd.DataFrame, method: str = 'spearman') -> pd.Series:
    # 1. 按 (date, symbol) MultiIndex 对齐
    aligned = pd.concat([signal.rename('s'), forward_return.rename('r')], axis=1).dropna()
    # 2. 按 date 分组,逐日计算横截面相关
    def _corr(group):
        if method == 'spearman':
            return spearmanr(group['s'], group['r']).statistic
        return pearsonr(group['s'], group['r']).statistic
    # 3. 返回长度 T 的 IC 时间序列
    return aligned.groupby(level='date').apply(_corr)

compute_ic 的 函数名、参数 signal / forward_return / method、默认值 'spearman'、以及 SciPy 函数 名,在 中英 两版 中 字节 一致;仅 注释 翻译。

信息比率 IR

IR 是 IC 的 年化 信噪比:

IR=ICσ(IC)annualisation_factor\mathrm{IR} = \frac{\overline{\mathrm{IC}}}{\sigma(\mathrm{IC})} \cdot \sqrt{\text{annualisation\_factor}}

年化 因子 在 月度 IC 上 取 12, 日度 取 252, 周度 取 52。 根号 来自 标准化 IC 时间序列 的 中心 极限 定理。 典型 量级:单 公式驱动 信号 raw IR ≈ 0.3-0.8(正交化 前、成本 前); 良好 正交化 的 复合 信号 IR ≈ 1.0-2.0; 扣除 交易成本 后,机构 量级 的 量产 门槛 是 IR ≈ 0.5-1.5。 IR 与 把 信号 z 分数 当 头寸 的 多空 纸面 组合 的 夏普比率 大致 等价。

下面 是 配套 的 IR 计算 函数,封装 了 Newey-West HAC SE:

import numpy as np
import pandas as pd
import statsmodels.api as sm
from scipy.stats import norm

def compute_ir(ic_series: pd.Series, horizon: int, annualisation_factor: int) -> dict:
    # 1. 均值 / 中位数 / 标准差
    mean_ic = ic_series.mean()
    std_ic = ic_series.std()
    # 2. Newey-West HAC SE,滞后 = 前瞻视界 h
    X = np.ones((len(ic_series), 1))
    ols_fit = sm.OLS(ic_series.values, X).fit(cov_type='HAC', cov_kwds={'maxlags': horizon})
    hac_se = ols_fit.bse[0]
    # 3. HAC 调整 t 统计量与双侧 p 值
    t_stat = mean_ic / hac_se
    p_value = 2 * (1 - norm.cdf(abs(t_stat)))
    # 4. 年化 IR
    ir = (mean_ic / std_ic) * np.sqrt(annualisation_factor)
    return {'mean_ic': mean_ic, 'std_ic': std_ic, 'hac_se': hac_se,
            't_stat': t_stat, 'p_value': p_value, 'ir': ir}

compute_ir 的 函数名、参数 ic_series / horizon / annualisation_factor、返回 字典 的 键 mean_ic / std_ic / hac_se / t_stat / p_value / ir、以及 HAC-lag 规则,在 中英 两版 中 字节 一致。

Formula Explorer

IR = IC * sqrt(BR)

Grinold-Kahn 主动管理基本定律

把 IR 拆开 看:IR ≈ IC * sqrt(BR),其中 BR广度——每年 独立 押注 的 数量。「独立」二字 才是 关键:沪深300 上 300 只 股票、 一年 252 个 交易日 并 300 * 252 = 75600 次 押注,而是 接近 252横截面 押注——因为 同一 t 上 300 只 股票 的 押注 是 相关 的(t 和 t+1 的 横截面 排序 相关系数 通常 在 0.7-0.9)。

实际 含义:高 IC 低 广度 的 信号(例如 季度 盈余 惊奇 信号,IC = 0.10,BR = 4)与 低 IC 高 广度 的 信号(例如 日度 价格 动量 信号,IC = 0.02,BR = 252)产 出 接近 的 IR——0.10 * sqrt(4) = 0.20 对 比 0.02 * sqrt(252) = 0.32。 信号 设计 的 取舍 是 质量(IC)与 数量(BR)的 平衡;纯 套利 策略 最大化 IC,高 广度 因子模型 最大化 BR。 文献 锚点:Grinold 'The fundamental law of active management'(JPM 1989), Grinold & Kahn《主动投资组合管理》(1999) 中文版 第 4-6 章。

各 信号 家族 的 IC 量级

三 个 经典 量级 带,你 见到 偏离 这些 带 的 数字 时 应当 警觉:

(1) formula_driven rank IC ≈ 0.02-0.05 月度——12-1 动量、 账面市值比 价值因子、 ROE 质量因子、 60 日 低波动 都 落 在 这 一 带,这 就是 业内 「alpha 是 小 数」的 共识;

(2) event_driven 峰值 IC ≈ 0.08-0.12 在 公告日 当天(稀疏);例如 SUE(标准化 未预期 盈余)在 财报 公告日 当天 IC 在 0.08-0.12,但 全 年 平均 IC 因 事件 稀疏 而 显著 更低;

(3) ml_driven 复合 rank IC ≈ 0.05-0.12 月度——一个 调优 良好 的 LightGBM 排序模型 在 ~300 维 特征 上 通常 比 最佳 单一 公式驱动 信号 提升 2-3 倍。

异常 带:单 信号 月度 rank IC > 0.15 在 沪深300 这种 主流 universe 上 几乎 总是 4.2.1 L2 的 前瞻 偏差 bug——前视 特征、 事件 日期 错位 滞后、 测试集 标准化 污染。 规则:​​当 IC 超出 预期 带 3 倍 时,先 审查 前瞻 偏差,再 庆祝。​ alpha 衰减 与 公式 失效 也 会 改变 IC 量级,但 一次 性 出现 0.20 的 单 信号 IC 大概率 是 数据 错位。

七 元素 单 信号 诊断包

每个 信号 进入 L3 正交化 之前,必须 携带 七 个 诊断:

(1) ic_time_series(每个 调仓 日 的 IC), (2) rolling_12m_ic(稳健性 检验——逐月 滑动 12 月 IC,下降 趋势 意味着 信号 在 衰减,这是 L2 的 主题), (3) ic_histogram(看 偏度 和 尾部——重 偏 分布 说明 单一 regime 主导 均值), (4) ic_by_regime(牛市 / 熊市 / 高波动 / 低波动——只 在 牛市 工作 的 信号 其实 是 隐藏 的 beta 倾斜), (5) annualised_ir(带 注明 的 年化 因子), (6) breadth_count_and_implied_ir(广度 计数 与 Grinold-Kahn 隐含 IR——和 实际 IR 对照), (7) signal_vs_return_scatter(代表性 调仓日 的 信号-前瞻收益 散点——视觉 卫生 检查:应当 看到 微弱 但 明确 的 正 斜率;若 看起来 像 白噪声,IC 是 被 异常值 驱动;若 显示 两个 聚类,信号 实际 是 二元 变量)。

规则:​​任何 缺失 七 元素 任一 项 的 信号 都 不 进入 L3 正交化 步骤。​ 这 与 因子模型 中 检查 因子暴露 的 流程 一致:你 永远 不会 在 没看过 因子载荷 之前 把 一个 风险因子 引入 主投资组合优化 问题。

一个 走通 的 例子

把 4.2.2 L2 的 12-1 动量 信号 接 上 来。 在 沪深300 上、 2018-2023 的 月度 调仓 上 跑 一遍:rank IC ≈ 0.03 月度, IR ≈ 0.5, 广度 ≈ 12(月度 调仓 每年 12 次 横截面 押注),Grinold-Kahn 隐含 IR ≈ 0.03 * sqrt(12) ≈ 0.10——和 实际 IR 0.5 之间 的 差距,就是 公式 没 显式 计入 的 横截面 押注 乘数(实际 IR 是 纸面 组合 IR,享受 了 横截面 多 押注 的 收益;公式 低估 了 实际 数字)。

行业 工具:沪深300 上 的 默认 评估 框架 是 Microsoft Qlib(github.com/microsoft/qlib)——它 自带 Alpha158 和 Alpha360 因子 库 加上 qlib.contrib.eval 的 IC / IR / 衰减 / 换手率 诊断,基本 是 量化 私募 业内 起步 工具。 alphalens-reloaded 是 单独 评估 库 的 备选。 推荐 学习者 在 沪深300 上 复现 Alpha158 的 IC 基线,作为 入门 任务。 私募 业(明汯、 幻方、 九坤、 灵均)和 公募 量化 部门 使用 的 评估 框架 与 上 述 一字 不差——中文 词汇 信息系数 / 排序 IC / 信息比率 / 主动管理 基本定律 / 广度 / 信号 衰减 / 信号 半衰期 是 中文 量化 文献 的 标准 用语。

与 L2、 L3、 L4 的 衔接

L1 在 一个 视界 上 评估 一个 信号,得到 一个 IC 和 一个 IR;L2 把 视界 扩展 到 多个(衰减 曲线),并 引入 换手率 与 容量——单 信号 评估 的 时间 与 规模 维度。 L3 引入 多 信号 卫生 步骤 正交化(orthogonalisation):把 K 个 相关 信号 残差化 (residualisation) 成 K 个 正交 信号; L4 把 正交化 后 的 信号 合成 为 单 一 复合 评分。 IR 在 后 三 课 反复 出现:L2 的 break-even IC 涉及 IR; L3 的 正交 IC 用 IR 做 边际 贡献 度量; L4 的 整个 目标 就是 最大化 复合 IR。 沿 用 4.2.1 的 工序: 每个 你 评估 的 信号 都 在 4.2.1 L3 的 试验 计数器 上 加 一(多 重 检验 inflation 是 4.2.1 L3 的 主题),写 出 报告 时 用 deflated-Sharpe 修正 调整 显著性。 接下来 L2 走 的 是 把 单 视界 IC 扩展 为 多 视界 衰减 曲线,并 衡量 换手率 与 容量。

课程 组件 (Lesson components)

​Inline-code 列表 IC / IR 核心 的 五 个 元素​​: IC_t = corr(s_t, r_{t, t+h})rank_ICIR = mean(IC) / std(IC) * sqrt(annualisation_factor)t_stat = mean(IC) / NeweyWest_SE(IC, lag=h)IR ≈ IC * sqrt(BR)。 每 个 信号 上 线 前 都要 全 部 报 出。

​Inline-code 列表 七 元素 单 信号 诊断 包​​: ic_time_seriesrolling_12m_icic_histogramic_by_regime(牛市 / 熊市 / 高 波动 / 低 波动)、 annualised_irbreadth_count_and_implied_irsignal_vs_return_scatter。 任 何 缺 失 七 元素 任一 项 的 信号 都 不 进 入 L3 正交化 步骤。

​Inline-code 列表 三 个 经典 IC 量级 带​​: formula_driven rank IC ≈ 0.02-0.05 月度、 event_driven 峰值 IC ≈ 0.08-0.12 在 公告 日 (稀疏)、 ml_driven 复合 rank IC ≈ 0.05-0.12 月度。 异常 带 是 单 信号 月度 rank IC > 0.15 在 主流 universe 上 ——超 出 预期 带 3 倍 时 先 审 查 前瞻 偏差。

​Inline-code 列表 IC t 统计量 计算 的 四 步​​: mean_ic = mean(IC_t)hac_se = NeweyWest_SE(IC_t, lag=h)t_stat = mean_ic / hac_sep_value = 2 * (1 - Phi(|t_stat|))。 朴素 SE = std(IC) / sqrt(T) 在 IC 自 相关 时 过 度 拒 绝 零 假设。

两 个 fenced python 块: compute_ic 函数 (Spearman / Pearson 分 派 返回 长度 T 的 IC 时间序列) 和 compute_ir 函数 (Newey-West HAC SE 加 年化 IR, 返回 mean_ic / std_ic / hac_se / t_stat / p_value / ir 字典)。

本 模块 还 命名 了 后续 模块 会 用 到 的 词汇: 索提诺比率 (Sortino 比率 ——Sharpe 比率 用 下行 离散度 替换 总 波动 ——用 于 偏 收益 分布, 留 给 组合 构造 模块); 因子模型 与 因子暴露 词汇 (L3 因子 中性化 对 Barra CNE6 / CITIC 行业 使 用); 价值因子、 质量因子、 低波动因子 标 签 (因子 zoo 语 言 操 作 层 在 此 命名; 学 术 因子 模型 文 献 在 下 一 个 subject)。 Alpha 衰减 词 汇 是 L2 主题; 此 处 仅 在 词汇 层 出 现。

练习

Exercise

给定 一个 signal_df(以 (date, symbol) 为 MultiIndex,列 mom_12_1)和 一个 returns_df(以 (date, symbol) 为 MultiIndex,列 fwd_21d_return——21 日 前瞻 横截面 排名 收益),在 沪深300 的 universe 上、 2018-2023 范围 内 完成 五 项 任务。 (i) 在 21 日 前瞻 视界 上 计算 rank IC 时间序列,并 报告 mean_icmedian_icstd_ic。 (ii) 计算 lag=21 的 Newey-West HAC 调整 IC t 统计量 以及 双侧 p 值。 (iii) 使用 annualisation_factor = 12(月度 调仓 与 21 日 视界)计算 年化 IR。 (iv) 用 BR = 12(每年 12 次 独立 月度 押注)和 经验 IC 计算 Grinold-Kahn 隐含 IR; 对比 实际 IR,并 用 一句 话 解释 为什么 实际 IR 通常 高于 Grinold-Kahn 公式 的 预测(公式 低估 了 横截面 押注 乘数)。 (v) 判断 你 得到 的 rank IC 量级(公式驱动 信号 月度 通常 0.02-0.05)落 在 预期 带、 异常 带(> 0.15)、 还是 低于 预期 带; 说明 超出 异常 带 意味着 4.2.1 L2 的 前瞻 偏差 bug、 落在 预期 带 下方 意味着 alpha 衰减 或 regime 变化。

提示
横截面 相关 用 scipy.stats.spearmanr 在 每个 调仓日 分组 计算;统计 摘要 直接 在 IC 序列 上 跑 .mean() / .median() / .std()
提示
HAC 标准误 用 statsmodels.api.OLScov_type='HAC'cov_kwds={'maxlags': 21};年化 IR 是 (mean / std) * sqrt(12) 因为 每年 12 次 月度 IC。