Day-Ahead Forecasting & Dispatch Model
Grid-scale batteries earn revenue by participating in multiple markets simultaneously. This model focuses on the day-ahead decision layer: given yesterday's auction results and market price data, how should a BESS operator allocate capacity between frequency response commitment and spot arbitrage — and how much does the quality of the price forecast actually affect the outcome?
The framework has three components: a per-EFA-block FR/arbitrage capacity allocator that compares confirmed auction clearing prices against a forecast-based shadow arbitrage value; an MPC dispatch engine (rolling 48-hour LP) that plans charge/discharge at half-hourly resolution while enforcing FR SoC constraints as hard bounds; and a price forecasting pipeline that benchmarks three strategies against each other.
Controls
Results
Total net revenue
Annualised net
Revenue per MW
Top revenue stream
Modelling a
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
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 £
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.