01

Study design

The model-selection/development data covered 2022–2025. The test data covered January–June 2026.

Model selection: 2022–2025

For model selection, I used three expanding-window folds with a floored exponential-decay weighting scheme and separate training, validation, and out-of-sample evaluation periods.

Each fold followed the same process:

  1. Train the model on the initial training period.
  2. Use the following validation period for early stopping and hyperparameter tuning.
  3. Freeze the selected hyperparameters and refit the model using the training and validation data.
  4. Predict the next untouched out-of-sample evaluation period.
FoldTrainingValidationOut-of-sample
1Jan 2022–Aug 2024Sep–Dec 2024Jan–Apr 2025
2Jan 2022–Dec 2024Jan–Apr 2025May–Aug 2025
3Jan 2022–Apr 2025May–Aug 2025Sep–Dec 2025

The three non-overlapping out-of-sample evaluation windows collectively cover the full year of 2025.

Several model families were compared using point-forecasting metrics (MAE and MSE) calculated from the pooled predictions across the three 2025 backtest windows:

  • Linear models: LEAR and SARIMAX
  • Tree models: XGBoost, LightGBM, and CatBoost
  • Neural-network models: LSTM

LightGBM performed best and was selected as the winning model. The point model achieved a 2025 equal-weighted macro MAE of 12.83 EUR/MWh across the three non-overlapping forward backtests.

Final test: 2026

After model selection, the feature pipeline, preprocessing rules, and all LightGBM hyperparameters were frozen. The selected pipeline was then refitted using all eligible pre-2026 data and evaluated once more on the untouched January–June 2026 holdout.

For detailed results, see the Results section below.

02

Data

The raw dataset contains approximately 1.4 million rows across ten bidding zones and four years of 15-minute observations, with 61 raw columns. Each row represents one bidding zone and one physical 15-minute delivery interval. The data sources are publicly available and include, among others, ENTSO-E, JAO (Joint Allocation Office), ICE-based market data, and Energy-Charts.

The data collected can be grouped into the following categories:

Target and historical prices

Day-ahead curves from ENTSO-E were used as the prediction target and to construct lagged and historical-price features.

Load and renewable day-ahead forecasts

  • D-1 load forecasts from ENTSO-E
  • D-1 wind-generation forecasts from ENTSO-E
  • D-1 solar-generation forecasts from ENTSO-E

These forecasts are among the most important raw features and are also used to calculate residual load, a key signal for day-ahead electricity prices.

For an important note regarding these specific data, see the Limitations section below.

Nuclear and hydro data

  • D-2 nuclear generation from ENTSO-E
  • D-2 run-of-river, reservoir, and pumped-storage hydro generation from ENTSO-E

These variables were based on D-2 actual generation values. D-1 forecast values are not available from ENTSO-E, while D-1 actual values are published after the day-ahead gate closure (around midday on D-1).

Commodity data

  • TTF day-ahead natural-gas prices
  • API2 front-month coal futures prices
  • EUA front-December carbon futures prices

These commodity variables were taken from ICE-based market data and converted into approximate gas and coal marginal-cost features. For more information on this, see the Feature Engineering section below.

Network data

  • Cross-border transmission capacities from JAO (ATC and MaxBEX)
  • D-2 actual cross-border net physical flows from ENTSO-E

These variables were used to create border-congestion proxy features. No outage-related data was used.

EXAA day-ahead prices

EXAA operates pre-gate day-ahead auctions for Austria, Germany, Belgium, France, and the Netherlands. The DE-LU series from Energy-Charts was therefore used as a pre-gate proxy for German day-ahead prices; publicly available historical data were found only for Germany.

Some data-processing notes:

  • Where a source was available only hourly, linear interpolation was used; for the final hour, the last available value was repeated to avoid data leakage.
  • Daylight-saving-time days were handled explicitly: 92 intervals on the spring transition day, 96 intervals on a normal day, and 100 intervals on the autumn transition day.

03

Feature engineering

Using the raw dataset described above, a total of ~100 features were created. These consist of own-market features, neighbouring-market aggregates, and common features used across all bidding zones. The features can be grouped as follows.

Country identity flags

Country identity flags are used to distinguish between features related to the specific bidding zone, referred to as own-market features, and features related to neighbouring bidding zones. A neighbouring market is defined as a market connected through a physical border. 10 features.

Cyclical time features

These features represent the time of day, day of the week, and month of delivery as circles rather than straight lines, using sine and cosine transformations. This helps the model capture intraday, weekly, and seasonal patterns in electricity prices. 7 features.

Own fundamental forecasts or proxies

  • Load/wind/solar forecast
  • Residual-load forecast
  • Nuclear/hydro forecast proxies
  • EXAA day-ahead price for Germany

These were taken directly from the original dataset, and no feature engineering was done. 9 features.

Neighbour fundamentals

The same fundamental variables as above were calculated for the corresponding neighbours as simple averages across directly connected neighbouring markets. 4 features.

Lagged and historical features: own market and neighbours

Examples include:

  • Own-market price lagged by one day for the same quarter-hour
  • Own-market mean price over the previous seven days for the same quarter-hour
  • Own-market price standard deviation over the previous seven days for the same quarter-hour
  • Own-market maximum price over the previous seven days for the same quarter-hour
  • Own-market maximum and minimum prices over the previous complete delivery day
  • The same features calculated for neighbouring markets

28 features.

Fundamental binning

Each fundamental variable, load, residual load, wind, and solar, was divided into seven quantile-based bins. These bins represent distinct fundamental regimes and provide the basis for the target-encoding features described below; a separate equal-width binning scheme was used for frequency encoding. 4 features.

