diff --git a/changelog.d/2383.fixed.md b/changelog.d/2383.fixed.md new file mode 100644 index 0000000000..b6294fcdbe --- /dev/null +++ b/changelog.d/2383.fixed.md @@ -0,0 +1 @@ +Take population growth from the OBR's March 2026 long-term economic determinants (ONS 2024-based projections after 2030-31) and re-derive the per-capita GDP, mixed income and non-labour income series and the road-fuel spending proxies from it, so they share one vintage. diff --git a/docs/book/assumptions/growthfactors.md b/docs/book/assumptions/growthfactors.md index b2c9328531..6cef640db0 100644 --- a/docs/book/assumptions/growthfactors.md +++ b/docs/book/assumptions/growthfactors.md @@ -91,11 +91,11 @@ We lag earnings growth by one year and use that to uprate housing service charge ## Per capita GDP -We derive these rates from OBR GDP growth and ONS population projections. +We derive these rates as calendar-year nominal GDP growth from the OBR's March 2026 EFO divided by population growth: (1 + GDP growth) / (1 + population growth) − 1. -| Fiscal year | 2022 | 2023 | 2024 | 2025 | 2026 | 2027 | 2028 | 2029 | +| Year | 2022 | 2023 | 2024 | 2025 | 2026 | 2027 | 2028 | 2029 | |-------------|------|------|------|------|------|------|------|------| -| Growth rate | 9.2% | 5.0% | 3.8% | 2.8% | 2.8% | 3.1% | 3.3% | 3.3% | +| Growth rate | 10.0% | 5.2% | 3.9% | 4.7% | 2.9% | 3.3% | 3.2% | 3.1% | We use per capita GDP for these variables: `benunit_reported_capital`, `capital_gains`, `capital_gains_badr`, `capital_gains_before_response`, `capital_gains_carried_interest`, `capital_gains_residential_property`, `cash_isa`, `corporate_wealth`, `directly_held_shares`, `dividend_income`, `gross_financial_wealth`, `household_lifetime_isa_balance`, `lifetime_isa_balance`, `lump_sum_income`, `main_residence_value`, `maintenance_income`, `miscellaneous_income`, `mortgage_capital_repayment`, `net_financial_wealth`, `non_residential_property_value`, `other_investment_income`, `other_residential_property_value`, `owned_land`, `pension_credit_reported_capital`, `pension_income`, `private_pension_wealth`, `private_transfer_income`, `property_income`, `property_rental_income`, `savings`, `savings_interest_income`, `spousal_maintenance_income`, `stocks_and_shares_isa`, `sublet_income`, `uc_reported_capital`, `unit_and_investment_trusts` @@ -143,20 +143,20 @@ We apply this to: `rent` ## Per capita mixed income -We derive these rates from OBR mixed income growth and ONS population projections. +We derive these rates as calendar-year mixed income growth from the OBR's March 2026 EFO (Table 1.12) divided by population growth, in the same way. -| Fiscal year | 2022 | 2023 | 2024 | 2025 | 2026 | 2027 | 2028 | 2029 | +| Year | 2022 | 2023 | 2024 | 2025 | 2026 | 2027 | 2028 | 2029 | |-------------|------|------|------|------|------|------|------|------| -| Growth rate | 6.3% | 2.4% | 4.8% | 4.7% | 3.1% | 3.1% | 3.6% | 3.8% | +| Growth rate | 2.9% | -0.6% | 2.7% | 1.1% | 3.1% | 3.8% | 3.7% | 3.6% | We apply this to: `self_employment_income` ## Population -We use ONS population [projections](https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationprojections/bulletins/nationalpopulationprojections/2022based). +We use the population growth in the OBR's [long-term economic determinants for the March 2026 EFO](https://obr.uk/supplementary-forecast-information-release-long-term-economic-determinants-march-2026/): the OBR's forecast to 2030-31, then the principal projection of the [ONS 2024-based national population projections](https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationprojections/bulletins/nationalpopulationprojections/2024based). 2021-22 and 2022-23 are the same OBR series, read from the March 2026 EFO economy tables. | Fiscal year | 2022 | 2023 | 2024 | 2025 | 2026 | 2027 | 2028 | 2029 | |-------------|------|------|------|------|------|------|------|------| -| Growth rate | 0.3% | 1.4% | 1.0% | 1.1% | 0.7% | 0.8% | 0.4% | 0.5% | +| Growth rate | 1.0% | 1.3% | 1.1% | 0.3% | 0.4% | 0.3% | 0.3% | 0.3% | We apply this to: `household_weight` diff --git a/policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml b/policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml index 1f0380a3fb..7635a15868 100644 --- a/policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml +++ b/policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml @@ -357,59 +357,59 @@ obr: petrol_spending_litre_proxy: description: Unleaded-petrol spending proxy growth that preserves weighted road-fuel litres after dividing by model pump prices. Derived as (1 + road_fuel_volume) x (price_t / price_t-1) / (1 + population) - 1, using household.consumption.fuel.prices; re-derive whenever those prices change. values: - 2021-01-01: 0.4276130160591334 - 2022-01-01: 0.32114330849740713 - 2023-01-01: -0.11978022401038202 - 2024-01-01: -0.05378435951558702 - 2025-01-01: -0.07097011631498962 - 2026-01-01: 0.09631434800374827 - 2027-01-01: -0.027765858532455168 - 2028-01-01: -0.030878786058031737 - 2029-01-01: -0.04149818363243518 - 2030-01-01: -0.056482738187697334 - 2031-01-01: -0.00428158916658361 - 2032-01-01: -0.004182433778131878 - 2033-01-01: -0.004083258639577703 - 2034-01-01: -0.003984063745019917 - 2035-01-01: -0.003884849088554687 - 2036-01-01: -0.0037856146642757382 - 2037-01-01: -0.003686360466274796 - 2038-01-01: -0.0035870864886409226 - 2039-01-01: -0.0034877927254609586 - 2040-01-01: -0.0034877927254609586 - 2041-01-01: -0.003388479170819303 - 2042-01-01: -0.003388479170819303 - 2043-01-01: -0.0032891458187980227 - 2044-01-01: -0.0031897926634769647 - 2045-01-01: -0.0031897926634769647 - 2046-01-01: -0.003090419698933422 - 2047-01-01: -0.0029910269192421346 - 2048-01-01: -0.0028916143184762877 - 2049-01-01: -0.002792181890705958 - 2050-01-01: -0.002692729629998891 - 2051-01-01: -0.0024937655860348684 - 2052-01-01: -0.002394253790901746 - 2053-01-01: -0.0021951706246258196 - 2054-01-01: -0.0020955992415926383 - 2055-01-01: -0.001996007984031989 - 2056-01-01: -0.0018963968459926317 - 2057-01-01: -0.001796765821521329 - 2058-01-01: -0.001697114904662067 - 2059-01-01: -0.0015974440894569453 - 2060-01-01: -0.0015974440894569453 - 2061-01-01: -0.0015974440894569453 - 2062-01-01: -0.0014977533699451762 - 2063-01-01: -0.0014977533699451762 - 2064-01-01: -0.0014977533699451762 - 2065-01-01: -0.0014977533699451762 - 2066-01-01: -0.0014977533699451762 - 2067-01-01: -0.0014977533699451762 - 2068-01-01: -0.0014977533699451762 - 2069-01-01: -0.0014977533699451762 - 2070-01-01: -0.0014977533699451762 - 2071-01-01: -0.0014977533699451762 - 2072-01-01: -0.0014977533699451762 - 2073-01-01: -0.0013980427401638629 + 2021-01-01: 0.42818201287701263 + 2022-01-01: 0.32048914761975955 + 2023-01-01: -0.11986709923501582 + 2024-01-01: -0.05406513567003335 + 2025-01-01: -0.06707986156775403 + 2026-01-01: 0.09664209519298694 + 2027-01-01: -0.026990320280212532 + 2028-01-01: -0.030105962123468832 + 2029-01-01: -0.04054292967950757 + 2030-01-01: -0.055636618682285754 + 2031-01-01: -0.002394253790901746 + 2032-01-01: -0.0021951706246258196 + 2033-01-01: -0.0020955992415926383 + 2034-01-01: -0.0018963968459926317 + 2035-01-01: -0.001796765821521329 + 2036-01-01: -0.001697114904662067 + 2037-01-01: -0.0015974440894569453 + 2038-01-01: -0.0014977533699451762 + 2039-01-01: -0.0014977533699451762 + 2040-01-01: -0.0013980427401638629 + 2041-01-01: -0.0013980427401638629 + 2042-01-01: -0.001298312194147666 + 2043-01-01: -0.001298312194147666 + 2044-01-01: -0.001198561725929026 + 2045-01-01: -0.0010987913295376073 + 2046-01-01: -0.0010987913295376073 + 2047-01-01: -0.0009990009990008542 + 2048-01-01: -0.0008991907283444345 + 2049-01-01: -0.0007993605115906854 + 2050-01-01: -0.000599640215870445 + 2051-01-01: -0.0004997501249375258 + 2052-01-01: -0.00029991002699192304 + 2053-01-01: -0.00019996000799837876 + 2054-01-01: 0.0 + 2055-01-01: 0.00010001000100001711 + 2056-01-01: 0.00030009002700803755 + 2057-01-01: 0.0004001600640255454 + 2058-01-01: 0.0005002501250623848 + 2059-01-01: 0.0006003602161297472 + 2060-01-01: 0.0007004903432403786 + 2061-01-01: 0.0008006405124099114 + 2062-01-01: 0.0008006405124099114 + 2063-01-01: 0.0008006405124099114 + 2064-01-01: 0.0009008107296566426 + 2065-01-01: 0.0009008107296566426 + 2066-01-01: 0.0009008107296566426 + 2067-01-01: 0.0009008107296566426 + 2068-01-01: 0.0009008107296566426 + 2069-01-01: 0.0009008107296566426 + 2070-01-01: 0.0009008107296566426 + 2071-01-01: 0.0010010010010010895 + 2072-01-01: 0.0010010010010010895 + 2073-01-01: 0.0010010010010010895 metadata: unit: /1 label: Petrol spending litre-proxy growth @@ -424,59 +424,59 @@ obr: diesel_spending_litre_proxy: description: Diesel spending proxy growth that preserves weighted road-fuel litres after dividing by model pump prices. Derived as (1 + road_fuel_volume) x (price_t / price_t-1) / (1 + population) - 1, using household.consumption.fuel.prices; re-derive whenever those prices change. values: - 2021-01-01: 0.4035933750476013 - 2022-01-01: 0.38608334996374616 - 2023-01-01: -0.12613670608493466 - 2024-01-01: -0.07344928074891444 - 2025-01-01: -0.06483399761456943 - 2026-01-01: 0.1748436772712496 - 2027-01-01: -0.027765858532455168 - 2028-01-01: -0.030878786058031737 - 2029-01-01: -0.04149818363243518 - 2030-01-01: -0.056482738187697334 - 2031-01-01: -0.00428158916658361 - 2032-01-01: -0.004182433778131878 - 2033-01-01: -0.004083258639577703 - 2034-01-01: -0.003984063745019917 - 2035-01-01: -0.003884849088554687 - 2036-01-01: -0.0037856146642757382 - 2037-01-01: -0.003686360466274796 - 2038-01-01: -0.0035870864886409226 - 2039-01-01: -0.0034877927254609586 - 2040-01-01: -0.0034877927254609586 - 2041-01-01: -0.003388479170819303 - 2042-01-01: -0.003388479170819303 - 2043-01-01: -0.0032891458187980227 - 2044-01-01: -0.0031897926634769647 - 2045-01-01: -0.0031897926634769647 - 2046-01-01: -0.003090419698933422 - 2047-01-01: -0.0029910269192421346 - 2048-01-01: -0.0028916143184762877 - 2049-01-01: -0.002792181890705958 - 2050-01-01: -0.002692729629998891 - 2051-01-01: -0.0024937655860348684 - 2052-01-01: -0.002394253790901746 - 2053-01-01: -0.0021951706246258196 - 2054-01-01: -0.0020955992415926383 - 2055-01-01: -0.001996007984031989 - 2056-01-01: -0.0018963968459926317 - 2057-01-01: -0.001796765821521329 - 2058-01-01: -0.001697114904662067 - 2059-01-01: -0.0015974440894569453 - 2060-01-01: -0.0015974440894569453 - 2061-01-01: -0.0015974440894569453 - 2062-01-01: -0.0014977533699451762 - 2063-01-01: -0.0014977533699451762 - 2064-01-01: -0.0014977533699451762 - 2065-01-01: -0.0014977533699451762 - 2066-01-01: -0.0014977533699451762 - 2067-01-01: -0.0014977533699451762 - 2068-01-01: -0.0014977533699451762 - 2069-01-01: -0.0014977533699451762 - 2070-01-01: -0.0014977533699451762 - 2071-01-01: -0.0014977533699451762 - 2072-01-01: -0.0014977533699451762 - 2073-01-01: -0.0013980427401638629 + 2021-01-01: 0.4041527984732878 + 2022-01-01: 0.38539703418341165 + 2023-01-01: -0.12622295394260497 + 2024-01-01: -0.07372422161516101 + 2025-01-01: -0.06091804825263625 + 2026-01-01: 0.17519490109106162 + 2027-01-01: -0.026990320280212532 + 2028-01-01: -0.030105962123468832 + 2029-01-01: -0.04054292967950768 + 2030-01-01: -0.055636618682285865 + 2031-01-01: -0.002394253790901746 + 2032-01-01: -0.0021951706246258196 + 2033-01-01: -0.0020955992415926383 + 2034-01-01: -0.0018963968459926317 + 2035-01-01: -0.001796765821521329 + 2036-01-01: -0.001697114904662067 + 2037-01-01: -0.0015974440894569453 + 2038-01-01: -0.0014977533699451762 + 2039-01-01: -0.0014977533699451762 + 2040-01-01: -0.0013980427401638629 + 2041-01-01: -0.0013980427401638629 + 2042-01-01: -0.001298312194147666 + 2043-01-01: -0.001298312194147666 + 2044-01-01: -0.001198561725929026 + 2045-01-01: -0.0010987913295376073 + 2046-01-01: -0.0010987913295376073 + 2047-01-01: -0.0009990009990008542 + 2048-01-01: -0.0008991907283444345 + 2049-01-01: -0.0007993605115906854 + 2050-01-01: -0.000599640215870445 + 2051-01-01: -0.0004997501249375258 + 2052-01-01: -0.00029991002699192304 + 2053-01-01: -0.00019996000799837876 + 2054-01-01: 0.0 + 2055-01-01: 0.00010001000100001711 + 2056-01-01: 0.00030009002700803755 + 2057-01-01: 0.0004001600640255454 + 2058-01-01: 0.0005002501250623848 + 2059-01-01: 0.0006003602161297472 + 2060-01-01: 0.0007004903432403786 + 2061-01-01: 0.0008006405124099114 + 2062-01-01: 0.0008006405124099114 + 2063-01-01: 0.0008006405124099114 + 2064-01-01: 0.0009008107296566426 + 2065-01-01: 0.0009008107296566426 + 2066-01-01: 0.0009008107296566426 + 2067-01-01: 0.0009008107296566426 + 2068-01-01: 0.0009008107296566426 + 2069-01-01: 0.0009008107296566426 + 2070-01-01: 0.0009008107296566426 + 2071-01-01: 0.0010010010010010895 + 2072-01-01: 0.0010010010010010895 + 2073-01-01: 0.0010010010010010895 metadata: unit: /1 label: Diesel spending litre-proxy growth @@ -836,43 +836,44 @@ obr: gdp: description: Per capita nominal GDP year-on-year growth. values: - # Outturn (2021-2024) - derived from nominal GDP growth minus population growth + # Calendar-year nominal GDP growth from the March 2026 EFO (Table 1.4 + # annual totals, the same growth as Table A.1), divided by one plus + # ons.population: (1 + nominal) / (1 + population) - 1, rounded to 4 + # decimals. 2021-2024 are outturn, 2025-2030 forecast. 2021-01-01: 0.0892 - 2022-01-01: 0.1019 - 2023-01-01: 0.0532 - 2024-01-01: 0.0372 - # Forecast (2025-2030) from OBR EFO March 2026, Table A.1 nominal GDP minus population growth. - # Population growth here is ons.population (March 2025 vintage), not the - # lower growth implied by the March 2026 EFO; see ons.population. - 2025-01-01: 0.0438 - 2026-01-01: 0.0292 - 2027-01-01: 0.0323 - 2028-01-01: 0.0310 - 2029-01-01: 0.0296 + 2022-01-01: 0.1004 + 2023-01-01: 0.0524 + 2024-01-01: 0.0389 + 2025-01-01: 0.0474 + 2026-01-01: 0.0294 + 2027-01-01: 0.0326 + 2028-01-01: 0.0317 + 2029-01-01: 0.0306 2030-01-01: 0.0315 metadata: unit: /1 label: Per capita GDP growth reference: - - title: OBR EFO March 2026 (Table A.1, nominal GDP minus population growth) + - title: OBR EFO March 2026 (detailed forecast tables, economy, Table 1.4), divided by ons.population growth href: https://obr.uk/efo/economic-and-fiscal-outlook-march-2026/ mixed_income: description: Per capita mixed income year-on-year growth. values: - # Outturn (2021-2024) - derived from mixed income growth minus population growth - 2021-01-01: 0.0635 - 2022-01-01: 0.0296 + # Calendar-year growth in mixed income from the March 2026 EFO (Table + # 1.12 annual totals), divided by one plus ons.population: + # (1 + growth) / (1 + population) - 1, rounded to 4 decimals. + # 2021-2024 are outturn, 2025-2030 forecast. + 2021-01-01: 0.0636 + 2022-01-01: 0.0288 2023-01-01: -0.0060 - 2024-01-01: 0.0273 - # Forecast (2025-2030) from OBR EFO March 2026, Table 1.12 minus population growth - # (ons.population, March 2025 vintage; see ons.population). - 2025-01-01: 0.0069 - 2026-01-01: 0.0306 - 2027-01-01: 0.0371 - 2028-01-01: 0.0364 - 2029-01-01: 0.0353 - 2030-01-01: 0.0361 + 2024-01-01: 0.0269 + 2025-01-01: 0.0112 + 2026-01-01: 0.0309 + 2027-01-01: 0.0378 + 2028-01-01: 0.0371 + 2029-01-01: 0.0364 + 2030-01-01: 0.0370 metadata: unit: /1 label: Per capita mixed income growth @@ -883,19 +884,19 @@ obr: non_labour_income: description: Per capita non-labour income year-on-year growth. values: - # Outturn (2021-2024) - derived from non-labour income growth minus population growth - 2021-01-01: 0.0830 - 2022-01-01: 0.0894 - 2023-01-01: 0.1084 - 2024-01-01: 0.0385 - # Forecast (2025-2030) from OBR EFO March 2026, Table 1.12 minus population growth - # (ons.population, March 2025 vintage; see ons.population). - 2025-01-01: 0.0275 - 2026-01-01: 0.0358 - 2027-01-01: 0.0474 - 2028-01-01: 0.0309 - 2029-01-01: 0.0256 - 2030-01-01: 0.0271 + # obr.non_labour_income divided by one plus ons.population: + # (1 + growth) / (1 + population) - 1, rounded to 4 decimals. + # 2021-2024 are outturn, 2025-2030 forecast. + 2021-01-01: 0.0831 + 2022-01-01: 0.0880 + 2023-01-01: 0.1069 + 2024-01-01: 0.0378 + 2025-01-01: 0.0318 + 2026-01-01: 0.0361 + 2027-01-01: 0.0483 + 2028-01-01: 0.0317 + 2029-01-01: 0.0266 + 2030-01-01: 0.0280 metadata: unit: /1 label: Per capita non-labour income growth @@ -1023,81 +1024,86 @@ obr: ons: population: description: Population year-on-year growth. - # 2022-2073 is the population growth row of the OBR's long-term economic - # determinants for the March 2025 EFO, published 19 June 2025 (#1305). - # The fiscal year starting in year t is stored at t-01-01, rounded to - # four decimals (2025-26's 0.7230% is 2025-01-01: 0.0072). The OBR notes - # that readings are at the start of the fiscal year or mid-year. To - # 2029-30 the series is the OBR's March 2025 forecast; from 2030-31 it is - # the migration category variant of the ONS 2022-based national - # population projections. The 2021 value predates #1305 and has no - # recorded source. This series is a March 2025 vintage. Calendar-year - # population growth implied by the March 2026 EFO economy tables (real GDP - # in Table 1.1 over real GDP per person in Table 1.5) is lower: 0.37% in - # 2025, against 0.72% here, and 0.30% to 0.36% a year in 2026-2030. The - # ONS has since published 2024-based projections (28 April 2026). + # One vintage, consistent with the OBR's March 2026 EFO. The fiscal year + # starting in year t is stored at t-01-01, as growth over the year before, + # rounded to four decimals (2025-26's 0.2973% is 2025-01-01: 0.0030). The + # OBR reads population at the start of the fiscal year (Q2). + # - 2023-2073: the population growth row of the OBR's long-term economic + # determinants for the March 2026 EFO (28 May 2026). To 2030-31 it is + # the OBR's March 2026 forecast; after that it is the principal + # projection of the ONS 2024-based national population projections. + # - 2021-2022: that release starts at 2023-24, so these two years are + # the same OBR population series read from the March 2026 EFO economy + # tables: Q2 real GDP (Table 1.1) over Q2 real GDP per person, total + # population (Table 1.5), against the Q2 a year earlier. The same + # calculation gives the release's 2023-24, 2024-25 and 2025-26 values + # exactly (policyengine_uk/tests/test_population_vintage.py). + # The per_capita series under obr are derived from this series; re-derive + # them, and the petrol and diesel spending proxies, whenever it changes. values: - 2021-01-01: 0.004 - 2022-01-01: 0.0093 - 2023-01-01: 0.0131 - 2024-01-01: 0.0107 - 2025-01-01: 0.0072 - 2026-01-01: 0.0038 - 2027-01-01: 0.0037 - 2028-01-01: 0.0040 - 2029-01-01: 0.0044 - 2030-01-01: 0.0045 - 2031-01-01: 0.0043 - 2032-01-01: 0.0042 - 2033-01-01: 0.0041 - 2034-01-01: 0.0040 - 2035-01-01: 0.0039 - 2036-01-01: 0.0038 - 2037-01-01: 0.0037 - 2038-01-01: 0.0036 - 2039-01-01: 0.0035 - 2040-01-01: 0.0035 - 2041-01-01: 0.0034 - 2042-01-01: 0.0034 - 2043-01-01: 0.0033 - 2044-01-01: 0.0032 - 2045-01-01: 0.0032 - 2046-01-01: 0.0031 - 2047-01-01: 0.0030 - 2048-01-01: 0.0029 - 2049-01-01: 0.0028 - 2050-01-01: 0.0027 - 2051-01-01: 0.0025 - 2052-01-01: 0.0024 - 2053-01-01: 0.0022 - 2054-01-01: 0.0021 - 2055-01-01: 0.0020 - 2056-01-01: 0.0019 - 2057-01-01: 0.0018 - 2058-01-01: 0.0017 - 2059-01-01: 0.0016 - 2060-01-01: 0.0016 - 2061-01-01: 0.0016 - 2062-01-01: 0.0015 - 2063-01-01: 0.0015 - 2064-01-01: 0.0015 - 2065-01-01: 0.0015 - 2066-01-01: 0.0015 - 2067-01-01: 0.0015 - 2068-01-01: 0.0015 - 2069-01-01: 0.0015 - 2070-01-01: 0.0015 - 2071-01-01: 0.0015 - 2072-01-01: 0.0015 - 2073-01-01: 0.0014 + 2021-01-01: 0.0036 + 2022-01-01: 0.0098 + 2023-01-01: 0.0132 + 2024-01-01: 0.0110 + 2025-01-01: 0.0030 + 2026-01-01: 0.0035 + 2027-01-01: 0.0029 + 2028-01-01: 0.0032 + 2029-01-01: 0.0034 + 2030-01-01: 0.0036 + 2031-01-01: 0.0024 + 2032-01-01: 0.0022 + 2033-01-01: 0.0021 + 2034-01-01: 0.0019 + 2035-01-01: 0.0018 + 2036-01-01: 0.0017 + 2037-01-01: 0.0016 + 2038-01-01: 0.0015 + 2039-01-01: 0.0015 + 2040-01-01: 0.0014 + 2041-01-01: 0.0014 + 2042-01-01: 0.0013 + 2043-01-01: 0.0013 + 2044-01-01: 0.0012 + 2045-01-01: 0.0011 + 2046-01-01: 0.0011 + 2047-01-01: 0.0010 + 2048-01-01: 0.0009 + 2049-01-01: 0.0008 + 2050-01-01: 0.0006 + 2051-01-01: 0.0005 + 2052-01-01: 0.0003 + 2053-01-01: 0.0002 + 2054-01-01: 0.0000 + 2055-01-01: -0.0001 + 2056-01-01: -0.0003 + 2057-01-01: -0.0004 + 2058-01-01: -0.0005 + 2059-01-01: -0.0006 + 2060-01-01: -0.0007 + 2061-01-01: -0.0008 + 2062-01-01: -0.0008 + 2063-01-01: -0.0008 + 2064-01-01: -0.0009 + 2065-01-01: -0.0009 + 2066-01-01: -0.0009 + 2067-01-01: -0.0009 + 2068-01-01: -0.0009 + 2069-01-01: -0.0009 + 2070-01-01: -0.0009 + 2071-01-01: -0.0010 + 2072-01-01: -0.0010 + 2073-01-01: -0.0010 metadata: unit: /1 label: Population growth reference: - - title: OBR, "Long-term economic determinants - March 2025 Economic and fiscal outlook" (19 June 2025), population growth row - href: https://obr.uk/supplementary-forecast-information-on-long-term-economic-determinants-and-personal-independence-payment-policy-costing/ - - title: ONS, "National population projections - 2022-based" (migration category variant, used by the OBR from 2030-31) - href: https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationprojections/bulletins/nationalpopulationprojections/2022based + - title: OBR, "Long-term economic determinants - March 2026 Economic and fiscal outlook" (28 May 2026), population growth row + href: https://obr.uk/supplementary-forecast-information-release-long-term-economic-determinants-march-2026/ + - title: OBR EFO March 2026 (detailed forecast tables, economy, Tables 1.1 and 1.5), for 2021-22 and 2022-23 + href: https://obr.uk/efo/economic-and-fiscal-outlook-march-2026/ + - title: ONS, "National population projections - 2024-based" (28 April 2026; principal projection, used by the OBR from 2031-32) + href: https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationprojections/bulletins/nationalpopulationprojections/2024based household_interest_income: description: Household interest income year-on-year growth from ONS National Accounts D.41g. values: diff --git a/policyengine_uk/tests/test_council_tax_uprating.py b/policyengine_uk/tests/test_council_tax_uprating.py index d0700fb4d9..62d27b55ff 100644 --- a/policyengine_uk/tests/test_council_tax_uprating.py +++ b/policyengine_uk/tests/test_council_tax_uprating.py @@ -118,10 +118,10 @@ def _uprated_council_tax(regions, council_tax, year): def test_uprate_council_tax_holds_northern_ireland_flat(): # In 2025-26 OBR's council tax receipts grow 7.02% in England, 7.73% in # Wales and 3.84% in Scotland (March 2026 EFO, Table 4.1), and household - # weights grow 0.72%, with population. So a £1,000 bill becomes - # £1,000 x 1.0702 / 1.0072 = £1,062.55 in London, - # £1,000 x 1.0773 / 1.0072 = £1,069.60 in Wales and - # £1,000 x 1.0384 / 1.0072 = £1,030.98 in Scotland. Northern Ireland has + # weights grow 0.30%, with population. So a £1,000 bill becomes + # £1,000 x 1.0702 / 1.0030 = £1,067.00 in London, + # £1,000 x 1.0773 / 1.0030 = £1,074.08 in Wales and + # £1,000 x 1.0384 / 1.0030 = £1,035.29 in Scotland. Northern Ireland has # no council tax series and keeps £1,000; it used to fall through to # England's growth, because the code compared the region with # "NORTHERN IRELAND" (a space) while the dataset label is NORTHERN_IRELAND. @@ -130,27 +130,27 @@ def test_uprate_council_tax_holds_northern_ireland_flat(): ) assert council_tax == pytest.approx( - [1_062.55, 1_069.60, 1_030.98, 1_000.0], abs=0.005 + [1_067.00, 1_074.08, 1_035.29, 1_000.0], abs=0.005 ) def test_uprate_council_tax_gives_unknown_region_england_growth(): council_tax = _uprated_council_tax(["UNKNOWN"], [1_000.0], 2025) - assert council_tax == pytest.approx([1_062.55], abs=0.005) + assert council_tax == pytest.approx([1_067.00], abs=0.005) def test_scottish_bills_grow_with_the_amount_billed_in_2024_25(): # Scotland's average Band D rose 0.1% in 2024-25, from £1,416.50 to # £1,418.11 (Scottish Government, Band D Council Tax 1996-97 to 2026-27), # but the net amount billed rose 2.36%, from £3,005.8m to £3,076.8m, and - # household weights grow 1.07%. So a £1,000 bill becomes - # £1,000 x 1.0236 / 1.0107 = £1,012.76. Dividing the Band D growth the + # household weights grow 1.10%. So a £1,000 bill becomes + # £1,000 x 1.0236 / 1.0110 = £1,012.46. Dividing the Band D growth the # series used to hold for 2024 (0.001) by the weights' growth would have - # cut it to £990.40, and Scotland's total would have grown 0.1%, not 2.36%. + # cut it to £990.11, and Scotland's total would have grown 0.1%, not 2.36%. council_tax = _uprated_council_tax(["SCOTLAND"], [1_000.0], 2024) - assert council_tax == pytest.approx([1_012.76], abs=0.005) + assert council_tax == pytest.approx([1_012.46], abs=0.005) @pytest.mark.parametrize("region", ["NORTHERN IRELAND", "ATLANTIS", ""]) diff --git a/policyengine_uk/tests/test_population_vintage.py b/policyengine_uk/tests/test_population_vintage.py new file mode 100644 index 0000000000..4e3b0ed6fc --- /dev/null +++ b/policyengine_uk/tests/test_population_vintage.py @@ -0,0 +1,184 @@ +"""Population growth and the per-capita series come from one OBR vintage. + +ons.population, 2023-2073: the population growth row of the OBR's +"Long-term economic determinants - March 2026 Economic and fiscal outlook" +(28 May 2026), per cent, fiscal year t-(t+1) stored at t-01-01. To 2030-31 it +is the OBR's March 2026 forecast; after that, the principal projection of the +ONS 2024-based national population projections. + +ons.population, 2021-2022: the release starts at 2023-24, so the same OBR +series is read from the March 2026 EFO detailed forecast tables (economy): +population at Q2 = Table 1.1 real GDP / Table 1.5 real GDP per person (total +population, index 2008Q1=100). That ratio reproduces the release's 2023-24 to +2025-26 values to 1e-9 per cent. + +per_capita.*: (1 + aggregate growth) / (1 + ons.population) - 1, rounded to 4 +decimals, with calendar-year aggregates from the same EFO tables. +""" + +import pytest + +from policyengine_uk.system import system + +YOY = system.parameters.gov.economic_assumptions.yoy_growth +POPULATION = YOY.ons.population + +# OBR long-term economic determinants, March 2026 EFO: population growth, %. +LTED_MARCH_2026_POPULATION_GROWTH = { + 2023: 1.3158672896090877, + 2024: 1.1017715903452796, + 2025: 0.29733981899798323, + 2026: 0.3513313012721113, + 2027: 0.28846436048186774, + 2028: 0.3221199806863382, + 2029: 0.33740683300655405, + 2030: 0.3633675140245316, + 2031: 0.2388497010895163, + 2032: 0.22370075378450593, + 2033: 0.2088704995126811, + 2034: 0.19480847931587775, + 2035: 0.18209972234002336, + 2036: 0.17105370632082284, + 2037: 0.16149757764156725, + 2038: 0.15337082743571706, + 2039: 0.14645525205250198, + 2040: 0.14059256520155827, + 2041: 0.13544502807449899, + 2042: 0.13065266604816994, + 2043: 0.1258303566855412, + 2044: 0.12057608878321968, + 2045: 0.11394765412899854, + 2046: 0.10597542494543699, + 2047: 0.09714837762127004, + 2048: 0.08728256097529918, + 2049: 0.07626452247553317, + 2050: 0.06324271154818373, + 2051: 0.04847236420357781, + 2052: 0.03311728764627819, + 2053: 0.01733576022024952, + 2054: 0.0014408344165772746, + 2055: -0.014031732617858506, + 2056: -0.028358364675085124, + 2057: -0.041173708067321346, + 2058: -0.05246738930690942, + 2059: -0.062196733283259586, + 2060: -0.07017357235220567, + 2061: -0.07644675557505476, + 2062: -0.08105844946758589, + 2063: -0.08446815098064331, + 2064: -0.08701048822423729, + 2065: -0.08868551161084204, + 2066: -0.0897568416164729, + 2067: -0.09044608293788947, + 2068: -0.09115102662563546, + 2069: -0.09215432481369801, + 2070: -0.09377616180261672, + 2071: -0.09615695591076445, + 2072: -0.09939184042673244, + 2073: -0.10361433924080954, +} + +# March 2026 EFO economy tables, Q2 of each year. +# Table 1.1 real GDP, GBP billion chain-linked volumes. +REAL_GDP_Q2 = { + 2020: 522.356, + 2021: 655.443, + 2022: 686.335, + 2023: 689.491, + 2024: 695.28, + 2025: 704.973, +} +# Table 1.5 real GDP per person (total population), index 2008Q1=100. +REAL_GDP_PER_PERSON_Q2 = { + 2020: 82.30813961942992, + 2021: 102.91179537890864, + 2022: 106.71381138411466, + 2023: 105.81216977918598, + 2024: 105.53778853635153, + 2025: 106.69186884652444, +} + +# March 2026 EFO calendar-year totals, GBP billion. +# Table 1.4 nominal GDP (annual growth equals Table A.1 nominal GDP growth). +NOMINAL_GDP = { + 2020: 2124.72, + 2021: 2322.652, + 2022: 2580.949, + 2023: 2752.164, + 2024: 2890.664, + 2025: 3036.746486, + 2026: 3136.973465, + 2027: 3248.777377, + 2028: 3362.463387, + 2029: 3477.144474, + 2030: 3599.757631, +} +# Table 1.12 mixed income. +MIXED_INCOME = { + 2020: 152.109, + 2021: 162.369, + 2022: 168.687, + 2023: 169.885, + 2024: 176.374, + 2025: 178.87647080000002, + 2026: 185.0544149, + 2027: 192.6154851, + 2028: 200.4094443, + 2029: 208.40325, + 2030: 216.8960756, +} + + +def q2_population_growth_percent(year): + population = { + y: REAL_GDP_Q2[y] / REAL_GDP_PER_PERSON_Q2[y] for y in (year - 1, year) + } + return (population[year] / population[year - 1] - 1) * 100 + + +@pytest.mark.parametrize("year", sorted(LTED_MARCH_2026_POPULATION_GROWTH)) +def test_population_is_the_march_2026_long_term_determinants_row(year): + expected = round(LTED_MARCH_2026_POPULATION_GROWTH[year] / 100, 4) + assert POPULATION(f"{year}-01-01") == pytest.approx(expected, abs=1e-12) + + +@pytest.mark.parametrize("year", [2023, 2024, 2025]) +def test_efo_tables_reproduce_the_release(year): + assert q2_population_growth_percent(year) == pytest.approx( + LTED_MARCH_2026_POPULATION_GROWTH[year], abs=1e-9 + ) + + +@pytest.mark.parametrize("year, expected", [(2021, 0.0036), (2022, 0.0098)]) +def test_population_before_the_release_comes_from_the_efo_tables(year, expected): + # 2021: 0.3566% and 2022: 0.9824%, rounded to 4 decimals. + assert round(q2_population_growth_percent(year) / 100, 4) == expected + assert POPULATION(f"{year}-01-01") == pytest.approx(expected, abs=1e-12) + + +def _per_capita(aggregate_growth, year): + return round((1 + aggregate_growth) / (1 + POPULATION(f"{year}-01-01")) - 1, 4) + + +@pytest.mark.parametrize("year", range(2021, 2031)) +def test_per_capita_gdp_divides_nominal_gdp_by_population(year): + growth = NOMINAL_GDP[year] / NOMINAL_GDP[year - 1] - 1 + assert YOY.obr.per_capita.gdp(f"{year}-01-01") == pytest.approx( + _per_capita(growth, year), abs=1e-12 + ) + + +@pytest.mark.parametrize("year", range(2021, 2031)) +def test_per_capita_mixed_income_divides_mixed_income_by_population(year): + growth = MIXED_INCOME[year] / MIXED_INCOME[year - 1] - 1 + assert YOY.obr.per_capita.mixed_income(f"{year}-01-01") == pytest.approx( + _per_capita(growth, year), abs=1e-12 + ) + + +@pytest.mark.parametrize("year", range(2021, 2031)) +def test_per_capita_non_labour_income_divides_by_population(year): + growth = YOY.obr.non_labour_income(f"{year}-01-01") + assert YOY.obr.per_capita.non_labour_income(f"{year}-01-01") == pytest.approx( + _per_capita(growth, year), abs=1e-12 + )