跳转至

信息系数与 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 值的反例,股票池和频率都不同。

相关概念

代码

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 预测与信息分析