Monte Carlo simulation calibrated to 7 years of Irish SEM data — what does the revenue distribution look like?
EUR 66k/MW MEAN (P10: EUR 60k)EUR 3.3M/yr MEAN (P10: EUR 3.0M)
Mean Revenue
€66k /MW/yr€3.3M /yr
P10 Floor
€60k /MW/yr€3.0M /yr
P90 Ceiling
€72k /MW/yr€3.6M /yr
P(≥€80k)
0.4% probability
How was this page built?
1
Price Structure Analysis
Computed hourly statistics (mean, std, skewness, kurtosis, percentiles) for all 24 hours across seasons and day types. Analyzed autocorrelation structure, price clustering, and spread distributions. Script: scripts/price_analysis.py
2
Regime Identification
Used k-means clustering on daily price features (mean, spread, volatility) to identify 3 distinct price regimes: Low (66% of days, mean spread EUR 63/MWh), Normal (25%, EUR 163/MWh), High (9%, EUR 188/MWh). Computed transition probabilities between regimes. Script: scripts/price_model.py
3
Stochastic Model Calibration
Built a regime-switching model where each regime has its own hourly price shape, volatility, and autocorrelation. Calibrated on 2019-2024 data (training set). Validated on 2025 data (out-of-sample). Model reproduces spread distribution within 12% of actual.
4
Monte Carlo Simulation
Generated 1,000 synthetic years of hourly prices. For each scenario, ran an adaptive battery dispatch optimisation with 12% forecast error (realistic trading). Computed annual revenue distribution. Script: scripts/monte_carlo_sim.py
5
Sensitivity Analysis
Re-ran simulations under spread compression (–20%) and expansion (+20%) scenarios, plus gas price shifts (±30%). Script: scripts/monte_carlo_analysis.py
Limitations: The model is stationary — it doesn’t project future trends (like increasing renewables or BESS fleet). It answers “what would revenue look like if future years were statistically similar to 2019-2024?” The regime-switching model underestimates extreme spread events by ~12%. The 12% forecast error is a rough estimate — actual forecast quality varies by trader.
Nerd level: regime-switching stochastic models with Monte Carlo simulation — this is the deep end of the nerd pool and we loved every minute of it
Annual Wholesale Arbitrage Revenue EUR/MW/yrEUR M/yr (50 MW project), 1,000 Monte Carlo scenarios
C2-C3: Model calibrated on 64,670 SEM hoursRevenue mean +/-15% from model risk
Bell-shaped distribution with slight right skew (CV = 7.6%). The mean (€66k/MW€3.3M) and median (€66.1k/MW€3.3M) nearly coincide. The financial model's €69k/MW€3.45M assumption sits at P73 — optimistic but possible. The old €80k/MW€4.0M assumption at P99.6 is essentially unreachable from arbitrage alone. Worst: €51.6k/MW€2.58M; best: €81.5k/MW€4.08M.
02Probability of Hitting TargetsHow likely is each revenue threshold?
Exceedance Probability P(revenue ≥ target)
C2: Direct Monte Carlo output
Key finding: The financial model's €80k/MW€4.0M target is effectively unreachable from arbitrage alone. Only 4 out of 1,000 simulated years achieved it. The €69k/MW€3.45M central assumption (P73) requires above-median spreads — optimistic but within the realm of possibility. The €60k/MW€3.0M floor is exceeded in 88% of scenarios, making it a reliable conservative base.
03Three Price RegimesDistinct market states drive revenue
66%
Low regime — calm, moderate wind
€63/MWh mean spread. Modest daily arbitrage. 7.6-day average persistence.
25%
Normal regime — price spikes begin
€163/MWh mean spread. Strong arbitrage opportunity. 2.4-day average persistence.
9%
High regime — extreme volatility
€188/MWh mean spread. Gas scarcity / crisis days. 4.6-day average persistence.
Regime Structure Mean spread and daily frequency
C1: Historical data classificationC2: Regime transition probabilities
Just 9% of days (High regime) contribute disproportionate revenue. Regimes persist for days: Low episodes average 7.6 days, High episodes average 4.6 days. Transition from Low to High is nearly impossible in one step (p=0.001) — prices must pass through Normal first.
Regime Transition Probabilities
From \ To
Low
Normal
High
Mean Duration
Low
87.4%
11.2%
1.4%
8.0 days
Normal
7.7%
83.1%
9.1%
5.9 days
High
0.8%
18.9%
80.3%
5.1 days
C2: Calibrated on 2,178 days (2019-2024)
04What Drives RevenueCorrelation of scenario features with annual revenue
Revenue Driver Correlations Pearson r across 1,000 scenarios
C2: Monte Carlo correlation analysis
Spread magnitude matters 2.5x more than gas price. The 4-hour spread alone explains 83% of revenue variance (r2 = 0.83). This confirms that the BESS fleet growth trajectory — which determines future spread compression — is the single most important variable for the investment case. Cycles per day is essentially uncorrelated with revenue (-0.08) because the optimizer naturally reduces cycling on low-spread days.
05Sensitivity ScenariosHow revenue changes under different market conditions
Mean Revenue by Scenario EUR/MW/yrEUR M/yr (50 MW project) with P10-P90 range
C3: Spread scaling is approximateC3: Gas price sensitivity assumes linear passthrough
20% spread compression (from BESS fleet growth to 2-3 GW) cuts revenue by 40% to €40k/MW€2.0M — this is the dominant risk. Conversely, 20% spread expansion (from aggressive RES build-out with slow BESS deployment) lifts revenue to €92k/MW€4.6M. Gas price has a material but secondary effect: +/-30% gas moves revenue by only +/-15%.
Scenario Detail
Scenario
Mean
P10
P90
P(≥€69k)
P(≥€80k)
Base case
€66k€3.3M
€59k€2.95M
€72k€3.6M
24%
1.0%
Spread -20% (BESS growth)
€40k€2.0M
€36k€1.8M
€44k€2.2M
0%
0%
Spread +20% (more RES)
€92k€4.6M
€83k€4.15M
€103k€5.15M
100%
96%
Gas +30%
€76k€3.8M
€68k€3.4M
€84k€4.2M
87%
21%
Gas -30%
€56k€2.8M
€50k€2.5M
€63k€3.15M
0.5%
0%
C3: Sensitivity assumptions
Sensitivity Ranking
→Spread change (+/-20%): +/-40% revenue impact. Dominant driver. A function of BESS fleet size and renewable deployment pace.
→Gas price (+/-30%): +/-15% revenue impact. Material but secondary. Higher gas pushes up peaks, widening spreads.
→Regime mix (stochastic): +/-8% random variation year-to-year. Background noise from weather and demand patterns.
20% spread compression cuts revenue by 40% — this is the dominant risk. The BESS fleet growth trajectory matters more than gas prices, carbon prices, or demand growth for this investment.
06Model ValidationHow well does the model reproduce reality?
Modeled vs Actual Metrics Out-of-sample validation on 2025 data
C2: 2025 out-of-sample validation
Validation Detail
Metric
Model
Actual
Error
Assessment
Mean price (EUR/MWh)
€116
€114
+1.8%
Excellent
Mean daily spread (EUR/MWh)
€98
€111
-12%
Conservative
Calibration spread (2019-24)
€97
€99
-2%
Excellent
Hourly profile RMSE
€9.5/MWh
8%
Good
Negative price frequency
0.53%
0.66%
-0.13pp
Close
C2: Validation on 365 out-of-sample days
Model captures spread distribution well; individual hour prices less precise. Mean price is within 2% of actual 2025 values. Spreads are slightly conservative (model EUR 98 vs actual EUR 111 for 2025), which means revenue estimates carry a conservative bias of approximately 10-15%. For forward projection this is appropriate given expected BESS fleet growth. Calibration-period spread accuracy is excellent (EUR 97 vs EUR 99).
07Revenue StackingComplete revenue picture for BESS investment case
Total Revenue by Stream EUR/MW/yrEUR M/yr (50 MW project), stacked estimate
→Wholesale alone (€66k/MW€3.3M) is not enough. The investment case requires CRM capacity payments and DASSA ancillary services revenue to work. Arbitrage alone does not cover typical BESS CAPEX + OPEX at current costs.
→CRM is the swing factor. The difference between €35k€1.75M and €60k€3.0M CRM is worth more to the business case than the entire P10-P90 range of arbitrage revenue.
→Total €116-146k/MW€5.8-7.3M/yr makes the investment viable. Even the conservative stack (€116k€5.8M) is well above the typical €80-90k/MW€4.0-4.5M breakeven for a 4-hour BESS.
The Monte Carlo confirms a viable project — but only with revenue stacking. Wholesale arbitrage provides a solid (€60k P10€3.0M P10) floor, but the investment case is built on the combination of arbitrage + CRM + ancillary. All three legs must hold.
Source: Regime-switching model calibrated on 64,670 SEM hours (2019-2024), validated on 2025 data. 1,000 Monte Carlo scenarios, each simulating 365 days of hourly prices. Battery dispatch via adaptive day-ahead LP optimization with 12% forecast error. Revenue computed for a 50 MW / 200 MWh (4-hour) BESS with 85% round-trip efficiency and 90% usable capacity. CRM and DASSA estimates are from independent research and are not part of the Monte Carlo model.
All figures are in EUR per MW of installed discharge capacity per year. The model is stationary (no trend projection). For forward-looking scenarios, spread adjustment factors from SPREAD-PROJECTION are applied as post-hoc sensitivity. Confidence levels follow the C1-C5 scale: C1 (data), C2 (reasonable model), C3 (estimate with caveats), C4 (rough estimate), C5 (speculation).