Skip to content

Split pensions, shares, trusts, ISAs and secured debt out of WAS wealth - #501

Draft
MaxGhenis wants to merge 5 commits into
mainfrom
was-wealth-split
Draft

MaxGhenis wants to merge 5 commits into
mainfrom
was-wealth-split

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Draft: waits on two policyengine-uk releases and a lock bump. This PR exports inputs the locked policyengine-uk 2.122.2 does not yet know:

test_wealth_split_dataset.py checks that the locked engine reads every new input. It fails until the lock moves to a release carrying both. Release-equivalent before/after builds are queued behind the shared heavy-run lock. Their measured impacts will replace the "Impact" placeholder.

What changes

The WAS round 8 wealth imputation (datasets/imputations/wealth.py):

  1. Pensions leave corporate_wealth. It was built as (total private pension wealth − current-employment DB) + employee shares + UK shares + investment ISAs + unit/investment trusts. Pension wealth was 84.7% of its weighted donor mass (£3,659bn of £4,318bn), and every means test disregards it (UC Regs 2013 Sch 10 para 10; HB Sch 6 paras 31-32; IS Sch 10 paras 23-23A; JSA Sch 8 paras 28-29; ESA Sch 9 paras 28-29; SPC Sch V paras 22-23). private_pension_wealth is now drawn in the chain slot the old column held.
  2. The share-like parts are exported. These are directly_held_shares (UK shares + employee shares and options), unit_and_investment_trusts (one WAS question) and stocks_and_shares_isa. corporate_wealth is now their exact sum, derived after imputation. cash_isa is exported too.
  3. Buy-to-let joins other_residential_property_value. Before this PR the column held second homes only (£254bn), and buy-to-let (£573bn) reached no capital input.
  4. Debt secured on non-main property is imputed for policyengine-uk#1969's inputs. Each debt is drawn after its asset and kept only where the household holds the asset:
    • other_residential_property_secured_debt = second-home + buy-to-let mortgages;
    • non_residential_property_secured_debt;
    • owned_land_secured_debt.
  5. Independent quantile draws. microimpute draws every target's quantile from one seed, so a household got one quantile for all eighteen chained targets. On the raw 2024-25 FRS, imputed debt secured on UK land came to £56.8bn across 0.19m households, against £1.3bn and 0.03m in the donor. Per-target seeds bring it to £7.0bn and 0.04m, non-residential debt from £51.8bn to £6.9bn, and savings from £1,890bn to £733bn.
  6. Model metadata. It records each derived target's sources and the draw seeds, so cached models retrain when either changes. The uprating rows for the new columns copy corporate_wealth's per-capita GDP index.

Donor against ONS (WAS round 8, GB, April 2020 to March 2022, own weighted sums of the EUL file)

Every published aggregate matches:

ONS cell ONS £bn WAS EUL £bn
total wealth (Table 2.1 K8) 13,568 13,567.6
gross property (3.9 J6) 6,727 6,726.8
property debt (3.9 J7) 1,266 1,266.2
gross financial wealth (5.12 K4) 2,061 2,061.0
net financial wealth (5.12 K6) 1,915 1,914.8
private pensions (6.11 K17) 4,808 4,807.7
active occupational DB (6.11 K4) 1,149 1,148.7

Holder counts also match ONS exactly:

Asset Households (thousands) ONS cell
second homes 980 3.2 J23
buy-to-let 1,349 3.2 J24
other buildings 158 3.2 J25
UK land 191 3.2 J26
other-property mortgages 1,201 3.6 J19
UK shares 3,054 5.1 K119
employee shares 1,423 5.1 K123
trusts 975 5.1 K124
S&S ISA 3,590 5.1 K115
cash ISA 8,980 5.1 K114

ONS publishes no component totals. Ours (£bn) are:

  • shares 217.1, of which UK 153.1 and employee 64.0;
  • unit and investment trusts 131.5;
  • S&S ISA 310.8;
  • cash ISA 218.5;
  • other residential property 826.9, of which second homes 254.3 and buy-to-let 572.6;
  • secured debt on other residential property 214.3, on buildings 5.7, on UK land 1.3.

ONS suspended WAS accreditation from round 8 (13 June 2025 notice). Against HMRC ISA Table 9.6 (GB-adjusted), WAS captures 69-79% of stocks and shares ISA value and 77-78% of cash ISA value.

Imputed totals still run above the donor. On the raw FRS they are about 1.5-2.5× the donor after this PR's draw fix. The causes are pre-existing predictor mismatches:

  • WAS council tax is not on an annual basis;
  • 2024 incomes are matched against 2020-22 donors;
  • WAS is_renting means private renters only;
  • the fit is unweighted.

