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 $ MAsbb_lower/mid/uppergtja_alpha150 · price×volgtja_alpha014/088/106/129/167High |IR| comes from penny-stock effect, not signal. Use ratios (price_vs_sma_X) instead.
DEGENERATE
wq_alpha002/003/013/016/044/055/074/075wq_alpha050/015gtja_alpha001/006/016All 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.
| Pair | In-Sample | Train Sharpe | Test Sharpe | Test CAGR | Test MaxDD |
|---|---|---|---|---|---|
| dist_52w_low × vol_10d ⭐ | 1.62 | 1.21 | +2.56 | +211.9% | -33.3% |
| wq_alpha042 × dist_52w_low | 1.70 | 1.40 | +2.40 | +148.1% | -34.4% |
| range_true × dist_52w_low | 1.81 | 1.57 | +2.37 | +159.6% | -37.9% |
| atr_14 × dist_52w_low | 1.84 | 1.62 | +2.35 | +155.7% | -38.5% |
| dist_52w_low × vol_14d | 1.52 | 1.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".