Skip to content

Commit 5e45253

Browse files
authored
Use road fuel volumes for fuel spending uprating
1 parent 71d6cd1 commit 5e45253

7 files changed

Lines changed: 145 additions & 5 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Uprate petrol and diesel spending with HMRC/OBR road-fuel volume growth rather than CPI when projecting single-year datasets.

docs/book/assumptions/growthfactors.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,17 @@ We use the OBR's CPI projections to drive most benefit and consumption variables
1717
We apply CPI to these variables:
1818
- All reported benefits– `carers_allowance_reported`, `child_benefit_reported`, `child_tax_credit_reported`, `esa_contrib_reported`, `esa_income_reported`, `housing_benefit_reported`, `iidb_reported`, `incapacity_benefit_reported`, `income_support_reported`, `jsa_contrib_reported`, `jsa_income_reported`, `maternity_allowance_reported`, `pension_credit_reported`, `sda_reported`, `state_pension_reported`, `universal_credit_reported`, `winter_fuel_allowance_reported`, `working_tax_credit_reported`
1919
- All consumption categories– `alcohol_and_tobacco_consumption`, `clothing_and_footwear_consumption`, `communication_consumption`, `domestic_energy_consumption`, `education_consumption`, `food_and_non_alcoholic_beverages_consumption`, `health_consumption`, `household_furnishings_consumption`, `housing_water_and_electricity_consumption`, `miscellaneous_consumption`, `recreation_consumption`, `restaurants_and_hotels_consumption`, `transport_consumption`
20-
- Other variables– `afcs_reported`, `bsp_reported`, `childcare_expenses`, `diesel_spending`, `free_school_fruit_veg`, `free_school_meals`, `free_school_milk`, `maintenance_expenses`, `petrol_spending`, `statutory_maternity_pay`, `statutory_paternity_pay`, `statutory_sick_pay`, `state_pension`
20+
- Other variables– `afcs_reported`, `bsp_reported`, `childcare_expenses`, `free_school_fruit_veg`, `free_school_meals`, `free_school_milk`, `maintenance_expenses`, `statutory_maternity_pay`, `statutory_paternity_pay`, `statutory_sick_pay`, `state_pension`
21+
22+
## Road fuel volume
23+
24+
We use HMRC road-fuel clearances and OBR-implied forecast volumes for petrol and diesel spending, because PolicyEngine converts these spending fields into litres by dividing by pump prices.
25+
26+
| Fiscal year | 2022 | 2023 | 2024 | 2025 | 2026 | 2027 | 2028 | 2029 |
27+
|-------------|------|------|------|------|------|------|------|------|
28+
| Growth rate | 6.3% | -0.6% | -0.1% | -2.0% | -1.4% | -2.4% | -2.7% | -3.7% |
29+
30+
We apply this to: `diesel_spending`, `petrol_spending`
2131

2232
## Average earnings
2333

policyengine_uk/data/uprating_indices.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ gov.economic_assumptions.yoy_growth.obr.consumer_price_index:
1515
- childcare_expenses
1616
- clothing_and_footwear_consumption
1717
- communication_consumption
18-
- diesel_spending
1918
- domestic_energy_consumption
2019
- education_consumption
2120
- esa_contrib_reported
@@ -37,7 +36,6 @@ gov.economic_assumptions.yoy_growth.obr.consumer_price_index:
3736
- maternity_allowance_reported
3837
- miscellaneous_consumption
3938
- pension_credit_reported
40-
- petrol_spending
4139
- recreation_consumption
4240
- restaurants_and_hotels_consumption
4341
- sda_reported
@@ -50,6 +48,9 @@ gov.economic_assumptions.yoy_growth.obr.consumer_price_index:
5048
- universal_credit_reported
5149
- winter_fuel_allowance_reported
5250
- working_tax_credit_reported
51+
gov.economic_assumptions.yoy_growth.obr.road_fuel_volume:
52+
- diesel_spending
53+
- petrol_spending
5354
gov.economic_assumptions.yoy_growth.obr.mortgage_interest:
5455
- mortgage_interest_repayment
5556
gov.economic_assumptions.yoy_growth.obr.per_capita.gdp:

policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,77 @@ obr:
251251
- title: Bank of England inflation target (2031+ assumes 2% target)
252252
href: https://www.bankofengland.co.uk/monetary-policy/inflation
253253

