🔋 Dutch BESS Flexibility & Commercial Value Intelligence

Energy-market analysis of a 50 MW / 100 MWh battery energy storage system, combining market intelligence, constrained optimization, commercial valuation, machine-learning price forecasting, algorithmic trading and balancing-market data.

View Full GitHub Project Back to Portfolio

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.

Energy Markets BESS MILP Optimization Revenue Stacking NPV / IRR LightGBM Algorithmic Trading TenneT Python

Base Commercial Case

BESS Power
50 MW
Utility-scale battery
Energy Capacity
100 MWh
2-hour duration
Base Revenue
€4.58M
Annualized
NPV
€8.84M
Base case
IRR
15.13%
Project economics
Simple Payback
5.54 yrs
Approximate
CAPEX
€20.0M
Base case
Availability
97%
Operating assumption

Commercial & Analytical Snapshot

Annual Revenue

Historical wholesale vs. base stacked case
Wholesale €3.98M
Base stacked €4.58M
The base case combines the historical wholesale benchmark with a simplified 15% balancing-revenue uplift.

Forecast Performance

LightGBM vs. persistence benchmark
RMSE €42.24/MWh
MAE €31.20/MWh
Forecasting effect: approximately 41.8% lower RMSE and 39.7% lower MAE versus the persistence benchmark over the tested period.

Algorithmic Backtest

August 2026 tested period
Cash PnL €97.8k
Max drawdown €12.7k
Profitable days 76.9%
Backtest covers a limited August 2026 period and should not be interpreted as an annual expected profit.

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.

01_market_intelligence.ipynb

Dutch day-ahead prices, volatility, negative prices, spreads and BESS arbitrage opportunities.

02_bess_dispatch_optimization.ipynb

Constrained BESS charging and discharging using MILP optimization.

03_bess_valuation_revenue_stacking.ipynb

Revenue stacking, degradation, CAPEX, O&M, NPV, IRR and payback.

04_price_forecasting_signals.ipynb

LightGBM 24-hour price forecasting and transparent trading signals.

05_bess_algorithmic_trading_backtest.ipynb

Forecast-driven BESS trading backtest with PnL, drawdown and risk metrics.

06_tennet_imbalance_market_data.ipynb

TenneT API integration and Dutch balancing-market analysis.

Open Full GitHub Repository →

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.