The Hidden Look-Ahead: Point-in-Time Leakage in Electricity Market Data
Organizations: Goldsmiths, University of London
Abstract
Empirical studies of electricity prices routinely state that their models use only information available at the time of the trading decision. For weather-driven forecasts drawn from commercial archives, this condition is harder to meet than it appears, and whether it holds can change over time. We identify three timing pitfalls. A forecast run is labelled by the issue time of its weather model, but becomes available hours later and keeps changing after publication. Auction gates follow local clock time, while archives use UTC. Outturn series are revised after publication without earlier values being kept. Using the timestamps of 128,656 forecast runs from ten weather-model configurations, matched to the day-ahead and first intraday auction gates in Great Britain over 2022-2026, we find that selecting "the latest run issued before the gate" picks a run not yet published at the gate on more than 99% of delivery days for six of the ten configurations at one of the two gates. For GFS at the day-ahead gate, the share is 0.6% in winter and 99.8% in summer. The exposure also shifts as publication delays drift, and an action margin of a few minutes can cost a full six-hour forecast cycle. The wrongly selected inputs differ materially from those available at the gate, but their apparent accuracy gain ranges from -9% to +24% across variables, models, gates and seasons, so its effect cannot be assumed and must be measured. We argue that point-in-time correctness is a dynamic property of the data pipeline, and propose a protocol that audits it from timestamps before any model is fitted.
Figures & tables
| Configuration | Underlying system | Cycles (UTC) | Horizon | Runs per variable |
|---|---|---|---|---|
| GFS | NCEP Global Forecast System | 00, 06, 12, 18 | up to 16 days | 6,957 |
| GFS-ENS | NCEP global ensemble | 00, 06, 12, 18 | n/a | 6,952 |
| ICON | DWD ICON global, main runs | 00, 06, 12, 18 | 120 h | 6,955 |
| ICON-SR | DWD ICON global, short-range intermediate runs | 03, 09, 15, 21 | 30 h | 6,945 |
| ECMWF | ECMWF IFS high-resolution, main runs | 00, 12 | 360 h | 3,482 |
| ECMWF-ENS | ECMWF IFS ensemble, main runs | 00, 12 | 360 h | 3,483 |
| Configuration | Publication: median | Publication: 95th pct. | Finalisation: median | Finalisation: 95th pct. | No finalisation time (%) |
|---|---|---|---|---|---|
| ICON-SR | 2.75 | 3.00 | 3.20 | 3.30 | 3.3 |
| ICON | 2.76 | 3.09 | 3.67 | 3.83 | 0.4 |
| GFS | 3.55 | 3.64 | 5.22 | 5.37 | 0.1 |
| GFS-ENS | 3.86 | 3.94 | 6.52 | 6.75 | 0.3 |
| AIFS (2026) | 5.42 | 5.80 | 5.48 | 5.88 | 8.4 |
| ECMWF-SR | 5.77 | 5.78 | 6.21 | 6.22 | 6.9 |
| Configuration | DA, not published (BST / GMT) | DA, not final (BST / GMT) | IDA1, not published (BST / GMT) | IDA1, not final (BST / GMT) |
|---|---|---|---|---|
| GFS | 99.8 / 0.6 | 99.8 / 100.0 | 0.9 / 0.1 | 99.7 / 5.0 |
| GFS-ENS | 99.8 / 93.2 | 100.0 / 100.0 | 2.3 / 0.0 | 99.8 / 99.6 |
| ICON | 23.5 / 1.0 | 99.8 / 4.0 | 0.5 / 0.6 | 1.3 / 1.4 |
| ICON-SR | 99.7 / 99.6 | 99.8 / 99.6 | 100.0 / 99.9 | 100.0 / 99.9 |
| ECMWF | 0.1 / 0.0 | 11.5 / 1.2 | 100.0 / 57.0 | 100.0 / 99.9 |
| ECMWF-ENS | 0.3 / 0.1 | 9.9 / 1.2 | 100.0 / 100.0 | 100.0 / 100.0 |
| Gate | Configuration | Publication rule, UTC gate: not published | Finalisation rule, UTC gate: not final |
|---|---|---|---|
| DA | GFS | 98.9 | 0.4 |
| DA | GFS-ENS | 11.4 | 0.5 |
| DA | ICON | 23.3 | 94.6 |
| IDA1 | ECMWF | 35.6 | 0.0 |
| IDA1 | GFS | 0.3 | 96.3 |
| Gate | Configuration | Rule | Season | Age at = 0 | Step at (min) | Age after step |
|---|---|---|---|---|---|---|
| DA | ICON | publication | BST | 2.8 | 5 | 8.8 |
| DA | ICON | finalisation | GMT | 3.8 | 11 | 9.8 |
| DA | GFS | publication | GMT | 3.8 | 19 | 9.8 |
| DA | ICON | publication | GMT | 3.8 | 64 | 9.8 |
| DA | ECMWF-ENS | finalisation | BST | 8.8 | 69 | 20.8 |
| DA | ECMWF | finalisation | BST | 8.8 | 114 | 20.8 |
| Variable | Configuration | Gate | Days with a different run (%) | Mean , MW (% of mean outturn) | , all days (%) [95% CI] | , summer (%) |
|---|---|---|---|---|---|---|
| Wind | ECMWF-SR | DA | 100 | 611 (6.1) | 11.4 [8.9, 14.0] | 9.2 |
| Wind | ECMWF | IDA1 | 100 | 550 (5.5) | 10.1 [7.9, 12.2] | 9.0 |
| Wind | GFS | DA | 100 | 486 (4.9) | 5.4 [3.7, 7.0] | 4.9 |
| Wind | GFS | IDA1 | 55 | 240 (2.4) | 4.2 [3.0, 5.6] | 7.9 |
| Wind | ICON | DA | 56 | 305 (3.1) | 0.0 [ 1.4, 1.2] | 0.2 |
| Solar | ECMWF-SR | DA | 100 | 126 (6.6) | 2.7 [0.4, 5.1] | 1.0 |
| Data type | When known | Revised after publication? | Auditable from the archive? | Safe use |
|---|---|---|---|---|
| Forecast runs | Publication time, 2.8–6.7 h after issue (Table 2) | Yes, until finalisation, up to 2.7 h later | Yes: issue, publication and finalisation times stored per run | Select by the finalisation rule with an explicit margin (Section 7) |
| Auction prices | At results publication (DA 10:00, IDA1 18:00 UK time, D 1) | None observed (two retrievals) | Not tested | As a feature only after publication; never as a feature at its own gate |
| Outturns | Close to real time ( 0.3–1.3 h after the half-hour) | Yes; observed up to 32 days after delivery (median changes 0.2–4.4%) | No: only the latest values are retained | Lag conservatively (revisions seen up to 32 days), or record first-published values going forward; otherwise declare the revision exposure |
Temporal Data Leakage
Temporal data leakage occurs when models use information unavailable at prediction time, making performance estimates and forecasts misleading.
See all 35 papers