254+
road_fuel_volume:
255+
description: UK road-fuel petrol and diesel clearances year-on-year growth.
256+
values:
257+
# HMRC Hydrocarbon Oils Bulletin Table 2a: petrol plus diesel clearances.
258+
2021-01-01: 0.24418262350052777
259+
2022-01-01: 0.06256523245735934
260+
2023-01-01: -0.005727524527185501
261+
2024-01-01: -0.0012858149728238732
262+
# OBR March 2026 fuel-duty receipts forecast, net of non-road fuel
263+
# receipts, divided by fiscal-year average petrol/diesel duty rates.
264+
2025-01-01: -0.019907019324541197
265+
2026-01-01: -0.01438967286340953
266+
2027-01-01: -0.02416859220902523
267+
2028-01-01: -0.02700230120226388
268+
2029-01-01: -0.037280775640417985
269+
2030-01-01: -0.052236910509542045
270+
# Hold the final OBR forecast volume flat after 2030-31.
271+
2031-01-01: 0.0
272+
2032-01-01: 0.0
273+
2033-01-01: 0.0
274+
2034-01-01: 0.0
275+
2035-01-01: 0.0
276+
2036-01-01: 0.0
277+
2037-01-01: 0.0
278+
2038-01-01: 0.0
279+
2039-01-01: 0.0
280+
2040-01-01: 0.0
281+
2041-01-01: 0.0
282+
2042-01-01: 0.0
283+
2043-01-01: 0.0
284+
2044-01-01: 0.0
285+
2045-01-01: 0.0
286+
2046-01-01: 0.0
287+
2047-01-01: 0.0
288+
2048-01-01: 0.0
289+
2049-01-01: 0.0
290+
2050-01-01: 0.0
291+
2051-01-01: 0.0
292+
2052-01-01: 0.0
293+
2053-01-01: 0.0
294+
2054-01-01: 0.0
295+
2055-01-01: 0.0
296+
2056-01-01: 0.0
297+
2057-01-01: 0.0
298+
2058-01-01: 0.0
299+
2059-01-01: 0.0
300+
2060-01-01: 0.0
301+
2061-01-01: 0.0
302+
2062-01-01: 0.0
303+
2063-01-01: 0.0
304+
2064-01-01: 0.0
305+
2065-01-01: 0.0
306+
2066-01-01: 0.0
307+
2067-01-01: 0.0
308+
2068-01-01: 0.0
309+
2069-01-01: 0.0
310+
2070-01-01: 0.0
311+
2071-01-01: 0.0
312+
2072-01-01: 0.0
313+
2073-01-01: 0.0
314+
metadata:
315+
unit: /1
316+
label: Road fuel volume growth
317+
reference:
318+
- title: HMRC Hydrocarbon Oils Bulletin
319+
href: https://www.gov.uk/government/statistics/hydrocarbon-oils-bulletin
320+
- title: OBR EFO March 2026 (fuel-duty receipts forecast)
321+
href: https://obr.uk/efo/economic-and-fiscal-outlook-march-2026/
322+
- title: OBR fuel-duty supplementary release, receipts by vehicle type
323+
href: https://obr.uk/docs/dlm_uploads/Fuel-duty-supplementary-release_receipts-by-vehicle-type.pdf
324+
254325
consumer_price_index_ahc:
255326
description: Consumer price index year-on-year growth, modified to remove housing costs.
256327
values:
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import pandas as pd
2+
import pytest
3+
4+
from policyengine_uk.data.dataset_schema import UKSingleYearDataset
5+
from policyengine_uk.data.economic_assumptions import extend_single_year_dataset
6+
from policyengine_uk.system import system
7+
8+
9+
def test_petrol_and_diesel_spending_use_road_fuel_volume_not_cpi():
10+
parameters = system.parameters
11+
road_fuel_volume = (
12+
parameters.gov.economic_assumptions.yoy_growth.obr.road_fuel_volume
13+
)
14+
cpi = parameters.gov.economic_assumptions.yoy_growth.obr.consumer_price_index
15+
16+
assert road_fuel_volume(2027) < 0
17+
assert cpi(2027) > 0
18+
19+
dataset = UKSingleYearDataset(
20+
person=pd.DataFrame(
21+
{
22+
"person_id": [1],
23+
"person_benunit_id": [1],
24+
"person_household_id": [1],
25+
"age": [40],
26+
}
27+
),
28+
benunit=pd.DataFrame({"benunit_id": [1]}),
29+
household=pd.DataFrame(
30+
{
31+
"household_id": [1],
32+
"region": ["LONDON"],
33+
"tenure_type": ["OWNED_OUTRIGHT"],
34+
"council_tax": [1_500.0],
35+
"rent": [0.0],
36+
"petrol_spending": [1_000.0],
37+
"diesel_spending": [2_000.0],
38+
}
39+
),
40+
fiscal_year=2026,
41+
)
42+
43+
extended = extend_single_year_dataset(
44+
dataset,
45+
tax_benefit_system_parameters=parameters,
46+
end_year=2027,
47+
)
48+
household_2027 = extended[2027].household
49+
50+
assert household_2027["petrol_spending"].iloc[0] == pytest.approx(
51+
1_000 * (1 + road_fuel_volume(2027))
52+
)
53+
assert household_2027["diesel_spending"].iloc[0] == pytest.approx(
54+
2_000 * (1 + road_fuel_volume(2027))
55+
)
56+
assert household_2027["petrol_spending"].iloc[0] < 1_000
57+
assert household_2027["diesel_spending"].iloc[0] < 2_000

policyengine_uk/variables/input/consumption/diesel_spending.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ class diesel_spending(Variable):
1010
value_type = float
1111
unit = GBP
1212
quantity_type = FLOW
13-
uprating = "gov.economic_assumptions.indices.obr.consumer_price_index"
13+
uprating = "gov.economic_assumptions.indices.obr.road_fuel_volume"

policyengine_uk/variables/input/consumption/petrol_spending.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ class petrol_spending(Variable):
1010
value_type = float
1111
unit = GBP
1212
quantity_type = FLOW
13-
uprating = "gov.economic_assumptions.indices.obr.consumer_price_index"
13+
uprating = "gov.economic_assumptions.indices.obr.road_fuel_volume"

0 commit comments

Comments
 (0)