Skip to content

Model the temporary 0% VAT on GB domestic electricity - #2189

Open
vahid-ahmadi wants to merge 6 commits into
rederive-vat-coveragefrom
electricity-vat-zero-rate
Open

vahid-ahmadi wants to merge 6 commits into
rederive-vat-coveragefrom
electricity-vat-zero-rate

Conversation

@vahid-ahmadi

@vahid-ahmadi vahid-ahmadi commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2166.

Stacked on #2187 (base branch rederive-vat-coverage, which splits the VAT grossing factor for #1996). Review and merge #2187 first; GitHub will then retarget this PR to main.

What was wrong

From 1 October 2026 to 31 March 2027, domestic electricity in England, Wales and Scotland is zero-rated for VAT (SI 2026/987; HMRC Brief 10/2026). Northern Ireland and gas stay at 5%.

The model couldn't represent this. Domestic fuel and power sat only inside a flat 2.5% share of total consumption (reduced_rate_share), taxed at one undated reduced rate and grossed up to receipts. electricity_consumption had no effect on vat, and there was no electricity-specific rate, nation split or date handling.

Fix

  • New domestic_energy_vat (household). It is VAT on the household's own electricity and gas bills:
    • electricity at a new gov.hmrc.vat.domestic_electricity_rate.{great_britain, northern_ireland};
    • gas at gov.hmrc.vat.reduced_rate.
  • vat = (full-rate VAT + VAT on the remaining reduced-rate base) / (survey coverage × household share of receipts) + domestic_energy_vat. baseline_vat does the same with baseline_domestic_energy_vat. The two factors come from Split VAT grossing into household share and survey coverage #2187.
  • The electricity rate:
    • GB: 5% from 1 September 1997, 0% from 1 October 2026, 5% from 1 April 2027. NI: 5% throughout.
    • Both carry fiscal_year_blend: true. Model year 2026 (6 April 2026 to 5 April 2027) has 183 days at 5% and 182 at 0%, so the GB rate for 2026 is 2.507%. Equal daily use is an assumption: HMRC bases liability on when electricity is consumed, and winter use is higher.
  • VAT-inclusive inputs. electricity_consumption and gas_consumption are NEED kWh priced at DESNZ Quarterly Energy Prices average prices paid (2024-25, all payment methods), which include 5% VAT. The VAT-exclusive base is the bill / 1.05 (5/105 of the bill is VAT), and it is held fixed when the rate changes.
  • No gross-up on energy. The energy inputs are calibrated to NEED consumption, not to receipts, and households bear VAT on their own bills in full. So neither the survey coverage nor the household share of receipts applies to energy VAT. Dividing it by the household share would put part of government and business VAT on electricity bills, and the zero rate would then cost 1/0.7 times the VAT households actually pay.
  • The generic reduced-rate base (reduced_rate_vat_consumption) is now consumption × max(reduced_rate_share − domestic_fuel_and_power_share, 0). The new gov.hmrc.vat.domestic_fuel_and_power_share holds ONS COICOP 04.5 / household final consumption by year from 2000.
  • Behaviour change for reforms: reduced_rate no longer reaches electricity. Its description now says so. A reform to electricity VAT should change domestic_electricity_rate.
  • The baseline tree: baseline_domestic_energy_vat day-weights the electricity rates itself (fiscal_year_average). The .baseline parameter tree keeps its dated values, so without this a simulation with no reform showed a nonzero vat_change in 2026 and 2027.

Reconciliation numbers

How much of the 2.5% is domestic fuel and power: all of it, to within rounding.

  • The OBR says "around 2.5 per cent of expenditure is taxed at this reduced rate", covering "domestic fuel and power, children's car seats and some other goods".
  • ONS 04.5 (electricity, gas and other fuels, ADFX) as a share of household final consumption (ABQI) was:
    • 2.79% in 2025 (£49.3bn / £1,766.6bn);
    • 2.83% in 2024;
    • between 2.49% and 3.63% in every year from 2006.
  • The non-energy remainder is therefore zero, apart from 0.01% of spending in 2017. Children's car seats, smoking-cessation products and similar can't be separated from published totals, which is a known small gap.

