The model calculates alcohol duty, tobacco duty, vehicle excise duty on cars,
and duty on LPG and natural road fuel gas from supplied household inputs.
household_tax and gov_tax include these amounts once, alongside petrol and
diesel duty. These totals combine the different annual bases described below.
The incidence assumption is full pass-through to consumers.
The model also includes seven gambling duty families from supplied attributed household bases. Household gambling duties documents the rates, casino incidence proxy, period conventions and outstanding population data, machine-premises and VAT work.
Coverage and periods¶
Alcohol, tobacco and car duty calculations cover 2024/25 to 2026/27. The alcohol 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. SI 2026/555 removed the September 2026 step that Budget 2025 announced 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 with RPI growth on top, and rise by RPI each 1 April from 2028, as petrol and diesel do (see below).
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
year. Duty is calculated separately for every rate interval, then weighted by
the interval’s share of the year. Tobacco Budget-day changes take effect at
18:00, while the 1 October 2026 change takes effect at midnight. Applying the
cigarette minimum within each interval matters when the minimum begins or ceases
to bind during the year.
These two rate nodes use preserve_calendar_dates: true to opt out of the
usual conversion of government parameters to annual values. Their raw parameter
values retain their actual dates; utils/excise.py performs the annual
calculation. Value-level effective_time metadata records the Budget-day time.
Annual Scenario.parameter_changes and bare-year legacy reform dictionaries
apply to a complete UK fiscal year. Explicit date ranges retain the dates the
caller supplies.
The linear fuel duty rates on petrol, diesel and road fuel gases use the
existing fiscal_year_blend: true machinery. Each rate is keyed to the date it
takes effect and day-weighted across the model year, 6 April to 5 April. Time
of day is not modelled. Monthly fuel_duty allocates one twelfth of each annual
volume and uses the model’s annual rate; it does not represent duty on a dated
purchase.
Consequently, household_tax and gov_tax mix year bases. For model period
2026, alcohol, tobacco and fuel duty use 6 April 2026 to 5 April 2027, and VED
uses 1 April 2026 to 31 March 2027. They are added to existing annual components,
including income tax and VAT. Aggregation does not realign or prorate these components
to a common reporting year. The totals therefore do not represent a consistent
January-to-December receipts period. Before comparing gov_tax with
calendar-year receipts, align each component to that calendar year; changing the
total’s year label alone does not perform that conversion.
Alcohol inputs¶
For each of beer, cider, sparkling_cider, wine, spirits, and
other_fermented, supply household inputs:
<product>_litres: litres of the drink bought over the year, default zero.<product>_abv: strength as a fraction, for example0.05for 5%.<product>_draught_share: the fraction qualifying for statutory draught relief, default zero. This should reflect qualifying containers and dispensing, not simply where the household drinks the product.
Default strengths are illustrative assumptions in
household.consumption.alcohol, not population averages: beer 4%, cider and
sparkling cider 4.5%, wine 12%, spirits 40%, other fermented products 5%.
Override them for a known product. Each product input represents one strength;
where a household buys products spanning multiple rate bands, calculate the
components separately or supply the summed product duty.
The product definitions are the statutory categories. For example, fruit ciders
that do not qualify as cider belong under other_fermented. The model covers
Schedule 7 strength bands, Schedule 8 draught rates, the sparkling-cider 5.5%
boundary, and the temporary wine-strength easement ending on 1 February 2025.
Small producer relief and demand responses are excluded.
The result alcohol_duty sums the six product-duty outputs. In 2026/27,
100 litres of 5% beer gives £112.90 with no draught relief, or £97.25 when all of
it qualifies for draught relief.
Sources: HMRC Alcohol Duty rates and historic rates.
Tobacco inputs¶
Supply household cigarettes_per_week, cigarette_price_per_pack, and any of
hand_rolling_tobacco_grams_per_week, cigars_grams_per_week,
other_tobacco_grams_per_week, and heated_tobacco_grams_per_week.
Weekly quantities are annualised with the model’s 52-week convention. Prices
refer to twenty cigarettes. The default price uses the ONS 2024 calendar-year
average of £15.85 and stays constant thereafter; supply the actual price when
available. The default is a data assumption, not a tax parameter.
tobacco_duty applies the higher of specific-plus-ad-valorem duty and minimum
duty to cigarettes, plus weight-based duty on other products. Specific and
minimum cigarette parameters are stored in pounds per cigarette; other
specific rates are pounds per kilogram. Vaping products duty is outside this
implementation.
Sources: HMRC Tobacco Products Duty rates and ONS cigarette price series CZMP.
Car inputs¶
Supply one car for each person who keeps a car:
car_first_registration_date, formattedYYYY-MM-DD.car_co2_emissions, in g/km.car_fuel_type:PETROL,DIESEL_RDE2,DIESEL_NON_RDE2,ALTERNATIVE_FUEL(including hybrids and LPG), orELECTRIC(including other zero-emission cars).car_list_price, the original list price before discounts.car_engine_size, in cc, for cars first registered before 1 March 2001.car_is_ved_exempt, for an applicable exemption, including an eligible historic or disabled person’s vehicle.
Without a registration date the result is zero. num_vehicles and
owns_vehicle do not create a taxable car, since they cannot identify its
schedule. car_vehicle_excise_duty computes each person’s charge;
vehicle_excise_duty aggregates them within the household.
The calculation assumes one twelve-month licence in each VED rate year
(1 April to 31 March), with uninterrupted annual renewals from first
registration. It charges the full first licence in the registration year and
then the annual renewal; it does not spread that first licence across tax
years. It excludes partial-year ownership, refunds, instalment surcharges,
changes of tax class and the 50% disability reduction. A person with more than
one car can supply their combined car_vehicle_excise_duty directly.
The schedules cover engine size before March 2001; CO2 bands from March 2001 to March 2017, including the pre-23 March 2006 band-K cap; and first-year and standard rates from April 2017. The expensive-car supplement applies during the next five annual licences. Its zero-emission threshold rises to £50,000 from 2026/27, including cars registered in 2025/26; zero-emission cars registered before April 2025 remain exempt from the supplement. The 2024/25 zero-emission exemption and alternative-fuel discount are also represented. Vans, motorcycles and the proposed electric-vehicle mileage charge are outside this implementation.
Sources: DVLA vehicle tax rate tables, Budget 2025 rate tables, and zero-emission vehicle guidance.
Road fuel gas inputs¶
Supply annual household lpg_kg and natural_gas_kg. Natural gas includes
biogas used as road fuel, not domestic heating. The inputs are kilograms,
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.
Budget 2026’s costing 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)”, and
applies the cut to other fuels in proportion. So on 1 July 2027 the gas rates
return to their full rates before the 2022 cut (LPG £0.3161/kg, natural gas
£0.2470/kg), with the same RPI growth as petrol and diesel. HM Treasury
publishes the rates from 1 July 2027 in Annex A of Budget 2026’s Overview
of Tax Legislation and Rates: £0.3305/kg and £0.2582/kg (the uprating gives
£0.2583/kg for natural gas, and the model uses HM Treasury’s rate). Each
1 April from 2028 they rise by the previous calendar
year’s RPI growth. calculate_fuel_duty_rates.py writes these steps to
1 April 2031, as it does for petrol and diesel, and the parameters’ uprating
metadata continues them. That is policy, not law.
Sources: HMRC fuel duty rates 2026 to 2027 (RPI uprating from 2027/28), HMRC amended fuel duty rates 2026 to 2027 SI 2026/164 as amended by SI 2026/555 and Budget 2026 policy costings, 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
(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. The OBR’s October 2026 EFO (paragraph 3.19)
puts the rate at 60.59p from 1 July 2027: RPI growth in the year to 2027 Q1
(4.5565%, economy Table 1.7) on the 57.95p pre-cut rate. The model
uses that figure, and calculate_fuel_duty_rates.py refuses to write any
other July rate. From 1 April 2028, each step applies the previous calendar
year’s RPI growth from the OBR forecast in
gov.economic_assumptions.yoy_growth.obr.rpi, rounded to the nearest
hundredth of a penny. The script writes the steps to 1 April 2031, and a test
fails when they fall out of date with the RPI forecast. After a new EFO, set
the script’s July rate and RPI growth to its forecast and rerun it. Later steps come from the parameter’s uprating metadata.
The RPI index ends with the growth series, in 2074, so the last step is 1 April 2075.
An annual reform names a model year and replaces the rate for all of it. For
model years to 2030 it leaves other years unchanged. Scenario.parameter_changes
reapplies uprating after the change, so an override from model year 2031, where
the steps come from uprating metadata, restarts uprating from the last written
rate: every later year stays one 1 April step behind. Reform classes and legacy
reform dictionaries change the annual values after uprating and are not
affected.
Projecting alcohol and tobacco quantities¶
Each alcohol and tobacco quantity input declares its product group’s index,
and dataset projection grows it by the same group’s series in
gov.economic_assumptions.yoy_growth.obr.per_capita
(policyengine_uk/data/uprating_indices.yaml). The importer writes each
series as the growth in the OBR’s clearances of the group per person
(#2596):
| Inputs | Series | OBR line |
|---|---|---|
cigarettes_per_week | tobacco_clearances.cigarettes | Table 4.11, “Cigarette clearances (million sticks)” |
hand_rolling_tobacco_grams_per_week | tobacco_clearances.hand_rolling_tobacco | Table 4.11, “Hand rolled tobacco clearances” |
cigars_grams_per_week, other_tobacco_grams_per_week, heated_tobacco_grams_per_week | tobacco_clearances.other_tobacco_products | Table 4.11, “Other tobacco products” |
beer_litres, cider_litres, sparkling_cider_litres | alcohol_clearances.beer_and_cider | Table 4.12, “Beer and cider” |
wine_litres, other_fermented_litres | alcohol_clearances.wine | Table 4.12, “Wine”, which includes other fermented products |
spirits_litres | alcohol_clearances.spirits | Table 4.12, “Spirits”, which includes spirit-based ready-to-drinks |
The OBR splits Table 4.11’s non-cigarette clearances into hand-rolled tobacco
and other tobacco products only, so the cigar, other tobacco and heated
tobacco inputs share one series. Dataset projection keeps the strengths
(<product>_abv), the draught shares and cigarette_price_per_pack at their
base-year values, since the first two measure ratios and the third a price.
A forward path for the cigarette price needs its own change.
Population¶
extend_single_year_dataset copies the base year’s dataset into each later
year, and apply_single_year_uprating multiplies each column that
uprating_indices.yaml lists by one plus its series’ growth in that year.
The file lists household_weight under
gov.economic_assumptions.yoy_growth.ons.population. So, for household i in
year t, with population growth p(t) and a quantity series g(t):
the weight is w(i, t) = w(i, t - 1) × (1 + p(t));
the quantity is q(i, t) = q(i, t - 1) × (1 + g(t));
the weighted total is Q(t) = Σ w(i, t) × q(i, t) = (1 + p(t)) × (1 + g(t)) × Q(t - 1).
With g(t) = (1 + c(t)) / (1 + p(t)) - 1, where c(t) is the growth in
clearances, Q(t) = (1 + c(t)) × Q(t - 1): the weighted total follows the
clearances. A series of c(t) itself would give
Q(t) = (1 + p(t)) × (1 + c(t)) × Q(t - 1) and count population growth twice.
ons.population grows 1.54% from 2024-25 to 2031-32, so totals grown that
way would end 1.54% above the clearances.
In the OBR’s outturn, cigarette clearances fell 9.97%, from 13,578.2 million sticks in 2024-25 (March 2026 EFO) to 12,224.6 million in 2025-26 (October 2026 EFO). Population grows 0.33% in 2025, so the importer writes 12,224.6 / 13,578.2 / 1.0033 - 1 = -10.27% (-0.102653) for that year.
Years¶
| Model year | Series | Source |
|---|---|---|
| 2024 (2024-25) | Base year: 0, index 1 | The alcohol and tobacco duties start in model year 2024 |
| 2025 | Outturn | October 2026 Tables 4.11 and 4.12 (2025-26) over March 2026 Tables 3.11 and 3.12 (2024-25) |
| 2026 to 2031 | Forecast | October 2026 Tables 4.11 and 4.12 |
| 2032 on | Clearances held flat: 1 / (1 + p(t)) - 1 | As road_fuel_volume after the OBR’s forecast |
The OBR’s years run from 1 April and the model’s from 6 April. As for road
fuel, the importer stores the fiscal year that starts in year t at
t-01-01.
The indices, gov.economic_assumptions.indices.obr.per_capita.*, start at 1
in 2024 and stand at:
| Group | 2025 | 2026 | 2027 | 2028 | 2029 | 2030 | 2031 |
|---|---|---|---|---|---|---|---|
| Cigarettes | 0.897 | 0.803 | 0.721 | 0.660 | 0.599 | 0.558 | 0.520 |
| Hand-rolled tobacco | 0.826 | 0.769 | 0.712 | 0.652 | 0.610 | 0.584 | 0.556 |
| Other tobacco products | 0.861 | 0.815 | 0.781 | 0.715 | 0.679 | 0.653 | 0.615 |
| Beer and cider | 0.969 | 0.950 | 0.929 | 0.921 | 0.914 | 0.903 | 0.891 |
| Wine | 0.965 | 0.963 | 0.945 | 0.937 | 0.929 | 0.917 | 0.907 |
| Spirits | 0.984 | 0.974 | 0.956 | 0.950 | 0.944 | 0.933 | 0.924 |
Past PROJECTION_END_YEAR (2032), policyengine-core scales each input by
the index it declares.
The importer, policyengine_uk/utils/import_obr_forecasts.py, writes the
six series from CLEARANCE_SERIES_SPECS in the same run as the other
receipts series (see the steps for a new EFO in the economic assumptions
README), and reads ons.population from the yoy_growth.yaml it rewrites.
It interprets no words in the clearance tables. CLEARANCE_TABLE_TEXTS
lists each text, other than titles, numbers and fiscal years, in Tables 3.11
and 3.12 of the March 2025 and March 2026 EFOs and Tables 4.11 and 4.12 of
October 2026, from each title down to the next table’s title: the line
labels, the “Outturn” and “Forecast” markers, the “of which:” row, Table
4.12’s note “All clearances are in thousands of hectolitres of alcohol” and
its footnotes. On Table 4.12’s sheet the OBR follows the alcohol clearances
with the alcohol receipts forecasts. The importer ends the clearance table
at their title (CLEARANCE_TABLE_ENDS), so its check leaves out the
receipts table’s “£ billion” cell and note. From each clearance table’s
title through that configured end, or the sheet’s last row, the importer
compares text cells in every column with the list. It skips the title cell,
numbers and fiscal years, and stops before writing anything when:
a cell holds any other text, such as a note that states another unit or scale, a line for another product or a unit column’s heading;
the table lacks the cell that states a line’s unit: the cigarette label’s “(million sticks)”, the non-cigarette total’s “('000s kg)” for hand-rolled and other tobacco, or Table 4.12’s note for alcohol;
a text sits beside the years in the fiscal-year row over a line, such as a unit column’s heading or a line’s label;
hand-rolled or other tobacco does not sit under an “of which:” row directly below the non-cigarette total’s row, which holds its label and figures, with only the total’s other parts between;
the OBR puts any cell beside a line’s label and values;
the sheet repeats the table’s heading, since the importer would check the text under one heading and could read a line under another.
A table can keep every text on the list and still put a line under another unit: a rearranged copy of the real October 2026 Table 4.11 can put the two tobacco parts under the cigarette label’s million sticks. The two layout checks stop it. The importer reads every formatting run of a cell’s text, and leaves out any phonetic run. It names the table and each unread cell, the text in the fiscal-year row, the missing total or the rows that repeat the heading. Whoever runs it reads the text, converts the table’s figures to the listed units if it states another, and adds the text to the list. The importer checks no cell above a table’s title or below its end, so that person reads any note there too.
Budget measures and reforms¶
The OBR incorporates in its October 2026 forecast the measures the government announced at Budget 2026 and since the March forecast (EFO paragraph 3.2). It lists no change to an alcohol or tobacco duty rate in its policy Table 1.1, and three measures that change the two duties’ receipts, none by more than £13 million a year:
measure 19, more generous Small Producer Relief from 1 February 2027: alcohol duty £1.5 million lower in 2026-27 and £9.2 million to £9.9 million lower a year after (the model leaves out Small Producer Relief);
measure 45, HMRC’s measures to close the tax gap: tobacco duty £0.7 million higher in 2026-27 and £12.7 million higher in 2031-32, and alcohol duty £0.3 million to £4.8 million higher;
measure 95, the removal of the £135 customs duty relief on low-value imports from October 2028: tobacco duty up to £0.8 million and alcohol duty up to £0.4 million lower a year.
The OBR still assumes rising duty rates. It expects alcohol receipts to grow, “driven by increases to the duty rate that offset an assumed average 1 per cent decline in alcohol consumption in each year” (paragraph 4.43), and tobacco receipts to fall “as higher duty rates only partly offset falling consumption” (paragraph 4.44). So the OBR forecasts the clearances along that consumption trend, under rate rises it assumes rather than ones the government announced at the Budget.
The dataset projection reads no duty rate (uprating_input_paths in
policyengine_uk/data/economic_assumptions.py), so it grows quantities by
the indices whatever rates the model charges. When a reform changes alcohol
or tobacco duty rates, the model therefore moves receipts through the rates
alone and applies no consumption response. Under current law the model holds
the alcohol rates at their 1 February 2026 values, the tobacco rates at
their 1 October 2026 values and the default cigarette price at its 2024
average, while the OBR forecasts its volumes with the rates it expects.
Receipts against the OBR’s forecast¶
On quantities that follow the clearances, the model’s duty moves with its own rates. A constructed dataset of one household at weight 1 that holds the UK’s 2024-25 clearances shows the effect. It treats beer and cider as beer at 4% with no draught relief, wine and other fermented products as wine at 12%, spirits at 40%, other tobacco products as other smoking tobacco, and cigarettes at the default price. On that mix the model’s duty per unit cleared rises 5.7% for alcohol by 2026-27 and 19.0% for tobacco by 2027-28. The alcohol increases take effect in February 2025 and February 2026, and the tobacco increases in October 2024, November 2025 and October 2026. Each reaches its first full model year after 2024-25. After that, product mix alone moves model duty per unit. The OBR’s receipts per unit cleared keep rising, by 22.1% for alcohol and 48.2% for tobacco by 2031-32.
On this construct, the model’s alcohol duty exceeds the OBR’s receipts by 7.6% in 2024-25 and 7.9% in 2026-27, then by less each year: by 3.5% in 2027-28 and 0.3% in 2028-29. It first falls short in 2029-30, by 2.5%, and by 6.8% in 2031-32. The model’s tobacco duty exceeds the OBR’s 2024-25 receipts by 1.9%, falls short by 0.8% in 2025-26 and 0.4% in 2026-27, and then by more each year, to 18.0% in 2031-32. Charging all beer and cider at the beer rate with no draught relief lifts that line 22.4% above its 2024-25 receipts, and a dataset brings its own product mix. From 2027-28 the model holds its rates while the OBR assumes rising ones, and each gap moves with that difference.
Sources¶
The series and the figures above come from these files. The parser fixtures
in policyengine_uk/tests/fixtures/obr_receipts/ keep the receipts sheets
of the two receipts workbooks unchanged.
| File | SHA-256 | Sheet and cells |
|---|---|---|
OBR October 2026 EFO, detailed forecast tables zip (efo-october-2026-detailed-forecast-tables-zipfile.zip) | 06ac908c69fce7d69dbfda4e16fc3b091a83bd8140ecd2f24990acd13d945fc2 | Holds the two workbooks below |
October 2026 receipts tables, as published in the zip (efo-october-2026-detailed-forecast-tables-receipts.xlsx) | d115705716d77b11c190385d41cb1924f30080c9331a8a386c04d4e65a368e95 | 4.11: rows 5 (cigarettes, unit in B5), 6 (non-cigarette, unit in B6), 8 (hand-rolled) and 9 (other tobacco products), columns C (2025-26 outturn) to I (2031-32); 4.12: rows 5 to 7 (beer and cider, wine, spirits), columns C to I, unit note B8, footnotes B9 and B10; 4.8: row 27 (tobacco duties, cash) and 4.12 rows 16 to 18 (alcohol receipts, accrued), for the comparison above |
October 2026 policy tables (efo-october-2026-detailed-forecast-tables-policy.xlsx) | cdcc2a06b100241bf3010bd159a4e5d43daef2348a3850797b1e88a308fd45fd | 1.1: rows 95 (measure 19), 203 and 204 (measure 45), 446 and 447 (measure 95), 494 and 515 (totals for alcohol and tobacco duty) |
October 2026 EFO (economic-and-fiscal-outlook-october-2026-web-accessible.pdf) | 9e0e9c340e35e603066f3124a614fcd68feadb3d5d10d1f76fb536e150e6225e | Paragraphs 3.2, 4.43 and 4.44 |
March 2026 receipts tables, as downloaded (obr_efo_march_2026_receipts.xlsx; the parser fixture of that name keeps only some of its sheets) | f65b6cb7f96931d4abd85940794eb60f6f65afca8bbf16c74a4548bf92766a28 | 3.11: rows 5, 8 and 9, column C (2024-25 outturn); 3.12: rows 5 to 7, column C, and rows 16 to 18, column C (2024-25 receipts); 3.8: row 27, column D |
Population data follow-ups¶
These formulas do not impute quantities or vehicle characteristics from the
existing combined alcohol_and_tobacco_consumption, fuel expenditure or vehicle
counts. Missing new inputs therefore contribute zero duty. Program metadata
marks alcohol, tobacco and vehicle excise duty as partial coverage. National
revenue estimates and distributional results require a separate data change:
Split alcohol and tobacco expenditure into products, including alcohol purchased in hospitality venues. Derive quantities using independently measured prices and strengths, retaining the original total expenditure.
Validate weighted totals against the HMRC Alcohol Bulletin and Tobacco Bulletin. Record the fiscal year, population coverage, under-reporting adjustment, non-household purchases and cross-border differences before comparing totals.
Impute car characteristics jointly, preserving vehicle counts and ownership, using National Travel Survey or DVLA licensing data. Retain the registration, emissions, fuel and price correlations that determine the duty.
Identify road fuel gas consumption separately from petrol and diesel; do not allocate the same fuel spending to both.
Until these inputs are available, these additions support household calculations and reforms on supplied quantities, not validated national revenue estimates.