Cascade · Weather → Grid → Price

When a cold snap becomes a price shock, three countries away.

Cascade is a novel learned operator on a 357-node graph of the European energy system. Every edge carries a written description of its coupling mechanism, and the operator conditions its message passing on that text to forecast where stress surfaces next, from six hours to fourteen days ahead.

Live above: a subset of the actual graph. Hover any node.

01 · THE PROBLEMCascading Risk in a Coupled Energy System

A cold, near-windless week over Germany does not stay in Germany. Gas burn rises to cover the wind deficit, interconnector flows tighten across the continent, and days later the strain surfaces as a price spike in Italy and a curtailment notice at an aluminium smelter. A forecast of any single asset or country misses this, because the shock travels through physical infrastructure, market coupling and fuel logistics, with delays of hours to weeks.

Cascade models the whole system as one graph. Weather regions, generation fleets, interconnectors, gas hubs, river gauges, ports, prices, industries and companies are the nodes, and the couplings between them are the edges. A short description of how each coupling works, written by an LLM, is stored on its edge as a 1024-dimensional embedding. The learned operator passes messages along the edges conditioned on that text, and forecasts the change in stress at each of its 143 forecast targets.

357
graph nodes
675
edges, each storing a description of its coupling
18.8M
hourly observations
6 h–14 d
forecast horizons
  1. 01 · Ingest Weather, rivers and markets Open-Meteo · GloFAS · ENTSO-E
    2015–2024, hourly
  2. 02 · Features Anomalies against climatology z-score per node against its hour-of-year climatology
    18.8M rows
  3. 03 · Graph Typed nodes, described edges 357 nodes · 675 edges
    BGE-1024 text embedding per edge
  4. 04 · Operator History encoder, then message passing GRU over 336 h per node
    5 rounds of edge-conditioned messages
  5. 05 · Forecast Quantiles per node and horizon P10 / P50 / P90 × 5 horizons
    143 forecast targets

02 · CASE STUDYHow the December 2022 Cold Snap Spread Through the System

For eighteen days a cold anomaly sat over north-west Europe while wind output collapsed (a 13-day wind drought at the peak of the gas crisis). Britain warmed its coal reserve, day-ahead power cleared above £600/MWh, and the depleted Nordic hydro system set December price records. Cascade holds this episode out of training entirely.

The replay is the observed test data, not a simulation. Each node is coloured by its daily peak stress, |z|, against its own climatology.

Dec 01
Dec 1Dec 8Dec 15Dec 22Dec 31
nodes at |z| ≥ 2 that day

03 · RESULTSForecast Skill on Held-Out Years

Given any moment in a held-out year, the operator ranks which nodes will be under strain over the next one to fourteen days. Across 21 test episodes spanning the 2022 energy crisis and the storm winter of 2024, it separates "stressed" from "quiet" nodes at a median AUC of 0.74. Persistence, the strongest simple baseline, scores 0.65, and a per-node GRU with the graph removed scores 0.67. The graph structure therefore closes a quarter of the distance between persistence and a perfect ranking, and the operator beats persistence's median on 18 of the 21 episodes it never trained on.

Stress-ranking AUC · held-out test years 2022 + 2024

Dots: individual test episodes (hover for names). Diamonds: medians.
episode table

The graph structure is clearly beneficial. Removing it (per-node GRU) forfeits most of the margin over persistence, and removing history as well (climatology) collapses the ranking to chance.

04 · THE OPERATORTracing a Single Shock Through the Operator

The operator is a learned impulse response for the graph. Perturb one node of a calm system and, in one pass, it returns the change in every forecast target at five horizons from six hours to fourteen days. A hop count says only which nodes a shock can reach. The operator adds a magnitude, a sign and a per-edge delay, learned from seven years of hourly history.

Low water at Kaub · eight real nodes

1Shock a node
or click any node on the map
2Size
−2.0σ
3Horizon

The operator was trained on real joint histories, never on a single node moved on its own, so a response here shows what it learned about the wiring and is not a validated counterfactual.

How to read this

