Specimen · Vendor Band Audit

Forecast band calibration: DE-LU system load

A worked example of the deliverable, formatted exactly as a client receives it. It is run on a public series rather than on client data, and every number in it regenerates from the linked script and notebook.

Verdict

The two bands a desk builds without a calibration step do not deliver the coverage they state, and they fail hardest in the quarter-hours where being wrong is most expensive. Of 3 constructions audited, 2 carry Material findings and 1 does not fail on this evidence. The band that holds pays for it in width, and that price is scored rather than mentioned: at nominal 90% it quotes 8,820 MW on average against the parametric band's 7,547 MW, 17% wider on average, and never wide enough to be unusable on this series.

IDFindingSeverityExposure at 90%
F-01Parametric Gaussian band at nominal 90% covered 84.8%MaterialEUR 90,042
F-02Rolling split-conformal band at nominal 90% covered 83.5%MaterialEUR 94,400
F-03Adaptive conformal band at nominal 90% covered 89.6%ObservationEUR 44,495

Scope and exclusions

What an audit did not look at is the half a reader cannot infer, so it is stated rather than left to the method section.

What this audit did not check
  • Whether the forecast itself can be improved. This audits the stated uncertainty around it, not the point forecast.
  • Any series other than system load, and any period outside the 13 months above.
  • Whether the desk actually reserves flexibility equal to the stated band. The exposure figures assume it does; if it reserves more, they overstate.
  • Price risk beyond the imbalance-versus-day-ahead spread. No intraday trading, no portfolio effects, no cross-commodity exposure.
  • Whether the adaptive construction would hold on a future regime change. It is reactive by design and this report says so under F-03.

Findings register

F-01 Material

Parametric Gaussian band at nominal 90% covered 84.8%

Why this severity
nominal outside the coverage interval, and misses run 1.35x more frequent in the most expensive intervals (interval lower bound 1.16 > 1)
Measurement
Headline 90%: coverage 0.848, day-block bootstrap 95% interval [0.823, 0.871] over 32,252 scored intervals. Every audited level: 80%: covered 73.3% [70.3%, 76.2%], concentration 1.24x [1.10, 1.36], Significant; 90%: covered 84.8% [82.3%, 87.1%], concentration 1.35x [1.16, 1.55], Material; 95%: covered 91.2% [89.3%, 93.0%], concentration 1.50x [1.20, 1.81], Material
Consequence
EUR 90,042 of un-reserved adverse exposure per 100 MW mean load over the audited period at the 90% level
Recommended action
Re-state the band at its measured coverage, or replace the parametric step. The failure is the Gaussian assumption itself: a symmetric interval at a fixed multiple of sigma (1.645 at 90%) cannot track an error distribution whose shape moves, and widening it uniformly buys coverage in the calm hours it already had.
Limit of this finding
Measured on this series over this period. The interval is block-bootstrapped by day and so carries within-day dependence; it does not carry uncertainty in the price series used to value the misses.

F-02 Material

Rolling split-conformal band at nominal 90% covered 83.5%

Why this severity
nominal outside the coverage interval, and misses run 1.29x more frequent in the most expensive intervals (interval lower bound 1.11 > 1)
Measurement
Headline 90%: coverage 0.835, day-block bootstrap 95% interval [0.810, 0.860] over 32,252 scored intervals. Every audited level: 80%: covered 72.7% [69.7%, 75.7%], concentration 1.25x [1.13, 1.39], Material; 90%: covered 83.5% [81.0%, 86.0%], concentration 1.29x [1.11, 1.50], Material; 95%: covered 89.3% [87.3%, 91.3%], concentration 1.43x [1.19, 1.71], Material
Consequence
EUR 94,400 of un-reserved adverse exposure per 100 MW mean load over the audited period at the 90% level
Recommended action
Do not read the conformal guarantee as insurance here. It is conditional on exchangeability, and a trailing window under distribution shift violates that condition, which is why this construction covers no better than the parametric one it was meant to replace. Either recalibrate adaptively or widen on a measured schedule.
Limit of this finding
As above. Note also that this construction is the static split-conformal band, not the adaptive one: the finding says nothing about conformal methods that update, which are audited separately as F-03.

F-03 Observation

Adaptive conformal band at nominal 90% covered 89.6%

Why this severity
nominal coverage lies inside the day-block bootstrap interval; this evidence does not show the band failing at this level
Measurement
Headline 90%: coverage 0.896, day-block bootstrap 95% interval [0.877, 0.914] over 32,252 scored intervals. Every audited level: 80%: covered 79.4% [76.7%, 82.0%], concentration 1.31x [1.16, 1.48], Observation; 90%: covered 89.6% [87.7%, 91.4%], concentration 1.42x [1.19, 1.67], Observation; 95%: covered 94.3% [92.9%, 95.7%], concentration 1.53x [1.22, 1.91], Observation
Consequence
EUR 44,495 of un-reserved adverse exposure per 100 MW mean load over the audited period at the 90% level
Recommended action
Nothing to remediate on coverage. Three things to watch instead. Its misses are the most price-concentrated of any construction audited, which the severity rule does not grade because concentration only enters once coverage has failed: the band holds its promise and still misses disproportionately when a miss is expensive, and the exposure column is where that shows. Beyond that: the band pays for its coverage in width, so read this row against the width line before reserving against it; and it is reactive, so a regime break costs a stretch of under-coverage before it recovers. If either matters, the question is how much width the desk can carry, not whether to recalibrate.
Limit of this finding
An Observation is not a pass in general. It says the stated level sits inside the bootstrap interval on this series and period, at a sample size this audit reports rather than hides. It does not establish that the band holds through a regime change, which this period contains only in part.

Evidence

Coverage against the level each band states

Intervals are 95% day-block bootstrap, resampling whole days. A band is only recorded as failing when the level it states falls outside that interval.

