Skip to content

Growth indices drop their first listed year's growth #2692

Open

Description

@vahid-ahmadi

Mechanism

create_economic_assumption_indices.py:40-49 sets each yoy_growth series' first listed year to an index of 1.0 and multiplies growth only from the next year. The first listed year's growth (the step from the year before into that year) is never in the index. backdate_parameters (utils/parameters.py:31-46, called from tax_benefit_system.py:228 with BACKDATED_FROM = "2015-01-01") then carries that 1.0 back to 2015. So for a series starting in 2021, the 2020 and 2021 index values are both 1.0, and a 2020 to 2021 step gets a factor of 1.

Which routes read the indices

  • Dataset projection (data/economic_assumptions.py:352-369, and the council tax, rent and water helpers) multiplies by yoy_growth directly, not by indices. It is unaffected for every series, whatever the dataset year. The earliest supported dataset is 2022 (enhanced_frs_2022_23) in any case.
  • Parameter uprating: metadata: every parameter uprated by an index has its last listed value at or after that index's first year (for example household.wealth.national_balance_sheet 2021 against per_capita.gdp 2021, carbon/intensity.yaml 2022 against carbon_intensity 2022). No parameter is hit.
  • Direct situation inputs: Core's class-level uprating = carries an input forward by the index ratio (see the note in data/uprating_indices.yaml:11-12), as does the legacy-gross savings fallback at simulation.py:711-719. This is the only route hit, and only when an input is dated before the index's first growth year.

Series

Series First listed year Dropped growth Affects a supported route?
obr.per_capita.gdp (35 variables) 2021 8.92% yes, direct inputs dated 2020 or earlier only
obr.per_capita.mixed_income (4) 2021 6.36% yes, direct inputs dated 2020 or earlier only
obr.house_prices (2) 2021 8.2% yes, direct inputs dated 2020 or earlier only
obr.mortgage_interest (3) 2021 -2.26% yes, direct inputs dated 2020 or earlier only
obr.petrol_spending_litre_proxy 2021 42.8% yes, direct inputs dated 2020 or earlier only
obr.diesel_spending_litre_proxy 2021 40.4% yes, direct inputs dated 2020 or earlier only
orr.per_capita.rail_passenger_journeys 2021 154.3% yes, direct inputs dated 2020 or earlier only
ons.population (household_weight) 2021 0.36% yes, direct inputs dated 2020 or earlier only
obr.private_pension_index (generated) 2020 2.2% (min of 2019 RPI and 5%) yes, direct inputs dated 2019 or earlier only
obr.lagged_average_earnings (generated) 2022 5.9% (2021 earnings) yes, direct inputs dated 2021 or earlier only
ofwat.water_bills 2022 5.2% no: its variable is projected by country in uprate_water_and_sewerage_charges (#2501); a direct input dated 2021 or earlier would be hit
obr.consumer_price_index_ahc 2022 9.27% no: read only by inflation_adjustment_ahc, which nothing uses
obr.road_fuel_volume, obr.non_labour_income, obr.per_capita.non_labour_income 2021 24.4%, 8.7%, 8.31% no: no index consumers
obr.cpih, obr.social_rent, obr.rent, scottish_water.water_bills, ons.private_rental_prices.* (15 areas) 2022 7.92%, 1.6%, 3.47%, 4.2%, 2.8% to 8.8% no: no consumers before 2025 (rent is read from 2025 by utils/create_ahc_deflator.py)
carbon_intensity 2022 -4.9% no: its parameter's last value is 2022
obr.council_tax.* (3) 2023 6.38% to 7.09% no: no index consumers
obr.stamp_duty_land_tax.* (2), obr.business_rates.* (2) 2024 3.3% to 21.1% no: their parameters' last values are 2024 or 2025
ons.household_interest_income 2020 0.0 no: the dropped value is zero, so nothing changes
finance_ni.domestic_rates 2020 1.48% no: no index consumers outside tests
obr.rpi, obr.average_earnings, obr.consumer_price_index, obr.lagged_cpi 2009 to 2010 1.8% to 2.2% no
triple_lock (generated) 2011 April 2011 rise no: its parameters' last values are 2026
earnings_uprating, september_cpi_uprating (generated) 2010 placeholder none no: already anchored, see below

The rail case is the largest: a 2020-dated input queried for 2021 gets a factor of 1.0 instead of 2.543.

So 10 series can drop growth, all through the same narrow route: a direct input dated before the index's first growth year. No dataset or parameter route is affected today.

Fix pattern

#2638 (head b1ee29e) adds an opt-in index_base_year metadata key to the generator. A series that sets it is anchored at 1.0 in that earlier year, so its first growth step is included; the generator refuses a base year at or after the first growth year. create_earnings_uprating.py and create_september_cpi_uprating.py already do the same thing a different way, by writing a None placeholder for their 2010 base year. Either pattern could be applied to the ten series above, or the generator could anchor every series one year before its first growth year by default. Before adding an anchor, check that a growth value exists for the year before it (for example, per-person series need the year's population).

Not a duplicate of #1862, which is about declared uprating = attributes the dataset route ignores. Related: #2639 (rail per-person series).

Found while fixing #2638.

🤖 Generated with Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions