Repository navigation
Conversation
…with OBR receipts Corporate SDLT (HMRC buyer-type tables) now runs to 2024-25 and business rates to 2025-26 (Wales 2024-25); both grow with OBR March 2026 receipts forecasts by property type / nation. NI business rates were total rates (domestic and non-domestic); they are now LPS non-domestic rates paid. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tions - test_corporate_receipts_statistics: outturn equals the published tables, growth equals ratios of the OBR's published receipts, projections track them, shares within each line are invariant (Hypothesis), and the microsimulation allocates each statistic once (and holds it at the latest outturn under no_economic_assumptions). - corporate_sdlt.yaml: expectations for the 2026-27 statistic (£5,982.55 per 1e-6 shareholding), derived from the HMRC and OBR cells. - programs.yaml: business rates verified to 2030. - fiscal_partition.yaml: data notes on the business rates head (includes NI, which the OBR records under other taxes) and the household SDLT head (calibrated to the OBR total; policyengine-uk-data#564). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s; address review - England central list (Main Non-Domestic Rating Accounts) and Wales central list (StatsWales), which councils' figures exclude; GB statistics now sum to within 1% of the OBR's Business rates line in 2024-25 and 2025-26. - England 2019-20 and 2020-21 from MHCLG's November 2025 revised data. - Document the Welsh Covid-year relief treatment, NI's 2020-21 start, the 2039 index horizon, the 2024 index anchor and the SDLT shares assumption. - Tests: central lists, NI = LPS total less domestic, GB coverage of the OBR line, flat after 2039, explicit no_economic_assumptions cutoff guard. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The aggregate impact report (#2335) adds gov_spending, household_benefits and spending_heads to fiscal_partition.yaml. The tax tests now check the three tax totals only, require that spending heads borrow no tax head id or variable and that no spending head names a tax total, and apply dropped_when to the tax totals alone. Checked against #2335's file with these tax sections merged in: this file's tests and #2335's partition and guard tests pass. The vat head records that 76 households have negative VAT on policyengine-uk-data 1.58.0 (consumption or the full-rate expenditure share is negative in the data; policyengine-uk-data issue 565). Refs #2159 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…R lines Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… rates statistics Comment-only (review round 2, findings 2 and 3). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
force-pushed
the
fix/corporate-sdlt-double-count
branch
from
October 11, 2026 23:32
5f08c24 to
47eb1f7
Compare
33 of 69 tasks
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #2320
Summary
corporate_sdlt,business_ratesandbaseline_business_ratesallocate receipt statistics to households byshareholding. Those statistics stopped in 2018-2021 and were held flat in every later year. This PR:On certified data in 2026-27:
gov_taxandhousehold_taxrise by £9.16bn, and household net income falls by the same amount. The rise is £4.63bn in 2025-26 and £17.14bn in 2030-31.Every figure comes from real runs, shown below.
Known overlap. £2.85bn of the 2026-27 change is corporate SDLT, which overlaps household SDLT until policyengine-uk-data#564 lands; see "SDLT calibration overlap" below.
Stacked on #2235 (base
fix/corporate-sdlt-double-count). Retarget tomainwhen #2235 merges.Sources
Every value was read from the published file.
extract_values.pyregenerates them all with sheet and cell references. A separate blind extraction, which was not shown these values, read 666 cells from the same publications, and every value it covers matches. Where it found later revisions or extra series, they are adopted below. It did not cover the England central list. Its seven accounts were checked against the published PDFs: each account's prior-year column equals the previous account's figure, and the round-2 reviewer confirmed 2023-24 to 2025-26 on gov.uk.Checks.
What was wrong with the old values
business_ratescontained NI domestic rates, whichdomestic_ratesalready charges. LPS's total less domestic equals its non-domestic series in every year to within £1; a test enforces this.Projection
The new series sit in
gov.economic_assumptions.yoy_growth.obr:stamp_duty_land_tax.residentialandstamp_duty_land_tax.non_residential, from Table 3.7;business_rates.great_britain, from Table 3.8;business_rates.northern_ireland, from Table 3.2.Each value is the ratio of consecutive published levels, to six decimals:
average_earnings's long-run path, because the OBR forecasts receipts only to 2030-31.Each outturn statistic declares
uprating:, and core uprating scales its last outturn value by the index ratio:Why growth rates in
yoy_growthrather than levels elsewhere: the projection then behaves like the model's other OBR series. In particular,no_economic_assumptionsholds it at the latest outturn, which is tested.Caveats
2024-25 is outturn. 2025-26 is outturn except for Wales, which is projected. Later years are projected.
Data notes, recorded in the YAML
business_ratesallocates every list's receipts by shareholding. That includes ratepayers such as Network Rail (£10.5m) and Dwr Cymru (£17.0m) on the Welsh central list in 2024-25.programs.yamlnow verifies from 2020.Interactions checked
corporate_tax_incidence(=corporate_sdlt+business_rates).hbai_excluded_income(= −corporate_tax_incidence).baseline_business_ratesnow sums the six series;business_ratesshares its formula. All move exactly with the statistics: the microsimulation test checks weighted totals, and the real runs show identical changes. HBAI household net income doesn't change, so poverty doesn't either.data_notes:business_rates: GB £37.26bn against the OBR's £37.41bn in 2026-27. NI is £0.78bn against the OBR's £0.40bn NI line, which the OBR records under other taxes.sdlt_household: the calibration overlap, below.1.58.0,targets/sources/obr.pylocates the current-receipts sheet by title and maps the OBR's total "Stamp duty land tax" to householdstamp_duty_land_tax.corporate_sdltadds again.corporate_sdlt.yaml. Expectations move from £3,130 to £5,982.55 per 1e-6 of shareholding, derived in the file header from the HMRC and OBR cells. Margins are £0.50, because the model chains six-decimal growth into a five-decimal index and lands within £0.10.programs.yaml. Business rates is now verified 2020-2030, with notes on the method. It was 2019-2021, "Parameters need updating beyond 2021".Invariants (tests in
test_corporate_receipts_statistics.py)average_earningsgrowth through 2045.corporate_sdltequals the corporate SDLT statistic;business_ratesandbaseline_business_ratesequal the business rates statistic;corporate_tax_incidenceis their sum andhbai_excluded_incomeits negative.no_economic_assumptions, both statistics hold at the latest outturn. The test asserts the scenario's cutoff assumption explicitly.Tests run
test_corporate_receipts_statistics.py: 141 passed.stamp_duty/andexcise_integrationYAML: 24 passed. Partition tests: 39 passed.test_sdlt_counted_once_properties.py,test_import_obr_forecasts.py,test_lagged_series.py,test_council_tax_uprating.py,test_threshold_indexation.pyandtest_fiscal_year_parameters.py: 180 passed.main, so it is dispatched manually.test_dataframe_dataset.py::test_an_exported_frame_loads_back_and_exports_itself. That test also fails onmain(run 38143054188, 7343f94); the UK hub is fixing it (Exported input DataFrame no longer round-trips: main CI fails test_an_exported_frame_loads_back_and_exports_itself #2333).National impact (real runs)
Setup.
enhanced_frs_2024_25.h5, sha2565ba399ea5ab9a6c7d4e9aaf6c623080beb34d9ad5f330f6244dbad72b8d960b6.Microsimulationruns at current law, 2 versions × 6 years. No scaling.corporate_sdlt, base → headbusiness_rates, base → headgov_tax,household_tax,pre_budget_change_household_tax,gov_balance,corporate_tax_incidencehousehold_net_income(BHC and AHC),hbai_excluded_incomehbai_household_net_income,stamp_duty_land_tax,expected_sdltChecks, every year.
corporate_sdltandbusiness_ratesequal their statistics to within £0.01m.Distribution. Head − base, household net income per household, weighted mean £, by decile:
Both statistics are allocated by
shareholding, so the change grows with corporate wealth.Not changed here (follow-ups)
import_obr_forecasts.pyshould refresh these growth series when a new EFO lands. This is a chip.residential.household.first_time_buyers_reliefandtransactions_by_age(2020-21) are kept verbatim.Review
Round 1 (independent review, Opus 5.5): REQUEST_CHANGES, with 14 findings. The responses, finding by finding:
Round 2 (same reviewer): APPROVE. All four major findings are resolved.
axiom: n/a: official receipts statistics and OBR forecasts used for corporate incidence, not law
🤖 Generated with Claude Code