Aggregate check against HMRC.

  • Total domestic fuel and power:
    • HMRC's tax relief statistics (January 2026) put the reduced rate on domestic fuel and power at £7.0bn in 2025-26. Read as the 15-point gap to the standard rate, that is a VAT-exclusive base of about £46.7bn and £2.33bn of VAT at 5%.
    • ONS 04.5 for 2025 gives the same base: £49.3bn / 1.05 = £47.0bn.
  • Electricity:
    • ONS 04.5.1 (CDDL) is 58.5% of 04.5 in 2025, about £1.37bn of electricity VAT a year for the UK.
    • The model's GB electricity base (certified Microcosm UK 2024-25 release, 2026) is £24.9bn excluding VAT, which is £1.24bn of VAT a year at 5%. That is about 93% of HMRC-implied GB electricity VAT.
    • The gap is standing charges, which the NEED-priced inputs leave out.
  • Gas and electricity together: £2.02bn of VAT against HMRC's £2.33bn for all domestic fuel and power (87%). The remainder is heating oil, solid fuel and standing charges.

Coverage re-derived without energy VAT. With energy split out, coverage = pre-scaling non-energy VAT / (0.7 × (receipts − energy-bill VAT)). On the certified Microcosm UK 2024-25 release (f9d1922c) for 2024-25: 79.2 / (0.7 × (171.0 − 2.0)) = 0.670. That rounds to the same 0.67 as #2187's derivation, so the value is unchanged; its derivation record and docs/engineering/vat-coverage.md now describe the energy-excluded calculation.

Total vat against OBR receipts (same release):

Year OBR main (0.38) #2187 this PR of which energy-bill VAT
2024-25 £171.0bn £211.8bn (+23.9%) £171.6bn (+0.4%) £170.9bn (−0.0%) £2.0bn
2025-26 £180.2bn £220.6bn (+22.4%) £178.7bn (−0.8%) £177.9bn (−1.3%) £2.0bn
2026-27 £187.7bn £226.5bn (+20.7%) £183.5bn (−2.2%) £182.1bn (−3.0%) £1.4bn
2027-28 £231.9bn £187.9bn £187.0bn £2.0bn
  • 2024-25, 2025-26, 2027-28: against Split VAT grossing into household share and survey coverage #2187, energy now counts at its own bills (£2.0bn) instead of its share of grossed-up reduced-rate VAT, so total VAT is £0.7–0.9bn lower.
  • 2026-27: the GB zero rate is worth £0.62bn (£24.9bn of GB electricity excluding VAT × 5% × 182/365).
    • Search-result summaries say the Treasury put the cost at £850m in 2026-27; I couldn't confirm that on GOV.UK, whose impact table is still blank.
    • Equal daily use and the missing standing charges both understate the cost.

Tests

  • tests/test_domestic_electricity_vat.py (19 cases):
    • the GB rate on 30 September 2026, 1 October 2026, 31 March 2027 and 1 April 2027, and NI on each date;
    • the FY 2026-27 day-weighted rate (0.05 × 183/365), with FY 2025-26 and FY 2027-28 at 5%;
    • England, Wales and Scotland against NI in FY 2026-27;
    • gas unchanged;
    • vat responding to electricity_consumption;
    • energy VAT not grossed up by coverage;
    • the generic reduced-rate base being empty at current values, and a reduced-rate share above the energy share keeping the remainder;
    • no vat_change without a reform;
    • a dated reform extending the zero rate through FY 2027-28 (vat_change −£50 on £1,050 of bills);
    • a reduced_rate reform reaching gas but not electricity.
  • tests/policy/baseline/gov/hmrc/vat/domestic_energy_vat.yaml: five household cases covering GB, NI, gas, FY 2027-28 and the coverage treatment.
  • Full YAML policy suite: 2,667 passed. pytest outside tests/policy and tests/microsimulation: 3,233 passed, 8 skipped, 2 xfailed, 0 failed (one float32 tolerance fixed after the first run). The microsimulation tests were not run locally. reforms_config.yaml expected values that include VAT may move with the baseline change.
  • ruff format and ruff check are clean, and the Towncrier draft renders under "Fixed".

Coordination

Found while testing, not fixed here: with Scenario(parameter_changes=...), the .baseline parameter tree is cloned after the reform is applied, so baseline_vat (and baseline_domestic_energy_vat) include the reform. Filed as #2188, since fixed on main by #2305.

Reproducer

test_vat_responds_to_electricity is the reproduction in #2166: on main, vat does not respond to electricity_consumption.

