Live · CECadence
By Compounding Energy
Live now GB. SaaS at cadence.compoundingenergy.com, plus on-prem and air-gapped.

GB battery revenue, forecast at the cannibalisation equilibrium — not the price-taker fantasy.

As more storage is built, batteries compete away the very price spreads they earn from. A naive "price-taker" forecast — which assumes prices are unaffected by the fleet — overstates 2030 BESS revenue by 100–300%+. CECadence solves prices, fleet build-out and dispatch jointly to convergence, and reports the bias — naive minus equilibrium — as a headline number, because that bias is what decides a project's DSCR.

CECadence Quarterly GB BESS Index — measured fleet revenue by stream: 6.2 GW active fleet, 149 BMUs, measured revenue and the Balancing Mechanism rotation, published quarterly
Why this exists

A 30% revenue overstatement turns a 1.40× DSCR into ~1.05×.

On a 100 MW / 2-hour project (~£50–100M capex), pricing the build on a naive forecast is tens of millions of mispriced value and a covenant breach a few years in. Most of the market still forecasts BESS revenue as a battery dispatching against an exogenous price curve. That assumption silently breaks at fleet scale — and breaks worst exactly where the money is, around NESO's 2030 trajectory.

Naive vs equilibrium revenue · 2-hour BESS

£/kW·yr vs GB fleet penetration
today · ~5 GW NESO 2030 · ~30 GW +100–300% bias Naive (price-taker) Cannibalisation fixed point

The fixed point — fleet ↔ price ↔ dispatch coupled and solved jointly by Krasnoselski–Mann iteration — recovers the answer a price-taker model cannot. Stylised; the in-app cannibalisation sweep is computed per scenario-year.

What it does

Two jobs, one equilibrium.

Everything you do is one of two things: run a whole-GB scenario, or appraise a candidate site against that equilibrium. A candidate joins the fixed point as an extra asset and is valued at the with-candidate equilibrium — never against exogenous prices.

01 · Whole-GB scenario

Equilibrium revenue for the whole fleet.

Pick a scenario and year; CECadence solves the cannibalisation fixed point and returns the equilibrium price duration curve, the naive curve, the bias, and a per-duration revenue stack (1h / 2h / 4h) — wholesale arbitrage, frequency response, Capacity Market and Balancing Mechanism, in £/MW/yr. Sensitivities, Monte Carlo bands and the cannibalisation sweep are one click away.

02 · Candidate site appraisal

A bankable, reproducible site report.

Enter a site — power, duration, commission year, TNUoS zone, capex/opex, round-trip efficiency. Get equilibrium revenue, the cannibalisation externality on the existing fleet, project finance (NPV, IRR, DSCR), an NPV tornado, and an indicative CEAtlas grid-connection estimate. Save sites to a portfolio and compare 2–4 head-to-head.

The revenue stack

Every line in £/MW/yr, per duration class.

Wholesale arbitrage is the contested one — and the only line where cannibalisation bites. The ancillary stack is co-modelled with participation factors so the products don't double-count.

Wholesale (eq)

Arbitrage at equilibrium

Per-cohort dispatch LP — SoC balance, round-trip efficiency, degradation as a marginal cost, least-cycling tie-break — solved against the equilibrium price, with the naive price-taker number alongside.

Frequency response

DC · DM-L/H · DR-L/H

Saturation-priced reserve revenue calibrated to the NESO EAC trailing year, with an optional product-faithful FR co-optimisation that derives the line from the dispatch itself.

Capacity Market

Cleared price × de-rating

CM revenue by duration de-rating factor; unknown auction years modelled as a bounded random walk, disclosed in the manifest.

Balancing Mechanism

Statistical zone proxy

A per-TNUoS-zone × duration proxy, measured from the CE GB BESS Index — not dispatch-based in v1, and labelled as such everywhere it appears.

Methodology

For the quants in the room.

Plain-English everywhere else; this section for anyone vetting the maths. The full methodology, the index and the backtest evidence are live in-app.

The fixed point

Krasnoselski–Mann, with a contraction safeguard.

Iterate the price-bias map to convergence under a KM harmonic step schedule — plain Picard provably fails beyond ~2 GW fleets. A residual monitor switches to a μ-regularised dispatch (a contraction) if monotone decrease stalls. Non-converged days are flagged, excluded from headline aggregates, and recorded — never quietly averaged in.

Price formation

Supply curve, or a full system LP.

