clock

A public forecasting record for European power. Every day a forecast, the next day the score, every file timestamped and never edited.

Against the operator's own day-ahead forecast, over 43 days: clock 15.61% nMAE, operator 2.94%.

Skill -431.8%. Positive means the clock beat the TSO's published forecast on the same hours. Model naive-v1.

029.449258.89842026-09-132026-10-27

nMAE, % of installed capacity, day-ahead, DE-LU wind. Black: clock. Grey: the operator's forecast.

Day-ahead, all targets

Zone · targetModelDaysMetricClockPersistenceWeeklyOperatorSkill vs operator
DE-LU · windnaive-v145nMAE15.4015.4019.102.94-431.8%
DE-LU · solarnaive-v145nMAE2.403.112.870.54-352.7%
DE-LU · loadnaive-v145MAPE3.2112.183.213.09-4.2%
DE-LU · pricenaive-v144MAE68.5349.4268.53none exists·
ES · windnaive-v145nMAE9.319.3110.231.67-457.8%
ES · solarnaive-v145nMAE3.593.575.131.61-123.2%

Day-ahead (lead 1), mean of daily scores, every source over the same hours, one row per model version. Solar over daylight hours only. Operator columns count only days where the TSO forecast was captured before delivery.

By lead time

Lead, daysModelDaysClockPersistenceWeekly
1naive-v14515.4015.4019.10
2naive-v14416.1116.1119.33
3naive-v14317.2017.2019.43
4naive-v14218.4218.4219.73
5naive-v14118.3518.3519.86
6naive-v14019.8219.8219.50
7naive-v13917.9817.9816.47

DE-LU wind, nMAE, % of installed capacity. Leads 2 to 7 have no official forecast to compare against; they are on record so that the series exists when they do.

Intraday

Lead, hoursDaysClock (persistence)Operator intradaySkill
1452.591.53-61.3%
2453.731.56-146.0%
4455.121.70-220.0%
8457.221.57-347.8%

DE-LU wind, nMAE, % of installed capacity, hourly runs. Recorded from day one, not a headline.

Latest issue

Issued 2026-10-28T00:35:44Z, before the day-ahead gate closure (2026-10-28T11:00:00Z), for delivery day 2026-10-29 and six days beyond. Model naive-v1.

data/forecasts/2026-10-28.json · proof

47 issue days since 2026-09-12, no gaps.

Latest revision drift (mean absolute change between the preliminary and the final actuals, per hour): DE-LU/wind 5.3, DE-LU/solar 30.9, DE-LU/load 128.9, DE-LU/price 0.0, ES/wind 0.0, ES/solar 0.0.

Method

Every day from 00:17 UTC, before the day-ahead market closes at 12:00 Central European time (CET in winter, CEST in summer), a scheduled job downloads the latest actuals from the ENTSO-E transparency platform, writes a forecast for every hour of the next seven delivery days, commits it to the public repository and anchors its hash in the Bitcoin blockchain with OpenTimestamps. The next day it downloads what happened, scores every source over the same hours, and publishes the score next to the forecast. Seven days later it scores again with the revised actuals, in a second file; nothing is overwritten.

The operator's own day-ahead forecast is polled through the day and stored with the time it was first seen complete, because the regulation sets a deadline for publishing it, not a time, and a comparison against a number of unknown availability is not a comparison.

Zones: DE-LU and ES. Targets: wind, solar, load and day-ahead price for DE-LU; wind and solar for ES. Price has no official forecast and is a dated series only. Phase 1 model naive-v1 is deliberately naive (wind: persistence, solar: mean3, load: weekly, price: weekly); persistence and weekly baselines are always published beside it. The scarce thing is the dated series, and the method improves forward.

Wind and solar are scored as nMAE, a share of installed capacity; solar over daylight hours only. Load as MAPE. Everything is hourly means of the platform's quarter-hour values, in UTC; delivery days follow the CET/CEST calendar and have 23, 24 or 25 hours when the clocks change.

Verify

Every file under data/ has a .ots proof beside it. To check that a forecast existed before the day it forecast:

pip install opentimestamps-client
ots verify data/forecasts/2026-09-12.json.ots

Or drop the file and its proof at opentimestamps.org. A fresh proof says pending until its Bitcoin block is mined, typically within a day; the job upgrades proofs as blocks arrive. The commit history is a second, independent witness. The full record and code are at https://github.com/carlo-coding/clock.