Reproducer: policyengine_uk/tests/test_domestic_electricity_vat.py::test_vat_responds_to_electricity

🤖 Generated with Claude Code

@vahid-ahmadi vahid-ahmadi self-assigned this Oct 8, 2026
@juaristi22

juaristi22 commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Review of #2189 — Model the temporary 0% VAT on GB domestic electricity

Base repository: PolicyEngine/policyengine-uk
PR number: 2189
Reviewed head SHA: 69957d0
Merge base SHA: eac21df
Mode: incremental from 69957d0
Scope: changed behavior and affected dependencies
Source evidence: Official sources are linked below; local source copies and validation artifacts were retained.
Review status: PARTIAL

Source Documents

Critical

C1 — Keep the energy price VAT basis independent of gas-rate reforms (STILL OPEN)

CRITICAL — confirmed formula defect. Location: policyengine_uk/variables/gov/hmrc/domestic_energy_vat.py:50 at the reviewed head; the helper divides both fixed energy inputs by this value at lines 21–22, and the baseline calculation repeats it at lines 73–75. A supported scalar Scenario(parameter_changes={"gov.hmrc.vat.reduced_rate": 0.20}) makes the new formula treat bills priced with 5% VAT as though they include 20% VAT. For a London household in model year 2025 with unchanged £1,050 electricity and £1,050 gas inputs, the expected energy VAT under this hypothetical gas-rate reform is £250: £1,050 / 1.05 × 5% electricity plus £1,050 / 1.05 × 20% gas. Observed domestic_energy_vat is £218.749985 (£43.75 electricity plus £175 gas), understating actual VAT by £31.25. Total vat is correspondingly £4,483.14209 rather than £4,514.39209. The same inputs through Reform.from_dict give £250.000015. The fixed 5%-priced input premise is explicit in this PR and corroborated by Ofgem's Q2 2026 unit-price source, whose cached extract (pr-2189-source-ofgem-q2-2026.txt; retained locally) states that both unit prices include 5% VAT.

This diff newly makes actual electricity/gas VAT depend on the mutable .baseline gas rate used as a price denominator. A fresh interpreter also confirms that a scalar gas-rate reform to zero raises electricity VAT from £50 to £52.50 on an unchanged £1,050 electricity-only input. The passing PR test instead uses {"2025": 0}: that override starts on 6 April, while .baseline queried with "2025" reads 1 January and still returns 5%. A 2025-only override also changes actual 2026 energy VAT after expiry to £78.821915 instead of £75.068497. Preserve the input price's 5% VAT basis independently of the reformed statutory gas rate. Evidence: combined diagnostic and complete inputs (pr-2189-code-diagnostic.py; retained locally), observed results (pr-2189-code-diagnostic.log; retained locally), fresh isolated electricity-only reproduction (pr-2189-code-scalar-fresh.py; retained locally), and fresh output (pr-2189-code-scalar-fresh.log; retained locally).

The underlying Scenario baseline-cloning issue is already tracked as #2188 and may provide the common repair. Its separate cancellation of vat_change and household income effects is inherited; those zero effects are not counted as a new defect or used as this finding's impact claim. The demonstrated new impact is the incorrect actual energy VAT and total vat amount.

Should Address

A1 — Retain VAT on energy components excluded from the new direct base (STILL OPEN)

Severity: SHOULD ADDRESS (nonblocking coverage improvement). Captured location: policyengine_uk/variables/household/consumption/reduced_rate_vat_consumption.py:16 (also the new share parameter, lines 1 and 40–44).

Trigger and observed behavior: With the PR's documented default dataset contract, electricity_consumption and gas_consumption contain NEED kWh multiplied by Ofgem unit prices, excluding standing charges. The diff subtracts all ONS COICOP 04.5 spending—electricity, gas and other fuels—from the generic reduced-rate base, then replaces it with those two unit-priced inputs. At the 2025 share used for model year 2026, max(0.025 - 0.0279, 0) is zero. Thus the new direct base does not replace the standing charges or oil/solid-fuel components taken out of the previous generic proxy. This is conditional on the documented input contract: a caller supplying a complete VAT-inclusive bill can already include its standing charge in the new formula.