A fast parametric GB supply curve for interactive runs, or a scenario-grade whole-GB half-hourly merit-order LP — generator classes, curtailable renewables, interconnectors, unserved energy at VOLL £10,000/MWh — with the price taken as the dual of the power balance.

Price anchors

WP01 spec, realised 2024, or trailing 12 months.

The price level is pinned to a chosen basis: the WP01 spec curve, an equilibrium-refit to realised 2024 Elexon prices, or a trailing-12-month anchor that recalibrates to the latest settled market and flags itself STALE past 35 days. Two anchors are two different price bases — the app refuses to compare them silently.

Project finance

DSCR on the declining track, not year one.

Finance runs on the multi-year cannibalisation-aware revenue trajectory — re-solving the equilibrium at sample years against the growing fleet — and reports the minimum DSCR with its binding year (typically late in the debt term). P50 target 1.40×, P90 lender covenant 1.10×, with a Monte-Carlo P90 on the same track shape.

Scenarios

Four standard fleets, DESNZ fuel paths, or bring your own curve.

Standard scenarios

CE-CENTRAL (18 GW BESS by 2030), CE-HIGH-RES (25), CE-LOW-GAS (14), CE-CONSTRAINED (12). Years 2025–2035, half-hourly across 26 representative weeks.

DESNZ fuel paths

CE-CENTRAL on the DESNZ FFPA 2025 gas paths A/B/C — pinned, hashed, and carrying the DESNZ "not a forecast" caveat verbatim on every surface.

Custom — your market view

Set BESS GW by 2030, gas/carbon multipliers, demand growth, and paste per-year gas/carbon paths. Typed in, never fetched; disclosed as customer-supplied; carried in the run manifest so it stays reproducible.

Validation, stated honestly

The held-out year FAILs — and we publish it unmodified.

CECadence is benchmarked against the CE GB BESS Index — our own index built from Elexon BMRS and NESO open data, no third-party benchmark licence. The 2022–25 backtest is committed and reproducible live in-app. 2025 is the pre-registered held-out validation year: it fails its tolerances, and the failure is published as-is. Cells that were fit to the targets they're graded against are badged fit (in-sample), never "pass".

2022–25

Real Elexon backtest, committed and reproducible from the Methodology tab

Held-out

2025 pre-registered as the validation year — badged, and failing, in the open

Auditable

Every run keyed (scenario_id, code_version, timestamp) with a persisted manifest

What v1 does not do, stated plainly: the Balancing Mechanism line is a statistical zone proxy, not dispatch-based; price formation is single-zone GB (nodal via CEForesight is v2); demand/wind/solar profiles are synthetic-but-calibrated to the WP01 price-duration targets. The backtest bounds what these simplifications cost.

Under the hood

HiGHS today, CEMeridian when the gate is met.

Every solve runs through one solver-abstraction layer at the HiGHS-compatible API surface, so the backend is a single config line — CE_SOLVER=meridian|highs|auto. CEMeridian, our native Rust solver, passes the LP-value-and-duals correctness gate against HiGHS on every push; auto resolves to HiGHS by default until the warm-start performance gate is signed off in production.

Who it's for · how it ships

Developers, IPPs, funds and lenders.

Developers & IPPs

Appraise sites at the equilibrium, compare a portfolio head-to-head, and take a signed, reproducible bankable report into an investment committee.

Funds & lenders

The honest held-out disclosure is the feature: interrogate the assumptions, read the P90 DSCR covenant on the declining track, and replay any run from its manifest. On-prem and air-gapped for data sovereignty.

Analysts & desks

The cannibalisation sweep, sensitivities and Monte-Carlo bands for market views; the zone overlay for where revenue actually lands. Live as SaaS at cadence.compoundingenergy.com.

Next steps

It's live. Start running scenarios today.

CECadence is in production at cadence.compoundingenergy.com — whole-GB scenarios, candidate-site appraisal, the bankable report, and the full validation dossier in-app. On-prem and air-gapped deployments available for data-sovereign teams. Talk to us about plans and access.

Research

The papers behind it.

CECadence is built on our working-paper series. Both BESS papers are published in full — read them below.

CE-WP-2026-01 Working paper Published

Cannibalisation as a fixed point: revenue forecasting for battery energy storage in liberalised electricity markets.

The variational formulation, the convergence theorem behind the Krasnoselski–Mann iteration, and the bias result that anchors the product.

CE-WP-2026-02 Working paper Published

Co-optimising the GB BESS revenue stack: wholesale, frequency response, Capacity Market and Balancing Mechanism.

Extends the fixed point across the full stack with participation-bounded reserves, validated against the CE GB BESS Index.