Every step from raw open data to a rating group, including the two modelling decisions that changed the answer materially — and every assumption that is an assumption rather than a measurement.
Six stages, each a script in the repository. Everything is seeded, so a rebuild reproduces the published numbers exactly.
Scripts, in order: fetch_*.py → scores_real.py →
build_model.py → build_map.py / build_analysis.py /
build_site.py.
Each hazard peril is scored 0–1 per district from real hazard data, then converted to an annual loss distribution: Bernoulli(p) × LogNormal(μ, σ) — at most one claim per policy per year, which is adequate at district granularity. Theft, escape of water, fire and accidental damage skip the 0–1 score: theft's input is already a measured burglary rate per household, escape of water's is a claim frequency built from the ABI level and each district's air-frost days, fire's is the district's own dwelling-fire rate from eight years of attended incidents, and accidental damage's is a claim frequency tilted by the census share of households with dependent children.
| Peril | Hazard data | What is measured | Claim freq. | Median severity | % of claim cost | Buildings | Contents |
|---|---|---|---|---|---|---|---|
| Subsidence | BGS Geology 625k bedrock | Shrink–swell susceptibility of the formation under each unit postcode, averaged over the district's postcodes | to 3.0%/yr | £11,515 | 12.1% | 100% | 0% |
| Weather | Met Office (incl. MIDAS station gusts) | Winter wind, wind-driven rain index, 1-in-50 gust, ≥10 mm rain days, annual rainfall | to 10.0%/yr | £1,338 | 9.6% | unsplit | |
| Flood | EA NaFRA2, NRW FRAW, SEPA | Share of homes inside river/sea and surface-water flood zones (unit postcodes weighted by Census households) | from zone share | £23,344 / £12,006 | 12.3% | 48%† | 52%† |
| Groundwater | EA flood-alert areas | Share of unit postcodes inside a groundwater flood alert target area | to 0.8%/yr | £14,523 | 0.9% | 48%† | 52%† |
| Theft | police.uk street-level crime, 36 months | Burglary rate over households + VOA non-domestic premises (the residential share), p99.9 backstop cap | to 3.4%/yr | £2,305 | 13.4% | 24% | 76% |
| Escape of water | Met Office HadUK-Grid air-frost days | Flat base plus a freeze-attributable slice scaled by annual air-frost days (1991–2020 normal) | 0.9–1.5%/yr | £2,426 | 25.8% | unsplit | |
| Fire | Home Office / SFRS / Welsh FRA incident data | Dwelling fires per household — England at LSOA level, Scotland and Wales by local authority / FRA | 0.03–0.56%/yr | £6,014 | 17.1% | 78% | 22% |
| Accidental damage | Census 2021 (E&W) / Scotland's Census 2022 | Flat base plus a child-attributable slice scaled by the district's share of households with dependent children | 0.8–1.0%/yr | £1,101 | 8.9% | unsplit | |
| Erosion not insured | EA NCERM National 2024 | Share of district area projected lost to coastal erosion by 2105 (England) or 2100 (Scotland) | zone ÷ 80 yr | £235,147 | — | — | — |
† Three published conventions for flood's buildings/contents split disagree: Flood Re's statutory premium caps imply 66/34, the Multi-Coloured Manual's depth-damage curves 48/52, and the Environment Agency's appraisal convention 25/75. The MCM figure is used here because it is the only one of the three that measures damage to the property - the other two are a reinsurance pricing artefact and a public-benefit appraisal rule. Across all three the portfolio buildings share moves 4.9 percentage points, against 42.8 points for the three perils left unsplit. Groundwater follows flood. Weather, escape of water and accidental damage have no published split and are shown unsplit rather than given an invented one.
Coastal erosion is the odd one out and is treated as such: it is modelled inside the vine but excluded from the premium, because standard UK household policies do not cover gradual erosion. See Coastal erosion: modelled, not priced.
All 11,244 bedrock formations in the BGS 625k map are classified for shrink–swell susceptibility — London Clay and the Thames Group at the top, then the Gault, Weald, Oxford, Kimmeridge and Ampthill Clays, down through Mercia Mudstone — and pre-Mesozoic mudstones are down-weighted because they are indurated and low-plasticity. Each district's score is the susceptibility of the formation under each of its unit postcodes, averaged over the postcodes (point-in-polygon in British National Grid; area-weighted by polygon intersection before 2026-09-06, which read a district whose clay lies under fields and whose homes stand on gravel terraces as clay). This mirrors how BGS's own GeoSure shrink–swell layer is derived, using only the open 625k mapping.
Bedrock is not the whole story, though: shrink–swell happens in the soil shallow foundations actually bear on, and over about 58% of Great Britain that is superficial deposits lying on top. The 625k superficial map is blended in as a modifier — lacustrine clay, clay-with-flints and brickearth pull a district's score up, glacial sand and gravel and river terrace deposits pull it down, because a granular layer genuinely buffers the seasonal moisture change that drives shrink–swell. It cuts both ways: Vale of York lake clays over benign bedrock rise, while the City of London, sitting on metres of terrace gravel above London Clay, falls — which is why insurers' subsidence maps light up the outer-London clay outcrop rather than the centre.
Two deliberate limits. The blend is capped at half weight because 625k publishes no thickness, so a 0.5 m gravel skin and a 20 m clay sequence look identical in this data — drift can shift the ranking but never override mapped bedrock outright. And peat is excluded: it subsides badly, but by consolidation and oxidation rather than shrink–swell, so pricing it inside this peril would conflate two mechanisms under one calibration.
Geology says which ground can shrink; weather says how often it is made to. Each district also carries a drought climatology built from the Met Office's HadUK-Grid 1 km daily observations: the running water deficit max(cumsum(PET − rain), 0), reset every 1 January, peaked within each year and averaged over 1991–2020 — the same index that, aggregated nationally, recovers five of the six canonical UK subsidence years (1976, 1995, 2003, 2018, 2022). It enters claim frequency as a blend: 56.5% of subsidence frequency rides the district's deficit relative to the national exposure-weighted mean, the rest stays on the flat geology base. The share is the ABI's own attribution arithmetic — its 2022 release counts 13,000 of that year's 23,000 claims as drought-driven, and its pre-surge baseline of 2,500 claims a quarter implies the same split — bracketed by Zurich's engineering attribution (~60% of upheld claims are root-induced clay shrinkage in an average year, ~85% in a surge year). The blend is normalised so the national claim level is untouched: it moves who carries subsidence risk, not how much of it there is.
One measured caveat. The PET inside the deficit is Hargreaves–Samani, which runs roughly a third high in a maritime climate — so the deficit's level in millimetres is not a soil-physics quantity. Re-running the whole integral with PET scaled to 0.85× and 0.70× leaves the district ranking essentially unchanged (rank correlation +0.998 and better, at both the 1 km and 5 km grids), and the level is exactly what the ABI calibration re-pins — so the map survives the formula, and only the map is used.
The published flood maps are sampled at every live unit postcode (about 15 addresses each), giving the share of each district's homes in a high band (≥1% a year) and a low envelope (≥0.1%). Each postcode counts for its Census households: flooded postcodes are the sparse ones, so counting postcodes put England's river and sea high band at 1.2 times the EA's own count of homes in it. England's rivers and sea come from the EA's Risk of Flooding from Rivers and Sea, whose four risk bands already account for defences, decoded from the legend colours at 6.5 m per pixel, three times on grids shifted a third of a tile apart (the service leaves whole polygons out of some renders depending on where the tile falls, so a band most reads drew is kept, and so is a cluster of homes only one read drew); High (≥3.3% a year) is priced apart from Medium, as it is in Wales, where FRAW supplies its own High; Scotland's SEPA High is 1 in 10, so its homes carry England's High share of the band. High homes claim at 1.67 times Medium's rate and Medium homes at 1.92 times Low's: the ratios between the bands in the Environment Agency's recorded floods since 1990. Wales from NRW FRAW's own polygons, tested at each postcode; Scotland from SEPA's polygons, queried at a 5 m tolerance. Surface water is handled the same way: England's RoFSW layer only renders below 1:50,000, so it is fetched at 13 m per pixel with the three legend colours decoded per pixel into likelihood bands. A pixel counts only when at least a quarter of it is covered: the layer is drawn from 2 m flow paths, so a faint 13 m pixel is a thin path through its edge, and counting those put England at 1.6 times the EA's own count of homes at risk. A quarter was chosen on half the constituencies and checked on the other half. Surface-water claims are modelled as more frequent but cheaper than fluvial ones.
Depth is the single strongest driver of flood damage to a house, and the same EA service publishes five nested depth layers alongside the headline extent — the parts of the surface-water envelope deeper than 0.2, 0.3, 0.6, 0.9 and 1.2 m. Differencing them gives, for each district, the distribution of depth within its own flooded area, which becomes an expected-damage relativity following the familiar depth–damage shape: damage climbs steeply through the first half-metre as water passes floor level and reaches sockets and plaster, then flattens once the ground floor is a write-off either way.
The EA publishes the same five depth thresholds for its river and sea risk bands, so river and sea claims — the larger half of flood — get the same treatment. Where the river water is deep (Goole, Thorne and Fishlake, over a metre) the claim is dearer; on wide, shallow tidal plains (Grimsby, Cleethorpes, Weston-super-Mare, around 0.2 m) it is cheaper. The EA marks river depth "unavailable" for about a sixth of the homes in its higher risk bands, mostly in the Fens; those districts take the depth of their wider postcode area.
Each multiplier is deliberately renormalised to a mean of 1.0 per claim. That keeps it doing one job — re-shaping severity between districts — without moving the national level that the ABI calibration already fixes. Per claim rather than per household matters: deep water sits where the claims are, so a multiplier averaging 1.0 per household averages more per claim, and because the national flood total is fixed, the difference would be paid for by Welsh and Scottish homes whose flood risk had not changed. It is the same discipline the frequency calibration follows: the data decides the relativities, the published aggregates decide the level.
England only. Neither NRW nor SEPA publishes an equivalent depth product, so Welsh and Scottish districts keep the flat severity. That is an asymmetry in the spread of severity, not in its level. Nothing external measures flood depth at homes, so neither multiplier is validated.
668,609 street-level burglaries over the latest 36 months of the police.uk open archive, each anonymised to a snap point and placed into its district by point-in-polygon, become an annual burglary rate per household. That rate is then scaled by one national multiplier so the implied claim count matches the ABI's theft aggregates — which means the burglary→claim propensity (how many burglaries become home-insurance claims) cancels out and never has to be assumed. The police data contributes only what it actually knows: which districts have more burglaries than which.
Three corrections the raw data needs, all visible in the map:
Theft sits outside the vine copula, on purpose. Burglary does not arrive on the storm track: the correlation between a district's theft expected loss and its four-peril catastrophe expected loss is 0.25 — theft re-ranks the book rather than reinforcing it. It is simulated as an independent compound leg, and its systemic loading is derived, not assumed: national annual burglary counts vary by roughly ±10–15%, so the loading is solved to reproduce that, which makes a 1-in-100 theft year about 1.3× an average one. The consequence is visible in the price: theft adds £22.04 of expected loss per policy and almost no capital charge — the portfolio's bad years are still weather years, and an independent, stable peril earns nearly a full diversification credit.
One mechanical side effect to read correctly: percentage figures divided by the premium — the dependence uplift, the climate-scenario uplift — are all diluted by theft's arrival, because the denominator grew while the weather-driven numerator did not. Nothing about the flood or climate modelling changed.
Escape of water is the UK's most frequent home claim — the ABI puts it at £1.8m a day, about £657m a year, roughly 164,000 claims at ~£4,000 each. It is also the hardest of the eight to give a geography: burst pipes and failed appliances follow plumbing age and dwelling type, neither of which is open data at district level. Pretending otherwise would be invention, so the base frequency is deliberately flat.
What is open is the freeze. Around 31% of escape-of-water claims are freeze-attributable — the January burst-pipe peak, with insurers reporting ~25% of claims in July–September as the no-freeze floor — and that slice scales with each district's annual air-frost days from the Met Office HadUK-Grid 1991–2020 normal: 13 days a year on the mildest coasts to 147 in the Scottish Highlands. The result is a modest, physical spread: expected loss runs from £25 (ZE3) to £89 (IV4) per policy, around a national mean of £42.39.
Like theft it sits outside the vine — but for capital it is the opposite case. The vine's root is the storm track, and cold is the one weather axis the vine does not carry: the correlation between a district's escape-of-water expected loss and its four-peril catastrophe expected loss is 0.15 — the frost map is close to an inversion of the storm map, so this peril re-ranks the book more than any other addition. But a hard national freeze is genuinely systemic: winter 2010 pushed around 103,000 burst-pipe claims (£680m) through in six weeks, roughly doubling that year's escape-of-water bill. The factor loading is solved against exactly that observation — a 1-in-100 freeze year costs about twice the mean — which makes it twenty times theft's loading. Escape of water therefore pays a real, if small, capital charge where theft pays almost none.
The same dilution note as theft's applies, at larger scale: adding ~£42.39 of weather-independent expected loss grows the premium denominator, so percentage-of-premium figures — the dependence uplift, the climate-scenario uplift — fall again without any change to the flood or climate modelling.
Fire is the opposite data problem to escape of water: the ABI no longer publishes a domestic fire total at all (recent releases fold it into an aggregate and say only that fire payouts "declined"), but the geography is the best of any non-weather peril. The level is therefore a documented triangle: 31,001 attended dwelling fires across Great Britain in 2024/25 (Home Office FIRE0201) give a frequency of ~0.20% per policy; the ABI's average fire payout (£10,200–£11,000, of ~2019 vintage, indexed for claims inflation to ~£14,000) gives severity; together ~£434m a year — about 13% of what all home claims cost, consistent with the remainder once every published per-peril total is subtracted. The weakest leg of that triangle is the undated severity quote, and the methodology says so rather than pretending otherwise.
The geography comes from incident-level open data: 33,696 dwelling fires a year located to LSOA level in England (eight complete years of the Home Office low-level-geography dataset, reconciling with the national FIRE0201 totals to the exact incident), council level in Scotland and fire-authority level in Wales, apportioned to postcode districts through the same ONS lookup the household counts use. Expected loss runs from £4 (DN39) to £144 (W1J) per policy around a mean of £28.00 — a wider real spread than theft or escape of water, with Glasgow's peripheral estates and dense urban cores at the top and rural districts at a fifth of the mean. Rates are winsorised at the exposure-weighted 99.9th percentile (0.56% of households a year; 28 districts sit at the cap), the same tiny-denominator backstop theft keeps.
Fire buys no capital at all. Forty-five years of national counts show a steady secular decline with year-to-year residuals of ±2–3%: there are no systemic fire years in the record (even the 2022 heatwave summer barely registers at annual grain), so the factor loading comes out effectively zero and fire prices as pure expected loss — the purest diversifier in the book. Correlation with the four-peril catastrophe expected loss: 0.27. The severity sigma is 1.3, the heaviest tail of the attritional perils (~2% of claims above £100k), which the analytic expected-loss identity absorbs exactly as for theft and escape of water.
The dilution note applies a third time: ~£28.00 more weather-independent expected loss in the denominator pulls every percentage-of-premium figure down again — nothing about the flood or climate modelling changed.
Accidental damage completes the attritional four, and it is the extreme case of fire's data problem: no UK body has ever published a domestic AD payout total — not the ABI, not anyone. The level is therefore a triangle with every leg documented: the ABI's 560,000 home claims settled in 2025; an at-home AD share of 24.5% of those claims (a published claims-mix table: 23.4% accidental damage at home plus 1.2% accidental loss at home — the 6.5% away-from-home slice is deliberately excluded, because that is personal-possessions cover, not the buildings-and-contents policy this models); and Aviva's average AD payout, interpolated to £1,650 for 2025 from its published £1,148 (2022) and £1,869 (2026) figures. Together: ~137,000 claims, 0.89% per policy, ~£227m a year. The cross-check is that two independent books agree on the overall share — Aviva reports AD as 32% of its home claims, the claims-mix table sums to 31%. The weakest leg is the severity interpolation between two press-release vintages, and the methodology says so.
The geography is deliberately the gentlest in the book. The only demographic driver any insurer has published is Aviva's: children cause 8% of its accidental-damage claims. So the rate is a flat base plus an 8% slice scaled by each district's census share of households with dependent children — Census 2021 at LSOA level for England & Wales, Scotland's Census 2022 at output-area level, 27.3m households conserved through the postcode joins. That share runs from 27% of households (CF43) to 18% (SW1X), so expected loss runs only from £10 to £28 per policy around a mean of £14.65 — a driver that moves 8% of claims cannot honestly move the rate more than that. No winsorisation is needed: a share of households is bounded by construction, and its denominator is the same census the exposure weights come from.
Accidental damage buys no capital at all. Its systemic ceiling comes from the cleanest natural experiment on record: the 2020–21 lockdowns put the whole country at home for months — the largest behavioural shock UK housing has had — and home AD claim declarations moved by about 6%. (The widely quoted "+39% accidental damage after lockdown" is motor insurance, a trap documented in DATA_SOURCES.md.) A 6% worst-shock pins the factor loading at 0.012%, effectively zero, so AD prices as pure expected loss. Correlation with the four-peril catastrophe expected loss: 0.49. The severity sigma is 0.90, the narrowest tail of the attritional perils (~0.7% of claims above £10,000): dropped televisions and stained carpets cluster tightly around the mean.
The dilution note applies a fourth and final time: ~£14.65 more weather-independent expected loss in the denominator pulls every percentage-of-premium figure down once more — nothing about the flood or climate modelling changed.
A real policy has two sections — buildings (the structure: walls, roof, fitted kitchen, foundations) and contents (what you would take with you). Every figure elsewhere on this site is the two combined. Splitting them is worth doing, and this model splits only the part that a published source can settle.
The split is per peril, and that is the honest unit: a subsidence claim is nearly all structure, a burglary is nearly all stolen goods. Five of the eight perils have an anchor for that ratio. Three do not, and they are 44.3% of claim cost. Those three are left named and blank rather than filled in with a guess.
| risk type | £/policy/yr | % of cost | buildings | £ buildings | £ contents |
|---|---|---|---|---|---|
| escape of water | £42.39 | 25.8% | — | no anchor | |
| fire | £28.00 | 17.1% | 78% | £21.84 | £6.16 |
| theft | £22.04 | 13.4% | 24% | £5.33 | £16.71 |
| flood | £20.13 | 12.3% | 48% | £9.66 | £10.47 |
| subsidence | £19.81 | 12.1% | 100% | £19.81 | £0.00 |
| weather | £15.74 | 9.6% | — | no anchor | |
| accidental damage | £14.65 | 8.9% | — | no anchor | |
| groundwater | £1.46 | 0.9% | 48% | £0.70 | £0.76 |
| anchored subtotal | £91.44 | 55.7% | 63% | £57.34 | £34.09 |
| not split | £72.77 | 44.3% | named and left blank | ||
Anchors, all in DATA_SOURCES #31: theft from the ONS Crime Survey's nature-of-crime tables (damage to doors, windows and frames is 24.2% of burglary cost, the rest being the goods); fire from the Home Office's Economic and social cost of fire; subsidence at ~100% because it damages foundations and walls and contents are excluded in every policy wording checked; flood at 48% from the Multi-Coloured Manual's depth-damage curves; groundwater on the same curves, being the same water in the same dwelling.
Because it would be an opinion. Send the unanchored 44.3% all one way and the portfolio is 34.9% buildings; send it the other and it is 79.2%. That is a band tens of points wide, and a band that wide is not a number — publishing its midpoint would be inventing the answer rather than measuring it. The anchored 55.7% of claim cost comes out 63% buildings, and that figure is real because every input to it is published.
The gap is not evenly spread, either. Escape of water alone is 25.8% of claim cost with no anchor at all — more than the entire spread between the three contradictory flood conventions the literature offers. Anyone extending this should go at escape of water and ignore everything else.
The model can also split each district's capital charge between the two covers, and does so exactly — buildings and contents earn different diversification credits, so it is a real calculation rather than a pro-rata carve-up. It is deliberately not published: a per-district pounds split would need all eight fractions, and three of them do not exist.
The model carries one further peril, coastal erosion, from the Environment Agency's NCERM National 2024 mapping of ~7,500 stretches of the English coast and, since 3 September 2026, from NatureScot's Dynamic Coast phase 2 for Scotland. It is in the vine, and it is deliberately not in the premium.
Gradual coastal erosion is not covered by standard UK household policies. Pricing it as an insured loss would charge for something no policy pays — and it would quietly wreck the rating, because erosion is a total loss of the property rather than a repair, so wherever it bites it dwarfs every other peril. It is carried instead as blight and valuation exposure: the thing that actually drives mortgage and insurability decisions on an eroding coast.
Erosion is storm-driven — cliffs and beaches retreat in a handful of surge events, not on calm days. So it belongs in the dependence structure whether or not it is priced. It enters as a fifth vine dimension with a Gumbel pair to weather, and, conditional on weather, the strongest of the second-tree pairs to flood (ρ = 0.35): coastal flooding and coastal erosion are driven by the same storms.
NCERM publishes two policy scenarios — the adopted Shoreline Management Plan (defences maintained as planned) and No Further Intervention (defences allowed to lapse). The gap between them is the clearest result here: nationally the adopted plans hold the 2105 land loss to 250 km² against 435 km² undefended, and several major seafronts — Blackpool, Eastbourne, Bognor, Crosby — fall from substantial unmanaged erosion to exactly zero under their "hold the line" plans. Where the defences are not there, the fastest-eroding coastline in Europe shows up as you would expect: Hornsea and Withernsea on Holderness lead, then Southwold on the Suffolk coast.
Until 3 September 2026 every Scottish district scored exactly zero here, because NCERM stops at the English border. It now takes Dynamic Coast phase 2 instead — NatureScot's FutureCoast projections, open under OGL — which puts 80 km² of Scottish land inside the 2100 erosion zone across 179 districts, worst AB23 at 1.9% of its area.
The two sources are not the same measurement, and the model says so per
district in the er_basis column rather than blending them into one number
that hides it. Three differences, in descending order of how much they matter:
er_nfi columns are empty rather than zero.Wales still has no projection of its own, and its zero is still not a real one. Three border districts are the exception and not a Welsh source: NCERM's Severn and Dee frontages cross into Chepstow, Monmouth and Deeside, so those three carry a trace figure while the whole Welsh coast proper reads zero. Natural Resources Wales publishes shoreline management plan policies but no projected shoreline geometry, so there is nothing to build a Welsh erosion extent from. Northern Ireland does not arise: the boundary set is GB-only.
A property inside the strip projected to be lost by the horizon is lost within it, so the annual hazard is the district's zone fraction spread over 80 years, at a sum-insured severity. Two assumptions are worth stating plainly: households are taken as spread evenly across the district, when coastal populations in fact cluster towards the shore — so this if anything understates it — and the realistic scenario is the one used for the peril itself, SMP in England and the single Dynamic Coast case in Scotland.
Erosion is also absent from the good-vs-bad-years view, and from the capital allocation. It is a chronic process, not an event: including it would add a near-constant charge to every simulated year and blur exactly the contrast that view exists to show.
The Environment Agency publishes a climate-change edition of the two flood products this model already uses. Running the model again on those extents — with the calibration held fixed, so nothing moves except the hazard map — gives a per-district repricing.
Comparing two differently derived products would mix a method change in
with the climate change and produce a number that looks fine and means nothing.
England's rivers and sea read NaFRA2 rofrs_4band; its climate sibling
rofrs_cc01_4band is the same product, legend and resolution. That is the
pair used. Where the climate edition is not published (about 2% of English postcodes:
the fens, the Somerset Levels, the Lincolnshire coast) a postcode keeps its present-day
band, so those places show no uplift rather than a fall to zero.
Two normalisations had to be pinned to the present day rather than recomputed, or the exercise would have measured nothing. The depth severity multipliers are normalised to a mean of 1.0 per claim — recomputing that on the future data would divide out exactly the "water gets deeper everywhere" signal. The flood score is anchored to the 95th percentile of the present-day index for the same reason. Both runs also share their random draws, so the comparison is paired rather than two independent simulations differenced.
A single multivariate distribution would force one dependence shape on all five perils. A vine (pair-copula construction) instead builds the joint distribution from bivariate pieces, so each pair gets the dependence structure it deserves. This is a C-vine with weather at the root, because weather is the common driver: storms bring the rain that floods rivers and recharges aquifers, the same climate variability produces the droughts that shrink clay, and the same surges strip the coast. Theft, escape of water, fire and accidental damage are deliberately not vine dimensions: burglary has no meteorological driver, burst pipes answer to cold — the one weather axis a storm-rooted vine does not carry — dwelling fires follow deprivation and dwelling type, not the storm track, and accidental damage follows the household itself. All four are simulated as independent legs alongside the vine, with their systemic behaviour handled by factor loadings instead — see the theft section, the escape-of-water section, the fire section and the accidental-damage section.
Why Gumbel in tree 1. The Gumbel copula has upper-tail dependence: as one peril goes to its extreme, the probability the other does too stays positive. That is exactly the behaviour of a bad UK winter. Its tail-dependence coefficient is
and θ is not a constant — it rises with both districts' exposures, so a district that is both storm-exposed and flood-exposed gets a stronger joint tail than one that is neither:
Why flood–erosion is the strongest tree-2 pair. Once weather is accounted for, what is left linking two perils is whatever they share beyond general storminess. Coastal flooding and coastal erosion share the specific thing that matters — the storm surge — so their residual link (ρ = 0.35) is set above flood–groundwater (0.25) and flood–subsidence (0.15). A test asserts the sampler actually reproduces that ordering.
Sampling. The root pair (weather, flood) is drawn by Marshall–Olkin sampling with a positive-stable frailty; the remaining margins are recovered by inverting the conditional distribution (h-function) — closed form for the Gaussian pairs in tree 2, numeric bisection for the Gumbel pairs in tree 1. Common random numbers are used throughout, so scenario comparisons differ only by the assumption being tested. Two comparators run alongside every simulation: a 5-dimensional Gaussian copula matched pairwise to the same rank correlations (dependence without tail dependence) and a full independence run.
The hazard data decides which districts are riskier than which. It says nothing about how much a claim costs, so each peril's loss level is anchored to what the ABI publishes for that peril in the UK domestic market.
| Peril | Paid, 2025 | Average claim | Implied claims | Frequency |
|---|---|---|---|---|
| Storm | £244m | £2,450 | ~99,600 | 0.643% |
| Flood | £312m | £30,000 | ~10,400 | 0.0671% |
| Subsidence | £307m | £17,264 | ~17,800 | 0.115% |
| Groundwater | — | £20,000 | — | pegged at 10% of flood |
| Theft | £342m (envelope floor) | £3,800 | ~89,900 | 0.580% |
| Escape of water | ~£657m (£1.8m/day) | £4,000 | ~164,000 | 1.06% |
| Fire | ~£434m (triangle) | £14,000 | ~31,000 | 0.200% |
| Accidental damage | ~£227m (triangle) | £1,650 | ~138,000 | 0.888% |
Over ~15.5m policies (ABI premium-tracker coverage), these eight perils come to £164 per policy per year — 75% of the £219 that all home claims cost. Groundwater is not reported separately by the ABI, so it is a documented assumption rather than a calibration. Theft has no current published total at all: the ABI's last theft-specific figure is 2018's £450m and its £3,800 average claim is present-day, so pairing them implies 0.97–0.76% of policies against ~0.58% if claims fell with recorded burglary. That 0.58–0.97% spread is the documented envelope on theft's LEVEL, and the model sits at its floor — £342m, i.e. 0.58% × 15.5m × £3,800 — because theft was otherwise carrying the whole of the model's claim-count overshoot. Escape of water has no single published total either: its £657m is the ABI's rolling "£1.8m a day" figure, and the £4,000 average follows from escape-of-water's ~29% share of 2025's 560,000 home claims — three independent public numbers that close into one self-consistent triangle, which is the cross-check. Fire has no published total at all: its £434m is claim counts the fire services actually attended times the ABI's average payout, sanity-checked against the remainder of the £3.4bn all-claims total — the same triangle discipline, with the weak leg named. Accidental damage has never had one: its £227m is the ABI claim count times the market's at-home AD share times Aviva's average payout — a third documented triangle, cross-checked by two independent books agreeing on AD's share of all home claims.
What is fitted: one frequency multiplier per peril, so each peril's national claim count matches the published figure, and severity distributions whose means are the published average claims. The national loss level is therefore correct by construction — which is the point, since a level that is wrong by a factor of several makes every downstream number meaningless.
What is not fitted, and is where the model actually earns its keep:
An earlier version of this page calibrated to the all-claims figures instead (560,000 claims, 3.6% frequency). That was wrong: most of those claims are the attritional perils — escape of water and theft — so scaling four catastrophe perils up to that frequency while applying catastrophe severities overstated the loss cost by about 77%. The per-peril anchors above replace it, and the attritional perils now carry their own anchors with their own (much cheaper) severities.
The portfolio view needs one more anchor: how widely claims spread in a bad year. An early version assumed strongly correlated districts and produced catastrophic years in which nearly half of the country claimed at once — around ten times anything in the record. The spatial loading is now solved so that a 1-in-100 year has roughly twice the claim frequency of an average year, which is already generous next to a record year like 2025.
The ABI anchors are national totals, so the model's average has to be a national average, which means weighting districts by how many homes they actually contain. Croydon has about 56,000 households; plenty of rural districts have a few hundred. Counting them equally would let sparse geography outvote the population.
Postcode districts aren't an ONS geography, so household counts are built up from census small areas: ONS Census 2021 households by LSOA for England and Wales, mapped through the ONS postcode→small-area lookup (the outward half of a postcode is the district, so no spatial join is needed), with each small area's households shared between the postcodes inside it. Scotland's data zones don't join — the lookup uses the 2011 vintage and the available census table the 2001 one — so Scotland's Census 2022 national total of 2,509,300 is spread across Scottish postcodes instead. Only live postcodes count — ONSPD retains terminated ones, a third of its rows, and apportioning households across them credited ~730,000 homes to addresses that no longer exist until 2026-08-12. Total: 27.3m households across 2,866 districts.
Everything downstream is exposure-weighted: the calibration average, the portfolio loss in each simulated year, the tail that capital is held against, and the Euler allocation.
The earlier version charged each district 6% of its own 1-in-100 loss. That is wrong in a way worth being explicit about: an insurer does not hold capital against each policy's private worst year — those bad years mostly happen in different years and offset. Capital is held against the portfolio, then allocated back. The model now uses the standard Euler allocation:
Each district is charged for the loss it contributes when the portfolio is having a bad year, not when it personally is. These allocations sum exactly to the portfolio TVaR, so diversification is credited rather than ignored — which is why premiums here are a fraction of what the standalone calculation produced.
There is a trap hiding in that formula, and it took a seed test to find it. The worst 1% of 20,000 simulated years is 200 draws. At calibrated UK frequencies a district claims in one or two of them. So averaging its realised loss over that window is not measuring the district's risk — it is mostly measuring whether the dice happened to land on it.
The symptom was unmistakable once looked for. Re-running with nothing changed but the random seed, the allocation correlated just 0.49 with itself; and a 0.4% change in flood expected loss was enough to move one district eight rating deciles. The published premium was substantially noise.
The fix costs nothing. The factor model already gives the claim probability in closed form for any given year's systemic draw, so instead of averaging what happened, the allocation averages what was expected to happen given that draw:
That removes the coin-flip entirely and keeps only the genuine year-to-year variation. Seed-to-seed correlation goes from 0.49 to 0.9985 at full resolution. It is exact rather than approximate, because the bad years are ranked by the same smoothed quantity — so the choice of which years count depends only on the systemic draws, and the tower property applies. A test now guards it.
This is the same lesson as the deleted "copula uplift" layer, in a place that mattered more: at these frequencies, any per-district Monte Carlo estimate of a tail quantity is noise unless you condition on something.
Worth asking bluntly of any model that spends this much effort on dependence. Once frequencies are calibrated to real levels, the answer splits in two.
The vine joins the five perils of one district — whether that home's bad subsidence year is also its bad storm year. It says nothing about whether Croydon and Hull flood in the same year. Dependence across the map is a separate mechanism, a Gaussian factor model described under good years vs bad years.
The two meet at one point: the vine draws are the systemic factors that model mixes in. So the vine decides that a bad national storm year is also likely a bad flood year, and the spatial loading decides how much of that reaches any particular district. Keeping them apart is what lets each be calibrated against something real — the vine against per-peril physics, the loading against how widely a 1-in-100 year claims.
Only one place, and it is a small one. The technical premium is 97% expected loss and 3% cost of capital, and the expected-loss part is dependence-free by construction — the mean of a sum is the sum of the means whatever the copula does. So the entire effect of the dependence structure on what a household pays runs through that 3% capital charge.
And that charge is an aggregate quantity, not a personal one: it is 6% of the district's Euler-allocated share of the portfolio's worst 1% of years, not of its own. The gap is the whole point — a single policy's standalone TVaR₉₉ ran £10,100–£17,700 across 30 simulation seeds, while its allocated share of the portfolio tail held at about £261, a 98% diversification credit. An earlier version charged 6% of the standalone figure and inflated premiums roughly tenfold.
Why the first of those is a range and the other two are not.
The standalone figure is the mean of each district's worst 200 years out of
20,000, and every district is simulated against the same draws — so its Monte
Carlo error is common to all 2,736 of them and does not average away. Across
30 seeds the national mean moved 57%, while the allocated
share moved 2.2%, the diversification credit stayed within
97.4–98.5%, and the premium moved 0.20%. Quoting one
standalone number would imply a precision the simulation does not have; the premium
map does not inherit the problem. The per-district tvar99_vine column in
the download carries the same caveat.
Measured by scripts/seed_sweep.py.
For a single home, dependence transforms the rare case and barely touches the typical one. Modelling the perils jointly makes it 99 times more likely that one property suffers two or more perils in the same year — 0.12% of years, against 0.0012% under independence. But at UK frequencies a home claims on any of these perils in well under 1% of years, so its own 99% TVaR is essentially "the average claim, if one happens" — a statistic almost blind to dependence. Measured, the vine-versus-independence difference on a single policy's TVaR₉₉ is +3.1%, with a 95% bootstrap interval of -7.6% to +14.6%: indistinguishable from zero, exactly as it should be. The interval straddling zero is the finding; the point estimate wanders between runs precisely because it is noise, which is why nothing is priced off it.
For the portfolio, it shows up where capital is set. Aggregate over 2,736 districts and the rare joint events stop cancelling: catastrophic years cost 4.6% more under the vine than under independence. That is the number that matters for solvency, and it is the reason the vine is here.
Measured by scripts/dependence_check.py: 60 districts ×
400,000 simulated years, with a bootstrap interval on the TVaR comparison so the noise
is stated rather than assumed away.
This was a genuine surprise from the model, and it changed the headline numbers.
The first version priced on the 1-in-200 loss — the 99.5% Value-at-Risk — and the "copula uplift" came out negative for most districts. Modelling dependence appeared to reduce risk, which is nonsense.
It is not a bug. Claims here are rare and compound: flood strikes around 1% of years. When perils are positively tail-dependent, their claims coincide — the same years get hit several times over, and other years get nothing. That concentrates loss into fewer, far worse years, pushing it past the 99.5% quantile. VaR only reads the height of the quantile, not what lies beyond it, and it is famously not monotone with respect to concordance ordering. Expected shortfall is.
Districts are then ranked on that premium and banded into deciles — rating groups 1 to 10.
Pricing a district and describing a portfolio year are different questions, and they need different spatial assumptions. The pricing simulation gives every district the same random draws, which is right per district but degenerate as a portfolio view: it implies every district floods in the same year and none in any other.
The year analysis therefore mixes in a Gaussian factor model. Each district's draw combines the national systemic factor for that peril — which carries all of the vine dependence — with district-level idiosyncratic noise:
The loading w sets how national each peril is: weather 50%, flood 40%, subsidence 60%, groundwater 70% — storms, droughts and aquifer recharge are large-scale phenomena, while flooding is more localised. Those base ratios are then scaled by a single multiplier, solved analytically so that a 1-in-100 year claims twice as widely as an average one. Theft's loading is far smaller — 0.13% — and is derived rather than assumed: at these frequencies the year-to-year spread of the national claim count goes as ≈ 2.75·√w, and the observed national burglary series varies by ±10–15% a year, which pins w near 0.001. A "felt reasonable" loading of 0.20 would have implied worst years with 8–14× average claims — nothing in the crime record looks like that — and charged every policy ~£13 of phantom capital. Escape of water's loading is derived the same way but from a very different record: winter 2010's six-week freeze roughly doubled the year's burst-pipe bill, which pins its loading at 2.6% — twenty times theft's, and the reason escape of water buys real capital where theft buys almost none. Fire's is derived from forty-five years of Home Office dwelling-fire counts: once the secular decline is removed, the residuals are ±2–3% a year with no spike years at all, which pins its loading at 0.004% — effectively zero, thirty times below even theft's. Accidental damage's comes from a natural experiment: the 2020–21 lockdowns — the hardest a behavioural peril can plausibly be shocked — moved home AD declarations by only ~6%, which pins its loading at 0.012%, the second-smallest in the book. The four attritional perils thus span the whole loading spectrum, each pinned by its own record rather than by assumption.
The transformation preserves each district's marginal distribution exactly, so expected loss is untouched — bit-for-bit, whatever the loading. But it is not cosmetic: capital is allocated from the portfolio tail measured in this view, so the loading does move the cost-of-capital component. Raising it eightfold leaves every expected loss unchanged while raising the capital charge fourfold and the premium by about a fifth. That is precisely why the multiplier is calibrated against how widely a bad year claims, rather than picked.
The same model is published at two grains — 2,736 postcode districts (the map) and 10,398 postcode sectors (the sector map). Same perils, same C-vine, same ABI calibration; only the unit of geography changes. Sectors matter because a district can be large enough to average away the thing being priced: a river runs through some of its sectors and not others.
They are derived, not published. Only Scotland releases postcode-sector polygons; England & Wales publish lookups. But a sector is a district plus one inward digit, so sectors nest inside districts by definition — which turns one national problem into 2,736 small independent ones. For each district we take its own unit-postcode centroids (OS Code-Point Open, 1.75m live GB postcodes), partition the district between them with a Voronoi diagram, and dissolve the cells by sector digit. The result is an exact partition of every district, by construction.
How wrong is that? Scotland is the one place the answer can be measured, so we scored the derivation against the National Records of Scotland's official sector polygons. Two numbers matter, and the gap between them is the honest one:
Sector agreement is no worse than district agreement, so the Voronoi step adds no measurable error: essentially all the disagreement with NRS already exists in the underlying district outlines, which this project has always used. (Those outlines are community-maintained approximations — that is the number, now measured, behind the boundary caveat below.) 82% of derived Scottish sectors exceed 0.5 IoU against the official ones, 51% exceed 0.7.
Aggregating sector premiums back to their districts by household weight reproduces the district model closely — 0.996 correlation, exposure-weighted level within 0.0% — so this is the same model resolved more finely, not a different one. Within districts, though, it is not close at all:
Of the 2,248 districts holding more than one sector, the median contains sectors whose technical premiums differ by 1.25×; in 52 of them the gap exceeds twofold. The widest is DN14 at 4.0× — £162 to £657 across 7 sectors. The pattern is physical, not noise: the extremes are flood-led districts split by a river or estuary (Maidenhead SL6, Leeds LS1 and LS7, Wells BA5, the Dee at CH64) and subsidence-led ones split by a clay boundary (WV5, PO7, RG8, PE7). A single district price charges both halves the average of a risk only one of them has.
The EA's climate-change flood maps are sampled at the sectors' postcodes too, so the sector map carries the climate repricing: +4.2% exposure-weighted across the 8,730 sectors the EA models, against +4% over 2,087 districts — the same national answer, as it should be.
The tails are not the same answer at all. The worst district is DN32 at +82%; the worst sector is ME4 3 at +187%. And where the district model finds just 15 district whose flood risk falls under the scenario, the sector model finds 225 sectors. Those improvements are real — the EA's future run is a separate model, not a uniform uplift — but at district resolution they are averaged against worsening neighbours until they vanish. Climate change does not arrive evenly across a postcode district, and a district-level map cannot show that.
The same ground under the same scenario, on the climate layer: HU8 outlined in both. Blue is a premium that falls under the EA's future flood extents, red one that rises; the ramp and its breaks are the map's own. HU8 is the single district in Great Britain whose premium falls (+16%) — and it is made of 4 sectors running from HU8 7 at +10% to HU8 0 at +25%. Both statements are true; only one of them is useful to somebody choosing where to live.
All Open Government Licence v3 except ERA5 (CC-BY 4.0). Every endpoint, licence and
access quirk is documented in DATA_SOURCES.md in the repository — including a
"dead ends" section listing the endpoints that no longer work, so nobody repeats the
search.
| Publisher | Dataset | Used for |
|---|---|---|
| British Geological Survey | Geology 625k bedrock (11,244 formations) | Subsidence |
| Met Office | Winter wind speed 5 km; wind-driven rain index 5 km (UKCP18 baseline) | Weather |
| Met Office | HadUK-Grid 1991–2020: ≥10 mm rain days, annual precipitation | Weather |
| Met Office | HadUK-Grid 1991–2020: annual air-frost days | Escape of water (freeze exposure) |
| Met Office MIDAS Open (via CEDA) | Station gust observations 1970–2025 → Gumbel-fitted 1-in-50 gust at 191 stations ≤300 m | Weather extremes |
| Environment Agency | NaFRA2 Risk of Flooding from Rivers and Sea, present day and climate change (England) | Flood |
| Natural Resources Wales | FRAW rivers, sea and surface water (Wales) | Flood |
| SEPA | River, coastal and surface-water flood maps (Scotland) | Flood |
| Environment Agency | NaFRA2 Risk of Flooding from Surface Water (England) | Flood |
| Environment Agency | NaFRA2 surface-water depth bands >0.2/0.3/0.6/0.9/1.2 m (England) | Flood severity |
| Environment Agency | NaFRA2 rivers and sea depth bands >0.2/0.3/0.6/0.9/1.2 m (England) | Flood severity |
| Environment Agency | Flood-risk postcode data — groundwater alert-area flags | Groundwater |
| Environment Agency | NCERM National 2024 coastal erosion frontages (England) | Erosion (not priced) |
| NatureScot | Dynamic Coast phase 2 FutureCoast erosion areas, RCP8.5-95th and RCP2.6, 2050 and 2100 (Scotland) | Erosion (not priced) |
| OS / Wikipedia derived | UK postcode district polygons (2,736 districts) | Geography |
| ONS | Postcode → OA/LSOA best-fit lookup (2.7m rows; the 33% that are terminated postcodes excluded) | Exposure weighting — 27.3m households |
| ONS (via NOMIS) | Census 2021 TS041 households by LSOA (England & Wales) | |
| National Records of Scotland | Scotland's Census 2022 household total | |
| police.uk | Street-level crime archive, latest 36 months — burglary points (England, Wales, BTP) | Theft |
| VOA | Non-domestic rating: stock of properties 2025 — premises counts by LSOA (England & Wales) | Theft residential share |
| statistics.gov.scot | Recorded Crime in Scotland — Group 3 housebreaking by council area, 2023–24 to 2025–26 | Theft (Scotland override) |
| ABI | Domestic claims paid by peril, 2025 (theft: 2018, the last published; escape of water: the "£1.8m a day" figure; fire: average-payout quote only) | Loss calibration |
| Home Office / MHCLG | Fire statistics: incident-level low-level-geography dataset (LSOA), FIRE0201 national series to 1981/82 | Fire frequency, geography and loading |
| SFRS / statistics.gov.scot | Dwelling fires by council area | Fire geography (Scotland) |
| Welsh Government / stats.gov.wales | Primary dwelling fires by fire and rescue authority | Fire geography (Wales) |
| ONS (via NOMIS) | Census 2021 TS003: households with dependent children by LSOA (England & Wales) | Accidental damage geography |
| National Records of Scotland | Scotland's Census 2022 UV113 by output area + the postcode→OA index with household weights | Accidental damage geography (Scotland) |
| Aviva / GoCompare (published figures, not open data) | Average AD payout by year; claims-mix shares; children's share of AD claims | Accidental damage calibration and driver |
A note on honesty in sourcing: HadUK-Grid's NetCDF files on CEDA require a
login, so the same HadUK-derived climatologies are taken from the Met Office's anonymous
Climate Data Portal instead. The gust extremes DO come from behind that login — MIDAS
Open needs a (free) CEDA account to download; without one, the repo's ERA5 fallback
(fetch_gusts.py) reproduces the pre-2026-08-10 gust surface instead.
Python 3.13. Every stage is deterministic — the simulation is seeded, so the same inputs reproduce the published figures exactly.
py -3.13 -m venv .venv
.venv/Scripts/python -m pip install -r requirements.txt
git clone --depth 1 https://github.com/missinglink/uk-postcode-polygons.git data/uk-postcode-polygons
.venv/Scripts/python scripts/fetch_bgs.py # BGS bedrock geology (~32 MB)
.venv/Scripts/python scripts/fetch_metoffice.py # 5 climate grids (incl. air-frost days)
.venv/Scripts/python scripts/fetch_flood_postcodes.py # river/sea risk bands at every postcode
.venv/Scripts/python scripts/fetch_sw_postcodes.py # surface water at every postcode
.venv/Scripts/python scripts/fetch_groundwater.py # groundwater alert flags
.venv/Scripts/python scripts/fetch_midas.py # MIDAS station gusts (CEDA token; ERA5 fetch_gusts.py = fallback)
.venv/Scripts/python scripts/fetch_history.py # 35yr ERA5 drivers, for the backtest
.venv/Scripts/python scripts/fetch_households.py # census households -> exposure weights
.venv/Scripts/python scripts/fetch_burglary.py # police.uk burglary points (1.7 GB archive, resumable)
.venv/Scripts/python scripts/fetch_premises.py # VOA non-domestic premises -> theft's residential share
.venv/Scripts/python scripts/fetch_fires.py # dwelling fires: England LSOA + Scotland + Wales
.venv/Scripts/python scripts/fetch_children.py # census dependent-children shares -> AD driver
.venv/Scripts/python scripts/build_model.py # scores + vine simulation (~15 min)
.venv/Scripts/python scripts/sensitivity.py # perturbed re-runs (~60 min)
.venv/Scripts/python scripts/build_map.py
.venv/Scripts/python scripts/build_analysis.py
.venv/Scripts/python scripts/build_site.py # assembles this website
One manual step: the EA flood-risk postcode CSV must be downloaded by
hand (its URL is in DATA_SOURCES.md) because it is served from a file-download
endpoint rather than an API.
The hazard inputs are real and current. The loss model is not calibrated. Specifically:
pyvinecopulib) rather than taking
the assumed θ(s) forms.