Expected treatment: HMRC treats a supplier's standing charge as part of the electricity or gas supply; qualifying domestic fuel oil, kerosene, coal and other solid fuel also remain taxable at the reduced rate. Electricity's zero rate extends to the qualifying electricity supply, while gas and the other fuels keep their existing treatment. Removing double counting should retain a representation of components absent from the direct inputs. VAT Notice 701/19, sections 2.2, 6, 7 and 10.10, VATA Schedule 7A, Group 1, HMRC Brief 10/2026.

Impact: For illustration, a continuously connected GB household at the documented Q2 2026 average electricity standing charge of 57.21p/day has £208.82 of gross standing charges over 365 days. At the fixed 5% input-price basis, those charges contain approximately £9.94 annual VAT. At that same price, the 182-day zero-rate portion of fiscal year 2026 removes approximately £4.96, which unit-only inputs omit. These are source-derived illustrations holding the Q2 price constant; they are not claims about the actual October tariff, the private dataset, or a population total. Ofgem Q2 2026 unit rates and standing charges, including 5% VAT.

Why introduced by this diff: Energy-input coverage was already limited, but generic reduced-rate consumption previously represented domestic fuel and power as part of a broad spending share. This change removes the whole category without a corresponding full-bill/other-fuel replacement. The PR discloses the limitation; it remains a coverage improvement rather than evidence that its aggregate factor is wrong. Retain or add the omitted components, or make the default inputs complete bills, while ensuring the two VAT bases do not overlap. The OBR describes its 2.5% reduced-rate share as approximate and also includes children's car seats and other goods; it does not establish a zero non-energy residual. OBR VAT explanation.

Suggestions

None.

Evidence Gaps

  • Private Microcosm f9d1922c population totals and revised energy-excluded coverage cannot be reproduced.
  • Exact OBR cash-basis detailed receipts table 3.8 was not acquired; headline EFO uses a different basis.
  • Original HMRC January 2026 domestic-fuel relief table and the aggregate missing-component reconciliation remain unverified.
  • Role checks incomplete: current-pr-2189-review-policy.md; see recovered report.

Notes

  • Private dataset calibration and missing standing charges/other fuels are assessed by the policy role; code diagnostics use the documented fixed 5%-priced input contract.
  • Known Scenario parameter changes leak into the baseline parameter tree, so baseline_vat shows no change #2188 Scenario baseline contamination and Re-average fuel duty and other blended rates after mid-year reforms #2185 mid-year reblending are inherited; the new finding concerns actual VAT being calculated on a changed priced base.
  • Captured GitHub statusCheckRollup is empty; local tests are separate evidence.
  • Evidence reused after confirming identical reviewed head and merge base. The fetched main branch has advanced; the review remains scoped to this unchanged head. Current CI was captured separately. Local tests were not rerun.
  • Statutory dates, GB/NI scope and gas exception verified.
  • All 26 ONS ADFX/ABQI parameter shares independently match original annual series.
  • Standing-charge/other-fuel coverage finding is conditional on documented unit-priced default inputs; complete-bill inputs can include standing charges.
  • Fixed 5% VAT-inclusive unit-price contract supports uk_code Scenario denominator defect; code reviewer owns that distinct finding.
  • Equal daily use, calendar-to-fiscal share carry-forward and receipts incidence are disclosed modeling assumptions.
  • Captured base branch: rederive-vat-coverage. Actual fetched base SHA: eac21df. Incremental scope contains no code changes.

Validation Summary

Reused exact-head validation (not rerun in this batch): tests: 60 passed, 1 warning in 24.39s; exit 0; exact snapshot import confirmed; test log: pr-2189-code-tests.log; diagnostics: ['pr-2189-code-diagnostic.py: exit 0, 15.57s; scalar/dated Scenario and Reform contrasts through VAT, household_tax, household_net_income', 'pr-2189-code-array-diagnostic.py: exit 0, 8.48s; nation vectors, 2025–2027 parity, both composition orders through final household_net_income', 'pr-2189-code-scalar-fresh.py: exit 0, 4.25s; isolated fresh process confirms fixed electricity VAT-base error']; diagnostic logs: ['pr-2189-code-diagnostic.log', 'pr-2189-code-array-diagnostic.log', 'pr-2189-code-scalar-fresh.log']

