Detailed Methodology
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:
- Train the model on the initial training period.
- Use the following validation period for early stopping and hyperparameter tuning.
- Freeze the selected hyperparameters and refit the model using the training and validation data.
- Predict the next untouched out-of-sample evaluation period.
| Fold | Training | Validation | Out-of-sample |
|---|---|---|---|
| 1 | Jan 2022–Aug 2024 | Sep–Dec 2024 | Jan–Apr 2025 |
| 2 | Jan 2022–Dec 2024 | Jan–Apr 2025 | May–Aug 2025 |
| 3 | Jan 2022–Apr 2025 | May–Aug 2025 | Sep–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:
| Parameter | Value |
|---|---|
| Objective | Regression L1 |
| Validation metric | L1 / MAE |
| Maximum trees | 3,000 |
| Learning rate | 0.035 |
| Number of leaves | 63 |
| Minimum observations per leaf | 80 |
| Row subsampling | 0.90 |
| Feature subsampling | 0.90 |
| L2 regularisation | 2.0 |
| Early-stopping rounds | 150 |
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
2026 · Final test
| 2025 · Out-of-sample development | 2026 · Final test | |||
|---|---|---|---|---|
| Market | MAE | RMSE | MAE | RMSE |
| DE-LU | 11.93 | 19.49 | 13.55 | 27.01 |
| FR | 13.38 | 18.22 | 17.88 | 27.42 |
| NL | 13.15 | 21.36 | 15.26 | 31.94 |
| BE | 11.86 | 19.18 | 14.69 | 32.06 |
| AT | 13.36 | 21.40 | 17.77 | 30.67 |
| CZ | 13.75 | 22.92 | 16.05 | 29.62 |
| PL | 15.32 | 24.40 | 18.17 | 33.80 |
| DK1 | 14.38 | 22.20 | 15.72 | 26.69 |
| IT North | 9.23 | 13.50 | 12.42 | 18.24 |
| ES | 11.91 | 16.08 | 11.73 | 16.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
2026 · Final test
| 2025 · Out-of-sample development | 2026 · Final test | |||
|---|---|---|---|---|
| Market | AQL | AQCE | AQL | AQCE |
| DE-LU | 4.32 | 7.41 pp | 5.12 | 13.43 pp |
| FR | 4.78 | 5.26 pp | 6.59 | 6.76 pp |
| NL | 4.73 | 5.92 pp | 5.80 | 10.23 pp |
| BE | 4.31 | 4.62 pp | 5.63 | 4.26 pp |
| AT | 4.85 | 8.14 pp | 6.61 | 10.78 pp |
| CZ | 5.04 | 5.94 pp | 6.06 | 8.72 pp |
| PL | 5.56 | 9.40 pp | 6.80 | 5.45 pp |
| DK1 | 5.22 | 7.24 pp | 5.90 | 14.45 pp |
| IT North | 3.25 | 5.29 pp | 4.55 | 7.74 pp |
| ES | 4.20 | 6.31 pp | 4.31 | 7.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.