Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/ab26-fuel-duty.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Keep the 5p fuel duty cut to 1 July 2027, as announced at Budget 2026. On that date petrol and diesel return to 57.95p uprated by 2026 RPI growth, then rise by RPI each 1 April from 2028; LPG and natural gas return to their full rates.
50 changes: 27 additions & 23 deletions docs/engineering/excise-duties.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ parameter history starts on 1 August 2023; the preceding alcohol regime and a
complete 2023/24 calculation are outside this implementation. Tobacco rates
start on 22 November 2023. The new alcohol, tobacco and car formulas return their
default zero before 2024; that is an unmodelled period, not a statutory exemption.
Gas duty covers 2022/23 onwards and includes the 1 January 2027 and 1 March 2027
increases. SI 2026/555 removed the September 2026 step announced at Budget 2025
and moved the December 2026 step to 1 January 2027. Rates after the last dated
entry stay constant; the gas parameters do not forecast future inflation
increases.
Gas duty covers 2022/23 onwards. SI 2026/555 removed the September 2026 step
announced at Budget 2025 and moved the December 2026 step to 1 January 2027.
Budget 2026 then kept the proportionate cut to 1 July 2027, when the gas rates
return to their full levels. Rates after the last dated entry stay constant;
the gas parameters do not forecast future inflation increases.

For alcohol and tobacco, a model year such as `2026` represents 6 April 2026 to
5 April 2027. Quantities and cigarette retail prices are constant across that
Expand Down Expand Up @@ -154,32 +154,36 @@ matching the legislation. No universal litre-to-kilogram density is assumed.
The existing `fuel_duty` output includes these charges. Rural fuel duty relief
continues to apply only to petrol and diesel.

From 1 March 2027 onwards, the gas parameters hold LPG at £0.3161/kg and natural
gas at £0.2470/kg. This implementation stops at the last numerical rates in the
HMRC 2026-to-2027 schedule and does not extrapolate gas rates using an inflation
forecast. This is a modelling limitation: HMRC states that RPI uprating resumes
from 2027/28. The petrol and diesel rate includes forecast RPI uprating each
1 April from 2027, so its rates rise while the gas rates stay flat. Later-year gas duty is therefore lower than it would be
under the same uprating assumption. Analyses beyond March 2027 that require
consistent fuel-duty forecasts must supply an uprated gas-rate path explicitly.
From 1 July 2027 onwards, the gas parameters hold LPG at £0.3161/kg and natural
gas at £0.2470/kg, the full rates before the 2022 cut. This implementation does
not extrapolate gas rates using an inflation forecast. This is a modelling
limitation: Budget 2026's costing says fuel duty rates are uprated by RPI from
1 July 2027. The petrol and diesel rate includes that forecast uprating, so its
rates rise while the gas rates stay flat. Later-year gas duty is therefore lower
than it would be under the same uprating assumption. Analyses beyond June 2027
that require consistent fuel-duty forecasts must supply an uprated gas-rate path
explicitly.