ConstructionStatesDelivered95% intervalVerdict
Parametric Gaussian80.0%73.3%[70.3%, 76.2%]fails
Parametric Gaussian90.0%84.8%[82.3%, 87.1%]fails
Parametric Gaussian95.0%91.2%[89.3%, 93.0%]fails
Rolling split-conformal80.0%72.7%[69.7%, 75.7%]fails
Rolling split-conformal90.0%83.5%[81.0%, 86.0%]fails
Rolling split-conformal95.0%89.3%[87.3%, 91.3%]fails
Adaptive conformal80.0%79.4%[76.7%, 82.0%]holds
Adaptive conformal90.0%89.6%[87.7%, 91.4%]holds
Adaptive conformal95.0%94.3%[92.9%, 95.7%]holds

Coverage by delivery slot

Every construction is scored per quarter-hour slot, and this is where that shows. A band that sits below its stated level at every slot is failing on the shape of the error distribution; one that fails at particular hours is failing on the schedule, and a scheduling desk needs to know which. At 90%, both static bands sit below their stated level at every one of the 96 slots: a shape failure, with the deepest shortfall at 00:00, overnight.

336 scored days per slot
80%85%90%stated 90%Gaussianconformaladaptive00:0006:0012:0018:0023:45DELIVERY SLOT · COVERAGE AGAINST THE STATED 90%
Parametric Gaussian · worst slot
81.5% (00:00)
Rolling split-conformal · worst slot
80.4% (00:00)
Adaptive conformal · worst slot
88.7% (21:30)
Out-of-sample coverage at each of the 96 delivery slots against the stated level. The readout names each construction's worst slot.

Coverage by month

The table above averages over the scored months, and a desk lives in one of them at a time. The same score, cut month by month, is what coverage by regime and by season means; the dashed line is the level each band states.

hollow: 25/08 (2 scored days), left out of the worst-month readout
50%60%70%80%90%100%stated 90%Gaussian2025-08 · Parametric Gaussian: 74.5% (2 scored days)2025-09 · Parametric Gaussian: 85.0%2025-10 · Parametric Gaussian: 76.3%2025-11 · Parametric Gaussian: 80.3%2025-12 · Parametric Gaussian: 81.9%2026-01 · Parametric Gaussian: 78.0%2026-02 · Parametric Gaussian: 91.9%2026-03 · Parametric Gaussian: 91.5%2026-04 · Parametric Gaussian: 88.4%2026-05 · Parametric Gaussian: 91.9%2026-06 · Parametric Gaussian: 77.5%2026-07 · Parametric Gaussian: 91.0%conformal2025-08 · Rolling split-conformal: 64.1% (2 scored days)2025-09 · Rolling split-conformal: 83.7%2025-10 · Rolling split-conformal: 77.4%2025-11 · Rolling split-conformal: 79.2%2025-12 · Rolling split-conformal: 79.8%2026-01 · Rolling split-conformal: 77.6%2026-02 · Rolling split-conformal: 91.4%2026-03 · Rolling split-conformal: 90.6%2026-04 · Rolling split-conformal: 82.3%2026-05 · Rolling split-conformal: 88.7%2026-06 · Rolling split-conformal: 77.5%2026-07 · Rolling split-conformal: 92.1%adaptive2025-08 · Adaptive conformal: 64.1% (2 scored days)2025-09 · Adaptive conformal: 85.5%2025-10 · Adaptive conformal: 84.3%2025-11 · Adaptive conformal: 89.1%2025-12 · Adaptive conformal: 89.4%2026-01 · Adaptive conformal: 90.4%2026-02 · Adaptive conformal: 95.4%2026-03 · Adaptive conformal: 94.0%2026-04 · Adaptive conformal: 86.9%2026-05 · Adaptive conformal: 92.9%2026-06 · Adaptive conformal: 82.8%2026-07 · Adaptive conformal: 96.4%25/0825/1025/1226/0226/0426/06MONTH · OUT-OF-SAMPLE COVERAGE AGAINST THE STATED 90%
Parametric Gaussian · worst full month
76.3% (25/10)
Rolling split-conformal · worst full month
77.4% (25/10)
Adaptive conformal · worst full month
82.8% (26/06)
Each point is one month's out-of-sample coverage at the selected level. The readout names each construction's worst month; a stated level is only as good as that month. Hollow points mark calendar months with fewer than fifteen scored days, left out of that readout; in the first such month the adaptive band has not yet moved from its starting point and coincides with the rolling conformal.

Where the misses fall

An interval is expensive when its adverse imbalance spread lands in the top 20% of all scored intervals, which is EUR 39.97/MWh here. The threshold was fixed before this audit scored anything, though not in ignorance: the underlying study had already reported that misses cluster in costly intervals on this series in aggregate. What was not known in advance is any of the numbers below. The ratio below is the miss rate inside those intervals against the miss rate everywhere else.

ConstructionStatesMiss rate, expensiveMiss rate, restRatio95% interval
Parametric Gaussian80.0%31.5%25.5%1.24x[1.10, 1.36]
Parametric Gaussian90.0%19.2%14.2%1.35x[1.16, 1.55]
Parametric Gaussian95.0%12.0%8.0%1.50x[1.20, 1.81]
Rolling split-conformal80.0%32.5%26.0%1.25x[1.13, 1.39]
Rolling split-conformal90.0%20.1%15.6%1.29x[1.11, 1.50]
Rolling split-conformal95.0%14.1%9.8%1.43x[1.19, 1.71]
Adaptive conformal80.0%25.3%19.4%1.31x[1.16, 1.48]
Adaptive conformal90.0%13.6%9.6%1.42x[1.19, 1.67]
Adaptive conformal95.0%7.9%5.1%1.53x[1.22, 1.91]

What the bands cost

For every quarter-hour the outcome escaped the stated band, the excess beyond the band edge is exposure the band said not to carry. It is priced at that interval's adverse imbalance spread and scaled to a 100 MW mean-load portfolio.

Construction80%90%95%
Parametric GaussianEUR 178,824EUR 90,042EUR 45,794
Rolling split-conformalEUR 183,883EUR 94,400EUR 55,411
Adaptive conformalEUR 124,307EUR 44,495EUR 21,339

A band that never misses does not exist, so the exposure figures need something to be read against. The reference below is an oracle: each slot's quantiles taken over the whole period, which no forecaster could have known. It is not a competitor and it is not in the register.

