The Grid Stress Index is a single 0–100 number that tries to answer one question: how hard is the GB grid working right now? It is a transparent heuristic, not a black box — this page is the whole method, and it imports the same constants the engine runs on, so it cannot quietly drift out of sync with it.

The six components

Each component is a signal that tends to move before things get visibly difficult. On every tick, each is converted to a z-score against a trailing 30-day distribution of the same half-hour-of-day — settlement period number, not wall-clock hour, so the comparison is DST-safe by construction and compares like against like: a Tuesday teatime peak against other teatime peaks, never against a 3am trough.

ComponentWeightWhy it signals stress
Price16.7%Scarcity prints in price first.
Imbalance16.7%Big net imbalance = grid fighting itself.
Frequency16.7%The physical heartbeat straining.
Import dependence16.7%Leaning on neighbours.
Wind surprise16.7%Forecast error is what breaks the plan.
Margin16.7%Thin headroom = one trip from trouble.

Weights start equal and sum to 100%. They will be tuned by eye against known stressful days — replayed with the Time Machine — once there is enough history to judge them against. Any change to the weights will be a published change on this page, not a silent re-tune.

Clamping

Every z-score is clamped to ±3 before it enters the composite. One freak reading — a sensor glitch, a single bad settlement period — should move the index, not break it. Clamping bounds how much damage any single component can do, no matter how extreme its raw value gets.

The composite

stress = logistic(Σ wᵢ · zᵢ) × 100

The logistic function maps the weighted sum of z-scores — which can run from very negative to very positive — onto a bounded 0–100 range, with the useful property that it compresses extremes: going from "quite stressed" to "very stressed" moves the needle less than going from "calm" to "quite stressed". When the weighted sum is exactly zero — the active components' deviations cancelling out around their own historical means — the score sits at exactly 50 (logistic(0) = 0.5).

Bands

ScoreBand
0 – 25CALM
25 – 50NORMAL
50 – 75ELEVATED
75 – 100STRESSED

Bands are lower-edge-inclusive: a score of exactly 50 reads ELEVATED, not NORMAL. Band changes are alertable events (Pro) and get their own share card.

Cold start — the honest bit

A component needs at least 8historical samples at the same half-hour-of-day before it participates. Below that, it drops out and the remaining components' weights renormalise so the score stays comparable — the panel shows this as "N of 6 components active".

If everycomponent is still short of history, the index returns nothing at all rather than a fabricated number: a 503 from the API and an honest "index warming up" on the panel. This is the real state of the index for its first month against fresh data, by design — a plausible-looking 50 with no basis behind it would be worse than admitting it isn't ready yet.

See also: the house price forecast used by the Pro optimisers has its own honesty page — forecast accuracy →.

← Back to the terminal