A Cascade Study · Weather → Grid → Price
A ~360-node graph of Europe's energy system and a learned propagation operator that advances stress along its edges — and a rigorous account of what it can, and cannot, forecast.
A cold, near-windless week over Germany is not one event. Gas burn climbs to cover the wind deficit; interconnector flows tighten across the continent; days later the strain surfaces as a price spike in Italy and a curtailment notice at an aluminium smelter in Alsace. The shock propagates — through physical infrastructure, market coupling, and fuel logistics — and it does so with delays measured in hours to weeks.
Cascade models that propagation explicitly. Weather regions, generation fleets, interconnectors, prices, gas infrastructure, industry and companies become nodes; the physical and economic couplings between them become edges, each carrying a language description embedded into a vector. A learned operator reads each node's recent history and advances stress along the graph over five horizons, from 6 hours to 14 days.
Give the operator a moment in history and ask which parts of the network will be stressed over the next one to fourteen days. On held-out years it ranks stressed-versus-quiet nodes with an AUC of 0.74 — comfortably above persistence, the honest baseline that assumes today's stress simply continues, and above a per-node GRU that ignores the graph entirely.
Whole-system stress ranking · AUC · held-out test years (2022, 2024)
Ranking overall stress is useful, but it is not the question a reinsurer prices. The consequential question is onset: among the nodes that look healthy today, which will be disrupted by the end of the week? This is the newly-disrupted slice — nodes quiet before the shock (|z| < 1.5 over the prior week) that then cross the disruption threshold.
On this slice the standard baselines are not merely weak but structurally blind. Persistence scores an AUC of 0.34 — worse than a coin flip — because a quiet node offers it nothing to extrapolate. That looks like open headroom for a model that can read the graph. It is not.
Three independent methods were aimed at this slice. All three land below random — and for the same reason.
Newly-disrupted ranking · pooled AUC with 95% bootstrap CI · val + test
The exceedance classifier is the sharp test. It is a dedicated head that predicts, per node and horizon, the probability that stress crosses the disruption threshold, trained with class-weighting against the rare positives. It scores 0.35 — below chance. The reason is not a tuning gap; it is structural. The slice is defined as the quiet-before nodes, and a node's own quietness is the single strongest predictor of it staying quiet. Any score that reads recent history therefore ranks the eventual spikers below the nodes that stay calm. To surface a quiet-then-spiking node, the evidence has to arrive entirely through its graph neighbours — and on this graph that signal is too faint to overcome the node's own autocorrelation.
This is a covariate-shift result stated plainly: the feature that predicts exceedance in the training distribution — dominated by already-active nodes — generalises in the wrong direction to the quiet subpopulation.
Each edge carries an LLM-written description, embedded to 1024 dimensions, of the coupling it represents. The natural hypothesis: semantic edge conditioning should beat a bare 13-dimensional edge-type one-hot. The matched-capacity ablation says otherwise — text and one-hot tie at every cell of the evaluation.
A perturbation probe rules out the boring explanation. Shuffling the embeddings within each edge type moves the operator's outputs by 0.47× their scale: the model demonstrably reads the per-edge text. It simply gains no forecast skill from it on this graph.
The final test is zero-shot generalisation. Hold two entire edge types out of training, then evaluate on the full graph: a one-hot arm has an untrained row for the unseen type, whereas semantic text ought to interpolate from similar types. It does the opposite. On the nodes fed by the held-out edges, the text arm's forecast error degrades by +0.042 when those types are removed, against +0.001 for one-hot — a thirtyfold larger hit, while unaffected control nodes stay flat for both. Per-edge semantics give the model something specific to lean on, and that specificity makes it more brittle to an edge type it never saw, not less.
A negative result is only worth stating if the measurement is trustworthy. Cascade's evaluation was built to be defensible before any model was judged against it.
The same rigor turns on the model itself. A pinball-trained forecaster should be honest about its own uncertainty, so its P10–P90 band ought to cover roughly 80% of what actually happens. On the held-out years it covers 66%. The median is close to calibrated (it sits above 46% of outcomes, near the ideal 50%), but the interval is too narrow: the operator is over-confident on the tails.
Predictive-interval calibration · edge-text arm · test years
A worthwhile secondary finding: adding the exceedance objective as a multi-task term slightly improved the regression head it shared parameters with (validation stress-ranking AUC 0.688 → 0.743). The auxiliary classification task regularised the forecaster even as its own ranking failed.