01 · Energy-storage chronology — what survives a harder test

01 · Energy-storage chronology — what survives a harder test

Priority 1 · status: published result reproduced, then substantially re-scoped.

The published test reports that reordering whole days inside each month raises the ideal cyclic storage capacity of a 70/30 wind/solar year by a median 10.7 % (updated to 10.9 %) across ten years of RTE data. This dossier reproduces that number to three significant figures, then asks the question the site itself lists as the next milestone: is the number a property of chronology, or of the null used to measure it?

Short answer: the arithmetic is right and the interpretation is not. The within-month day shuffle holds the multiset of days fixed but destroys multi-day persistence — real weather comes in runs, a shuffled year does not. When the null is made to preserve 3-day or 7-day runs, the premium collapses from 10.6 % to 5.1 % and 1.8 %. In a least-cost system with a firm fleet and a reliability target, the ordering effect is 1.3 % once persistence is preserved. The correct claim is narrower and more useful: storage sizing is sensitive to the run structure of the residual load, and the published number measures that sensitivity, not “chronology” as such.


1. Reproduction

this dossier published test
median ratio (real year / within-month day-null) 1.1083 1.1100
years above their null 10 / 10 10 / 10
per-year ratio range 1.033 – 1.271 1.027 – 1.271
median ideal capacity 31.6 TWh 31.6 TWh
source rows 175,344 175,344

Method: RTE éCO2mix national definitive half-hourly series, 2015–2024, wind and solar scaled so that wind carries 70 % and solar 30 % of annual demand; capacity = range of the cumulative net-load path (a lossless cyclic store, no power limit, no efficiency). 999 permutations of whole days within each calendar month. Code: code/prepare_data.py, code/run_models.py (model_A), figure figures/capacity_by_year.png.

One data note worth recording: the “UTC” definitive file is not on a clean UTC grid. On the ten spring-forward dates the half-hour labels 01:00 and 01:30 UTC appear twice; on the ten autumn dates 00:00 and 00:30 UTC are absent, which flags 30 calendar days per decade. The row count still comes to exactly 175,344 because the two errors cancel — a row-count check cannot catch this. Audit and recomputation are in code/dst_audit.py / results/dst_audit.json: dropping the 30 affected days moves the median premium from 1.107 to 1.115, i.e. the defect is not material for a day-level result, but it remains material for any sub-daily dispatch or duration calculation, which must rebuild the timeline against the IANA database first.

2. The null is doing the work

The null shuffles days, so every 2–10 day weather episode inside a month is cut into independent days. Measured directly (figures/runs.png): the longest run of worst-decile deficit half-hours is 67 h in the real year (median over years) and 38 h in the day-shuffle null. The null is not exchangeable with the data it is meant to represent; it is a less persistent system.

Replacing the null with a block shuffle — permute runs of L consecutive days inside each month, so L = 1 is the published null and L → month length approaches the real year — gives:

block length L 1 2 3 5 7 14
median premium +10.56 % +7.59 % +5.13 % +3.24 % +1.81 % +1.48 %
years above null 10/10 10/10 9/10 9/10 8/10 5/10

(figures/premium_vs_block.png.) The decline is monotone and steep: three-quarters of the effect is gone once three-day runs are preserved. It is not a subtle statistical quibble — it is the mechanism. Capacity is the range of a cumulative sum, and the range is driven by how long the system stays in deficit, not by which day sits before which.

Two years still show a 7-day premium well above the rest (2023: +14.6 %, 2017: +7.8 %). Whatever distinguishes those years is the most interesting residual question here, and it is not answered in this dossier.

3. What happens in a system that actually buys storage

The ideal store has no power rating, no efficiency, no cost and no reliability target. Adding them:

Least-cost sizing. A stylised firm fleet (nuclear at 40 % of annual demand, hydro at 10 %, gas turbines at 15 % of peak) leaves a residual that a battery and the gas fleet serve. Storage is sized by minimising 100 k€/MW · P + 250 k€/MWh · E + 20 k€/MWh · unserved, 90 % round-trip efficiency, perfect foresight, curtailment allowed, 11 null draws per year. At that penalty the objective is dominated by unserved energy (≈ 60 G€ of a 70 G€ total), so this ratio should be read as “excess unserved energy”, not as a capital-cost premium — the storage capex is under 1 % of the objective in every year.