Node colour is the change in the median forecast (ΔP50) against the calm baseline. Edge colour and width show each edge's first-order share of the change in its destination's median at that horizon, measured on the final message pass. The operator is a one-shot forecaster with a five-bucket delay per edge, so the horizons step and nothing flows between them. Gas, industry, company and logistics nodes have no sensor series in training, so they cannot be shocked and have no forecast. Diffusion is a heat kernel on the same directed graph at one hop per 36 hours on average, and hop count lights up everything within k hops at horizon k.

05 · THE FRONTIERPredicting Onset in Quiet Nodes

Ranking visible stress is what a grid operator needs. A reinsurer prices something harder, onset: among the nodes that look healthy today, which will be disrupted by the end of the week? These are the newly-disrupted nodes, quiet for a week (|z| < 1.5) before they cross the disruption threshold within the episode.

On this slice persistence is structurally blind (AUC 0.34, below random), because a quiet node gives it nothing to extrapolate. This leaves open headroom for a model that reads the graph. None of the three scores measured below uses it.

All three scores rank the nodes that later spike below the nodes that stay quiet.

Newly-disrupted ranking · pooled AUC, 95% bootstrap CI · val + test

24,376 within-episode pairs · 206 positives · 26 episodes

The mechanism is a covariate shift, and it is structural rather than a tuning gap. The slice is defined as the quiet-before nodes, and a node's own quietness is the single strongest predictor that it stays quiet, so any score built on recent history sorts the eventual spikers to the bottom. Evidence for a quiet-then-spiking node has to arrive entirely through its graph neighbours, and on this graph that signal is too faint to overcome the node's own autocorrelation. On this graph, that is the current boundary of predictability.

06 · METHODSEvaluation Design and Caveats

Every claim above rests on the evaluation harness, so the harness was built first and the models were judged against it unchanged.

Year Splits

2015
2016
2017
2018
2019
2020
2021
2022
2023
2024

train · validation · test, with a 336-hour guard band so no training window's forecast horizon reaches a held-out year.

Scoring

  • Pooled AUC, not median-of-episodes. Test episodes contain only 1–4 positives each, so per-episode medians are noise. Pooling all 24,376 within-episode pairs and bootstrapping over episodes gives CIs of half-width ≈ 0.03, tight enough that a real effect would be visible.
  • Matched-capacity ablation. The edge-text and one-hot arms share every downstream parameter, so the comparison isolates the edge feature and nothing else.

Edge Text Ablation

Swapping each edge's 1024-dimensional text embedding for a bare 13-dimensional edge-type one-hot leaves in-distribution skill unchanged, and the two arms tie at every cell of the evaluation. The operator does read the text, since shuffling embeddings within each edge type moves its outputs by 0.47× their own scale. With two edge types held out of training, however, the text arm's error on the nodes downstream of them rises an order of magnitude more than one-hot's. The per-edge specificity the operator reads is what makes it brittle on an unseen type.

Zero-shot edge-type holdout · Δ pinball loss

Positive = worse without the held-out types. Affected: 8 nodes downstream of a held-out edge. Control: 135 other targets.
reads per-edge text · 0.47× output sensitivity ties one-hot in-distribution, every cell brittle on unseen edge types

In distribution, structure beats semantics on this graph. Because the operator provably uses the text, the null is a modelling result about language conditioning, not an artefact of a weak enrichment pipeline.

Calibration

A pinball-trained forecaster ought to be calibrated, so the P10–P90 band should cover 80% of outcomes. On test years it covers 66%. The median is nearly calibrated, and both tails are too tight. Under-dispersion is the signature of a variance-shrinking objective, and it appears to be the same mechanism behind the onset blindness of §05, since the model thins exactly the tail where onset lives. Adding the exceedance objective as a multi-task term did regularise the shared forecaster (validation ranking AUC 0.688 → 0.743).

Quantile calibration · edge-text arm · 12,234 test positions

Caveats

  • The single validation year (2019) contains five episodes, so validation deltas are high-variance.
  • The test set contains the 2022 crisis, a correlated high-volatility regime.
  • The language-conditioning verdict is a finding about this graph, not a universal claim.

The full pipeline and quantitative results are in the repository at github.com/wienkers/cascade.