▶ Full Post Text
I've spent the last few weeks building a complete AFML (Advances in Financial Machine Learning) pipeline from scratch in Rust for MNQ futures on 1-min data. Everything works, everything is tested, but the ML adds
zero edge. Looking for input from anyone who's actually made this framework profitable.
What I built:
\- Volume bars (\~46/day from 681K 1-min bars) — AFML Ch.2
\- CUSUM filter (12K structural break events, \~8/day, avg magnitude 73 pts) — AFML Ch.2 Snippet 2.4
\- Triple barrier labeling (target/stop/time) — AFML Ch.3
\- Meta-labeling (CUSUM direction = primary signal, ML predicts if trade will win) — AFML Ch.4
\- 96 structural features including:
\- Cross-asset: NQ-ES fair value residual, NQ-ZN divergence, NQ-ES return correlation, DX impact
\- Volume: BVC (buy volume classification), market maker inventory proxy, Kyle lambda
\- Regime: Hurst exponent, permutation entropy, vol compression ratio
\- Macro: drawdown from 20-day high, realized vol, daily momentum
\- Events: NFP/CPI/FOMC day flags
\- HMM regime states (3-state Gaussian HMM with Dirichlet sticky prior)
\- CPCV validation (45 splits, purge=200, embargo=100) — AFML Ch.7
\- LightGBM with aggressive regularization (num\_leaves=8, max\_depth=3, lr=0.01)
\- Feature selection (top 20 by univariate IC)
What works:
\- Pipeline is rock solid: 442 tests, 0 failures, audited by 15+ adversarial agents
\- No data leakage (verified: features use bar i-1, entry at bar i+1, session-safe forward returns)
\- No overfitting (train AUC=0.60, not 0.90)
\- CUSUM direction signal: 51.1% win rate (slightly above random)
\- Individual features have real IC: cum\_bvc IC=0.047, Hurst IC=0.052 on 5-min bars
What doesn't work:
\- Meta-labeling OOS AUC: 0.5049 (coin flip)
\- Permutation test: 6/10 shuffled models beat the real one (p=0.60)
\- The features predict direction (IC measured correctly) but DON'T predict which CUSUM events will win
\- Estimated PnL: \~$78-152/mo on 1 MNQ contract (commissions eat most of the edge)
What I've tried:
\- 1-min bars → AUC 0.51
\- 5-min bars → AUC 0.51
\- Volume bars → AUC 0.51
\- Triple barrier labels → AUC 0.51
\- Fixed-horizon return labels → AUC 0.51
\- Quantile-extreme labels (top/bottom 20%) → AUC 0.52
\- Meta-labeling at CUSUM events → AUC 0.50
\- 97 features → overfit (train 0.87, test 0.50)
\- 20 features → no overfit but no signal either
\- HMM regime-conditional → no improvement
My data:
\- MNQ 1-min: 681K bars (2019-2026, RTH 9:30-16:00, Databento)
\- ES 1-min: 681K bars (cross-asset)
\- ZN 10Y bonds 1-min: 1.56M bars
\- DX Dollar Index 1-min: 676K bars
My questions:
1. Has anyone actually made money with meta-labeling in production? Lopez de Prado reports Sharpe 0.5→1.5 improvement but I can't reproduce anything close to that.
2. Is AUC=0.50 OOS just the reality for intraday futures? Published papers report 0.51-0.53 — is there a way to get to 0.55+?
3. Am I asking the wrong question? My features predict direction (IC=0.01-0.05) but don't predict which events are good vs bad. Maybe the meta-labeling framing is wrong for this data?
4. Would tick data or Level 2 order book data make a real difference? I only have 1-min OHLCV.
5. Anyone using CUSUM + volume bars successfully? What primary signal do you use with meta-labeling?
The codebase is in Rust with Python for LightGBM training. Happy to share details on any part of the pipeline.