Methodology

How the forecasts work

Morrowatt predicts hourly day-ahead electricity prices for two European bidding zones, Germany-Luxembourg (DE-LU) and Spain (ES), at one, two and three days ahead. The input data is the official price, load, and generation history from the ENTSO-E Transparency Platform. The models are trained by JITM.ai AutoML, one production model per zone and horizon, from a table of roughly 27 features per hour.

Three horizons, honest timing

The day-ahead auction clears at 12:00 local market time (CET in winter, CEST in summer) for delivery the next day. The D+1 model runs around 11:00, before that auction, so it never sees the prices it is trying to beat. The D+2 and D+3 models run around 13:35, after the D+1 auction has published, which is exactly the information a live operator would have at that moment and nothing more. Almost nobody publishes D+2 and D+3 hourly prices for free, which is what makes them valuable.

One consequence worth knowing: the "actual" price for every hour of tomorrow is the auction clearing price, fixed at noon and published early afternoon the day before delivery. That is why a forecast for tomorrow can already be scored against reality today, and why a future day can show its full auction result.

How accurate is it?

Measured on a six-week chronological holdout, 2 June to 13 July 2026, that the models never saw in training. The baseline is the strongest simple forecast in this market: the actual price at the same hour one week earlier. rMAE is model error divided by that baseline error, so a value below 1.0 means the model beats the baseline, and 0.46 means the model's miss is 46% the size of the baseline's.

ZoneHorizonModel MAErMAE vs naive
Germany (DE-LU)D+118.9/MWh0.456
Germany (DE-LU)D+223.3/MWh0.562
Germany (DE-LU)D+327.8/MWh0.670
Spain (ES)D+114.2/MWh0.551
Spain (ES)D+216.6/MWh0.647
Spain (ES)D+320.8/MWh0.811

Days from that holdout window are marked reconstructed on this site: their predictions were back-filled after the fact for evaluation. Days forecast live, before the auction, carry a green mark.

What the model looks at

Every forecast is a weighted read of five kinds of signal. The balance shifts with the horizon: one day out, grid physics leads; two days out, yesterday's published auction dominates; three days out, the weekly price pattern, weather and gas carry more of the load. The driver mix on the homepage shows this shift bar by bar.

Grid physics

Forecast demand minus forecast wind and solar. When the wind blows and the sun shines, expensive gas plants stay off and prices fall.

Price memory

What the market cleared at yesterday, last week, and at this hour over the past seven days. Markets are creatures of habit.

Weather at lead time

Temperature, wind speed and solar radiation from forecasts issued two or three days out, exactly as they looked at prediction time.

Gas price

TTF front-month futures. Gas plants set the marginal price in most European hours, so gas moves the whole curve.

Calendar

Weekday or weekend, public holidays, hour of day. Demand follows human routine.

What we deliberately did

  • Leak-free features

    Every one of the ~27 features (calendar structure, lagged prices, rolling statistics, forecast load and renewables) is knowable before the model runs, at that horizon's true lead time.

  • Chronological holdout

    The six-week test window sits strictly after the training data, with no shuffling and no random splits.

  • Grouped cross-validation

    During model selection, hours from the same day stay in the same fold, so the model can never grade itself on a day it partly saw.

  • Ensembles, not single fits

    Each production model is not one fitted estimator. JITM trains several model families, bags them across time-grouped folds, and assembles the final artifact by hill-climbing ensemble selection on out-of-fold error. "One model per zone and horizon" means the selected ensemble that won that search.

  • Measured, then reverted (v2)

    We built cross-border and scarcity features for a candidate v2, measured them on the same holdout, saw no reliable gain, and reverted to the simpler v1.

The short version

ENTSO-E data, ~27 strictly leak-free features, one JITM.ai AutoML ensemble per zone and horizon, scored on a six-week chronological holdout. At D+1, DE-LU misses by 18.9 €/MWh (rMAE 0.456) and ES by 14.2 €/MWh (rMAE 0.551). Reconstructed days are labelled, and ideas that don't earn their place get reverted.