null cost of the real year relative to the null median
1-day shuffle (published null) +16.3 %
7-day block shuffle +1.3 %

Adequacy target. Same fleet, battery power fixed at 30 % of peak, battery energy sized so that unserved energy is ≤ 0.1 % of demand (a tight-standard proxy for LOLE):

null battery energy needed, real year relative to null median
1-day shuffle × 2.27
7-day block shuffle × 1.27

(figures/cost_and_adequacy.png.) The second table is the striking one, and it must be read with care: near a tight reliability target the required energy is a knife-edge function of the worst run in the year, so a factor of two is a statement about threshold sensitivity, not about a stable “chronology cost”. The first table is the defensible number: once the null preserves a week of weather, the ordering of days is worth about 1 % of the modelled system objective — i.e. of unserved energy — not 16 %.

The sign is also worth noting. With a firm fleet the battery’s value comes from short deficits; the real, run-heavy year needs less battery energy than a shuffled one (ratio of energies 0.47 at the 1-day null) while still costing more, because the runs exceed what any affordable battery can cover and the unserved energy is what costs money. Chronology does not simply “add storage” — it changes what storage is for.

4. Revised claim, in the form the site should publish

At fixed peak, mean and variance, the within-month order of days changes the ideal cyclic storage capacity of a 70/30 wind/solar year by a median 10.6 %. Most of that number is the multi-day persistence that the day-shuffle null removes: preserving three-day runs halves it (5.1 %) and preserving seven-day runs reduces it to 1.8 %. In a least-cost system with firm capacity, the ordering effect is 1.3 % of cost under a persistence-preserving null. Sizing is therefore sensitive to run structure, and a day-shuffle null is not an adequate counterfactual for a weather-driven system.

This is compatible with the original proposal (which already included duration) and it does not rescue a universal “order matters” theorem. It does replace an unstable headline number with a mechanism that can be tested.

5. What to do next (in order)

  1. Publish the null-sensitivity curve, not the single number. It is the honest object and it is already computed here.
  2. Rebuild the sub-daily timeline (IANA tz, deduplicate the spring rows, interpolate the two autumn half-hours per year). Only then can duration and ramping claims be made at half-hour resolution.
  3. Replace the stylised fleet with a real one. The residual used here is constructed from historical nuclear and hydro shapes; a defensible adequacy statement needs a unit-commitment model with actual availability, hydro inflow and interconnector limits.
  4. Test the 2017/2023 residual. If the 7-day premium is real in some years, identify the weather pattern that produces it. That is the publishable scientific content.

6. Limits

All numbers above are produced by code/run_models.py and code/run_part2.py and stored in results/summary.json and results/summary_part2.json.

Figures

Ideal cyclic capacity by year: real, 1-day null median, 7-day null median. The premium survives at 7 days only in some years.

Ideal cyclic capacity by year: real, 1-day null median, 7-day null median. The premium survives at 7 days only in some years.

Least-cost system objective (dominated by unserved energy) and battery energy for a 0.1 % EUE target, under both nulls.

Least-cost system objective (dominated by unserved energy) and battery energy for a 0.1 % EUE target, under both nulls.

Cumulative net load for 2017. Ideal capacity is the range of this path; the three orderings differ in where the path turns, not in its endpoints.

Cumulative net load for 2017. Ideal capacity is the range of this path; the three orderings differ in where the path turns, not in its endpoints.

Capacity premium of the real year over a block-shuffled null, against block length. L = 1 is the published null. Grey dots are individual years; the line is the median.

Capacity premium of the real year over a block-shuffled null, against block length. L = 1 is the published null. Grey dots are individual years; the line is the median.

The longest run of worst-decile deficit half-hours, real year vs 1-day and 7-day nulls. This is what the day shuffle removes.

The longest run of worst-decile deficit half-hours, real year vs 1-day and 7-day nulls. This is what the day shuffle removes.