Killed at G10 · Exploration

Machine-learning intraday forecaster

70 features, gradient boosting, a promising IC. The signal was oil prices read five hours early.

Markets
Nasdaq-100, S&P 500, Dow 30, Russell 2000
Timeframe
Forecasts every half hour, 30 and 60 minutes ahead and to the close
Period
2010 to 2020 (walk-forward)
Tested
19 October 2026
IC before the fix, 60 min
0.045
shuffled control 0.013
IC after the fix, 60 min
0.002
shuffled control 0.010
Net per trade after the fix
−1.6 to −7.3 bp
every horizon negative

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.

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.

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.

Lesson

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.

FileKindSizeStatussha256
ALPHA_V3_EXPLORATION_2026-10-19.md
alpha_v3/ALPHA_V3_EXPLORATION_2026-10-19.md
Report2 KB30 lines withheld (not about this test)6ca949670adf
panel.py
alpha_v3/panel.py
Script8 KBCompleteed0e3f28abb6
ml_walkforward.py
alpha_v3/ml_walkforward.py
Script4 KBComplete86339c4b7548
ml_walkforward_20261019.out
alpha_v3/ml_walkforward_20261019.out
Saved output5 KBComplete05c1cdfb20b9
ml_walkforward_20261019_fixclock.out
alpha_v3/ml_walkforward_20261019_fixclock.out
Saved output5 KBComplete114fd01313b1
data_loader.py
prop_gpu_miner/data_loader.py
Lab module10 KB3 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