IC Information Coefficient (IC)
The single number that tells you whether your signal actually knows something
Learning Objectives
- •Compute and interpret IC for trading signals
- •Understand the Fundamental Law of Active Management
- •Evaluate IC stability across time and regimes
- •Identify common IC pitfalls that inflate apparent skill
Explain Like I'm 5
IC measures how well your predictions line up with what actually happens. A perfect IC of 1.0 means you nailed every rank order. In practice, anything above 0.05 is worth paying attention to.
Think of It This Way
Think of IC like a weather forecaster's track record. They don't need to predict exact temperatures — they just need to consistently get the relative ordering right. "Hotter than yesterday" matters more than "exactly 72 degrees."
1What IC Actually Tells You
2Why Spearman, Not Pearson
3The Fundamental Law of Active Management
4IC Stability and Distribution
5Common IC Pitfalls
6From IC to Actual Money
Key Formulas
Information Coefficient
Spearman rank correlation between predicted and realized returns
Fundamental Law of Active Management
Information ratio as a function of signal quality and breadth of independent bets
Hands-On Code
Computing IC for Trading Signals
import numpy as np
from scipy.stats import spearmanr
def compute_rolling_ic(predictions, realized_returns, window=60):
"""
Compute rolling IC between signal predictions and realized returns.
Parameters:
predictions: array of predicted return rankings/scores
realized_returns: array of actual returns
window: rolling window size (trading days)
Returns:
rolling_ic: array of IC values
ic_stats: dict with mean, std, hit_rate, t_stat
"""
n = len(predictions)
rolling_ic = []
for i in range(window, n):
pred_window = predictions[i-window:i]
real_window = realized_returns[i-window:i]
# Spearman rank correlation
ic, p_value = spearmanr(pred_window, real_window)
rolling_ic.append(ic)
rolling_ic = np.array(rolling_ic)
ic_stats = {
'mean_ic': np.mean(rolling_ic),
'std_ic': np.std(rolling_ic),
'hit_rate': np.mean(rolling_ic > 0),
't_stat': np.mean(rolling_ic) / (np.std(rolling_ic) / np.sqrt(len(rolling_ic))),
'ir': np.mean(rolling_ic) / np.std(rolling_ic)
}
return rolling_ic, ic_statsComputes rolling Spearman rank correlation between signal predictions and realized returns, returning IC time series and summary statistics including mean, standard deviation, hit rate, and t-statistic.
Knowledge Check
Q1.Why is Spearman rank correlation preferred over Pearson for computing IC?
Q2.According to the Fundamental Law, a signal with IC = 0.05 and 400 independent bets per year has an expected IR of approximately:
Q3.An IC of 0.12 on a single-asset monthly signal should make you:
Assignment
Take a simple momentum signal (e.g., 20-day return) and compute its rolling IC against forward 5-day returns across at least 10 liquid FX pairs. Plot the IC distribution and compute the hit rate, mean IC, and t-statistic. Does the signal quality vary by volatility regime?