Industry: Energy Product: ModelRisk Application: Stochastic dispatch optimization for a grid-connected BESS
The 4-hour LFP battery is built. The asset's lifetime NPV is now controlled not by capex but by a single recurring decision made 96 times a day: how to split each 15-minute interval between energy arbitrage, frequency regulation, and reserve capacity, given a price stack that won't be known until clearing. A deterministic dispatch optimiser pointed at next-day forwards generates a "perfect-foresight" schedule whose realised P&L falls 28% short of the optimiser's promised revenue. The shortfall is not modelling laziness — it is the distance between a single forecast price and the actual conditional distribution, and it is visible the moment you run both dispatch policies against the same simulated price stacks:
The deterministic optimiser promised $11.4k/day; following its instructions into the realised price distribution earns a mean of just $8.2k with a 5th percentile of $1.9k. The stochastic optimiser — which leaves 18% state-of-charge headroom for high-spread real-time events — recovers most of the gap: a realised mean of $10.6k and a 5th percentile of $4.8k. Stochastic dispatch closes most of the foresight-vs-reality shortfall.
Every 15-minute interval the battery can earn from:
The same MWh of state-of-charge cannot simultaneously back an arbitrage charge and a reg-up bid. The optimiser must co-optimise across products under stochastic prices and stochastic AGC signal.
The dispatch engine wraps a forward-looking SoC LP inside a Monte Carlo over conditional price scenarios. Conditional structure matters:
The same battery, same week of forward curves, dispatched two ways — the comparison shown above. The deterministic optimiser claimed a mean daily revenue of $11.4k. The realised mean — feeding the same dispatch instructions into the stochastic price simulator — was $8.2k, with a 5th percentile of $1.9k. The stochastic optimiser, which sizes its reg-up bid to leave 18% SoC headroom for high-spread RT events, posts a realised mean of $10.6k and a 5th percentile of $4.8k. Mean +$2.4k/day (×400 cycling days = +$0.96M/year), tail +$2.8k/day. On a $272M asset this is roughly 180 basis points of additional levered equity return.
The RT–DA basis-volatility mixture parameter dominates — the same battery, with the same forecast, earns $1.4M/year more in a high-basis-vol regime than a low one. Reg-up clearing price is second, ahead of DA-spread itself; for a 4-hour battery the regulation product is where the real economic value sits.
The team ran a sweep on the regulation-share parameter — what fraction of battery power is bid into reg-up versus energy.
The deterministic optimum sits at 60% reg-up share, where mean revenue maxes at $3.9M. But the P10 revenue maxes at 45% — and that's the share the asset owner picked, trading $0.06M of expected revenue for $0.20M of downside protection. The optimal split is risk-preference-sensitive, and only the distribution makes that visible.
A battery does not earn its forecast revenue; it earns the conditional expectation under the realised price stack, which is always lower and almost always more volatile. Monte Carlo dispatch in ModelRisk closes the foresight-vs-reality gap by treating the price stack as a distribution, not a forecast.