Band at nominal 90%CoverageMean widthMean missExposure
Oracle, with hindsight89.9%8,301 MW1,099 MWEUR 64,266
Adaptive conformal89.6%8,820 MW875 MWEUR 44,495
per 100 MW mean load, priced at the interval's adverse spread
EUR 20kEUR 40kEUR 60kEUR 80kEUR 100kGaussian2025-08 · Parametric Gaussian: EUR 142 this month, EUR 142 to date2025-09 · Parametric Gaussian: EUR 5,045 this month, EUR 5,187 to date2025-10 · Parametric Gaussian: EUR 6,733 this month, EUR 11,920 to date2025-11 · Parametric Gaussian: EUR 8,233 this month, EUR 20,153 to date2025-12 · Parametric Gaussian: EUR 8,576 this month, EUR 28,729 to date2026-01 · Parametric Gaussian: EUR 23,904 this month, EUR 52,633 to date2026-02 · Parametric Gaussian: EUR 1,963 this month, EUR 54,596 to date2026-03 · Parametric Gaussian: EUR 5,206 this month, EUR 59,802 to date2026-04 · Parametric Gaussian: EUR 6,986 this month, EUR 66,788 to date2026-05 · Parametric Gaussian: EUR 1,553 this month, EUR 68,341 to date2026-06 · Parametric Gaussian: EUR 19,605 this month, EUR 87,946 to date2026-07 · Parametric Gaussian: EUR 2,094 this month, EUR 90,040 to dateconformal2025-08 · Rolling split-conformal: EUR 236 this month, EUR 236 to date2025-09 · Rolling split-conformal: EUR 5,223 this month, EUR 5,459 to date2025-10 · Rolling split-conformal: EUR 6,596 this month, EUR 12,055 to date2025-11 · Rolling split-conformal: EUR 8,692 this month, EUR 20,747 to date2025-12 · Rolling split-conformal: EUR 8,056 this month, EUR 28,803 to date2026-01 · Rolling split-conformal: EUR 26,056 this month, EUR 54,859 to date2026-02 · Rolling split-conformal: EUR 1,885 this month, EUR 56,744 to date2026-03 · Rolling split-conformal: EUR 5,002 this month, EUR 61,746 to date2026-04 · Rolling split-conformal: EUR 11,811 this month, EUR 73,557 to date2026-05 · Rolling split-conformal: EUR 2,273 this month, EUR 75,830 to date2026-06 · Rolling split-conformal: EUR 16,783 this month, EUR 92,613 to date2026-07 · Rolling split-conformal: EUR 1,788 this month, EUR 94,401 to dateadaptive2025-08 · Adaptive conformal: EUR 234 this month, EUR 234 to date2025-09 · Adaptive conformal: EUR 4,530 this month, EUR 4,764 to date2025-10 · Adaptive conformal: EUR 3,617 this month, EUR 8,381 to date2025-11 · Adaptive conformal: EUR 5,652 this month, EUR 14,033 to date2025-12 · Adaptive conformal: EUR 3,765 this month, EUR 17,798 to date2026-01 · Adaptive conformal: EUR 7,247 this month, EUR 25,045 to date2026-02 · Adaptive conformal: EUR 874 this month, EUR 25,919 to date2026-03 · Adaptive conformal: EUR 1,679 this month, EUR 27,598 to date2026-04 · Adaptive conformal: EUR 4,133 this month, EUR 31,731 to date2026-05 · Adaptive conformal: EUR 1,389 this month, EUR 33,120 to date2026-06 · Adaptive conformal: EUR 10,361 this month, EUR 43,481 to date2026-07 · Adaptive conformal: EUR 1,013 this month, EUR 44,494 to dateoracle2025-08 · Oracle, with hindsight: EUR 49 this month, EUR 49 to date2025-09 · Oracle, with hindsight: EUR 297 this month, EUR 346 to date2025-10 · Oracle, with hindsight: EUR 160 this month, EUR 506 to date2025-11 · Oracle, with hindsight: EUR 3,665 this month, EUR 4,171 to date2025-12 · Oracle, with hindsight: EUR 4,891 this month, EUR 9,062 to date2026-01 · Oracle, with hindsight: EUR 30,899 this month, EUR 39,961 to date2026-02 · Oracle, with hindsight: EUR 1,249 this month, EUR 41,210 to date2026-03 · Oracle, with hindsight: EUR 5,202 this month, EUR 46,412 to date2026-04 · Oracle, with hindsight: EUR 8,630 this month, EUR 55,042 to date2026-05 · Oracle, with hindsight: EUR 2,560 this month, EUR 57,602 to date2026-06 · Oracle, with hindsight: EUR 5,613 this month, EUR 63,215 to date2026-07 · Oracle, with hindsight: EUR 1,051 this month, EUR 64,266 to date25/0825/1025/1226/0226/0426/06MONTH · CUMULATIVE UN-RESERVED ADVERSE EXPOSURE AT THE STATED 90%
Parametric Gaussian · period total
EUR 90,042 largest month 26/01, EUR 23,904
Rolling split-conformal · period total
EUR 94,400 largest month 26/01, EUR 26,056
Adaptive conformal · period total
EUR 44,495 largest month 26/06, EUR 10,361
Exposure as it accrued, month by month. The end of each line is the figure in the table above; the shape says when it was earned. The oracle is the floor a perfectly calibrated band would still have paid.

A band with hindsight coverage of 89.9% costs more than the adaptive band at 89.6%. That is not a broken baseline. Coverage counts misses; exposure pays for their size, and the two come apart for any band that changes width over time rather than only across slots. The oracle's width is fixed per slot for the whole period, so when a volatile stretch arrives it misses by a lot. The adaptive band widens after it misses, so it is wide when errors are large: mean miss 875 MW against 1,099 MW, on 6% more average width. No coverage statistic shows this.

