Skip to main content

Information report (IC / IR)

python main.py info measures whether a strategy has skill — its information coefficient and effective breadth — and reconciles the predicted information ratio with the realized one. It is read-only: a diagnostic, never a control input.

python main.py info \
--strategy volume_spike \
--symbols NVDA,AAPL,META,AMD,TSLA,GOOG,MSFT,AMZN \
--start 2024-01-01 --end 2024-12-31 \
--n-trials 10
Information report: 'volume_spike' 2024-01-01..2024-12-31
measured over 24 rebalances (horizon 5 bars)
IC mean +0.018 t-stat +0.74 rank-IC +0.021
breadth: 142 effective vs 504 naive (ρ̄ 0.41, 8 names)
IR: predicted +0.21 realized +0.18 ± 0.61 (SE)
guardrails: P(any |t|>2 in 10 trials) = 0.40

Verdict: skill is NOT distinguishable from luck (IC t-stat +0.74).

Read it as: the IC t-stat is the honesty gate — below ~2 the mean IC is a few lucky periods, not skill. Effective breadth deflates the name count by how correlated the bets are (ρ̄); predicted IR = mean_IC · √BR_eff. The realized IR comes with a standard-error band — a 1-year window has SE(IR) ≈ 1, so almost any IR is indistinguishable from zero on a single short window. --n-trials reports how inflated a "significant" result is once you account for everything you tried.

Options

FlagDefaultMeaning
--strategyvolume_spikeThe strategy whose alpha is measured.
--sourcestrategyAlpha score origin (strategy / signal / scanner).
--symbolsdemo universeThe cross-section.
--start / --endlast yearMeasurement window.
--benchmarkSPYUsed to strip beta (residual returns).
--horizon5Forward-return horizon, in bars.
--n-trials1Configs tried, for the multiple-testing inflation.
--neutralize-factorsoffMeasure the factor-neutral alpha (bare flag = market,volatility,size) — use the same setting you deploy with, so the measured IC/IR describes the forecast you actually trade. Also on horizon.
--scaling-aboffResearch mode: walk-forward the realized IR under Case-1 (σ·IC·z) vs Case-2 (IC·c_g·z) scaling and compare against the regression's pick — the ground-truth tiebreak for the Case test.

The level shrink and the risk-bucket monitor

The report also carries two more diagnostics:

  • Level shrink. The measured IC is itself estimated; the report prints what fraction of the naive level survives that estimation error — keep 13% of the naive level (T_eff 60, IC 0.05) — and the shrunk IC to deploy. T_eff deflates the rebalance count for horizon overlap, so a daily-sampled monthly horizon isn't credited 21× the observations it really has.
  • Risk buckets. Under correct scaling every residual-vol bucket contributes ~equally to active variance; a monotone gradient flags a mis-scaled alpha (usually a Case mis-choice). Suppressed on universes too thin for reliable buckets rather than reporting noise.

What it does (and doesn't) tell you

  • Skill vs luck. A high IC with a low t-stat, or a realized IR inside its SE band of zero, is not skill — the report says so plainly.
  • No look-ahead. The IC pairs each forecast with strictly later residual returns.
  • Feedback to alphas. When skill is distinguishable, the report recommends the measured IC to replace the prior used in alpha scaling — a human applies it; nothing auto-tunes the trade clock.
  • Not yet covered. Factor/specific attribution and capacity analysis are deferred (they need the factor risk model and the cost model).

The same report is available to agents as the read-only MCP tool compute_information.