Models: how they were tested and which one won
The ladder. Start with naive baselines, climb to ridge regression, then LightGBM. A more complex model is used only if its winter error is more than 5% lower and a Diebold–Mariano test says the gain is not luck (p < 0.10). After that, the simplest model within 5% of the winner is taken.
The test. A rolling origin: for every day from May 2024, each model is trained only on data before that day and forecasts 1, 7, 14 and 30 days ahead. Future weather comes from the long-term average for that day of the year (what you'd really know), not the actual weather.
Winter error by horizon
Each chart has its own units, and lower is better. For demand and peak, ridge is lowest at every horizon. LightGBM overfits: about 600 days is too little for trees.
Which model ships
import_need_method= diff: import need is forecast as demand − generation. It beat the direct model at 14–30 days and ties at 1–7.- Coverage is the share of actual values inside the P10–P90 range (target 80%). Above 80% the range is cautious; below, too narrow.
How much would better weather knowledge help?
Knowing the river flow (a perfect river forecast) helps generation only a little. Knowing all the weather helps generation more, but nobody has that 30 days ahead. For demand, actual weather doesn't help at all.
Backtest: forecasts vs what happened
Monthly winter outlook: two hold-out winters
No single model won both winters, so the outlook uses combo, the average of the three. Combinations are the most reliable choice on short series.