dot = a day on which 24+ of 96 slots missed
5.0 GW10 GW15 GW20 GWGaussianadaptiveoracle2025-08-31 · Parametric Gaussian: 49 of 96 slots missed, mean width 5.3 GW2025-09-07 · Parametric Gaussian: 53 of 96 slots missed, mean width 5.3 GW2025-09-14 · Parametric Gaussian: 35 of 96 slots missed, mean width 5.3 GW2025-09-16 · Parametric Gaussian: 33 of 96 slots missed, mean width 5.4 GW2025-09-24 · Parametric Gaussian: 34 of 96 slots missed, mean width 5.4 GW2025-09-25 · Parametric Gaussian: 80 of 96 slots missed, mean width 5.4 GW2025-09-26 · Parametric Gaussian: 64 of 96 slots missed, mean width 5.5 GW2025-10-04 · Parametric Gaussian: 46 of 96 slots missed, mean width 5.4 GW2025-10-06 · Parametric Gaussian: 28 of 96 slots missed, mean width 5.5 GW2025-10-09 · Parametric Gaussian: 29 of 96 slots missed, mean width 5.5 GW2025-10-10 · Parametric Gaussian: 44 of 96 slots missed, mean width 5.5 GW2025-10-16 · Parametric Gaussian: 30 of 96 slots missed, mean width 5.6 GW2025-10-20 · Parametric Gaussian: 64 of 96 slots missed, mean width 5.6 GW2025-10-21 · Parametric Gaussian: 86 of 96 slots missed, mean width 5.7 GW2025-10-23 · Parametric Gaussian: 43 of 96 slots missed, mean width 5.9 GW2025-10-25 · Parametric Gaussian: 95 of 96 slots missed, mean width 6.1 GW2025-10-26 · Parametric Gaussian: 31 of 96 slots missed, mean width 6.2 GW2025-10-28 · Parametric Gaussian: 37 of 96 slots missed, mean width 6.3 GW2025-11-01 · Parametric Gaussian: 34 of 96 slots missed, mean width 6.4 GW2025-11-04 · Parametric Gaussian: 35 of 96 slots missed, mean width 6.5 GW2025-11-16 · Parametric Gaussian: 24 of 96 slots missed, mean width 6.3 GW2025-11-17 · Parametric Gaussian: 36 of 96 slots missed, mean width 6.3 GW2025-11-18 · Parametric Gaussian: 50 of 96 slots missed, mean width 6.3 GW2025-11-19 · Parametric Gaussian: 91 of 96 slots missed, mean width 6.5 GW2025-11-20 · Parametric Gaussian: 27 of 96 slots missed, mean width 6.7 GW2025-11-22 · Parametric Gaussian: 28 of 96 slots missed, mean width 6.8 GW2025-11-23 · Parametric Gaussian: 26 of 96 slots missed, mean width 6.8 GW2025-11-27 · Parametric Gaussian: 65 of 96 slots missed, mean width 6.9 GW2025-12-07 · Parametric Gaussian: 66 of 96 slots missed, mean width 6.8 GW2025-12-08 · Parametric Gaussian: 53 of 96 slots missed, mean width 6.8 GW2025-12-21 · Parametric Gaussian: 71 of 96 slots missed, mean width 6.6 GW2025-12-22 · Parametric Gaussian: 61 of 96 slots missed, mean width 6.8 GW2025-12-23 · Parametric Gaussian: 41 of 96 slots missed, mean width 6.9 GW2025-12-27 · Parametric Gaussian: 30 of 96 slots missed, mean width 7.0 GW2025-12-29 · Parametric Gaussian: 67 of 96 slots missed, mean width 7.0 GW2025-12-30 · Parametric Gaussian: 62 of 96 slots missed, mean width 7.2 GW2026-01-02 · Parametric Gaussian: 42 of 96 slots missed, mean width 7.3 GW2026-01-03 · Parametric Gaussian: 52 of 96 slots missed, mean width 7.4 GW2026-01-07 · Parametric Gaussian: 96 of 96 slots missed, mean width 7.6 GW2026-01-08 · Parametric Gaussian: 96 of 96 slots missed, mean width 7.9 GW2026-01-09 · Parametric Gaussian: 94 of 96 slots missed, mean width 8.2 GW2026-01-10 · Parametric Gaussian: 59 of 96 slots missed, mean width 8.4 GW2026-01-11 · Parametric Gaussian: 53 of 96 slots missed, mean width 8.5 GW2026-01-12 · Parametric Gaussian: 34 of 96 slots missed, mean width 8.6 GW2026-01-22 · Parametric Gaussian: 48 of 96 slots missed, mean width 8.7 GW2026-02-22 · Parametric Gaussian: 44 of 96 slots missed, mean width 8.7 GW2026-02-25 · Parametric Gaussian: 45 of 96 slots missed, mean width 8.8 GW2026-02-28 · Parametric Gaussian: 42 of 96 slots missed, mean width 9.0 GW2026-03-01 · Parametric Gaussian: 29 of 96 slots missed, mean width 9.1 GW2026-03-02 · Parametric Gaussian: 30 of 96 slots missed, mean width 9.2 GW2026-03-03 · Parametric Gaussian: 31 of 96 slots missed, mean width 9.3 GW2026-03-19 · Parametric Gaussian: 27 of 96 slots missed, mean width 9.6 GW2026-03-25 · Parametric Gaussian: 33 of 96 slots missed, mean width 9.5 GW2026-03-26 · Parametric Gaussian: 36 of 96 slots missed, mean width 9.6 GW2026-04-08 · Parametric Gaussian: 35 of 96 slots missed, mean width 9.1 GW2026-04-09 · Parametric Gaussian: 34 of 96 slots missed, mean width 8.9 GW2026-04-19 · Parametric Gaussian: 38 of 96 slots missed, mean width 8.5 GW2026-04-21 · Parametric Gaussian: 27 of 96 slots missed, mean width 8.6 GW2026-04-26 · Parametric Gaussian: 56 of 96 slots missed, mean width 8.3 GW2026-05-01 · Parametric Gaussian: 58 of 96 slots missed, mean width 8.2 GW2026-05-15 · Parametric Gaussian: 41 of 96 slots missed, mean width 8.0 GW2026-05-16 · Parametric Gaussian: 26 of 96 slots missed, mean width 8.0 GW2026-06-14 · Parametric Gaussian: 42 of 96 slots missed, mean width 7.2 GW2026-06-18 · Parametric Gaussian: 57 of 96 slots missed, mean width 7.3 GW2026-06-19 · Parametric Gaussian: 87 of 96 slots missed, mean width 7.4 GW2026-06-24 · Parametric Gaussian: 48 of 96 slots missed, mean width 7.4 GW2026-06-25 · Parametric Gaussian: 96 of 96 slots missed, mean width 7.1 GW2026-06-26 · Parametric Gaussian: 92 of 96 slots missed, mean width 7.3 GW2026-06-27 · Parametric Gaussian: 83 of 96 slots missed, mean width 7.5 GW2026-06-29 · Parametric Gaussian: 31 of 96 slots missed, mean width 7.7 GW2026-07-05 · Parametric Gaussian: 26 of 96 slots missed, mean width 7.8 GW2026-07-13 · Parametric Gaussian: 27 of 96 slots missed, mean width 7.8 GW2026-07-16 · Parametric Gaussian: 48 of 96 slots missed, mean width 7.9 GW2026-07-30 · Parametric Gaussian: 33 of 96 slots missed, mean width 7.7 GW2025-08-31 · Adaptive conformal: 59 of 96 slots missed, mean width 5.2 GW2025-09-07 · Adaptive conformal: 68 of 96 slots missed, mean width 5.3 GW2025-09-14 · Adaptive conformal: 37 of 96 slots missed, mean width 5.5 GW2025-09-16 · Adaptive conformal: 36 of 96 slots missed, mean width 5.6 GW2025-09-24 · Adaptive conformal: 27 of 96 slots missed, mean width 5.6 GW2025-09-25 · Adaptive conformal: 72 of 96 slots missed, mean width 5.7 GW2025-09-26 · Adaptive conformal: 47 of 96 slots missed, mean width 6.1 GW2025-10-20 · Adaptive conformal: 59 of 96 slots missed, mean width 6.0 GW2025-10-21 · Adaptive conformal: 72 of 96 slots missed, mean width 6.3 GW2025-10-23 · Adaptive conformal: 35 of 96 slots missed, mean width 6.6 GW2025-10-25 · Adaptive conformal: 88 of 96 slots missed, mean width 6.9 GW2025-11-17 · Adaptive conformal: 24 of 96 slots missed, mean width 7.2 GW2025-11-18 · Adaptive conformal: 41 of 96 slots missed, mean width 7.3 GW2025-11-19 · Adaptive conformal: 80 of 96 slots missed, mean width 7.6 GW2025-11-27 · Adaptive conformal: 43 of 96 slots missed, mean width 8.4 GW2025-12-07 · Adaptive conformal: 53 of 96 slots missed, mean width 8.1 GW2025-12-21 · Adaptive conformal: 41 of 96 slots missed, mean width 7.8 GW2025-12-22 · Adaptive conformal: 47 of 96 slots missed, mean width 8.1 GW2025-12-29 · Adaptive conformal: 51 of 96 slots missed, mean width 8.6 GW2025-12-30 · Adaptive conformal: 24 of 96 slots missed, mean width 9.7 GW2026-01-03 · Adaptive conformal: 28 of 96 slots missed, mean width 10.0 GW2026-01-07 · Adaptive conformal: 86 of 96 slots missed, mean width 10 GW2026-01-08 · Adaptive conformal: 68 of 96 slots missed, mean width 12 GW2026-02-22 · Adaptive conformal: 26 of 96 slots missed, mean width 10 GW2026-02-25 · Adaptive conformal: 30 of 96 slots missed, mean width 10 GW2026-03-19 · Adaptive conformal: 29 of 96 slots missed, mean width 10.0 GW2026-03-25 · Adaptive conformal: 33 of 96 slots missed, mean width 9.8 GW2026-03-26 · Adaptive conformal: 28 of 96 slots missed, mean width 10 GW2026-04-04 · Adaptive conformal: 32 of 96 slots missed, mean width 9.6 GW2026-04-08 · Adaptive conformal: 43 of 96 slots missed, mean width 9.6 GW2026-04-09 · Adaptive conformal: 27 of 96 slots missed, mean width 9.9 GW2026-04-19 · Adaptive conformal: 40 of 96 slots missed, mean width 9.2 GW2026-04-21 · Adaptive conformal: 24 of 96 slots missed, mean width 9.4 GW2026-04-26 · Adaptive conformal: 54 of 96 slots missed, mean width 9.3 GW2026-05-01 · Adaptive conformal: 52 of 96 slots missed, mean width 9.5 GW2026-05-15 · Adaptive conformal: 38 of 96 slots missed, mean width 9.0 GW2026-06-14 · Adaptive conformal: 45 of 96 slots missed, mean width 7.1 GW2026-06-18 · Adaptive conformal: 50 of 96 slots missed, mean width 7.3 GW2026-06-19 · Adaptive conformal: 71 of 96 slots missed, mean width 7.7 GW2026-06-24 · Adaptive conformal: 30 of 96 slots missed, mean width 7.9 GW2026-06-25 · Adaptive conformal: 96 of 96 slots missed, mean width 7.8 GW2026-06-26 · Adaptive conformal: 77 of 96 slots missed, mean width 8.6 GW2026-06-27 · Adaptive conformal: 25 of 96 slots missed, mean width 9.6 GW25/0825/1025/1226/0226/0426/06DAY · MEAN BAND WIDTH AT THE STATED 90% (FAINT: THE DAY'S WIDEST INTERVAL)
Parametric Gaussian · widest interval
13 GW (2026-03-27)
Parametric Gaussian · days with 24+ misses
74 of 336
Adaptive conformal · widest interval
19 GW (2026-01-08)
Adaptive conformal · days with 24+ misses
43 of 336
Daily mean width, with each day's widest interval as the faint line above it and the days on which a quarter or more of the slots missed marked. The oracle is flat by construction. The adaptive band is wide when errors are large, which is the claim the paragraph above makes in words.

Read the exposure column with that in mind, and with the width line below: exposure is non-increasing in width by construction, so any band can lower it by quoting a wider one.

The mean adverse spread across all scored intervals was EUR 24.6/MWh. Across the intervals the Gaussian 90% band missed it was EUR 34.8/MWh. The band fails disproportionately in the intervals where failing is expensive.

Series integrity, checked before anything is scored

An audit of a forecast band is worthless if the two series are not a forecast and its outcome. Every report opens with the same three checks, and this pair passes all three. The thresholds are fixed before a client's data arrives, but they were not chosen in ignorance: both columns below were already known when they were set, and they were placed to separate a pair like the control from a pair like this one. They are a tripwire, not a discovery.

CheckThis pairThresholdControl
Correlation, forecast against outcome0.958≥ 0.900.621
Slope of outcome on forecast1.0201 ± 0.150.610
Mean bias against mean load-0.71%± 5%15.14%
Verdictpassesfails

The control column is a real failure, not an illustration. It is the same audit run against Dutch system load, where the published forecast sits below realised load at every one of the 96 quarter-hour slots and the pair correlates at 0.62 with a slope of 0.61. No day-ahead forecast is wrong in one direction at every slot for thirteen months; a gap of that shape is definitional, and the two series are measuring different perimeters. We have not established which, and are not going to guess in a report.

That run is kept because a check nobody has seen fail is a check nobody should trust. It is also the answer to the obvious question about this section: it would have caught the problem on a client's data in the first hour, before anything downstream was built on it.

4545505055556060slot 0: forecast 47 GW, actual 47 GWslot 1: forecast 46 GW, actual 47 GWslot 2: forecast 46 GW, actual 46 GWslot 3: forecast 45 GW, actual 46 GWslot 4: forecast 45 GW, actual 45 GWslot 5: forecast 45 GW, actual 45 GWslot 6: forecast 44 GW, actual 45 GWslot 7: forecast 44 GW, actual 44 GWslot 8: forecast 44 GW, actual 44 GWslot 9: forecast 44 GW, actual 44 GWslot 10: forecast 44 GW, actual 44 GWslot 11: forecast 44 GW, actual 44 GWslot 12: forecast 44 GW, actual 44 GWslot 13: forecast 44 GW, actual 44 GWslot 14: forecast 44 GW, actual 44 GWslot 15: forecast 44 GW, actual 44 GWslot 16: forecast 44 GW, actual 44 GWslot 17: forecast 44 GW, actual 44 GWslot 18: forecast 45 GW, actual 45 GWslot 19: forecast 45 GW, actual 45 GWslot 20: forecast 46 GW, actual 46 GWslot 21: forecast 46 GW, actual 47 GWslot 22: forecast 47 GW, actual 47 GWslot 23: forecast 48 GW, actual 48 GWslot 24: forecast 50 GW, actual 50 GWslot 25: forecast 51 GW, actual 52 GWslot 26: forecast 52 GW, actual 53 GWslot 27: forecast 53 GW, actual 54 GWslot 28: forecast 55 GW, actual 55 GWslot 29: forecast 56 GW, actual 56 GWslot 30: forecast 57 GW, actual 57 GWslot 31: forecast 58 GW, actual 57 GWslot 32: forecast 58 GW, actual 58 GWslot 33: forecast 59 GW, actual 59 GWslot 34: forecast 60 GW, actual 59 GWslot 35: forecast 60 GW, actual 60 GWslot 36: forecast 60 GW, actual 59 GWslot 37: forecast 61 GW, actual 60 GWslot 38: forecast 61 GW, actual 60 GWslot 39: forecast 61 GW, actual 60 GWslot 40: forecast 61 GW, actual 60 GWslot 41: forecast 62 GW, actual 60 GWslot 42: forecast 62 GW, actual 60 GWslot 43: forecast 62 GW, actual 60 GWslot 44: forecast 62 GW, actual 60 GWslot 45: forecast 62 GW, actual 60 GWslot 46: forecast 62 GW, actual 60 GWslot 47: forecast 62 GW, actual 60 GWslot 48: forecast 62 GW, actual 60 GWslot 49: forecast 61 GW, actual 59 GWslot 50: forecast 61 GW, actual 59 GWslot 51: forecast 61 GW, actual 59 GWslot 52: forecast 60 GW, actual 59 GWslot 53: forecast 60 GW, actual 58 GWslot 54: forecast 60 GW, actual 58 GWslot 55: forecast 59 GW, actual 57 GWslot 56: forecast 59 GW, actual 57 GWslot 57: forecast 59 GW, actual 57 GWslot 58: forecast 58 GW, actual 57 GWslot 59: forecast 58 GW, actual 56 GWslot 60: forecast 58 GW, actual 57 GWslot 61: forecast 58 GW, actual 56 GWslot 62: forecast 58 GW, actual 56 GWslot 63: forecast 57 GW, actual 56 GWslot 64: forecast 58 GW, actual 57 GWslot 65: forecast 58 GW, actual 57 GWslot 66: forecast 58 GW, actual 57 GWslot 67: forecast 58 GW, actual 57 GWslot 68: forecast 58 GW, actual 58 GWslot 69: forecast 59 GW, actual 58 GWslot 70: forecast 59 GW, actual 59 GWslot 71: forecast 59 GW, actual 59 GWslot 72: forecast 59 GW, actual 59 GWslot 73: forecast 59 GW, actual 59 GWslot 74: forecast 60 GW, actual 60 GWslot 75: forecast 60 GW, actual 60 GWslot 76: forecast 59 GW, actual 60 GWslot 77: forecast 59 GW, actual 59 GWslot 78: forecast 59 GW, actual 59 GWslot 79: forecast 58 GW, actual 59 GWslot 80: forecast 58 GW, actual 58 GWslot 81: forecast 57 GW, actual 58 GWslot 82: forecast 57 GW, actual 57 GWslot 83: forecast 56 GW, actual 56 GWslot 84: forecast 55 GW, actual 56 GWslot 85: forecast 55 GW, actual 55 GWslot 86: forecast 54 GW, actual 54 GWslot 87: forecast 53 GW, actual 54 GWslot 88: forecast 53 GW, actual 53 GWslot 89: forecast 52 GW, actual 53 GWslot 90: forecast 51 GW, actual 52 GWslot 91: forecast 50 GW, actual 51 GWslot 92: forecast 50 GW, actual 50 GWslot 93: forecast 49 GW, actual 49 GWslot 94: forecast 48 GW, actual 49 GWslot 95: forecast 48 GW, actual 48 GWthis pair (DE-LU)slope 1.02 · r 0.9610.010.011.011.012.012.013.013.014.014.015.015.0slot 0: forecast 11.6 GW, actual 12.5 GWslot 1: forecast 11.5 GW, actual 12.4 GWslot 2: forecast 11.4 GW, actual 12.3 GWslot 3: forecast 11.3 GW, actual 12.1 GWslot 4: forecast 11.2 GW, actual 12.0 GWslot 5: forecast 11.2 GW, actual 11.9 GWslot 6: forecast 11.1 GW, actual 11.8 GWslot 7: forecast 11.0 GW, actual 11.7 GWslot 8: forecast 11.0 GW, actual 11.7 GWslot 9: forecast 10.9 GW, actual 11.6 GWslot 10: forecast 10.9 GW, actual 11.6 GWslot 11: forecast 10.8 GW, actual 11.5 GWslot 12: forecast 10.8 GW, actual 11.5 GWslot 13: forecast 10.8 GW, actual 11.5 GWslot 14: forecast 10.8 GW, actual 11.4 GWslot 15: forecast 10.8 GW, actual 11.4 GWslot 16: forecast 10.8 GW, actual 11.4 GWslot 17: forecast 10.8 GW, actual 11.4 GWslot 18: forecast 10.8 GW, actual 11.4 GWslot 19: forecast 10.8 GW, actual 11.4 GWslot 20: forecast 10.8 GW, actual 11.5 GWslot 21: forecast 10.9 GW, actual 11.5 GWslot 22: forecast 10.9 GW, actual 11.6 GWslot 23: forecast 11.0 GW, actual 11.8 GWslot 24: forecast 11.1 GW, actual 12.0 GWslot 25: forecast 11.2 GW, actual 12.2 GWslot 26: forecast 11.3 GW, actual 12.4 GWslot 27: forecast 11.5 GW, actual 12.6 GWslot 28: forecast 11.6 GW, actual 13.0 GWslot 29: forecast 11.8 GW, actual 13.2 GWslot 30: forecast 11.9 GW, actual 13.5 GWslot 31: forecast 12.0 GW, actual 13.7 GWslot 32: forecast 12.1 GW, actual 13.9 GWslot 33: forecast 12.1 GW, actual 14.0 GWslot 34: forecast 12.0 GW, actual 14.1 GWslot 35: forecast 12.0 GW, actual 14.2 GWslot 36: forecast 11.9 GW, actual 14.2 GWslot 37: forecast 11.8 GW, actual 14.2 GWslot 38: forecast 11.6 GW, actual 14.2 GWslot 39: forecast 11.5 GW, actual 14.2 GWslot 40: forecast 11.3 GW, actual 14.2 GWslot 41: forecast 11.1 GW, actual 14.1 GWslot 42: forecast 11.0 GW, actual 14.1 GWslot 43: forecast 10.8 GW, actual 14.1 GWslot 44: forecast 10.7 GW, actual 14.0 GWslot 45: forecast 10.6 GW, actual 14.0 GWslot 46: forecast 10.5 GW, actual 14.0 GWslot 47: forecast 10.4 GW, actual 14.0 GWslot 48: forecast 10.3 GW, actual 14.0 GWslot 49: forecast 10.2 GW, actual 14.0 GWslot 50: forecast 10.2 GW, actual 13.9 GWslot 51: forecast 10.1 GW, actual 13.9 GWslot 52: forecast 10.1 GW, actual 13.9 GWslot 53: forecast 10.1 GW, actual 13.9 GWslot 54: forecast 10.1 GW, actual 13.9 GWslot 55: forecast 10.1 GW, actual 13.9 GWslot 56: forecast 10.1 GW, actual 13.9 GWslot 57: forecast 10.2 GW, actual 13.9 GWslot 58: forecast 10.2 GW, actual 13.8 GWslot 59: forecast 10.2 GW, actual 13.8 GWslot 60: forecast 10.3 GW, actual 13.9 GWslot 61: forecast 10.4 GW, actual 13.9 GWslot 62: forecast 10.5 GW, actual 14.0 GWslot 63: forecast 10.7 GW, actual 14.0 GWslot 64: forecast 10.8 GW, actual 14.1 GWslot 65: forecast 11.0 GW, actual 14.2 GWslot 66: forecast 11.2 GW, actual 14.3 GWslot 67: forecast 11.4 GW, actual 14.5 GWslot 68: forecast 11.6 GW, actual 14.7 GWslot 69: forecast 11.8 GW, actual 14.9 GWslot 70: forecast 12.1 GW, actual 15.1 GWslot 71: forecast 12.3 GW, actual 15.1 GWslot 72: forecast 12.4 GW, actual 15.0 GWslot 73: forecast 12.5 GW, actual 14.9 GWslot 74: forecast 12.5 GW, actual 14.9 GWslot 75: forecast 12.6 GW, actual 14.9 GWslot 76: forecast 12.7 GW, actual 14.8 GWslot 77: forecast 12.8 GW, actual 14.8 GWslot 78: forecast 12.8 GW, actual 14.8 GWslot 79: forecast 12.9 GW, actual 14.8 GWslot 80: forecast 12.9 GW, actual 14.7 GWslot 81: forecast 12.9 GW, actual 14.6 GWslot 82: forecast 12.9 GW, actual 14.6 GWslot 83: forecast 12.9 GW, actual 14.5 GWslot 84: forecast 12.8 GW, actual 14.4 GWslot 85: forecast 12.8 GW, actual 14.3 GWslot 86: forecast 12.7 GW, actual 14.2 GWslot 87: forecast 12.7 GW, actual 14.1 GWslot 88: forecast 12.6 GW, actual 13.9 GWslot 89: forecast 12.5 GW, actual 13.8 GWslot 90: forecast 12.4 GW, actual 13.6 GWslot 91: forecast 12.2 GW, actual 13.4 GWslot 92: forecast 12.1 GW, actual 13.2 GWslot 93: forecast 12.0 GW, actual 13.0 GWslot 94: forecast 11.9 GW, actual 12.9 GWslot 95: forecast 11.7 GW, actual 12.7 GWcontrol (NL)slope 0.61 · r 0.62MEAN FORECAST, GW (ACROSS) · MEAN ACTUAL, GW (UP) · ONE POINT PER SLOT · DASHED = DIAGONAL
this pair (DE-LU) · slots with actual above forecast
54 / 96
this pair (DE-LU) · slope, correlation
1.02 · 0.958
control (NL) · slots with actual above forecast
96 / 96
control (NL) · slope, correlation
0.61 · 0.621
Mean actual against mean forecast at each of the 96 delivery slots, this pair beside the control, each on its own scale with the diagonal and its own fit. A forecast of its outcome sits on the diagonal at a slope near one. The control sits above it at every slot, at a slope of 0.61.

What a band costs in width

A band wider than 50% of mean load is not something an operator can reserve against, whatever its coverage. That fraction was fixed before scoring, like the expensive threshold, and the last column counts how often each construction crossed it. The adaptive band buys its coverage partly by going wide, and this is where that shows.

ConstructionStatesMean width95th pctWidestUnusable
Parametric Gaussian80.0%5,880 MW8,658 MW10,074 MW0.0%
Parametric Gaussian90.0%7,547 MW11,112 MW12,929 MW0.0%
Parametric Gaussian95.0%8,992 MW13,241 MW15,406 MW0.0%
Rolling split-conformal80.0%5,803 MW8,548 MW10,610 MW0.0%
Rolling split-conformal90.0%7,382 MW11,010 MW13,328 MW0.0%
Rolling split-conformal95.0%8,627 MW12,623 MW15,286 MW0.0%
Adaptive conformal80.0%6,804 MW10,971 MW18,443 MW0.0%
Adaptive conformal90.0%8,820 MW14,182 MW19,297 MW0.0%
Adaptive conformal95.0%10,530 MW16,323 MW19,567 MW0.0%

Assumptions register

Every number above rests on these. The direction column says which way the headline moves if the assumption is wrong, so a reader can discount it without having to guess.

AssumptionIf it is wrong
Portfolio errors move proportionally to system errors, scaled to 100 MW mean loadEither direction, and this is the single largest lever on the exposure figures. A portfolio less correlated with the system carries less exposure than stated; a concentrated one carries more.
Favourable spreads clipped to zero, risk side onlyInflates the exposure figures. A desk that earns on favourable imbalance would net some of this back.
The desk reserves flexibility equal to the stated bandInflates if the desk already reserves more than it states.
Trailing 90-day window, 60-day minimum, no lookaheadA longer window smooths regime breaks and would flatter the static constructions; a shorter one is noisier. Fixed before scoring.
Adaptive step size gamma = 0.02Fixed before evaluation, not tuned to this series. A larger step reacts faster and quotes wider.
Imbalance and day-ahead prices as published, unrevisedRevisions would move the exposure figures, not the coverage findings.
The forecast and outcome series describe the same perimeterChecked rather than assumed, and it holds here. This is the largest assumption a report like this carries silently, which is why it is a standing section above rather than a line in this table. The control column there shows what its failure looks like.
"Expensive" is defined over the audited period, after the factNeither direction, but it narrows the claim: the concentration result measures co-occurrence between misses and high spreads, not predictability. A desk cannot reserve against intervals it does not yet know are expensive, so this is evidence about where the risk sat, not a trading rule.

Method note

How severity is assigned

Severity is derived by rule, not asserted. The rule is fixed in the script and applied identically to every construction and level.

Material
The stated level falls outside the day-block bootstrap interval, and misses concentrate in expensive intervals by at least 1.25x, and that concentration interval excludes 1.
Significant
The stated level falls outside the interval, but the concentration test fails either limb: not distinguishable from none, or real but below the materiality floor.
Observation
The stated level falls inside the interval. The band holds at this level on this evidence, and sample size is allowed to win.

A construction takes the most severe rating it reaches at any audited level. The 1.25x floor is a commercial judgement rather than a statistical one: it stops a concentration of 1.02 with a tight interval being called Material. It is stated here so it can be argued with.

Where the floor bit

Parametric Gaussian at the 80.0% level concentrates 1.235x against a floor of 1.25x, and is recorded Significant rather than Material on that margin. Rolling split-conformal at the 80.0% level sits on the other side of the same line at 1.253x, and is recorded Material by that margin. A threshold chosen after seeing the results would not have been left where it decides a finding.

Why the intervals are bootstrapped and not binomial

Quarter-hour forecast errors are autocorrelated within a day and across neighbouring slots. Treating 32,252 intervals as independent trials would give a binomial interval far tighter than the evidence supports, and would promote findings that sample size cannot carry. Every interval here resamples whole days with replacement, 2,000 times, seed 20260901. That is why all three adaptive findings score Observation rather than a small win.

Lineage

DataENTSO-E Transparency Platform, zone DE: load forecast, load actual, day-ahead price, imbalance price
Scriptsrc/audit_specimen.py --zone DE
Codesrc/audit_specimen.py, sha256 4c1a6a71b4ec00869a7a139293ae541471078f9e573a6c8facb24b2b060bafd0
Artifact digestsha256 739e425eed3678fb2ecb1c225709f0d6bfc03552b0a735f623b0be0be39e0f56
Digest rulesha256 over every file in artifacts/specimen except meta.json, in filename order, feeding each file's name as UTF-8 followed by its bytes. meta.json is excluded because it carries the digest and cannot hash itself.
Outputsartifacts/specimen/: coverage.json, cost.json, findings.json, findings.csv, monthly.json, bias_slot.json, coverage_slot.json, width_daily.json, cost_monthly.json, slot_means.json, meta.json
Register as datafindings.csv carries all nine construction-level rows, including the levels this document summarises

A client engagement replaces the public series with your own and changes nothing else; terms and reference prices are on the services page. This report is that script against public German data: system load from the ENTSO-E Transparency Platform, priced at reBAP as published by the four TSOs.