Project Overview
This project evaluates the flexibility and commercial value of a 50 MW / 100 MWh, 2-hour BESS in the Dutch electricity market. The analysis connects market fundamentals, battery operating constraints, optimization, forecasting, trading decisions, balancing-market signals and investment economics into one analytical workflow.
Base Commercial Case
Commercial & Analytical Snapshot
Annual Revenue
Forecast Performance
Algorithmic Backtest
1. Dutch Electricity-Market Intelligence
The first analytical layer examines Dutch day-ahead electricity prices at 15-minute resolution over October 2025 through August 2026.
| Market Indicator | Observed Result |
|---|---|
| Mean day-ahead price | ~€99.57/MWh |
| Negative-price intervals | ~4.7% |
| Maximum observed price | ~€902/MWh |
| Minimum observed price | ~−€500/MWh |
| Mean daily price spread | ~€158/MWh |
These observations illustrate the volatility and price-spread environment that can create potential flexibility value for storage.
Project Architecture
Dutch Electricity Market Data
│
▼
01 Market Intelligence
│
▼
02 BESS Dispatch Optimization
│
▼
03 Commercial Valuation
& Revenue Stacking
│
▼
04 Price Forecasting
LightGBM / 24h
│
▼
05 Algorithmic BESS Trading
├── BUY / SELL / WAIT
├── SOC constraints
├── PnL
└── Risk metrics
│
▼
06 TenneT Balancing-Market
Data Integration
2. BESS Dispatch Optimization
A mixed-integer linear programming model determines economically optimal charging and discharging decisions while respecting the battery's operational constraints.
- 50 MW / 100 MWh BESS
- 2-hour duration
- 15-minute dispatch resolution
- 97% availability
- 90% round-trip efficiency
- 10–90 MWh SOC range
- Initial SOC: 10 MWh
- Final SOC: 10 MWh
- Maximum 1 EFC/day
3. Commercial Valuation
The optimized wholesale opportunity is translated into a project-level commercial model incorporating revenue, CAPEX, O&M and battery degradation.
- Historical wholesale arbitrage
- Simplified balancing-market uplift
- Commercial revenue scenarios
- CAPEX
- Fixed O&M
- Battery degradation
- NPV
- IRR
- Simple payback
- Revenue & CAPEX sensitivity
Commercial Scenarios
| Scenario | Revenue Multiplier | CAPEX €/kWh | O&M €/kWh-year |
|---|---|---|---|
| Upside | 1.20x | €180 | €5 |
| Base | 1.00x | €200 | €6 |
| Downside | 0.80x | €225 | €7 |
| Stress | 0.65x | €250 | €8 |
4. Machine-Learning Price Forecasting
A LightGBM gradient-boosting regression model forecasts the next 24 hours of Dutch 15-minute electricity prices, corresponding to 96 future intervals.
Feature Engineering
- Quarter-hour
- Hour-of-day cyclical features
- Day-of-week cyclical features
- Month
- Lagged prices
- 1-hour rolling statistics
- 6-hour rolling statistics
- 24-hour rolling statistics
Validation
- Chronological train/test split
- RMSE: ~€42.24/MWh
- MAE: ~€31.20/MWh
- RMSE improvement: ~41.8%
- MAE improvement: ~39.7%
5. Forecast-Driven Algorithmic BESS Trading
The forecasting layer is connected to a simplified BUY / SELL / WAIT trading strategy. The strategy applies BESS SOC and power constraints rather than assuming unlimited battery flexibility.
24h Price Forecast
│
▼
Expected Near-Term Price Movement
│
▼
BUY / SELL / WAIT
│
▼
BESS SOC & Power Constraints
│
▼
Charge / Discharge / Hold
│
▼
Realized PnL & Risk Metrics
| Backtest Metric | Result |
|---|---|
| Trading decision intervals | 906 |
| Realized cash PnL | ~€97.8k |
| Economic PnL | ~€97.6k |
| Energy charged | ~1,143.8 MWh |
| Energy discharged | ~953.5 MWh |
| Maximum cash drawdown | ~€12.7k |
| Profitable days | 10 / 13 |
| Profitable-day ratio | ~76.9% |
| Simple daily Sharpe | ~0.84 |
Perfect-Foresight Benchmark vs Forecast-Driven Trading
The MILP optimization uses the historical future price path and therefore represents an upper-bound market opportunity benchmark. The algorithmic trading strategy instead makes decisions using forecast information and simplified BUY / SELL / WAIT signals.
These two approaches serve different analytical purposes and should not be interpreted as directly equivalent performance measures.
6. TenneT Balancing-Market Integration
The project also integrates official TenneT API data to examine Dutch balancing-market settlement information alongside the day-ahead market.
| TenneT Metric — 1 August 2026 | Result |
|---|---|
| Intervals retrieved | 96 |
| UP regulation intervals | 43 |
| UP & DOWN intervals | 38 |
| DOWN regulation intervals | 15 |
| Average dispatch UP | €155.74/MWh |
| Average dispatch DOWN | €83.92/MWh |
| Average shortage price | €136.17/MWh |
| Average surplus price | €119.11/MWh |
The current analysis treats TenneT settlement prices as historical market information rather than directly executable trading prices.
Potential Multi-Market Architecture
Day-Ahead Market
│
▼
Price Forecast
│
├───────────────┐
▼ ▼
Intraday Market Balancing Market
│ │
└───────┬───────┘
▼
Opportunity Cost
Analysis
│
▼
BESS Co-Optimization
│
▼
Charge / Discharge
/ Reserve Capacity
│
▼
Revenue + Risk
Extending this architecture would require additional assumptions around bidding, activation, availability, imbalance exposure, reserve requirements and opportunity costs.
Explore the Analysis
The complete analysis, notebooks, data, source code and generated results are available in the GitHub repository.
Dutch day-ahead prices, volatility, negative prices, spreads and BESS arbitrage opportunities.
Constrained BESS charging and discharging using MILP optimization.
Revenue stacking, degradation, CAPEX, O&M, NPV, IRR and payback.
LightGBM 24-hour price forecasting and transparent trading signals.
Forecast-driven BESS trading backtest with PnL, drawdown and risk metrics.
TenneT API integration and Dutch balancing-market analysis.
Technology Stack
Python • Pandas • NumPy • Matplotlib • SciPy • scikit-learn • LightGBM • HiGHS MILP • Jupyter
Data Sources
ENTSO-E Transparency Platform API for Dutch day-ahead electricity-market data and the official TenneT API for balancing-market information.
Model Limitations
The project intentionally uses simplified commercial and trading assumptions. The perfect-foresight optimization is an upper-bound opportunity benchmark rather than a real-world revenue forecast.
The forecasting model is evaluated over a limited historical period and is not presented as a production-grade forecasting system. The algorithmic trading backtest also simplifies real-world issues such as order-book liquidity, transaction costs, bid/ask spreads, market gate closure, imbalance exposure, reserve obligations, intraday re-optimization and opportunity costs.
TenneT settlement prices are used as historical balancing-market information and are not assumed to represent directly executable trading prices.
Commercial Perspective
The central question is not simply whether electricity-price spreads exist, but how much value a BESS can actually capture while respecting battery constraints, forecast uncertainty, degradation, market rules, opportunity cost and investment economics.
The project therefore connects: Energy Markets → Asset Optimization → Forecasting → Trading → Revenue → Risk → Investment.