Target/frequency encoding of fundamentals

  • Target encoding: The seven quantile-based bins described above were used to calculate four regime-based historical price statistics for each fundamental: mean, median, standard deviation, and interquartile range.
  • Frequency encoding: Frequency encodings were created for the fundamentals, with each variable divided into seven equal-width bins.

20 features.

Gas and coal marginal-cost estimates

TTF day-ahead gas, API2 front-month coal, and EUA front-December carbon prices were used to create gas and coal marginal-cost features. The gas estimate assumed 50% efficiency and a 0.375 tCO₂/MWh emissions factor, while the coal estimate used a 0.33 fuel-cost conversion coefficient and a 0.85 tCO₂/MWh emissions factor.

2 features.

Border-congestion proxies

One congestion-stress proxy was created for each border using D-2 actual cross-border net physical flows and available transmission capacities.

For each border, one point was assigned when the absolute flow was above its training-period 75th percentile and another when the available capacity in the flow direction was below its training-period 25th percentile.

The indicator takes values of −2, −1, 0, 1, or 2. A value of 2 means that both high flow and low capacity occurred in the positive flow direction, while a value of −2 means that both occurred in the negative flow direction. 12 features.

04

Model training

Point-model training

The winning LightGBM model was trained using the engineered features described above, which were derived from the original raw dataset. A single pooled model was used across all ten bidding zones rather than training ten completely independent models.

The point-forecasting model was trained using LightGBM’s L1 regression objective (minimize MAE). Validation and early stopping also used the L1 loss (MAE). I did not perform an extensive hyperparameter search. The same main configuration was used in all folds, while the number of boosting rounds was selected separately through early stopping on the validation dataset.

The main hyperparameters were:

ParameterValue
ObjectiveRegression L1
Validation metricL1 / MAE
Maximum trees3,000
Learning rate0.035
Number of leaves63
Minimum observations per leaf80
Row subsampling0.90
Feature subsampling0.90
L2 regularisation2.0
Early-stopping rounds150

Probabilistic-model training

In addition to the point model, I trained probabilistic LightGBM models using the quantile-loss (pinball-loss) objective. The probabilistic models produced five quantiles: 0.10, 0.25, 0.50 (the median prediction), 0.75, and 0.90. These quantiles form the 50% and 80% prediction intervals shown in the plots.

In order to deal with quantile crossing, for example,

I used isotonic post-processing to enforce the correct quantile order:

Isotonic post-processing ensures that the minimum adjustment necessary is made to restore the correct ordering.

I did not apply conformal calibration or any other calibration method. Electricity-price observations are strongly time-dependent, making standard exchangeability assumptions difficult to justify in the case of conformal calibration.

05

Main results

Point forecasting

The 2025 results are equal-weighted macro metrics from the three non-overlapping out-of-sample evaluation windows. The 2026 results are equal-weighted macro metrics from the untouched January–June final test.

2025 · Out-of-sample development

MAE12.83EUR/MWh
RMSE19.87EUR/MWh

2026 · Final test

MAE15.32EUR/MWh
RMSE27.42EUR/MWh
2025 · Out-of-sample development 2026 · Final test
Market MAE RMSE MAE RMSE
DE-LU11.9319.4913.5527.01
FR13.3818.2217.8827.42
NL13.1521.3615.2631.94
BE11.8619.1814.6932.06
AT13.3621.4017.7730.67
CZ13.7522.9216.0529.62
PL15.3224.4018.1733.80
DK114.3822.2015.7226.69
IT North9.2313.5012.4218.24
ES11.9116.0811.7316.79

Probabilistic forecasting

AQL is the average pinball loss across all five predicted quantiles.

AQCE is the average absolute difference between nominal and empirical coverage across those quantiles.

2025 · Out-of-sample development

AQL4.63EUR/MWh
AQCE6.55percentage points

2026 · Final test

AQL5.74EUR/MWh
AQCE8.92percentage points
2025 · Out-of-sample development 2026 · Final test
Market AQL AQCE AQL AQCE
DE-LU4.327.41 pp5.1213.43 pp
FR4.785.26 pp6.596.76 pp
NL4.735.92 pp5.8010.23 pp
BE4.314.62 pp5.634.26 pp
AT4.858.14 pp6.6110.78 pp
CZ5.045.94 pp6.068.72 pp
PL5.569.40 pp6.805.45 pp
DK15.227.24 pp5.9014.45 pp
IT North3.255.29 pp4.557.74 pp
ES4.206.31 pp4.317.42 pp

06

Limitations and live deployment

There are five main limitations of this model:

  • The load, wind, solar, and residual-load forecasts were taken from the historical D-1 forecasts available through ENTSO-E. The renewable forecasts correspond to the D-1 18:00 publication, which is after the day-ahead gate closure around midday, while the historical load forecasts may include later revisions. Since historical pre-gate forecast vintages are not publicly available, I used these forecasts as a necessary compromise. In practice, pre-gate vintages could be obtained from energy-data vendors or archived directly from ENTSO-E before gate closure, hence reducing this limitation.
  • No calibration was applied to the quantile forecasts. As a result, it cannot be ensured that the predicted quantiles achieve their intended empirical coverage, as reflected in the AQCE.
  • I did not produce independent weather-based forecasts for load, wind, solar, and residual load. Combining weather-based forecasts with pre-gate forecast vintages from ENTSO-E or energy-data vendors could better capture the market consensus regarding these fundamental factors.
  • Modelling price spikes remains challenging, as reflected in the 2026 results, where RMSE increased from 19.87 to 27.42 EUR/MWh. This can be partly explained by the use of the L1 loss function, which minimises absolute errors rather than placing greater weight on large errors.
  • Model parameters were frozen after development and not recalibrated during the 2026 test period. Continuous updates could improve performance under changing market conditions but were not undertaken because of computational-resource limitations.