These are tracked as a separate fix with findings in ~/reviews/uk-was-wealth-split-2026-09-30/overshoot/.

Impact (pending)

The builds below are queued: a release-equivalent local build of current main, then this branch, with PE_UK_DATA_OA_CLONES=1 and policyengine-uk 2.122.2 at build time, measured on policyengine-uk main and on the #1969/#1974/#2131 stack. An earlier pair on 9/30 code (shared draws, superseded) gave these results at 2025 on policyengine-uk main 41a996e:

  • UC 6.457m → 6.667m benefit units;
  • UC-eligible 10.39m → 15.79m;
  • benefit units over £16,000 of UC capital 22.9m → 15.4m;
  • folding pensions back in on the same weights cuts UC by 1.30m units and £11.6bn, and raises BHC poverty by 1.6 points.

Tests

  • test_wealth_split.py (Hypothesis):

    • every imputed target is built from the survey;
    • corporate_wealth is derived, not imputed;
    • each debt comes after its asset;
    • definitions and seeds are in the model metadata;
    • the mapping is checked component by component;
    • conservation: old corporate_wealth = new corporate_wealth + private_pension_wealth, and old other residential property + buy-to-let = new;
    • the derived outputs' identities hold;
    • every target draws independently.

    Four mutants fail it: no debt zeroing, no component clipping, pension left in, buy-to-let dropped.

  • test_wealth_split_dataset.py: the built-dataset and engine checks above.

Refs #452; PolicyEngine/policyengine-uk#1837, #1791 (merged), #1974, #1969, #2131; PolicyEngine/microcosm#1095 (port status).

axiom: n/a: data change

🤖 Generated with Claude Code

corporate_wealth was built as (WAS total private pension wealth less
current-employment DB) + employee shares + UK shares + investment ISAs +
unit/investment trusts, so 84.7% of its WAS round 8 mass (GBP 3,659bn of
4,318bn) was pension wealth, which every means test disregards (UC Regs 2013
Sch 10 para 10 and the legacy equivalents). policyengine-uk counts
corporate_wealth as capital, so imputed pensions failed claimants on the
GBP 16,000 limit.

The imputation now draws private_pension_wealth in the slot the old column
held, then directly_held_shares (UK + employee shares), unit_and_investment_
trusts and stocks_and_shares_isa, and builds corporate_wealth as their exact
sum. These are the parts DWP values differently: quoted shares less 10% for
costs of sale (ADM H1665), unit trusts with none (H1674), ISAs at withdrawal
value (H1656). cash_isa is exported too.

other_residential_property_value took only WAS second homes (DVHseValR8,
GBP 254bn) and left buy-to-let (DVBltValR8, GBP 573bn) out of every capital
input; it now holds both. The debt secured on each non-main asset class is
imputed after its asset for the policyengine-uk inputs that value capital
net of encumbrances (reg 49(1)(b)): second homes + buy-to-let, other
buildings and UK land, kept only where the household holds the asset.

The model metadata records how each derived target is built, so a cached
model retrains when a definition changes. Uprating rows for the new columns
copy corporate_wealth's per-capita GDP index.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
microimpute's QRF draws every target's quantile from the same seed, so each
household got one quantile for all eighteen targets. Chained on earlier
draws, that made sparse targets near-certain for households drawn high for a
related asset: on the raw 2024-25 FRS the imputed debt secured on UK land came
to GBP 56.8bn across 0.19m households (WAS donor GBP 1.3bn, 0.03m), and
non-residential property debt GBP 51.8bn (donor GBP 5.7bn). Each target now
gets its own seed after fitting (recorded in the model metadata, so cached
models retrain): land debt falls to GBP 7.0bn across 0.04m households,
non-residential debt to GBP 6.9bn, and savings from GBP 1,890bn to GBP 733bn
(donor GBP 457bn on 7% fewer households).

docs/imputations.md: overseas property and shares are not exported
separately but are inside the property and financial totals (review nit).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 2 commits October 12, 2026 10:15
On the built Enhanced FRS: corporate_wealth equals its components, each
secured debt appears only with its asset, the locked policyengine-uk reads
every new input at its stored weighted total, deducts each debt from the asset
it is imputed for, and keeps corporate_wealth as the share-like capital block.
The engine checks need the policyengine-uk releases carrying #1974 and #1969;
this PR stays a draft until the lock moves to them (UK hub review of 2ad43a6).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main already pins hypothesis>=6.168.3; the unversioned entry this PR added
before the merge duplicated it (review of 23d1027).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant