← CEAtlas · Accuracy · scorecard

CONUS day-ahead price scorecard

The persisted accuracy record of the CONUS daily rolling forecast. Every morning the previous day is re-scored against what actually happened — each market's published day-ahead and real-time hub and zone prices over the local market day, and EIA-930 generation by fuel — and the result is appended to a store that nobody hand-edits. The headline is skill against yesterday's price: 1 − MAEmodel / MAEpersistence, where persistence is the market's own day-ahead price 24 hours earlier — the cheapest honest forecast a subscriber already has. Negative skill means the model is worse than that; the map layer Price Forecast Accuracy paints the same numbers per hub and zone.

Lead Scored against Window Chart

Headline

By market

Regions

Loading the scorecard…

Where the error sits

Series shown
error by local hour
distribution of hourly errors (model − market)

Per-series detail

ex-artefact MAE (diag.): solver-artefact bus-hours (relief-priced, sub-floor, above-cap, floor-slack) removed from the aggregate for diagnosis only — the headline, the map and every gate keep them (founder ruling D5, 2026-09-11). '—' where the record carries no ex-artefact figure (days scored before the column, or every scored bus-hour flagged).

forecast vs actual — pick a series above

Daily rows (this region, this view)

Published before the market closed?

Every day-ahead row carries the run's solve stamp in UTC and a before gate flag against that market's day-ahead gate closure (the table below). A day published after the gate is still scored — but it was not a bid-time forecast, and every panel on this page says so per day. The cycle starts 09:30 UTC and normally publishes 10:45–12:15 UTC; late re-dispatches have happened.

Read this honestly

Definitions

skill
1 − MAEmodel / MAEpersistence over the same hours; persistence = the market's own price at the same hour of the previous market day (known when the day-ahead run publishes). 0 = no better than yesterday's price; −1 = twice its error; +0.5 = half. Pooled over series-days within a window.
lead
day-ahead = the run made the day before the scored day (its last window day); same-day = the run made on the scored day (a nowcast, the run the calibration gate evaluates).
basis
day-ahead price = the market's published DA hub/zone price; real-time price = the market's RT price, hourly where published hourly, hourly means of 5-minute intervals otherwise.
MAE / RMSE / bias
$/MWh over the scored hours of the local market day, model minus observed; bias negative = the model prices low.
hours/day
hours of the 24-hour local market day the run actually contained and the validator scored; since 2026-09-11 (ruling D1, +9 extension periods) the day-ahead run reaches 07:00 UTC of D+2, so every local hour of the day-ahead day is forecast, 23:00 PST in winter included; before that the window ended 00:00 UTC of D+1 and the last local hours were reported as truncated, never silently dropped. Since 2026-09-26 the run carries a further day of look-ahead (a 96-hour horizon, founder ruling) that is not published or scored — the scored hours are unchanged.
before gate
the run's UTC solve stamp was before the market's day-ahead gate closure for that day (PJM 10:30 EPT, ISO-NE 10:00 EPT, MISO 10:30 EST, SPP 09:30 CPT, ERCOT 10:00 CPT, CAISO 10:00 PPT; NYISO 05:00 EPT is before the cycle starts, so NYISO day-ahead rows are never bid-time).
sMAPE
symmetric MAPE in % (2·|m−o| / (|m|+|o|)), the MAPE-safe form near zero and negative prices.
corr
Pearson correlation of the model and observed hourly shapes.
peak hit
share of series whose model peak hour is the observed peak hour (exact hour).
spread ratio
σ(model) / σ(observed) — 1.0 is the right intraday volatility; below 1 the model is too flat.
hub dispersion
std over hubs/zones of their daily-mean prices, model / observed. In ISO-NE and NYISO this is shown as loss-dominated: the ISOs' own published LMP components say 64 % / 54 % of the observed zone spread variance is marginal LOSSES (std of the loss component 0.94 / 1.29 $/MWh vs 0.16 / 0.45 for congestion, 4 days 2026-09-05..08), which a lossless dispatch cannot make with line ratings — so since 2026-09-11 the transmission yardstick is the next column.
vs ISO congestion
the same model dispersion divided by the std of the ISO's published congestion component (NYISO's sign flipped to price terms), and the MAE of the model's cross-zone spread against that congestion spread; the rating lever's ceiling is the mean |observed congestion spread| (ISO-NE 0.10–0.13, NYISO 0.25–0.29 $/MWh). Large values mean the model congests where the market cleared none.
loss term (shadow)
a recorded-only test of a marginal-loss post-processing term: the model spread plus yesterday's published loss spread, scored out of sample against the observed spread next to the model alone. Nothing is served from it; it ships only if it beats persistence on ≥ 14 days, p < 0.05.
artefact bus-hours
bus-hours inside a hub/zone aggregate priced at a solver construct (a flat $250 export-relief price, below −$400, above the market cap, or the engine's floor-slack flag on the hosting bus of a must-run unit backed below its floor). Counted and shown, never removed from the score.
ex-artefact MAE (diag.)
the same hub/zone aggregate re-weighted without those bus-hours, scored over the hours that kept at least one bus — a diagnostic of how much of the error the constructs carry (founder ruling D5, 2026-09-11). It is never the headline, never on the map, never in a gate.
gen-share
generation fuel shares vs EIA-930 net generation, mean absolute error in percentage points over the compared fuels; max = worst fuel.
gate
the daily calibration gate on the same-day run: a major fuel share off by more than 5 pts, or (since 2026-09-11, ruling D3) the median-hub day-ahead MAE over the full local day above the p90 of the region's own trailing 30 scored days in the run's system, turns the cycle AMBER (BREACH here). Until 14 such days exist the LMP half is CALIBRATING and shows as OK (report-only); the $8 any-hub figure is a report line only. Day-ahead-lead and real-time rows are never gated.
raw / ml / cal / anchor / ordc
raw = the solved run; ml = the SERVED correction (whatever the trailing 7-day record picked: the ML ridge, the rolling residual or the persistence anchor); cal = the rolling-residual candidate, always scored; anchor = the persistence-anchored candidate, always scored (a_half / c_reg are its shadows, scored never served); ordc = the reserve-scarcity shadow solve.
anchor · "~ yesterday's price"
the persistence-anchored level (since 2026-09-11, programme FD1/FD2): yesterday's day-ahead price at the same hour plus the run's own day-over-day model change. It ties yesterday's price by construction — measured on the record (day-ahead lead, a_anchor − persistence MAE) it sits within +0.25/−0.5 $/MWh of persistence in ISO-NE, MISO, NYISO and WECC and +1.2..+1.9 $/MWh in PJM (7-run / all dates); the same-day within-run form is unmeasured until the first cycles score it — so a window whose served product is the anchor, or any served file within $0.25/MWh of persistence on its hours, is labelled ~ yesterday's price and never carries a skill claim. The selector admits it only where what would otherwise be served loses to persistence by more than $1/MWh on the trailing 7 days (scope), and any switch needs ≥ $0.25/MWh and ≥ 60 % of the paired days over the incumbent (margin). The skill bar — beat persistence out of sample on ≥ 14 days, p < 0.05 — is unchanged; each region card states its scope test.
era
runner = the current engine on the daily runner (from 2026-08-25); mac_july = the July workstation era (older engine, 4-day windows). Windows never pool eras.
system
era · network revision (the bundle's topology stamp) · inputs revision (a hand-bumped label the cycle stamps whenever a day-layer definition, engine snapshot or bundle export changes). Every window is restricted to the latest system of its view, so a re-export or an input change restarts the window rather than blending two forecast systems; "pre-stamp" rows are the history before 2026-09-11.