信息系数与 ICIR¶
定义¶
IC 是预测得分和随后收益的相关系数。ICIR 是 IC 时间序列的均值除以它的标准差。
公式¶
\[
\mathrm{IC}=\mathrm{corr}(s,r),\qquad
\mathrm{ICIR}=\frac{\overline{\mathrm{IC}}}{\sigma(\mathrm{IC})}
\]
Rank IC 是得分排名和收益排名的 Pearson 相关,不需要额外的统计库。两条 IC 为 0.04 和 0.03、相关 0.5 时,等权合成 0.0404,最优合成 0.0416。按 IC 信息比率 \((0.4,0.6)\) 合成是 0.0390。
直觉¶
IC 问这一次猜得有多齐。ICIR 问这种齐是不是每个月都在。更稳但更弱的信号,合成相关可以低于简单平均。
实务要点 / 常见误区¶
- 得分用形成日已经知道的数。收益是形成日之后的。
- 正交之后的代数上限 \(\sqrt{0.04^2+0.03^2}=0.050000\) 成立的前提是残差 IC 没有变小。这个前提没有测量。
- 实验室季频 Rank IC 0.0086 不是 French 动量 t 值的反例,股票池和频率都不同。
相关概念¶
- 主动管理基本定律 (
fundamental_law_of_active_management) - Fama–MacBeth 回归 (
fama_macbeth_regression) - 时序动量与截面动量 (
time_series_vs_cross_sectional_momentum)
代码¶
def rank_ic(score: list[float], fwd: list[float]) -> float:
# 先排名再做 Pearson。并列时用平均秩,这里的教学序列假定没有并列。
def ranks(xs: list[float]) -> list[float]:
order = sorted(range(len(xs)), key=lambda i: xs[i])
out = [0.0] * len(xs)
for rank, idx in enumerate(order, start=1):
out[idx] = float(rank)
return out
a, b = ranks(score), ranks(fwd)
n = len(a)
ma, mb = sum(a) / n, sum(b) / n
cov = sum((x - ma) * (y - mb) for x, y in zip(a, b))
va = sum((x - ma) ** 2 for x in a)
vb = sum((y - mb) ** 2 for y in b)
return cov / (va * vb) ** 0.5
教材:M10 预测与信息分析