Skip to content

Project the gambling duty bases with the OBR's October 2026 betting and gaming forecast - #2761

Draft
MaxGhenis wants to merge 20 commits into
mainfrom
fix-2738-gambling-bases
Draft

MaxGhenis wants to merge 20 commits into
mainfrom
fix-2738-gambling-bases

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2738

What and why

No gambling input declared an uprating index, so dataset projection held each of the sixteen inputs at its 2024-25 cash level in every later year. This PR gives the seven betting and gaming duties a base series each and grows every input by its duty's series:

  • Each input in policyengine_uk/variables/input/consumption/gambling/ declares gov.economic_assumptions.indices.obr.per_capita.gambling_duty_bases.<duty>, and policyengine_uk/data/uprating_indices.yaml maps it to the same yoy_growth series for dataset projection. Charge higher-stake machines at the Machine Games Duty higher rate from April 2027 #2731's machine_games_standard_rate_higher_stake_net_takings takes the Machine Games Duty index, like the standard-rate input it belongs to.
  • policyengine_uk/utils/import_obr_forecasts.py writes the seven series from RECEIPTS_SERIES_SPECS, beside the SDLT and business rates series. Each series runs from HMRC's 2024-25 receipts (index 1) to their 2025-26 outturn, then through the OBR's October 2026 forecast in receipts Table 4.10, "Betting and gaming duties forecast breakdown" (2026-27 to 2031-32), then along the average_earnings path.
  • The series divides each year's receipts by the rate in the model's own parameter files, averaged by day over the OBR's 1 April to 31 March year. The model then applies its own rate changes once. A base grown with receipts would carry Remote Gaming Duty's rise to 40%, and the formula would charge 40% on it again.
  • Each series holds the base's growth per person: one plus the base's growth, over one plus ons.population growth, minus one, to six decimals. Dataset projection grows household weights by ons.population, so the weighted inputs grow with each duty's base. Remote Gaming Duty's base grows 9.38% into 2026-27, and its series 9.16% as population grows 0.20%. A series that held the base's own growth would count population growth twice, and the weighted bases would exceed Table 4.10 by 1.54% in 2031-32.
  • After 2031-32 the base grows with average_earnings, or holds flat for Bingo Duty, and the importer divides that growth by population growth in every year to 2073, the last year ons.population states. Past PROJECTION_END_YEAR (2032), policyengine-core scales each input by its index and each household weight by the population index, so the weighted inputs keep that path until the cumulative indices stop. Those indices end in 2039 today, so inputs and weights freeze from 2040. Derive economic assumption index horizon from the growth series #2756 carries them through 2074, and on a merge with that branch every gambling index reaches 2074 with no change here.

The importer reads every rate from the model's parameter files:

