Machine-learning intraday forecaster
70 features, gradient boosting, a promising IC. The signal was oil prices read five hours early.
Why it failed: The oil files were stamped in New York time but read as London time: every oil price arrived five hours early. See the scorecard
The claim
Our own exploration: can cross-asset prices, volatility and dealer-gamma data predict the next 30 to 60 minutes of US index returns well enough to trade?
First run: information coefficient 0.033 (30 min) and 0.045 (60 min), well above a shuffled-target control.
Source: Lab exploration (design fixed before the first run; not pre-registered)
What we tested
- Model: LightGBM regression (300 trees), retrained every year on all earlier years and tested on the next one, 2010 to 2020. Validation and holdout years never opened.
- Targets: volatility-scaled index return over the next 30 minutes, the next 60 minutes, or to the close; 11 forecast times a day (10:00 to 15:00 New York) on four US index CFDs.
- About 70 features: cross-asset returns (rates, FX, commodities incl. oil), volatility, the VIX term structure, GEX and DIX, time of day and weekday.
- Trade when the forecast is in the strongest 20% (threshold taken from the training years), in the forecast's direction, at the file's bid/ask.
- Control: the same pipeline with the target shuffled. One model configuration and three horizons, fixed before the first run.
Costs and fills
- Real spreads from the minute files.
Data
- US index CFD minute bid/ask, true clock
- Cross-asset minute data incl. WTI and Brent
- Cboe VIX family
- SqueezeMetrics GEX and DIX
A model that looked like it knew something
The first walk-forward run produced an information coefficient (the correlation between forecast and outcome) of 0.033 at 30 minutes and 0.045 at 60 minutes. For intraday index returns that is large, and a shuffled-target control stayed near zero. Even so, the strategy still lost money after the spread, which was the first warning.
Where the information came from
The lab's time-zone map listed the WTI and Brent files as London time. They are New York time. The proof is in the data: the weekly US oil inventory report (Wednesdays 10:30 New York) spikes at 10:31 in the raw stamps in both winter and summer, and the WTI settlement shows up at 14:30 New York.
Read as London time, every oil price entered the model five hours before it happened. Oil moves with stocks during the US session, so the model learned to read the future.
After fixing the map, the 30-minute IC fell to 0.011 against 0.008 for the shuffled control, and the 60-minute IC to 0.002 against 0.010. Every horizon lost money: −1.6 bp a trade at 30 minutes, −2.4 bp at 60, −7.3 bp to the close.
The 12-gate scorecard
0 passed · 4 failed · 8 not run or not reached. A gate is "not reached" when the strategy had already failed a veto: there is nothing left for it to test.
Is the backtest real?
Absolute veto. These gates look for bugs and physical limits, not for statistical evidence, so one failure ends the test.
WTI and Brent files stamped in New York time, read as London time: a 5-hour look-ahead during US hours. Fixed in the lab's loader on 2026-10-19.
Is the edge more than luck?
G12, one pre-registered holdout, is the only statistical veto. G1 to G5 and the regime test G6 are always reported; G6 vetoes only a regime that is significantly negative. A strategy with no edge after costs never reaches G12, because there is nothing to confirm.
After the fix: no horizon positive after costs (t per day −10.1, −7.7, −5.2).
After the fix the model is no better than the shuffled-target control (IC 0.011 vs 0.008 at 30 min; 0.002 vs 0.010 at 60 min).
Gross +0.34 bp a trade at 30 minutes, net −1.63 bp.
Can it survive a prop-firm account?
Absolute veto, for strategies meant for funded accounts. The account rules are simulated event by event, not at the end of the day.
Check the clock of every input file, not just the one you trade
A machine-learning model will find any leak in seventy columns faster than you will. Verify each file's time zone against a scheduled event it must contain (an economic release, an exchange open, a settlement), and treat a model that beats a shuffled control but still loses after costs as a bug report, not a near miss.
Receipts
Every number on this page comes from one of these files: the test script, its saved output, the trade list and, where the test was pre-registered, the registration and its hash lock. Download them and check our work. Numbers that also appear in the chart are recomputed from the trade list when this page is built, and the build fails if they disagree.
| File | Kind | Size | Status | sha256 |
|---|---|---|---|---|
| ALPHA_V3_EXPLORATION_2026-10-19.md alpha_v3/ALPHA_V3_EXPLORATION_2026-10-19.md | Report | 2 KB | 30 lines withheld (not about this test) | 6ca949670adf |
| panel.py alpha_v3/panel.py | Script | 8 KB | Complete | ed0e3f28abb6 |
| ml_walkforward.py alpha_v3/ml_walkforward.py | Script | 4 KB | Complete | 86339c4b7548 |
| ml_walkforward_20261019.out alpha_v3/ml_walkforward_20261019.out | Saved output | 5 KB | Complete | 05c1cdfb20b9 |
| ml_walkforward_20261019_fixclock.out alpha_v3/ml_walkforward_20261019_fixclock.out | Saved output | 5 KB | Complete | 114fd01313b1 |
| data_loader.py prop_gpu_miner/data_loader.py | Lab module | 10 KB | 3 lines withheld (private strategy) | 62ae717b4bf1 |
Price data is not included: the vendors' licences do not allow it, so the scripts run only with your own copy of the data, and the trade lists show dates, direction, R and costs, not prices. Lines that refer to the lab's private live strategy are replaced by a marker; the receipts page explains the rules and lists the sha256 of every original file.
Related tests
USD/JPY Tokyo fix fade
t 7.52, twelve green years, and a bug that read the future. Corrected: t −1.52.
Opening Volatility Stretch on DAX, Bund and Nasdaq
The DAX and Bund results came from a frozen pre-open quote. Nasdaq is positive but unproven.