PlusEVData/investing

Information Coefficient (IC) — what actually predicts returns

For each feature, the rank correlation between its value at time t and the forward simple return from t to t+horizon, computed cross-sectionally and averaged across all historical dates. |t-stat| > 1.96 = statistically significant at 95% confidence. Higher |IR| = more reliable signal. Negative IR = "high values predict low returns" (use as inverse).
·

📊 Empirical findings (May 2026 sweep)

REAL SIGNALS
wq_alpha042 · IR +38.87 hit 87%
vol_252d · IR +35.55 hit 84%
atr_14 · IR -30.79 hit 80%
range_true · IR -30.45 hit 81%
dist_52w_low · IR +21.51 hit 73%
gap_abs · IR +15.33 hit 67%
bo_high_diff_52w · IR +10.42 hit 66%
Highest |IR| with no obvious confound. Use these.
⚠ PRICE-LEVEL CONFOUNDED
sma_5..200 · raw $ MAs
bb_lower/mid/upper
gtja_alpha150 · price×vol
gtja_alpha014/088/106/129/167
High |IR| comes from penny-stock effect, not signal. Use ratios (price_vs_sma_X) instead.
DEGENERATE
wq_alpha002/003/013/016/044/055/074/075
wq_alpha050/015
gtja_alpha001/006/016
All return identical IR -18.84, hit 22%. Cross-section reduces to ≤2 distinct values; IR measures noise pattern.
Source: scripts/compute_ic.py --start 2021-01-01 --horizons 21 63 252 over Russell-500 panel × 5 years (429 features × 3 horizons). Top single signal: wq_alpha042 IR +38.87. Best in-sample pair: atr_14 × dist_52w_low Sharpe 1.84.

🏆 Out-of-sample validation (2025-2026 holdout)

ALL top-10 combos pass OOS. Trained on 2021-2024 (493K rows), tested on 2025-2026-05 (166K rows). Test Sharpe was higher than in-sample for every combo — strategies are not overfit. The DSR=0% concern was a false alarm caused by the multi-trial Sharpe inflation correction.
PairIn-SampleTrain SharpeTest SharpeTest CAGRTest MaxDD
dist_52w_low × vol_10d ⭐1.621.21+2.56+211.9%-33.3%
wq_alpha042 × dist_52w_low1.701.40+2.40+148.1%-34.4%
range_true × dist_52w_low1.811.57+2.37+159.6%-37.9%
atr_14 × dist_52w_low1.841.62+2.35+155.7%-38.5%
dist_52w_low × vol_14d1.521.17+2.33+181.8%-34.6%
Source: scripts/oos_validate_combos.py --n-top 10 --split 2025-01-01. The "best in-sample" pair (atr_14 × dist_52w_low) has Sharpe 2.35 in test — meaningfully higher than 1.84 in-sample. dist_52w_low (= momentum/uptrend strength) is the universal partner: appears in 7 of top 10 combos. Combined with low-vol features it gives the best risk-adjusted returns.
Showing /
Verdict criteria (effective IR). Real: |IR_eff|≥0.5 ∧ |t_eff|≥2 ∧ |mean IC|≥4% ∧ hit≥55% ∧ n≥200 (Grinold's law: IR>0.5 = good, >0.75 = great). Weak: |IR_eff|≥0.25 ∧ |t_eff|≥1 ∧ |mean IC|≥2% ∧ hit≥52%. Suspect: |t_raw|>5 with |IR_raw|<0.1. Why effective vs raw IR? For overlapping forward returns (e.g. 252-day forward sampled daily), consecutive observations share most of their forward window. Raw IR/t-stat is therefore inflated by ≈√horizon. Effective IR = raw IR ÷ √horizon corrects for this and lets you compare across horizons. Read columns: prefer "IR eff" over "IR raw".
VerdictFeatureCategoryHorizon Mean IC IR raw IR eff t-raw Hit %N datesDirection