Duty Parameter Rates
Remote Gaming Duty gov.hmrc.gambling_duty.remote_gaming.rate 21% from 2019-04-01; 40% from 2026-04-01
General Betting Duty, remote gov.hmrc.gambling_duty.general_betting.rates.remote 15% from 2014-12-01; 25% from 2027-04-01
General Betting Duty, fixed odds and exchange ...general_betting.rates.fixed_odds, .exchange_commission 15%
Bingo Duty gov.hmrc.gambling_duty.bingo.rate 10% from 2014-07-01; 0 from 2026-04-01
Machine Games Duty ...machine_games.rates.lower, .standard, .higher and ...machine_games.higher_stake_machines_at_higher_rate 5%, 20%, 25%; higher-stake machines at 25% from 2027-04-01 (#2731)
Lottery Duty gov.hmrc.gambling_duty.lottery.rate 12%
Pool Betting Duty gov.hmrc.gambling_duty.pool_betting.rate 15%
Gaming Duty household.consumption.gambling.casino_effective_rate 0.235487 (the household formula's one effective rate)

How the rate effects come out

The equations round receipts and rates for display, and each result comes from the unrounded figures.

  • Remote Gaming Duty. The OBR forecasts £2,752.0 million for 2026-27 in Table 4.10, against HMRC's £1,321.0 million for 2025-26, so receipts grow 108.3%. The base grows (2,752.0 / 40%) / (1,321.0 / 21%) − 1 = 9.3757%.

  • General Betting Duty. The remote part makes up 45.47% of the 2024-25 base, so the rate on the whole base rises from 15% to 15% + 10% × 45.47% = 19.55% in 2027-28. Receipts grow 33.8% (£655.6 million to £877.4 million), and the base grows (877.4 / 19.55%) / (655.6 / 15%) − 1 = 2.7038%. The importer holds fixed the shares from Microcosm's split of HMRC's 2024-25 receipts by the Gambling Commission's 2024-25 gross gambling yield. Microcosm applies the Commission's remote horse racing share to all remote fixed odds and puts that part in the UK horse racing input at 15%, so the part at 25% may be larger, and the 2.70% would then overstate the base's growth. Microcosm gives spread betting no part, so the two spread-betting inputs take the duty's index with no weight in it.

  • Machine Games Duty. From 1 April 2027 the model charges the higher-stake part of the standard-rate base at 25% (Charge higher-stake machines at the Machine Games Duty higher rate from April 2027 #2731), and the OBR includes that rise in Table 4.10's line. The OBR says it "increases receipts by a further estimated £0.1 billion a year from 2027-28" (EFO paragraph 4.45). The series divides the line by a rate that charges 90.78% of the standard-rate base at 25% from 2027-28 (see the share below). The importer weights each band by HMRC's 2024-25 liabilities over its rate, so the rate on the whole base rises from 19.35% to 23.68%. Receipts grow 22.1% into 2027-28 (£677.1 million to £826.9 million), and the base falls by (826.9 / 23.68%) / (677.1 / 19.35%) − 1 = −0.2319%. The importer reads the switch date and the rates from their parameter files, so the series and the formula read the same dates and rates.

    In its policy Table 1.1, the OBR joins two costings as measure 56, under the head Betting: the 25% rate, and the move of liability to machine suppliers from April 2028. The Treasury nets off a behavioural response in its rate costing, with an elasticity of −0.95, a quarter of the stakes lost moving to Remote Gaming Duty, and general attrition. It estimates that moving liability to suppliers reduces non-compliance and brings payments forward (Budget 2026 policy costings, pages 67 and 68). Dividing the line by the rate that produced it keeps all of these in the base, as receipts over the rate does for every other duty. Taking the measure off the line would drop them, and the model's static rates restore none of them.

  • Bingo Duty. Parliament abolished the duty from 1 April 2026, and a zero rate leaves no base to divide out, so the importer keeps the base at its 2025-26 level from 2026-27 on: the weighted index stays at 1.0333 while the per-person series falls as population grows. Current-law receipts come to zero whatever the base, so the model leaves out the £0.19 million of 2026-27 receipts the OBR forecasts, which a zero rate cannot produce. A reform that charges Bingo Duty again charges the 2025-26 base in cash terms.

  • Gaming Duty. The parameters hold marginal bands, but the household formula multiplies losses by one constant effective rate. The base therefore grows with receipts, and any change in the effective rate that the OBR forecasts stays in the base.

  • Lottery Duty and Pool Betting Duty. One unchanged rate each, so the base grows with receipts.

The higher-stake share

MACHINE_GAMES_HIGHER_STAKE_SHARE in the importer holds the share of standard-rate takings from machines with a maximum charge above £1 or a maximum prize above £100: 90.78%. It equals the Gambling Commission's 2024-25 gaming machine yield in Category B, £2,289.8 million, over that in Categories B and C, £2,522.3 million (Industry Statistics, April 2025 to March 2026, sheet 4, cells K34 and L34, revised figures; workbook SHA-256 a6ea23b5ddff2f3839ebec2a8cc0d9a0817e218f5bf10921e0172ecae768da58). Under the Categories of Gaming Machine Regulations 2007, regulation 5, a Category B machine falls outside Categories C and D, and the Commission gives Category C's limits as a £1 charge and a £100 prize. Category D enters neither side. Its money-prize machines charge at most 20p for at most £10 in cash, which puts them in the lower-rate class (Finance Act 2012, Schedule 24, paragraph 5(2)). Its other machines pay no cash prize, so their games fall outside the duty (paragraph 2(2)).

The Commission's statistics cover the premises it licenses in Great Britain: arcades, betting shops, bingo halls and casinos. They leave out pubs, which may hold only Category C and D machines; members' and commercial clubs, which may also hold Category B3A or B4 machines; and Northern Ireland. HMRC's 2024-25 standard-rate liabilities, £604.7 million at 20%, give a UK base of £3,023.7 million, which exceeds the Commission's Category B and C yield by £501.4 million (16.6% of HMRC's base). Differences in definition and timing between gross gambling yield and dutiable net takings may account for part of that gap. Leaving out pubs' Category C and D machines, which never pay the higher rate, pushes the share up, though skill-with-prize machines there fall outside the categories. Leaving out clubs' taxable Category B4 machines pushes it down; legally operated Category B3A lottery machines pay no duty. If the whole gap stayed at 20%, the share would fall to 75.73% and the 2027-28 base index would rise by 3.13%; that figure shows the sensitivity and sets no bound. The Commission's provisional 2025-26 figures give 91.41%. The importer holds the 2024-25 share in every year, as it does the band weights.

Datasets without the higher-stake input

No dataset supplies machine_games_standard_rate_higher_stake_net_takings yet, and neither Microcosm's main nor policyengine-uk-data's mentions it. Microcosm's Budget data list tracks the split as item 5. Until one does, machine_games_duty charges the pre-Budget rates on the post-response base, so it falls short of Table 4.10 by 18.3% from 2027-28: the duty equals Table 4.10's line times 19.35% / 23.68%. Two constructed households, weighted 700 and 1,900, hold the 2024-25 national bases between them, and their weighted duty comes to:

£ million 2027-28 2028-29 2029-30 2030-31 2031-32
Table 4.10 826.9 857.0 865.2 875.5 896.3
Higher-stake input at 90.78% 826.9 857.0 865.2 875.5 896.3
Higher-stake input absent 675.5 700.0 706.8 715.2 732.2
Shortfall without the input −151.4 −156.9 −158.4 −160.3 −164.1

A dataset that sets the input to 90.78% of its standard-rate input closes the gap.

Where the base-year link comes from

October 2026's Table 4.10 starts in 2026-27, and the March 2025 tables have no betting and gaming breakdown, so the years before 2026-27 come from HMRC's UK Betting and Gaming Statistics, July 2026 tables: Table_1_BG_receipts rows 45 (2024-25) and 46 (2025-26), £ thousand. The local copy's SHA-256, 3979df37c0611cce371f80950bacac6bc5e9dad499c726f6138f838c882914e8, matches the hash docs/engineering/gambling-duties.md already cites for that file. The Machine Games Duty band weights come from the same file's Table_2_MGD row 20 (2024-25 liabilities by rate).

The OBR figures come from the receipts workbook in the October 2026 detailed forecast tables zip (EFO page), SHA-256 d115705716d77b11c190385d41cb1924f30080c9331a8a386c04d4e65a368e95. The reduced test fixture's Table 4.10 worksheet and shared strings match that workbook's byte for byte.

Approximations

  • HMRC reports cash receipts, and the OBR reports accrued receipts in Table 4.10. That table's totals equal Table 4.1's "Betting and gaming taxes", whose note reads "All taxes are on an accrued basis." Growth into 2026-27 compares accrued 2026-27 receipts with cash 2025-26 receipts.
  • Model years run from 6 April and the OBR's from 1 April, so a model year that takes in 1 to 5 April of a rate change charges those days at the new rate. FY2025 Remote Gaming Duty exceeds HMRC's receipts by 1.24%, FY2026 General Betting Duty exceeds Table 4.10 by 0.42%, and FY2025 Bingo Duty falls short of HMRC's receipts by 1.37%. With the higher-stake input at its share, FY2026 Machine Games Duty exceeds Table 4.10 by 0.31%.
  • The OBR's receipts already include behaviour. The OBR says in paragraph 4.45 that receipts exceed March's "largely due to stronger-than-expected remote gaming duty receipts, suggesting a slower-than-expected reduction in activity in response to the rate increase". That response stays in the base, so the model scores a reform to these rates statically on the post-response base.
  • The OBR has Lottery Duty receipts falling 15.3% into 2026-27 (£980.1 million to £830.5 million) with no rate change. In March 2026 it forecast £1,008.6 million for the same year in Table 3.10, its October policy table lists no lottery measure, and it gives no reason in paragraph 4.45. The series follows the OBR. Pool Betting Duty's index falls 65% by 2026-27 (£8.1 million, £4.0 million, then £2.8 million of receipts).

Indices by year

The model compounds each committed yoy_growth series into an index and rounds it to five decimals. The per-person indices, with the ons.population index over its 2024 level:

Duty 2024-25 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32 2032-33
Remote Gaming 1.00000 1.13254 1.23625 1.24777 1.27271 1.29851 1.31280 1.31789 1.35247
Lottery 1.00000 1.04831 0.88652 0.90577 0.93200 0.95953 0.98476 1.01122 1.03776
General Betting 1.00000 0.95572 0.91355 0.93703 0.97755 1.00921 1.03623 1.06308 1.09098
Machine Games 1.00000 1.04868 1.10546 1.10146 1.13952 1.14813 1.15885 1.18355 1.21461
Gaming 1.00000 1.04796 1.04784 1.11045 1.11069 1.10984 1.11321 1.10561 1.13462
Bingo 1.00000 1.02989 1.02783 1.02650 1.02476 1.02261 1.02006 1.01762 1.01539
Pool Betting 1.00000 0.48701 0.34633 0.32771 0.34890 0.34558 0.36401 0.37889 0.38883
Population 1.00000 1.00330 1.00530 1.00661 1.00832 1.01044 1.01296 1.01539 1.01762

A weighted input grows by their product, the base's index:

Duty 2024-25 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32 2032-33
Remote Gaming 1.00000 1.13628 1.24280 1.25601 1.28330 1.31206 1.32981 1.33817 1.37630
Lottery 1.00000 1.05177 0.89122 0.91175 0.93975 0.96954 0.99752 1.02678 1.05605
General Betting 1.00000 0.95887 0.91839 0.94322 0.98568 1.01974 1.04966 1.07944 1.11020
Machine Games 1.00000 1.05214 1.11132 1.10874 1.14900 1.16011 1.17387 1.20176 1.23601
Gaming 1.00000 1.05142 1.05339 1.11779 1.11993 1.12142 1.12764 1.12262 1.15461
Bingo 1.00000 1.03329 1.03328 1.03328 1.03328 1.03328 1.03328 1.03328 1.03328
Pool Betting 1.00000 0.48862 0.34817 0.32987 0.35180 0.34919 0.36873 0.38472 0.39568

Expected change in gambling duty receipts

These figures come from a run on two constructed households, weighted 700 and 1,900, not the Enhanced FRS. Between them they hold the 2024-25 national bases that give HMRC's 2024-25 receipts at the model's rates, with General Betting split as Microcosm's national levels and Machine Games Duty by HMRC's band liabilities, and each figure sums the households' duty times their weight. Rows marked "input at 90.78%" set the higher-stake input to that share of the standard-rate input; rows marked "absent" leave it out. The main rows run an export of origin/main at 2da212abc, and the "this PR" rows run dbba5aef5, whose series the head keeps value for value. On main the inputs stay at their 2024-25 cash level while household weights grow with population, so receipts move with rate changes and population alone.

With the input at 90.78%, the seven duties reproduce HMRC's 2025-26 receipts and then Table 4.10 in every year to 2031-32, apart from the 6 April overlaps above. In 2026-27 the total exceeds Table 4.10's £5,092.5 million by £4.6 million; from 2027-28 it matches to the £0.1 million. policyengine-uk-data's main implements no mapping for the gambling inputs, and CI's aggregate impact report on the certified dataset shows no change in any reported year, 2025-26 to 2031-32.

£ million 2024-25 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32 2032-33
Remote Gaming, main 1,162.5 1,180.8 2,226.1 2,229.0 2,232.8 2,237.5 2,243.1 2,248.5 2,253.4
Remote Gaming, this PR 1,162.5 1,337.3 2,752.0 2,781.3 2,841.7 2,905.4 2,944.7 2,963.2 3,047.7
Remote Gaming, change +0.0 +156.5 +525.9 +552.3 +608.9 +667.9 +701.6 +714.7 +794.2
Lottery, main 931.9 935.0 936.8 938.1 939.6 941.6 944.0 946.2 948.3
Lottery, this PR 931.9 980.1 830.5 849.7 875.7 903.5 929.6 956.9 984.1
Lottery, change +0.0 +45.2 -106.3 -88.4 -63.9 -38.1 -14.4 +10.6 +35.8
General Betting, main 713.9 716.2 720.6 936.4 938.0 940.0 942.3 944.6 946.7
General Betting, this PR 713.9 684.5 658.3 877.4 916.9 948.6 976.5 1,004.2 1,032.8
General Betting, change +0.0 -31.7 -62.3 -59.0 -21.1 +8.7 +34.1 +59.6 +86.1
Machine Games, main, input at 90.78% 609.2 611.3 614.4 750.8 752.0 753.6 755.5 757.3 759.0
Machine Games, main, input absent 609.2 611.3 612.5 613.3 614.3 615.6 617.1 618.6 620.0
Machine Games, this PR, input at 90.78% 609.2 641.0 679.2 826.9 857.0 865.2 875.5 896.3 921.9
Machine Games, this PR, input absent 609.2 641.0 677.1 675.5 700.0 706.8 715.2 732.2 753.0
Machine Games, change, input at 90.78% +0.0 +29.8 +64.8 +76.2 +104.9 +111.6 +120.0 +139.0 +162.9
Machine Games, change, input absent +0.0 +29.8 +64.6 +62.2 +85.7 +91.2 +98.0 +113.5 +133.1
Gaming, main 165.4 165.9 166.3 166.5 166.8 167.1 167.5 167.9 168.3
Gaming, this PR 165.4 173.9 174.2 184.9 185.2 185.5 186.5 185.7 191.0
Gaming, change +0.0 +8.0 +8.0 +18.4 +18.5 +18.4 +19.0 +17.7 +22.7
Bingo, main 25.2 25.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Bingo, this PR 25.2 25.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Bingo, change +0.0 +0.7 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0
Pool Betting, main 8.1 8.2 8.2 8.2 8.2 8.2 8.2 8.3 8.3
Pool Betting, this PR 8.1 4.0 2.8 2.7 2.9 2.8 3.0 3.1 3.2
Pool Betting, change +0.0 -4.2 -5.3 -5.5 -5.3 -5.4 -5.2 -5.1 -5.1
All seven, main, input at 90.78% 3,616.3 3,642.3 4,672.4 5,028.9 5,037.4 5,048.0 5,060.6 5,072.8 5,083.9
All seven, this PR, input at 90.78% 3,616.3 3,846.6 5,097.1 5,522.9 5,679.4 5,811.1 5,915.7 6,009.3 6,180.6
All seven, change, input at 90.78% +0.0 +204.2 +424.7 +494.0 +642.0 +763.1 +855.1 +936.6 +1,096.7
All seven, this PR, input absent 3,616.3 3,846.6 5,095.0 5,371.4 5,522.5 5,652.6 5,755.4 5,845.2 6,011.8

Invariants

These hold for every input:

  1. Every index stays positive, and every index equals 1 in 2024 (test_indices_are_positive_from_the_2024_base_year). The importer refuses a series whose six-decimal growth would round the model's five-decimal index to zero, and for any positive receipts, however small, every series it writes keeps that index above zero. A Hypothesis property over the importer checks this on 60 examples (test_a_written_series_keeps_every_index_positive); test_a_fall_that_rounds_the_index_to_zero_is_refused pins a fall from £1,000bn to £0.01bn as the rate rises from 1% to 60%. The importer then compounds each finished series, earnings tail included, as the model does, through 2074, a year past the growth file's last entries, and refuses one that reaches zero (test_a_tail_that_rounds_the_index_to_zero_is_refused, test_the_index_check_reaches_the_end_of_the_growth_file, test_the_index_check_reads_the_value_in_force_each_january). That check reads the per-person series the importer writes: if population triples in 2028 and 2029, a Bingo Duty index that holds at 0.00002 falls to zero per person, and the importer refuses it (test_the_index_check_reads_the_per_head_series).
  2. For any positive receipts, dated rates and switch dates, one plus a year's base growth, times the rate's growth, equals the receipts' growth to the six decimals written. A zero rate in the year or the year before holds the base flat, and scaling every rate by one factor changes no growth (test_base_growth_is_receipts_growth_over_rate_growth, 40 examples).
  3. For any higher-stake share and any receipts path, a Machine Games Duty base that gives 2024-25's receipts gives every later year's receipts, within the rounding of the written growth. The rate charges that share at 25% from 2027-28 (test_machine_games_bases_reconcile_to_receipts_at_any_share, 60 examples). £100 of higher-stake takings at 20% and £80 at 25% pay the same £20, so flat receipts give a base index of 0.8 and £20 of duty. test_a_rise_that_behaviour_offsets_gives_a_base_index_of_0_8 checks the index, and test_a_rise_that_behaviour_offsets_leaves_the_duty_where_it_was checks the model's duty.
  4. A share of zero grows the Machine Games Duty base with receipts, the plain rule of receipts over an unchanged rate, and gives the same series as the three bands alone (test_a_zero_share_grows_the_machine_games_base_with_receipts, 40 examples).
  5. For any gambling receipts and any ons.population series, ending in any year from 2025 to 2045, one plus a written series' growth, times one plus population growth, equals one plus the base's growth in every year to 2060, to the rounding of the six decimals written. The base grows by receipts over the rate in the forecast years and by average_earnings after them, and holds flat while its rate is zero. The per-person index, compounded with the population index, therefore gives the base's index, and a second run changes nothing (test_per_head_series_compound_to_the_aggregate_index, 40 examples).
  6. A rate reform leaves every projected base unchanged and moves each duty through its rates alone: Remote Gaming Duty, remote betting, and Machine Games Duty's standard and higher rates with the higher-stake switch on or off (test_a_rate_reform_moves_receipts_through_the_rate_alone, a Hypothesis property over the model).
  7. Two households, weighted 700 and 1,900, hold between them the bases that give HMRC's 2024-25 receipts, with the higher-stake input at its share. Projected by extend_single_year_dataset, their weighted duty gives HMRC's 2025-26 receipts and then Table 4.10 in every year to 2031-32 for all seven duties, apart from the 6 April overlaps (test_bases_that_give_hmrc_receipts_give_the_obr_forecast). Without the input, Machine Games Duty falls short by 18.3% from 2027-28 (test_without_the_higher_stake_input_the_duty_falls_short_of_table_4_10).
  8. Each of the sixteen weighted inputs grows with its duty's national base, within 1e-4, in every year to 2039: through extend_single_year_dataset to 2032 and policyengine-core's uprating after it (test_weighted_gambling_bases_follow_the_aggregate). Bingo Duty's weighted index holds at its 2025-26 level to 2039, and in every year to 2074 one plus its per-person growth, times one plus population growth, equals one (test_bingo_base_holds_flat_once_its_rate_is_zero).
  9. The model charges the rate the importer divides by. The test sets every gambling rate parameter to its own value for 2029-30, with the switch on and then off. A household holding the national bases then pays, over each duty's base, the rate the importer divides that duty's receipts by (test_each_series_charges_the_rates_the_model_charges). The model's formulas decide which rate each input pays, so the test fails when a series wires a part to another parameter or weights it as another part.
  10. Dataset projection agrees with policyengine-core. Dataset projection compounds the yoy_growth series through uprating_indices.yaml, and Core scales a situation input by the ratio of the declared index. The two agree within 1e-4 for all sixteen inputs in every year from 2024 to 2032, and Remote Gaming Duty's 2026 input equals its 2024 input times the base's growth over population growth (test_dataset_projection_matches_core_uprating).
  11. The importer, run on the real October 2026 Table 4.10, HMRC's outturn and the committed ons.population, reproduces the committed series (test_real_october_2026_gambling_series, test_committed_gambling_series_are_the_real_bases_per_head, test_october_2026_tables_reproduce_the_committed_series, test_real_receipts_workbooks_reproduce_committed_yaml_byte_for_byte). I recomputed the seven Machine Games Duty base growth values by hand from the original OBR, HMRC and Gambling Commission workbooks, without the importer's code, and every one matches; base times rate then reproduces Table 4.10 within £0.002 million in each year.

Test plan

The head adds one commit to d08fbb6f1, which changes a comment and the documentation, and CI runs the whole suite on it. I ran each file on its own at d08fbb6f1 without survey data (HUGGING_FACE_TOKEN and POLICYENGINE_UK_DEFAULT_DATASET unset), under a 4 GB memory cap and a 1,500-second time cap.

File Result
policyengine_uk/tests/test_gambling_duty_base_projection.py 23 passed
The same file on a main export (2da212abc) fails to collect: main has no MACHINE_GAMES_HIGHER_STAKE_SHARE
policyengine_uk/tests/test_import_obr_forecasts.py 127 passed
code_health/test_uprating_declarations.py, test_input_variable_definitions.py, test_variables.py, test_test_module_caches_released.py, test_cached_arrays_not_written_in_place.py 8, 2, 2, 5 and 36 passed
code_health/test_changelog_fragments.py 103 passed
test_population_vintage.py, test_projection_horizon.py, test_parameter_descriptions.py 95, 14 and 24 passed
test_machine_games_higher_stake.py, test_gambling_schedules.py, test_gambling_additional_schedules.py 10, 9 and 5 passed
.github/check_changelog_fragments.py --base origin/main --head HEAD "Changelog fragments OK."

test_changelog_fragments.py ran with towncrier 26.9.0 importable, since the shared environment lacks it. Lint passes on all 20 changed Python files: ruff 0.17.2 format --check and check, check --select F811,F821 policyengine_uk, and git diff --check.

I ran each mutant in a scratch copy of d08fbb6f1 under a 2 GB memory cap and committed none. For each I ran test_import_obr_forecasts.py twice, against the committed series and after regenerating yoy_growth.yaml with the mutant importer, and ran the 17 projection tests that read the series against the regenerated file.

Mutant Change Importer failures, committed series Importer failures, regenerated series Projection failures, regenerated series
1 Remove the division 12 5 14
2 Divide by one plus population growth twice 12 5 14
3 Divide by the previous year's population growth 12 5 14
4 Leave Lottery Duty's series on the aggregate path 9 3 2

All four fail test_weighted_gambling_bases_follow_the_aggregate, test_gambling_series_are_written_per_head, test_committed_gambling_series_are_the_real_bases_per_head and test_per_head_series_compound_to_the_aggregate_index.

The importer's receipts tests for SDLT and business rates keep their expected values. The gambling tests now read the series under per_capita, and the importer test fixture holds them there, with an ons.population series that changes in 2026 and 2030.

  • For policy changes: not applicable. This projects data inputs and changes no rule; the series come from the OBR's and HMRC's published tables and the Gambling Commission's statistics.
  • make format (ruff 0.17.2 format and check on every changed Python file)
  • Changelog fragment changelog.d/2738.fixed.md

Overlap and merge order

Reproducer

Reproducer: policyengine_uk/tests/test_gambling_duty_base_projection.py::test_weighted_gambling_bases_follow_the_aggregate; policyengine_uk/tests/test_gambling_duty_base_projection.py::test_bases_that_give_hmrc_receipts_give_the_obr_forecast

axiom: n/a: this projects a data input from an OBR forecast and changes no rule.

🤖 Generated with Claude Code

MaxGhenis and others added 13 commits October 30, 2026 20:09
Each of the fifteen gambling inputs declares the uprating index of its
duty, and dataset projection grows it by the same series. The series come
from RECEIPTS_SERIES_SPECS: the OBR's October 2026 betting and gaming
forecast breakdown (receipts Table 4.10), after HMRC's 2024-25 and
2025-26 receipts, less Autumn Budget 2026 measure 56 for Machine Games
Duty, divided by the rates the model charges. The model then applies the
April 2026 Remote Gaming Duty and April 2027 remote betting rate rises
once, not twice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The new tests pin the Remote Gaming, General Betting and Machine Games
Duty indices to Table 4.10 and the rates by hand, check that dataset
projection and Core's variable uprating agree, and check that bases giving
HMRC's 2024-25 receipts give HMRC's 2025-26 receipts and then Table 4.10,
less measure 56, in every year to 2031-32. A property test checks that a
rate reform leaves the bases alone and moves receipts by the rate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Machine Games Duty paragraph now says that the OBR's tables do not
show which line holds the Remote Gaming Duty that measure 56's costing
moves online, so taking the whole measure off may understate the base.
The approximations give the size of each five-day rate overlap and note
that March 2026's Table 3.10 forecast £1,008.6 million of Lottery Duty
for 2026-27. Spread betting's zero weight now rests on Microcosm's split
alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in #2731 (higher-stake Machine Games Duty), whose new input needs the
Machine Games Duty base index.

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

#2731 added machine_games_standard_rate_higher_stake_net_takings, a part
of the standard-rate base that pays the higher rate from 1 April 2027. It
now declares the Machine Games Duty index, as the standard-rate input it
belongs to does, and dataset projection grows it by the same series. The
series takes measure 56 off Table 4.10's line, so the model adds the
higher-stake rise once; a new test checks the duty from 2027-28 to
2031-32.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The model stores inputs and duties as float32, so the test compares them to
one part in a million, and the rise, a difference of two duties, to one
part in 100,000.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keeps both economic assumptions README paragraphs: the gambling duty base
series and #2700's national living wage projection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rise in it

Table 4.10's Machine Games Duty line no longer loses Autumn Budget 2026
measure 56. The series divides it by an effective rate that charges the
Gambling Commission's Category B share of the standard-rate base (90.78%,
2024-25 machine yield in Categories B and C) at the higher rate on the
days the model's higher-stake switch is on, from 1 April 2027. The
behavioural response, the supplier-liability yield and any Remote Gaming
Duty substitution stay in the base, as for every other duty.

ReceiptsMeasure goes with the subtraction. A rate part can now follow a
dated switch, read with the rates from the parameter tree. The importer
refuses growth that would round the model's five-decimal index to zero.

Tests add the reconciliation invariant at any share, the zero-share rule,
index positivity, the 100-at-20% / 80-at-25% example, the shortfall when a
dataset lacks the higher-stake input, rate reforms that leave the base
alone, and a model-to-importer differential of every rate path's wiring.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The projection notes now give the Machine Games Duty rate with the
higher-stake share at 25% from 2027-28, the share's source and what it
leaves out (pubs, clubs and Northern Ireland), and the 18.3% shortfall
against Table 4.10 a dataset without the higher-stake input gives.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in #2735 (Northern Ireland Council Tax Rebate and Alternative Fuel
Payment), which merges without conflict.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The positivity check ran on the forecast's growth, before the earnings tail
joined it, so a tail could still round the model's index to zero. Compound
the finished series as the model does and refuse that case. Correct the
machine category reasoning in the docs and drop a README step for a series
the importer no longer has.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A value dated mid-year applies from the next January, as the model reads it,
so it must not replace that year's January value in the check.

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

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 2da212abcf against head 5ffee5c09c, both on enhanced_frs_2024_25.h5 (policyengine-uk-data 1.58.1, sha256 056e80fd8e91), fiscal years 2025-26 to 2031-32. Each year is a full microsimulation run on each side.

Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0 (thresholds in report_spec.yaml; a flag does not fail the job).

Workflow run and full report

Notes

  • In the years a figure from fewer than 10 records is suppressed (spending.disabled_students_allowance), every total containing it, and the decile incomes, are rebuilt from their other components, so no published total includes it. Those totals are marked †. A change is withheld where the two sides leave out different figures and can't be lined up.

Moves flagged for review

None.

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Caseloads

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Standard reform costings (change in gov_balance)

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise Class 1 main employee NICs rate to 10% 0 0 0 0 0 suppressed suppressed
Raise additional rate by 3pp 0 0 0 0 0 suppressed suppressed

Standard reforms: change in each reform's target

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise Class 1 main employee NICs rate to 10%: change in national_insurance 0 0 0 0 0 suppressed suppressed
Raise additional rate by 3pp: change in income_tax 0 0 0 0 0 suppressed suppressed

Household net income by decile

No household's net income changes in any year.

No change in any year: receipts by tax head; government balance, each component counted once; model totals; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles.

Checks failing on both base and head (1)
  • VAT excluding private school fees is never negative (sign:vat): 2025-26: 76 units below zero, a weighted £-53,888,684 in total; 2026-27: 76 units below zero, a weighted £-55,777,260 in total; 2027-28: 76 units below zero, a weighted £-57,727,917 in total
Counted-once check

Each of 92 components was raised by £1 per unit in 2026-27, and every head of its totals was read household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped.

  • widowed_parents_allowance: pension_credit responds only through other heads in fewer than 10 households (other heads that moved there: carers_allowance; gov_spending; not a failure)
  • widowed_parents_allowance: pension_credit responds only through other heads in fewer than 10 households (other heads that moved there: carers_allowance; household_benefits; not a failure)
Provenance
Side Commit Runtime Environment hash Partition hash Time
base main 2da212abcf uk 2.170.0 (files e654eb5f6f55), core 3.33.12, py 3.13.18 aarch64 77aac721ac5e 7cb61324a46b 2178.2s
head #2761 merged into main 5ffee5c09c uk 2.170.0 (files 1f5f88e94502), core 3.33.12, py 3.13.18 aarch64 77aac721ac5e 7cb61324a46b 2207.38s

Dataset: hf://policyengine/policyengine-uk-data-private/enhanced_frs_2024_25.h5@2526edbbb687a3b54dbb11272e5389e4b62d2ac2, sha256 056e80fd8e9151d78f432a25cde863340baee81304c6216a37fb575ce8563784 (verified on both sides), policyengine-uk-data 1.58.1.

Receipts by tax head: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Final charge on cash interest in non-cash ISAs £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Lifetime ISA withdrawal charge £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Income tax £294.46bn £315.23bn £335.83bn £351.28bn £366.96bn £385.36bn £400.00bn
National Insurance (employee and self-employed) £51.70bn £54.14bn £56.13bn £57.73bn £59.76bn £61.64bn £63.51bn
National Insurance (employer) £148.71bn £155.37bn £160.88bn £165.09bn £172.06bn £177.36bn £182.57bn
Employer NI change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Employer NI change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Capital gains tax £12.60bn £13.15bn £13.60bn £14.11bn £14.67bn £15.24bn £15.80bn
Student loan repayments £7.82bn £8.13bn £8.39bn £8.58bn £8.79bn £9.04bn £9.29bn
VAT excluding private school fees £249.37bn £256.87bn £266.33bn £272.70bn £278.97bn £285.24bn £291.59bn
Change in VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
VAT on private school fees £1.95bn £2.01bn £2.09bn £2.14bn £2.20bn £2.26bn £2.31bn
Change in private school VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Fuel duties £24.71bn £24.13bn £26.00bn £26.83bn £26.51bn £25.78bn £24.63bn
Alcohol duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tobacco duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Vehicle excise duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Betting and gaming duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
TV licence fee £4.26bn £4.40bn £4.41bn £4.42bn £4.43bn £4.44bn £4.45bn
Council tax £49.21bn £52.16bn £54.89bn £57.95bn £61.16bn £64.47bn £67.91bn
High value council tax surcharge £0.00bn £0.00bn £0.00bn £0.48bn £0.49bn £0.50bn £0.51bn
Northern Ireland domestic rates £0.55bn £0.58bn £0.60bn £0.63bn £0.66bn £0.69bn £0.72bn
Business rates £34.68bn £36.20bn £38.00bn £39.46bn £42.27bn £43.25bn £44.29bn
Stamp duty land tax on the household's own purchases £6.88bn £7.32bn £7.66bn £8.06bn £8.47bn £8.91bn £9.35bn
Stamp duty land tax paid by companies £4.72bn £4.57bn £5.29bn £6.03bn £6.37bn £6.92bn £7.45bn
Land transaction tax (Wales) £0.07bn £0.08bn £0.08bn £0.09bn £0.10bn £0.10bn £0.11bn
Land and buildings transaction tax (Scotland) £0.31bn £0.32bn £0.33bn £0.35bn £0.36bn £0.38bn £0.40bn
Unspecified tax change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Unspecified tax change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax excluding the main residence £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land value tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Carbon tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Spending by benefit and service: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Lifetime ISA bonus £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
State Pension £121.68bn £125.92bn £126.73bn £129.50bn £132.99bn £136.66bn £140.43bn
Pension Credit £6.66bn £7.03bn £7.29bn £7.48bn £7.60bn £7.84bn £8.03bn
Winter Fuel Payment £1.86bn £1.85bn £1.79bn £1.77bn £1.78bn £1.78bn £1.78bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £75.48bn £80.52bn £82.95bn £84.96bn £86.11bn £87.61bn £88.21bn
Housing Benefit £8.56bn £8.89bn £9.23bn £9.46bn £9.69bn £9.99bn £10.27bn
Council Tax Reduction £2.07bn £2.20bn £2.31bn £2.45bn £2.58bn £2.72bn £2.86bn
Employment and Support Allowance (income-related) £0.79bn £0.82bn £0.84bn £0.86bn £0.88bn £0.90bn £0.92bn
Employment and Support Allowance (contribution-based) £5.20bn £5.37bn £5.56bn £5.69bn £5.82bn £5.95bn £6.09bn
Jobseeker's Allowance (income-based) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Jobseeker's Allowance (contribution-based) £0.29bn £0.30bn £0.31bn £0.31bn £0.32bn £0.33bn £0.34bn
Income Support £0.11bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Working Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Incapacity Benefit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Personal Independence Payment £26.95bn £28.03bn £29.05bn £30.09bn £30.75bn £31.51bn £32.21bn
Disability Living Allowance £7.49bn £7.79bn £8.07bn £8.36bn £8.55bn £8.76bn £8.95bn
Attendance Allowance £8.68bn £9.03bn £9.36bn £9.69bn £9.90bn £10.15bn £10.38bn
Carer's Allowance £4.48bn £4.66bn £4.83bn £5.00bn £5.11bn £5.27bn £5.42bn
Carer Support Payment (Scotland) £0.31bn £0.32bn £0.33bn £0.34bn £0.35bn £0.36bn £0.37bn
Carer's Allowance Supplement (Scotland) £0.00bn £0.04bn £0.04bn £0.05bn £0.05bn £0.05bn £0.05bn
Severe Disablement Allowance £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn
Industrial Injuries Disablement Benefit £0.50bn £0.52bn £0.54bn £0.55bn £0.56bn £0.58bn £0.59bn
Armed Forces Compensation Scheme £0.61bn £0.63bn £0.65bn £0.66bn £0.68bn £0.69bn £0.71bn
War Widow's or Widower's Pension £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Benefit £16.19bn £16.82bn £17.39bn £18.00bn £18.39bn £18.84bn £19.25bn
Scottish Child Payment £0.49bn £0.52bn £0.53bn £0.55bn £0.56bn £0.57bn £0.56bn
Two Child Limit Payment (Scotland, counterfactual) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Healthy Start vouchers £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Maternity Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Maternity Pay £3.30bn £3.41bn £3.54bn £3.62bn £3.70bn £3.78bn £3.87bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.12bn £1.16bn £1.20bn £1.23bn £1.26bn £1.29bn £1.32bn
Sure Start Maternity Grant £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn
Bereavement Support Payment £0.67bn £0.69bn £0.71bn £0.73bn £0.75bn £0.76bn £0.78bn
Widowed Parent's Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tax-Free Childcare £0.56bn £0.57bn £0.57bn £0.58bn £0.60bn £0.61bn £0.59bn
Extended childcare entitlement £2.99bn £3.50bn £3.59bn £3.71bn £3.78bn £3.86bn £3.93bn
Universal childcare entitlement £2.06bn £2.22bn £2.29bn £2.37bn £2.43bn £2.48bn £2.53bn
Targeted childcare entitlement £0.50bn £0.51bn £0.52bn £0.54bn £0.55bn £0.57bn £0.56bn
Childcare Offer for Wales £0.26bn £0.28bn £0.28bn £0.29bn £0.30bn £0.31bn £0.32bn
Care to Learn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Childcare Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Parents' Learning Allowance £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn
Adult Dependants' Grant £0.06bn £0.06bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Travel Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
NHS spending £203.89bn £204.30bn £204.56bn £204.91bn £205.34bn £205.85bn £206.35bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.05bn £25.10bn £25.14bn £25.18bn £25.23bn £25.30bn £25.36bn
Cost-of-living support payment £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Bills Rebate £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Household Energy Payment £0.00bn £2.11bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Price Guarantee subsidy £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disability basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Other public spending budget change £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Caseloads: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Lifetime ISA bonus 0k 0k 0k 0k 0k 0k 0k
State Pension 11,264k 11,145k 10,819k 10,700k 10,723k 10,750k 10,776k
Pension Credit 1,486k 1,480k 1,472k 1,452k 1,450k 1,455k 1,464k
Winter Fuel Payment 7,844k 7,783k 7,473k 7,375k 7,391k 7,409k 7,427k
Pension Age Winter Heating Payment (Scotland) 803k 802k 800k 797k 799k 801k 802k
Universal Credit 6,342k 6,347k 6,336k 6,297k 6,292k 6,271k 6,223k
Housing Benefit 1,249k 1,245k 1,244k 1,227k 1,227k 1,229k 1,232k
Council Tax Reduction 3,176k 3,195k 3,200k 3,214k 3,224k 3,235k 3,242k
Employment and Support Allowance (income-related) 71k 71k 71k 71k 71k 71k 71k
Employment and Support Allowance (contribution-based) 719k 720k 721k 722k 724k 726k 728k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 67k 67k 67k 68k 68k
Income Support 25k 0k 0k 0k 0k 0k 0k
Working Tax Credit 0k 0k 0k 0k 0k 0k 0k
Child Tax Credit 0k 0k 0k 0k 0k 0k 0k
Incapacity Benefit 0k 0k 0k 0k 0k 0k 0k
Personal Independence Payment 3,567k 3,575k 3,579k 3,585k 3,593k 3,602k 3,611k
Disability Living Allowance 1,291k 1,294k 1,296k 1,298k 1,300k 1,304k 1,307k
Attendance Allowance 1,695k 1,698k 1,700k 1,703k 1,707k 1,711k 1,715k
Carer's Allowance 1,034k 1,037k 1,038k 1,040k 1,042k 1,060k 1,062k
Carer Support Payment (Scotland) 71k 71k 71k 72k 72k 72k 72k
Carer's Allowance Supplement (Scotland) 0k 71k 71k 72k 72k 72k 72k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 137k 137k 138k 138k 138k 139k
Armed Forces Compensation Scheme 93k 93k 94k 94k 94k 94k 94k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,123k 8,120k 8,120k 8,130k 8,145k 8,161k 8,178k
Scottish Child Payment 351k 352k 352k 353k 350k 348k 337k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 200k 200k 200k 201k 201k 201k 202k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 333k 333k 334k 334k 335k 336k 337k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 181k 182k 182k 182k 182k 183k 183k
Sure Start Maternity Grant 26k 26k 26k 26k 26k 26k 26k
Bereavement Support Payment 98k 98k 98k 98k 98k 99k 99k
Widowed Parent's Allowance 0k 0k 0k 0k 0k 0k 0k
Tax-Free Childcare 1,043k 1,027k 1,014k 1,009k 1,011k 1,009k 993k
Extended childcare entitlement 795k 800k 796k 797k 798k 798k 792k
Universal childcare entitlement 1,071k 1,072k 1,072k 1,073k 1,076k 1,079k 1,074k
Targeted childcare entitlement 165k 156k 154k 154k 155k 155k 150k
Childcare Offer for Wales 39k 39k 39k 39k 39k 39k 39k
Care to Learn 0k 0k 0k 0k 0k 0k 0k
Childcare Grant 0k 0k 0k 0k 0k 0k 0k
Parents' Learning Allowance 98k 98k 98k 99k 99k 99k 99k
Adult Dependants' Grant 18k 18k 12k 12k 12k 12k 12k
Travel Grant 0k 0k 0k 0k 0k 0k 0k
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund 0k 0k 0k 0k 0k 0k 0k
Cost-of-living support payment 0k 0k 0k 0k 0k 0k 0k
Energy Bills Rebate 0k 0k 0k 0k 0k 0k 0k
Household Energy Payment 0k 21,065k 0k 0k 0k 0k 0k
Energy Price Guarantee subsidy 0k 0k 0k 0k 0k 0k 0k
Basic income 0k 0k 0k 0k 0k 0k 0k
Disability basic income 0k 0k 0k 0k 0k 0k 0k
Government balance, each component counted once: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once £892.00bn £934.66bn £980.50bn £1,015.93bn £1,054.24bn £1,091.56bn £1,124.90bn
Government spending £529.38bn † £545.66bn † £550.77bn † £559.52bn † £567.20bn † £575.96bn † £583.61bn †
Government balance, each receipt once £362.62bn † £389.00bn † £429.73bn † £456.41bn † £487.04bn † £515.61bn † £541.29bn †
Benefits in household_benefits but not in gov_spending £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Model totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax £892.00bn £934.66bn £980.50bn £1,015.93bn £1,054.24bn £1,091.56bn £1,124.90bn
household_tax £491.97bn £520.41bn £551.21bn £576.01bn £601.00bn £626.70bn £648.42bn
pre_budget_change_household_tax £484.15bn £512.28bn £542.82bn £566.95bn £591.72bn £617.16bn £638.62bn
gov_spending £529.38bn † £545.66bn † £550.77bn † £559.52bn † £567.20bn † £575.96bn † £583.61bn †
household_benefits £529.38bn † £545.66bn † £550.77bn † £559.52bn † £567.20bn † £575.96bn † £583.61bn †
gov_balance £362.62bn † £389.00bn † £429.73bn † £456.41bn † £487.04bn † £515.61bn † £541.29bn †
Household income totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household market income £1,637.96bn £1,702.77bn £1,757.35bn £1,806.41bn £1,855.97bn £1,912.43bn £1,970.44bn
Household net income £1,636.69bn † £1,687.82bn † £1,715.46bn † £1,747.50bn † £1,778.70bn † £1,817.02bn † £1,859.69bn †
Household net income (HBAI definition) £1,449.57bn £1,499.83bn £1,530.87bn £1,565.18bn £1,597.89bn £1,635.60bn £1,676.62bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,245k 69,383k 69,473k 69,592k 69,738k 69,912k 70,080k
Benefit units 35,110k 35,181k 35,226k 35,286k 35,360k 35,449k 35,534k
Households 31,046k 31,108k 31,149k 31,201k 31,267k 31,345k 31,420k
Poverty rates: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 16.3% 15.5% 16.4% 16.3% 16.5% 16.5% 16.6%
Absolute poverty, before housing costs: children 24.7% 22.1% 23.3% 22.9% 23.1% 23.2% 23.5%
Absolute poverty, before housing costs: working-age adults 14.1% 13.8% 14.7% 14.7% 14.8% 14.8% 15.0%
Absolute poverty, before housing costs: pensioners 13.7% 13.4% 14.0% 13.8% 13.9% 13.9% 13.9%
Absolute poverty, after housing costs: everyone 21.6% 21.0% 22.0% 22.6% 22.9% 23.1% 23.4%
Absolute poverty, after housing costs: children 33.3% 31.3% 32.3% 32.5% 32.9% 33.4% 34.2%
Absolute poverty, after housing costs: working-age adults 19.9% 19.8% 20.8% 21.6% 21.9% 22.0% 22.3%
Absolute poverty, after housing costs: pensioners 12.7% 12.4% 13.2% 13.2% 13.3% 13.4% 13.6%
Relative poverty, before housing costs: everyone 17.0% 16.0% 16.4% 16.3% 16.4% 16.3% 16.6%
Relative poverty, before housing costs: children 25.9% 22.9% 23.3% 22.9% 23.0% 22.9% 23.5%
Relative poverty, before housing costs: working-age adults 14.5% 14.1% 14.6% 14.7% 14.7% 14.7% 15.0%
Relative poverty, before housing costs: pensioners 14.5% 14.0% 13.9% 13.8% 13.8% 13.9% 13.9%
Relative poverty, after housing costs: everyone 21.4% 21.0% 21.3% 21.3% 21.3% 21.5% 21.7%
Relative poverty, after housing costs: children 33.1% 31.1% 31.2% 31.0% 31.1% 31.2% 31.8%
Relative poverty, after housing costs: working-age adults 19.9% 19.8% 20.2% 20.4% 20.5% 20.6% 20.8%
Relative poverty, after housing costs: pensioners 12.5% 12.4% 12.2% 11.7% 11.7% 11.8% 12.0%
People in poverty: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 11,278k 10,779k 11,402k 11,365k 11,475k 11,513k 11,651k
Absolute poverty, before housing costs: children 3,688k 3,314k 3,496k 3,445k 3,480k 3,502k 3,549k
Absolute poverty, before housing costs: working-age adults 5,965k 5,893k 6,308k 6,362k 6,420k 6,430k 6,521k
Absolute poverty, before housing costs: pensioners 1,624k 1,572k 1,598k 1,559k 1,575k 1,580k 1,581k
Absolute poverty, after housing costs: everyone 14,944k 14,600k 15,310k 15,721k 15,936k 16,141k 16,426k
Absolute poverty, after housing costs: children 4,975k 4,682k 4,837k 4,888k 4,945k 5,040k 5,179k
Absolute poverty, after housing costs: working-age adults 8,463k 8,461k 8,971k 9,344k 9,491k 9,584k 9,706k
Absolute poverty, after housing costs: pensioners 1,506k 1,457k 1,502k 1,490k 1,500k 1,517k 1,542k
Relative poverty, before housing costs: everyone 11,750k 11,084k 11,388k 11,364k 11,416k 11,415k 11,651k
Relative poverty, before housing costs: children 3,872k 3,423k 3,496k 3,445k 3,466k 3,454k 3,549k
Relative poverty, before housing costs: working-age adults 6,159k 6,013k 6,301k 6,362k 6,389k 6,389k 6,521k
Relative poverty, before housing costs: pensioners 1,720k 1,648k 1,590k 1,557k 1,562k 1,572k 1,581k
Relative poverty, after housing costs: everyone 14,849k 14,552k 14,775k 14,809k 14,874k 15,014k 15,234k
Relative poverty, after housing costs: children 4,942k 4,660k 4,673k 4,663k 4,679k 4,707k 4,806k
Relative poverty, after housing costs: working-age adults 8,426k 8,440k 8,711k 8,823k 8,873k 8,967k 9,062k
Relative poverty, after housing costs: pensioners 1,482k 1,452k 1,391k 1,323k 1,322k 1,339k 1,365k
Inequality: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Gini coefficient, equivalised HBAI income before housing costs 0.3080 0.3052 0.3058 0.3058 0.3063 0.3069 0.3085
Mean household net income in each side's own deciles: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1: mean household_net_income per household £17,681 † £17,997 † £17,915 † £18,152 † £18,307 † £18,531 † £18,717 †
Decile 2: mean household_net_income per household £27,939 † £29,023 † £28,711 † £29,013 † £29,276 † £29,691 † £30,151 †
Decile 3: mean household_net_income per household £34,320 † £35,485 † £36,073 † £36,611 † £37,197 † £37,737 † £38,187 †
Decile 4: mean household_net_income per household £38,933 † £40,687 † £41,724 † £42,727 † £43,334 † £44,132 † £44,434 †
Decile 5: mean household_net_income per household £43,239 † £45,567 † £46,012 † £46,960 † £47,714 † £48,584 † £50,279 †
Decile 6: mean household_net_income per household £47,927 † £49,210 † £50,893 † £51,939 † £52,942 † £53,942 † £54,680 †
Decile 7: mean household_net_income per household £55,662 † £56,571 † £57,442 † £57,670 † £58,730 † £59,651 † £61,082 †
Decile 8: mean household_net_income per household £68,789 † £70,803 † £71,858 † £73,466 † £73,880 † £75,317 † £77,178 †
Decile 9: mean household_net_income per household £78,890 † £81,013 † £80,861 † £82,646 † £85,464 † £86,946 † £89,509 †
Decile 10: mean household_net_income per household £117,005 † £120,339 † £124,742 † £126,632 † £125,971 † £128,600 † £130,938 †
Standard reform costings (change in gov_balance): head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp £6.41bn £6.66bn £6.63bn £6.85bn £7.03bn £7.25bn £7.49bn
Raise higher rate by 1pp £3.61bn £3.87bn £4.00bn £4.22bn £4.44bn £4.71bn £4.83bn
Raise personal allowance by ~800GBP/year £-3.80bn £-3.92bn £-3.98bn £-4.04bn £-4.10bn £-4.23bn £-1.95bn
Raise child benefit by 25GBP/week per additional child £-1.99bn £-1.75bn £-1.55bn £-1.38bn £-1.30bn £-1.18bn £-1.07bn
Reduce Universal Credit taper rate to 20% £-20.77bn £-21.32bn £-21.75bn £-21.99bn £-22.34bn £-22.75bn £-22.94bn
Raise Class 1 main employee NICs rate to 10% £10.89bn £11.30bn £11.71bn £12.01bn £12.31bn suppressed suppressed
Raise VAT standard rate by 2pp £24.89bn £25.71bn £26.63bn £27.24bn £27.87bn £28.50bn £29.14bn
Raise additional rate by 3pp £2.90bn £3.15bn £3.22bn £3.41bn £3.61bn suppressed suppressed
Raise the Universal Credit standard allowance by 10% £-3.06bn £-3.18bn £-3.26bn £-3.35bn £-3.44bn £-3.49bn £-3.50bn
Raise the State Pension by 10% £-7.78bn £-8.01bn £-8.24bn £-8.47bn £-8.82bn £-8.55bn £-8.89bn
Standard reforms: change in each reform's target: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp: change in income_tax £6.55bn £6.86bn £6.79bn £7.00bn £7.20bn £7.44bn £7.66bn
Raise higher rate by 1pp: change in income_tax £3.61bn £3.92bn £4.01bn £4.23bn £4.45bn £4.72bn £4.84bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.93bn £-4.07bn £-4.13bn £-4.18bn £-4.22bn £-4.40bn £-1.75bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.33bn £2.14bn £1.94bn £1.76bn £1.65bn £1.52bn £1.40bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.74bn £21.31bn £21.78bn £22.04bn £22.37bn £22.78bn £22.99bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.15bn £11.63bn £12.00bn £12.29bn £12.61bn suppressed suppressed
Raise VAT standard rate by 2pp: change in vat £24.69bn £25.51bn £26.42bn £27.03bn £27.65bn £28.28bn £28.91bn
Raise additional rate by 3pp: change in income_tax £2.90bn £3.15bn £3.22bn £3.42bn £3.62bn suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.06bn £3.19bn £3.28bn £3.37bn £3.43bn £3.49bn £3.51bn
Raise the State Pension by 10%: change in state_pension £10.68bn £11.17bn £11.28bn £11.60bn £12.04bn £12.47bn £12.97bn

MaxGhenis and others added 5 commits October 31, 2026 06:07
The model's indices stop at or before that year, so the check holds however
long they run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dataset projection grows household weights by ons.population, so a
gambling series that grew each household's input by its duty's whole
base growth counted population growth twice: the weighted bases ran
1.54% above Table 4.10 by 2031-32.

The seven series move to obr.per_capita.gambling_duty_bases. The
importer writes each base's growth over one plus ons.population growth,
to six decimals, in the forecast years and in the tail, where the base
grows with average_earnings (or holds flat while its rate is zero) in
every year to the last that ons.population states. check_index,
population_growth, growth_in_effect and per_head_growth carry #2596's
names and signatures; ReceiptsSeriesSpec.per_head marks every series
under per_capita.

test_gambling_duty_base_projection.py now projects two weighted
households through extend_single_year_dataset and checks the weighted
duty against HMRC and Table 4.10; test_weighted_gambling_bases_follow_
the_aggregate checks every weighted input against its duty's national
base to 2039. A Hypothesis property checks that the per-head series,
compounded with population growth, gives back the aggregate index.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The docs' constructed-household table now comes from two households,
weighted 700 and 1,900, that hold the national bases between them; its
figures do not change. Comments give the division to the importer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
render_receipts_growth_yaml now divides a per-head series' forecast years
in the same block #2596 uses for its clearances, and receipts_tail
divides a base's tail through per_head_tail. Merged with #2596, the two
blocks conflict on one condition line instead of combining into a second
division of the clearance series. growth_ratio sits beside line_rate,
per_head_tail before receipts_tail, and the per-head property test beside
the other gambling properties, so the merge conflicts only where the two
branches differ. The written series do not change.

test_population_vintage.py's docstring names the three per-capita series
it checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 31, 2026
Brings in #2761's per-head gambling series. main keeps both #2761's
population argument to print_receipts_summary and this branch's national
living wage growth; the importer tests keep both LEVEL_SERIES_FIXTURE and
#2761's POPULATION_FIXTURE.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 31, 2026
The test added 2032 and 2033 after every "2031-01-01: 0.0200" line, and
#2761's per-head series, indented two spaces deeper, hold that line too, so
the edited fixture stopped parsing. It now edits average_earnings alone, as
the test means to.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 31, 2026
…dices

Merges #2761 at d08fbb6. Its growth_ratio, check_index,
population_growth, growth_in_effect and per_head_growth replace this
branch's copies, each defined once. ReceiptsSeriesSpec.per_head now
covers the clearance specs, which sit under per_capita, so the renderer
and summary write them per head through the shared helper. The
clearance tail and comment basis stay.

The importer rebuilds the merged yoy_growth.yaml byte for byte from the
real October 2026 and March 2026 tables.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 31, 2026
… head

A line's row may hold only its label and a value under each year. The
importer used to skip any other cell, so a "kg" cell beside "Other tobacco
products" let the line borrow the thousand kg its non-cigarette total
states, and growth read 999.0. A clearance table's year row holds only
years, and the one cell that states a clearance line's unit must describe
the line: its own label, the label of the total it breaks down (the row
above "of which:"), or a note.

ReceiptsGrowth carries each year's growth before rounding, and
per_head_growth divides that, so a gambling base with its own outturn
(previous_line None) grows per head by its base growth, not by its
receipts or a growth rebuilt from levels and rates. The committed
yoy_growth.yaml is unchanged byte for byte.

The population test now covers all 13 per-head series: after the merge
with #2761 the seven gambling bases move with population too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 2 commits October 31, 2026 17:07
Give the importer's comment the file's real last year, say where the model's
cumulative indices stop, flag the rounded operands in the equations, and give
the OBR, the Treasury and Parliament the actions the text gave their tables.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 31, 2026
Brings in #2761's text fixes to the gambling docs and the README. Both
branches rewrote the comment on LAST_INDEX_YEAR; #2761's wording stays.

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.

Project gambling duty bases with OBR Table 4.10

1 participant