Day-Ahead Forecasting & Dispatch Model

Grid-scale batteries earn from several markets at once. This model covers the day-ahead decision layer: given yesterday's auction results and price data, how should an operator split capacity between frequency response & wholesale arbitrage, and how much does forecast quality actually change the outcome?

The walkthrough below follows a single winter day — 8 January 2026 — from the raw price curve through to the dispatch the model settles on. Scroll, or select any step directly.

Step 1

A day of wholesale prices

To the right are half-hourly APXMIDP prices for a random GB winter day (January 8th 2026 here). Prices run from £73 to £291/MWh, defined by an overnight trough, a morning rise, and the evening peak when demand is highest, wind may ease, and there is no solar generation.

That spread is the raw arbitrage opportunity: buy low, sell high.

Step 2

Charge cheap, discharge at the peak

The obvious arbitrage value for battery sites: Charge through the overnight trough, discharge into the evening peak.

The catch is that a 2-hour battery can only shift so much energy, and every cycle costs something in degradation — so the model has to pick which periods are worth trading, not simply trade the extremes.

Step 3

But frequency response pays for sitting still

NESO pays a £/MW/h availability fee for capacity held ready to respond within seconds, whether or not it is ever called. That income is contracted and known a day ahead, because the EAC auction for day D clears on D-1.

Committing to it constrains the asset: FR-committed capacity must keep charge and headroom to respond in either direction, which limits how freely it can trade.

Step 4

Stage 1 — split the capacity

For each of the six EFA blocks the model compares two numbers: the confirmed FR clearing price, and a shadow arbitrage value — what that MW of headroom would earn trading the block, estimated from the price forecast.

Capacity is allocated in proportion, fr_fraction = fr_value / (fr_value + arb_value), so it flows toward whichever stream looks better that block without all-or-nothing switching.

Step 5

Stage 2 — dispatch under constraint

Within the arbitrage allocation, a linear programme plans charge and discharge at half-hourly resolution over a rolling 48-hour horizon, re-solving every period and executing only the first — model predictive control.

The state-of-charge trace shows the result. The shaded band is the [10%, 90%] FR feasibility constraint, enforced as a hard bound: the battery must pre-position its SoC to honour tomorrow's commitments, which is why it sometimes charges when prices are not obviously attractive.

Step 6

Forecast quality is the variable under test

All three strategies run the same dispatch engine. Only the price signal differs: Perfect Foresight sees actual day-D prices, Naive reuses yesterday's, and the ML model — a Random Forest on lagged prices, generation mix and cyclical time features — predicts them from information available at the end of D-1.

Where the traces diverge is the cost of forecast error. The analysis below quantifies it.

The model in full

Controls

Results

Total net revenue

Annualised net

per year

Revenue per MW

per MW per year

Top revenue stream

Modelling a MW / MWh asset (h duration, % round-trip efficiency) using price signals and MPC dispatch over a rolling 48-hour horizon.

Monthly revenue stack

Each bar shows gross revenue by stream for that month (positive) and cycling wear cost (negative, dark red). Net revenue is the algebraic sum of all segments — months with heavier arbitrage dispatch carry larger cycling deductions.

Average weekly SoC profile

Mean state-of-charge at each half-hourly slot across the backtest, folded onto an average week. The orange band is ±1 standard deviation across all weeks; the teal band marks the [10%, 90%] FR feasibility constraint enforced as a hard bound in the rolling LP. The pre-conditioning behaviour driven by the next block's FR obligations is visible in the shape.

Cumulative revenue by stream

Strategy comparison

Three price-signal strategies run the same MPC dispatch engine on the same asset, isolating how much forecast quality — not the optimiser — affects operational revenue.

Strategy Price signal What it represents
Perfect Foresight Actual day-D wholesale prices Theoretical ceiling — needs advance knowledge of the future
Naive* Yesterday's prices (day D-1) Zero-skill floor — any real model must beat this
ML Model Random Forest forecast Realistic best case, using features available at end of day D-1

Reading the chart

The three bars define a range. Naive* sets the zero-skill floor — what you would earn with no forecasting capability at all. Perfect Foresight is the ceiling, the maximum extractable revenue if you knew the future. ML Model sits between them, and the question is how close it gets to the ceiling.

The foresight ratio quantifies this as a fraction of the capturable improvement: (ML − Naive) / (PF − Naive). Published GB and European price-forecasting literature treats 70–85% as strong performance.


foresight ratio

ML model detail — Random Forest

The ML strategy predicts the 48 half-hourly APXMIDP prices for day D using features available at the end of day D-1. Tree-based ensembles suit this problem: the feature set is tabular (lagged prices, generation-mix ratios, temporal encodings) rather than sequential, they need no feature scaling, and they yield interpretable importances.

Training uses an expanding window ending before ; everything after that date is held out. Spike-RMSE measures error on top-decile price periods, where arbitrage revenue concentrates. Spearman ρ matters more than RMSE for dispatch quality — the LP only needs the ordering of prices to be right.

Known limitations: tree-based models cannot extrapolate beyond price ranges seen in training; electricity price forecasting is inherently noisy; and the model improves dispatch quality on average without eliminating error on individual days.

Sensitivity

Cycling wear cost

Battery degradation is a real operating cost, but modelling it precisely needs a full electrochemical model and site-specific data. A flat £/MWh cycled figure is used as a financial proxy, consistent with industry practice. The NESO/Modo consensus for modern Li-ion sits near £/MWh, with a plausible range from under £1/MWh to £8–10/MWh on aggressive cycling.

Service mix

How the revenue stack changes depending on which markets the asset participates in.

Arbitrage-only removes all FR availability fees; cycling cost is zeroed in FR-only mode, since in this model cycling is incurred only through arbitrage dispatch.