Sources: [HMRC fuel duty rates 2026 to 2027](https://www.gov.uk/government/publications/fuel-duty-rates-for-2026-to-2027/fuel-duty-rates-2026-to-2027)
(RPI uprating from 2027/28),
[HMRC amended fuel duty rates 2026 to 2027](https://www.gov.uk/government/publications/amended-fuel-duty-rates-for-2026-to-2027/amended-fuel-duty-rates-2026-to-2027)
and [SI 2026/164 as amended by SI 2026/555](https://www.legislation.gov.uk/uksi/2026/164).
[SI 2026/164 as amended by SI 2026/555](https://www.legislation.gov.uk/uksi/2026/164)
and [Budget 2026 policy costings, page 13](https://assets.publishing.service.gov.uk/media/6ae1883fe4367e5c8b0467df/AB26_Policy_Costing.pdf#page=13).

## Petrol and diesel rate

The main rate on unleaded petrol and diesel is keyed to each statutory change:
52.95p a litre from 23 March 2022, continued by annual orders to 31 December 2026;
55.95p from 1 January 2027 (SI 2026/164 as amended by SI 2026/555); and the Hydrocarbon Oil
Duties Act 1979 rate of 57.95p from 1 March 2027. Budget 2025 states that rates
will be uprated by RPI from April 2027, and HM Treasury's Budget 2025 costing
dates this from 1 April 2027. That uprating is policy, not law: HMRC's amended
note of 22 May 2026 says final rates will be confirmed at Budget 2026. No
official source names the RPI measure. The model applies the previous calendar
year's RPI growth from the OBR forecast in
`gov.economic_assumptions.yoy_growth.obr.rpi` on each 1 April, rounded to the
52.95p a litre from 23 March 2022, continued by annual orders to 31 December 2026
(SI 2026/164 as amended by SI 2026/555). Those orders then stepped to 55.95p on
1 January 2027 and to the Hydrocarbon Oil Duties Act 1979 rate of 57.95p on
1 March 2027. Budget 2026 (paragraph 6.211) cancelled both steps and kept the
cut to 1 July 2027. Its costing (page 13) says: "On 1 July 2027, fuel duty rates
will increase by 5ppl and will be uprated in line with the Retail Prices Index
(RPI). From 1 April 2028, fuel duty rates will be uprated annually in line with
RPI." That is policy, not law. No official source names the RPI measure. The
model takes the 57.95p pre-cut rate and applies 2026 RPI growth on 1 July 2027,
then the previous calendar year's RPI growth on each 1 April from 2028, from the
OBR forecast in `gov.economic_assumptions.yoy_growth.obr.rpi`, rounded to the
nearest hundredth of a penny. The steps to 1 April 2031 are written out by
`calculate_fuel_duty_rates.py`, and a test fails when they fall out of date
with the RPI forecast. Later steps come from the parameter's uprating metadata.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
"""
Generates the forecast RPI uprating steps in petrol_and_diesel.yaml.

The statutory schedule ends with the Hydrocarbon Oil Duties Act 1979 rate of
57.95p from 1 March 2027. Budget 2025 states that rates will then be uprated
by RPI from April 2027. This script applies each previous calendar year's RPI
growth from economic_assumptions/yoy_growth.yaml on 1 April (the date in HM
Treasury's Budget 2025 costing), rounding to the nearest hundredth of a penny, and writes the results between the BEGIN and END
Budget 2026 keeps the 5p cut to 1 July 2027. Its policy costing (page 13)
says that "On 1 July 2027, fuel duty rates will increase by 5ppl and will be
uprated in line with the Retail Prices Index (RPI). From 1 April 2028, fuel
duty rates will be uprated annually in line with RPI." This script takes the
57.95p pre-cut rate (Finance Act 2011 s. 19), applies 2026 RPI growth on
1 July 2027, then each previous calendar year's RPI growth on 1 April from
2028, using economic_assumptions/yoy_growth.yaml. It rounds to the nearest
hundredth of a penny and writes the results between the BEGIN and END
markers in petrol_and_diesel.yaml. Run it with --update whenever the RPI
forecast changes; test_fuel_duty_schedule.py fails until you do.

Expand All @@ -24,15 +27,19 @@
PARAMETER_FILE = FUEL_DUTY_DIR / "petrol_and_diesel.yaml"
YOY_GROWTH_FILE = FUEL_DUTY_DIR.parents[1] / "economic_assumptions" / "yoy_growth.yaml"

# The last statutory rate, and the first and last 1 April steps written out.
# Later steps come from the parameter's uprating metadata.
STATUTORY_DATE = "2027-03-01"
FIRST_UPRATING_YEAR = 2027
# The pre-cut rate the first step uprates, the date the cut ends, and the
# first and last 1 April steps written out. Later steps come from the
# parameter's uprating metadata.
BASE_DATE = "2011-03-23"
CUT_END_DATE = "2027-07-01"
FIRST_APRIL_YEAR = 2028
LAST_UPRATING_YEAR = 2031

BEGIN = " # BEGIN RPI forecast generated by calculate_fuel_duty_rates.py\n"
END = " # END RPI forecast generated by calculate_fuel_duty_rates.py\n"
PENNY_HUNDREDTH = Decimal("0.0001")
BUDGET_2026 = "https://assets.publishing.service.gov.uk/media/6ae1ec57bdb574cf1c9b3f12/E03668986_HMT_Budget_2026_ELAY__2_.pdf#page=138"
COSTING_2026 = "https://assets.publishing.service.gov.uk/media/6ae1883fe4367e5c8b0467df/AB26_Policy_Costing.pdf#page=13"


def rpi_series() -> dict:
Expand All @@ -46,24 +53,28 @@ def rpi_growth_by_year() -> dict:
return {int(str(date)[:4]): Decimal(str(value)) for date, value in values.items()}


def statutory_rate() -> Decimal:
def base_rate() -> Decimal:
with open(PARAMETER_FILE) as f:
values = yaml.safe_load(f)["values"]
entry = {str(date): value for date, value in values.items()}[STATUTORY_DATE]
entry = {str(date): value for date, value in values.items()}[BASE_DATE]
return Decimal(str(entry["value"] if isinstance(entry, dict) else entry))


def forecast_steps() -> list:
"""(date, rate, previous rate, RPI growth) for each forecast 1 April step."""
"""(date, rate, previous rate, RPI growth) for each forecast step."""
growth = rpi_growth_by_year()
rate = statutory_rate()
dates = [CUT_END_DATE] + [
f"{year}-04-01" for year in range(FIRST_APRIL_YEAR, LAST_UPRATING_YEAR + 1)
]
rate = base_rate()
steps = []
for year in range(FIRST_UPRATING_YEAR, LAST_UPRATING_YEAR + 1):
for date in dates:
year = int(date[:4])
previous = rate
rate = (previous * (1 + growth[year - 1])).quantize(
PENNY_HUNDREDTH, rounding=ROUND_HALF_UP
)
steps.append((f"{year}-04-01", rate, previous, growth[year - 1]))
steps.append((date, rate, previous, growth[year - 1]))
return steps


Expand All @@ -79,10 +90,10 @@ def render(steps: list) -> str:
f" note: Forecast. {previous} uprated by {int(date[:4]) - 1} RPI "
f"growth of {growth * 100:.1f}%.",
" reference:",
" - title: Budget 2025 (fuel duty uprated by RPI from April 2027)",
" href: https://www.gov.uk/government/publications/budget-2025-document/budget-2025-html",
" - title: HM Treasury, Budget 2025 policy costings, page 14 (from 1 April 2027)",
" href: https://assets.publishing.service.gov.uk/media/692872fd2a37784b16ecf676/Budget_2025-Policy_Costings.pdf#page=14",
" - title: Budget 2026, paragraph 6.211 (5p cut ends and RPI uprating from 1 July 2027)",
f" href: {BUDGET_2026}",
" - title: HM Treasury, Budget 2026 policy costings, page 13 (RPI on 1 July 2027, then each 1 April from 2028)",
f" href: {COSTING_2026}",
f" - title: {forecast['title']} (RPI forecast)",
f" href: {forecast['href']}",
]
Expand All @@ -106,7 +117,7 @@ def main():
)
args = parser.parse_args()
steps = forecast_steps()
print(f"{STATUTORY_DATE}: {statutory_rate()} (statutory)")
print(f"{BASE_DATE}: {base_rate()} (pre-cut rate)")
for date, rate, previous, growth in steps:
print(f"{date}: {rate} ({previous} x (1 + {growth}))")
if args.update:
Expand Down
7 changes: 4 additions & 3 deletions policyengine_uk/parameters/gov/hmrc/fuel_duty/lpg.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,18 @@ description: The UK levies road fuel duty on LPG at this rate per kilogram.
values:
'2021-01-01': 0.3161
'2022-03-23': 0.2888
'2027-01-01': 0.3052
'2027-03-01': 0.3161
'2027-07-01': 0.3161
metadata:
unit: currency-GBP
period: year
label: fuel duty rate on LPG per kilogram
reference:
- title: Hydrocarbon Oil Duties Act 1979, section 8
href: https://www.legislation.gov.uk/ukpga/1979/5/section/8
- title: SI 2026/164, article 8, as amended by SI 2026/555 (1 January to 28 February 2027)
- title: SI 2026/164, as amended by SI 2026/555 (cut continued to 31 December 2026)
href: https://www.legislation.gov.uk/uksi/2026/164
- title: Budget 2026, paragraph 6.211, and policy costings page 13 (proportionate cut to other fuels to 1 July 2027; not yet law)
href: https://assets.publishing.service.gov.uk/media/6ae1883fe4367e5c8b0467df/AB26_Policy_Costing.pdf#page=13
- title: HMRC, Amended Fuel Duty rates 2026 to 2027 (22 May 2026)
href: https://www.gov.uk/government/publications/amended-fuel-duty-rates-for-2026-to-2027/amended-fuel-duty-rates-2026-to-2027
fiscal_year_blend: true
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,18 @@ description: The UK levies road fuel duty on natural gas at this rate per kilogr
values:
'2021-01-01': 0.247
'2022-03-23': 0.2257
'2027-01-01': 0.2385
'2027-03-01': 0.247
'2027-07-01': 0.247
metadata:
unit: currency-GBP
period: year
label: fuel duty rate on natural gas per kilogram
reference:
- title: Hydrocarbon Oil Duties Act 1979, section 8
href: https://www.legislation.gov.uk/ukpga/1979/5/section/8
- title: SI 2026/164, article 8, as amended by SI 2026/555 (1 January to 28 February 2027)
- title: SI 2026/164, as amended by SI 2026/555 (cut continued to 31 December 2026)
href: https://www.legislation.gov.uk/uksi/2026/164
- title: Budget 2026, paragraph 6.211, and policy costings page 13 (proportionate cut to other fuels to 1 July 2027; not yet law)
href: https://assets.publishing.service.gov.uk/media/6ae1883fe4367e5c8b0467df/AB26_Policy_Costing.pdf#page=13
- title: HMRC, Amended Fuel Duty rates 2026 to 2027 (22 May 2026)
href: https://www.gov.uk/government/publications/amended-fuel-duty-rates-for-2026-to-2027/amended-fuel-duty-rates-2026-to-2027
fiscal_year_blend: true
Loading
Loading