How accurate is the outlook?
Gridcast forecasts whether a day ahead will be cheap or expensive relative to recent weeks. We measure how often that is right, publish the measurement per bidding zone, and show the outlook only where it clears both bars. Today it publishes in 14 of 24 zones, 0 of them beyond tomorrow, and 10 of them using a fitted model rather than the simple rule below.
How the outlook works
The driver is residual load — forecast electricity demand minus forecast wind and solar. It is the demand that dispatchable power stations have to cover, and it is the first-order reason a day is expensive: when the wind blows across a whole bidding zone, the expensive plants at the top of the merit order are not needed.
Each day is scored by its peak-hour residual load and placed in one of four categories against a 60-day rollingcalibration of the same statistic. Rolling, because calibrating on a full year would make every winter day “expensive” — true, and useless. “Expensive” here means expensive for this time of year, which is the part you cannot work out for yourself.
Today and tomorrow come from the grid operators' own published day-ahead forecasts (ENTSO-E). Days after that, where they are shown at all, come from a per-zone model that predicts residual load from the weather forecast. Every input is free and public; there is no proprietary data behind these numbers.
The two bars a zone must clear
Accuracy is measured by replaying history: for each past day we recalibrate using only what was published before that day, put the day in a category, and compare against the price that actually occurred. Two statistics, because they answer different questions.
- Separation (AUC ≥ 75%) — how often a day we called expensive really did cost more than a day we called cheap. 50% is a coin flip. This only ever looks at the two extremes.
- Ranking (ρ ≥ 0.65) — how well the whole ladder of days lines up with the prices that followed, over every day and not just the extremes. A zone can separate its extremes convincingly while the middle is noise — and most days are in the middle, so we label them too.
A zone must clear both. A zone we have not measured is withheld as well: unmeasured is not a pass.
Measured accuracy by zone
| Zone | Separation | Ranking | Reaches | Method | Status |
|---|---|---|---|---|---|
| Germany & Luxembourg | 99% | 0.77 | Tomorrow | Residual load | Published |
| Denmark — West (DK1) | 98% | 0.73 | Tomorrow | Fitted model | Published |
| Belgium | 98% | 0.74 | Tomorrow | Fitted model | Published |
| Poland | 98% | 0.81 | Tomorrow | Fitted model | Published |
| Denmark — East (DK2) | 97% | 0.71 | Tomorrow | Fitted model | Published |
| Lithuania | 97% | 0.82 | Tomorrow | Fitted model | Published |
| Netherlands | 96% | 0.67 | Tomorrow | Fitted model | Published |
| Finland | 96% | 0.80 | Tomorrow | Residual load | Published |
| Sweden — Sundsvall (SE2) | 96% | 0.77 | Tomorrow | Residual load | Published |
| France | 94% | 0.57 | — | — | Withheld — Extremes only |
| Czechia | 94% | 0.71 | Tomorrow | Fitted model | Published |
| Estonia | 93% | 0.83 | Tomorrow | Fitted model | Published |
| Sweden — Stockholm (SE3) | 93% | 0.77 | Tomorrow | Fitted model | Published |
| Austria | 92% | 0.57 | — | — | Withheld — Extremes only |
| Sweden — Malmö (SE4) | 92% | 0.72 | Tomorrow | Fitted model | Published |
| Sweden — Luleå (SE1) | 92% | 0.69 | Tomorrow | Residual load | Published |
| Latvia | 88% | 0.51 | — | — | Withheld — Extremes only |
| Spain | 86% | 0.56 | — | — | Withheld — Extremes only |
| Norway — Tromsø (NO4) | 85% | 0.60 | — | — | Withheld — Extremes only |
| Portugal | 84% | 0.36 | — | — | Withheld — Extremes only |
| Norway — Trondheim (NO3) | 63% | 0.27 | — | — | Withheld — No usable signal |
| Norway — Kristiansand (NO2) | 53% | 0.22 | — | — | Withheld — No usable signal |
| Norway — Oslo (NO1) | 50% | 0.32 | — | — | Withheld — No usable signal |
| Norway — Bergen (NO5) | 40% | 0.31 | — | — | Withheld — No usable signal |
Measured point-in-time over roughly nine months of prices, per zone. These are outputs of a reproducible backtest, not settings — when it is re-run, this table changes with it.
What “withheld” means
In a withheld zone we show no FORECAST at all — not a hedged one. The predicted days are not computed and greyed out; they are never sent to the page. A confident-looking label that is barely better than chance is worse than no label, and it is the failure that would cost us your trust in the zones where the outlook does work.
What a withheld zone does still show is the days the market has already settled. The day-ahead auction clears at 13:00 CET for the following day, so by every afternoon today and tomorrow are published facts — and putting a label on a price that already exists is arithmetic, not a prediction. Those days are marked settled and carry no accuracy figure, because there is no error rate on a number we are simply reading. Withholding them would mean hiding data from you over the absence of a forecast you were never going to be shown.
Extremes only means the zone reliably tells a very expensive day from a very cheap one, but cannot rank the ordinary days in between — and most days are ordinary. No usable signalmeans residual load does not explain that market's prices at all: the Norwegian zones are hydro-dominated, where price is set by the value of water in the reservoirs rather than by wind and sun, and we measured our signal there as no better than a coin flip. Four separate attempts have failed there, most recently one that tried every lead from tomorrow to five days out. We are not going to guess in the meantime — you get the settled days and nothing beyond them.
How far ahead it reaches
The day-ahead market publishes one day at a time, so the grid operators' forecasts reach tomorrow and no further. Weather forecasts reach much further, but only carry a useful price signal where we measured that they do — and both measurements have to agree, exactly as they do for the near days.
Right now none of them do. We used to show these days on the first number alone. When we measured the second one over the same period the bars are set on, it came out between 0.14 and 0.57 against a bar of 0.65 — the extremes separated, the ordinary days in between did not rank. So the multi-day outlook is switched off everywhere until a predictor clears both. The measurements stay here because they are why.
| Zone | Days ahead — extremes / all days | Shown? |
|---|---|---|
| Finland | D+2: 78% / 0.57 · D+3: 77% / 0.57 · D+4: 80% / 0.57 · D+5: 80% / 0.56 | no — the all-days figure is below the bar |
| Sweden — Luleå (SE1) | D+2: 82% / 0.22 · D+3: 85% / 0.23 · D+4: 82% / 0.23 · D+5: 75% / 0.14 | no — the all-days figure is below the bar |
| Sweden — Sundsvall (SE2) | D+2: 88% / 0.35 · D+3: 91% / 0.40 · D+4: 89% / 0.39 · D+5: 88% / 0.30 | no — the all-days figure is below the bar |
| Sweden — Stockholm (SE3) | D+2: 70% / 0.37 · D+3: 67% / 0.37 · D+4: 68% / 0.36 · D+5: 64% / 0.34 | no — the zone itself is withheld |
Reach is not permission. A zone can appear here, having been measured to carry a signal several days out, and still show nothing because it fails one of the two bars above.
The receipts: what we said, and what happened
The tables above are a backtest — history replayed over a fixed window, re-run when we change something. This is the other thing: every day we have actually published a call for, scored against the price that settled. Four categories, so guessing lands around 25%, and only an EXACT match counts here — calling an expensive day extreme is a miss in this column even though it is the same side of normal.
Days are either recorded live, written down before that day's price was known, or rebuilt from history using only what had been published at the time. Both are point-in-time honest about the data; only the live ones are also out-of-sample about the code, so the split is shown rather than folded together. A zone with fewer than a handful of scored days gets no percentage at all.
Loading the log…
Does a dynamic contract actually pay?
Only if you move your usage. In the Netherlands, an analysis of 2024–25 found roughly four in five households on a dynamic contract paid more than they would have on the best available fixed contract. Hourly pricing is not a discount; it is an opportunity that costs you money if you ignore it.
That is why gridcast tells you which days and hours are cheap rather than promising savings, and why we would rather show nothing in a zone than a label we cannot stand behind. We do not sell electricity, so we have nothing to gain from you switching to a dynamic contract.
Work it out for your own zone — every zone page links a calculator that prices the last year against your own consumption, and shows the no-change case first.
Building on this data?
We are working out whether an API is worth building, and the accuracy labelling above is the part that does not exist anywhere else. Tell us what you would build.