Reused exact-head validation (not rerun in this batch): Read SI 2026/987, HMRC Brief 10/2026, VAT Notice 701/19 and VATA Schedule 7A, Ofgem Q2 2026, ONS ADFX/ABQI/CDDL, official OBR proxy originals and 3 checksum-validated cached HMRC originals. Source validator exit 0: pr-2189-review-source-cache-check.json. Ratios: pr-2189-policy-share-comparison.json. Arithmetic: pr-2189-policy-arithmetic.json. Manifest: pr-2189-review-sources.json. Code reproduction delegated to uk_code and not duplicated.

CI at 69957d0: No checks reported at capture.

Detailed code, policy, source and reproduction artifacts were retained locally.

Timing

elapsed seconds: 1151.70s; setup seconds: 270.89s

Review Severity

REQUEST_CHANGES. Open findings: 1 critical, 1 should address, 0 suggestions.

vahid-ahmadi added a commit that referenced this pull request Oct 9, 2026
Addresses juaristi22's review of #2189.

C1: domestic_energy_vat divided the electricity and gas inputs by the
baseline-tree reduced rate. Scenario(parameter_changes=...) clones that
tree after applying the reform (#2188), so a 20% gas rate treated
5%-priced bills as if they included 20% (£218.75 instead of £250 on
£1,050 + £1,050). The divisor is now a fixed price-basis parameter,
gov.simulation.vat.energy_input_price_basis_rate = 0.05 (Ofgem Q2 2026
unit rates include 5% VAT), in both domestic_energy_vat and
baseline_domestic_energy_vat. Scenario and Reform.from_dict now agree.

Tests: her £250 case through both routes, a scalar zero gas rate leaving
electricity VAT at £50, and the FY2026 GB window/NI/gas cases with gas.

A1 (standing charges, other fuels) is not changed here: ONS electricity
plus gas alone is 2.71% of spending in 2025 (2.74% in 2024), above the
2.5% reduced-rate share, so a narrower subtraction is a no-op; complete
bills belong in the input data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

Thanks, María. Both points are addressed in 6df47b1.

C1: energy price basis (fixed)

  • New parameter gov.simulation.vat.energy_input_price_basis_rate = 0.05. It records the VAT rate the electricity and gas inputs were priced at: Ofgem's Q2 2026 cap unit rates include 5% VAT. It sits with the other data-contract VAT parameters under gov.simulation.vat and uses the same metadata. Its description says it describes the input data, not policy, and cites Ofgem.
  • domestic_energy_vat and baseline_domestic_energy_vat now divide the inputs by 1 + that rate. Neither reads baseline.gov.hmrc.vat.reduced_rate as a divisor any more, so a reform to the reduced rate no longer reprices the inputs.
  • Why the two routes differed: Scenario(parameter_changes=...) rebuilds the .baseline tree after the change has been applied (Scenario parameter changes leak into the baseline parameter tree, so baseline_vat shows no change #2188), so the old divisor picked up the reformed 20%. Reform.from_dict leaves .baseline alone. With the divisor fixed, both routes now give the same domestic_energy_vat and vat.
    • Your London 2025 case now gives £250.00 through both routes: 1,050 / 1.05 × 5% + 1,050 / 1.05 × 20%.
    • Your scalar zero-rate case now gives £50 of electricity VAT, not £52.50.
    • Your 2025-only zero-rate override now leaves 2026 energy VAT at £75.07 (1,000 × 0.05 × 183/365 + 1,000 × 5%), not £78.82.
  • Still open, outside this PR: under Scenario, baseline_domestic_energy_vat, baseline_vat and vat_change still read the contaminated baseline gas rate. That is Scenario parameter changes leak into the baseline parameter tree, so baseline_vat shows no change #2188, and Let Scenario structural reforms read the simulation, and add baseline regression tests #2193 fixes it. The new tests don't assert those values on the Scenario route.
  • The GB zero-rate window (1 October 2026 to 31 March 2027) is unchanged: GB electricity is still 0.05 × 183/365 for model year 2026, and NI stays at 5%.

A1: standing charges and other fuels (not changed here)

The narrower fix would subtract only electricity and gas from the generic reduced-rate share, so oil and solid fuel stay in it. I checked this against ONS:

Year Electricity (04.5.1, CDDL) Gas (04.5.2, ADVI) Household consumption (ABQI) Electricity and gas share of spending
2025 £28.84bn £18.96bn £1,766.6bn 2.71%
2024 £28.13bn £18.30bn £1,692.4bn 2.74%

Electricity and gas alone are above the OBR's 2.5% reduced-rate share, so the generic base would still be zero and the change would do nothing in current model years.

Standing charges can't go into the generic base either. Electricity standing charges must also be zero-rated during the window, and the generic base is taxed at the reduced rate and grossed up by coverage. The right home is the input data: complete-bill energy inputs, standing charges included, in policyengine-uk-data/Microcosm. domestic_energy_vat would then pick them up with the correct GB/NI and window treatment, with no change to the formula.

Raising reduced_rate_share instead would move the uk-data ETB imputation and the 0.67 coverage. The gap is about £9.94 a year per GB household on your figures, with about £4.96 lost in the 2026-27 window. It is disclosed in the PR body. I'm happy to file the data-side issue if you agree that's where it belongs.

Tests

  • New pytest cases in tests/test_domestic_electricity_vat.py, with the arithmetic in comments:
    • the price-basis rate is 5%;
    • your £250 case through Scenario and through Reform.from_dict, which give the same result;
    • the scalar zero gas rate leaving electricity VAT at £50;
    • the baseline 2026 window by nation with gas: GB £125.07, NI £150, and gas at £100 in every nation.
  • That file now has 25 cases, all passing.
  • Full YAML policy suite: 2,667 passed.
  • pytest outside tests/policy and tests/microsimulation: 3,240 passed, 8 skipped, 2 xfailed, 0 failed (microsimulation tests not run locally).
  • ruff format --check and ruff check are clean.

🤖 Generated with Claude Code

@vahid-ahmadi
vahid-ahmadi force-pushed the rederive-vat-coverage branch from eac21df to 691267f Compare October 12, 2026 09:10
@vahid-ahmadi
vahid-ahmadi force-pushed the electricity-vat-zero-rate branch from 8866719 to 43a7eec Compare October 12, 2026 09:10
vahid-ahmadi added a commit that referenced this pull request Oct 12, 2026
Addresses juaristi22's review of #2189.

C1: domestic_energy_vat divided the electricity and gas inputs by the
baseline-tree reduced rate. Scenario(parameter_changes=...) clones that
tree after applying the reform (#2188), so a 20% gas rate treated
5%-priced bills as if they included 20% (£218.75 instead of £250 on
£1,050 + £1,050). The divisor is now a fixed price-basis parameter,
gov.simulation.vat.energy_input_price_basis_rate = 0.05 (Ofgem Q2 2026
unit rates include 5% VAT), in both domestic_energy_vat and
baseline_domestic_energy_vat. Scenario and Reform.from_dict now agree.

Tests: her £250 case through both routes, a scalar zero gas rate leaving
electricity VAT at £50, and the FY2026 GB window/NI/gas cases with gas.

A1 (standing charges, other fuels) is not changed here: ONS electricity
plus gas alone is 2.71% of spending in 2025 (2.74% in 2024), above the
2.5% reduced-rate share, so a narrower subtraction is a no-op; complete
bills belong in the input data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

Rebased onto the new #2187 head (691267f5c); the four existing commits carry over unchanged. One test needed updating in 43a7eeccf:

Tests: ruff clean; VAT pytest 30 passed; gov/hmrc/vat YAML 9 passed; full YAML policy suite 3,067 passed, 0 failed.

One thing for when this is retargeted to main: main's new Fix evidence check treats this as a fix PR (changelog.d/2166.fixed.md), so the description will need a Reproducer: line naming one of the new tests. The check only runs on PRs into main, so it doesn't apply yet.

🤖 Generated with Claude Code

vahid-ahmadi and others added 6 commits October 12, 2026 14:50
SI 2026/987 zero-rates domestic electricity in England, Wales and Scotland
from 1 October 2026 to 31 March 2027; Northern Ireland and gas stay at 5%.

- Add domestic_energy_vat: VAT on the household's own electricity and gas
  bills, VAT-exclusive base = bill / 1.05, not grossed up by
  microdata_vat_coverage. Electricity uses the new nation-split
  gov.hmrc.vat.domestic_electricity_rate (fiscal_year_blend: FY 2026-27 has
  183 days at 5% and 182 at 0%); gas uses the reduced rate.
- Take the ONS COICOP 04.5 share of household spending
  (gov.hmrc.vat.domestic_fuel_and_power_share) out of the generic
  reduced-rate share, so energy is not counted twice.
- baseline_domestic_energy_vat day-weights the dated baseline tree, so a
  simulation with no reform shows no vat_change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Energy-bill VAT sits outside both grossing factors from #2187, since the
bills are calibrated to NEED and households bear that VAT in full. Re-derived
the survey coverage against receipts net of energy VAT on the certified
Microcosm UK 2024-25 release: 79.2 / (0.7 x (171.0 - 2.0)) = 0.670, which
rounds to the existing 0.67. Records the derivation in the parameter and in
docs/engineering/vat-coverage.md, and loosens a float32 difference check to 1p.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Addresses juaristi22's review of #2189.

C1: domestic_energy_vat divided the electricity and gas inputs by the
baseline-tree reduced rate. Scenario(parameter_changes=...) clones that
tree after applying the reform (#2188), so a 20% gas rate treated
5%-priced bills as if they included 20% (£218.75 instead of £250 on
£1,050 + £1,050). The divisor is now a fixed price-basis parameter,
gov.simulation.vat.energy_input_price_basis_rate = 0.05 (Ofgem Q2 2026
unit rates include 5% VAT), in both domestic_energy_vat and
baseline_domestic_energy_vat. Scenario and Reform.from_dict now agree.

Tests: her £250 case through both routes, a scalar zero gas rate leaving
electricity VAT at £50, and the FY2026 GB window/NI/gas cases with gas.

A1 (standing charges, other fuels) is not changed here: ONS electricity
plus gas alone is 2.71% of spending in 2025 (2.74% in 2024), above the
2.5% reduced-rate share, so a narrower subtraction is a no-op; complete
bills belong in the input data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Microcosm prices electricity_consumption and gas_consumption at DESNZ QEP average domestic prices paid (tables 2.2.4 and 2.3.4, all payment methods, 2024-25, including VAT), not Ofgem cap unit rates. The 5% price-basis rate is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…weights reforms

Main (3edfb4b, fixing #2167 and #2188) applies dated reforms on the
statutory timeline. A calendar-2027 zero rate now leaves 1 January to
5 April 2028 at 5%, so the test dates the reform 6 April 2027 to 5 April
2028. The Scenario route also keeps the baseline tree now, so the price
basis test asserts the £100 baseline on both routes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add the Enhanced FRS rows (policyengine-uk-data 1.56.16 and 1.58.0) to the
energy-net coverage table, state that the bound from #2187 still holds, and
say which version the #2187 derivation table was computed on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi
vahid-ahmadi force-pushed the electricity-vat-zero-rate branch from 43a7eec to ebddf75 Compare October 12, 2026 12:53
@MaxGhenis MaxGhenis added the ci-recheck Re-triggers Fix evidence without changing the PR (UK hub, 2026-10-12) label Oct 12, 2026
juaristi22 added a commit to PolicyEngine/microcosm that referenced this pull request Oct 13, 2026
The NEED energy rake bands households by income. The donor bands on LCFS
gross income (p344p), NEED's concept, but the recipient read a
household_gross_income column no spine stage writes and fell back to its
HBAI net income, so recipients sat in too low a band and the rake gave
richer households the lower bands' mean kWh. That skews electricity and gas
by income, the distribution the GB domestic-electricity zero rate reads
(PolicyEngine/policyengine-uk#2189).

The stage now materializes the engine's household_gross_income with its four
income predictors, for the band alone, as nts_bus_travel does; the fallback
is gone. The end-to-end test reads the materialize step by kind, not by
position.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22 added a commit to PolicyEngine/microcosm that referenced this pull request Oct 13, 2026
The NEED energy rake bands households by income. The donor bands on LCFS
gross income (p344p), NEED's concept, but the recipient read a
household_gross_income column no spine stage writes and fell back to its
HBAI net income, so recipients sat in too low a band and the rake gave
richer households the lower bands' mean kWh. That skews electricity and gas
by income, the distribution the GB domestic-electricity zero rate reads
(PolicyEngine/policyengine-uk#2189).

The stage now materializes the engine's household_gross_income with its four
income predictors, for the band alone, as nts_bus_travel does; the fallback
is gone. The end-to-end test reads the materialize step by kind, not by
position.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

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

Labels

ci-recheck Re-triggers Fix evidence without changing the PR (UK hub, 2026-10-12)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants