Skip to content

January 2027 price cap: kWh, a mains gas flag and tariff parameters, the cap's consumption basis, and Northern Ireland #2890

Open

Description

@juaristi22

Context

Ofgem announces the January–March 2027 cap by 25 November 2026 (checklist: PolicyEngine/uk-energy-price-cap-jan-2027#10). 2.174.1 already carries what the event needs for current law:

Already open

1. kWh, a mains gas flag, and standing charge and unit rate parameters

Tariff reforms need consumption in kWh and the two charges by fuel (PolicyEngine/uk-energy-price-cap-jan-2027#4). Examples are removing standing charges, moving cost between standing charges and unit rates, or a social tariff.

  • Annual kWh inputs. electricity_consumption_kwh and gas_consumption_kwh (variables/input/consumption/) are monthly inputs, default -1, which no dataset fills. Microcosm prices annual kWh to spending in its build. Annual inputs, or a documented split of an annual value into months, would let a dataset supply them.
  • A mains gas flag. has_mains_gas would be a household input defaulting to gas_consumption > 0.
  • Tariff parameters. Standing charges (pence a day) and unit rates (pence per kWh), by fuel, payment method and region, with a bill split: spending = standing charge × days + unit rate × kWh.
    • Chronicle's ofgem-energy-price-cap-levels-2024-2026 holds the cap's nil and benchmark levels by region and payment method.
    • From those, the standing charge = nil level / 365, and the unit rate = (benchmark level − nil level) / benchmark consumption.

2. The cap parameter on one consumption basis

gov.ofgem.energy_price_cap mixes typical-consumption bases around July 2026. #2098 documented the break in comments but kept both bases (PolicyEngine/uk-energy-price-cap-jan-2027#3).

Either option would put it on one basis:

  • restate the series on one typical-consumption basis;
  • add a typical_consumption sibling, and have epg_subsidy (variables/gov/treasury/price_cap_subsidy/epg_subsidy.py) use a ratio on the same basis.

3. Northern Ireland

  • Energy projection. uprate_energy (data/economic_assumptions.py) moves every household's energy spending by the Great Britain indices. Northern Ireland's tariffs sit outside Ofgem's cap. The options are a Northern Ireland index, or a documented choice to keep Northern Ireland on the OBR path.
  • An unbanded council tax member. Northern Ireland has domestic rates, not council tax. CouncilTaxBand (variables/input/council_tax_band.py) has no unbanded member, so datasets give Northern Ireland households a placeholder band. An unbanded member would keep them out of band-based results.
  • Cold Weather Payment: Cold Weather Payment #435.
  • An unused parameter. No variable reads gov.contrib.policyengine.economy.energy_bills (parameters/gov/contrib/policyengine/economy/energy_bills.yaml). Either wire it up or remove it.

Relationship to data work

None of Microcosm's data work for this event is decided. If any goes ahead:

  • A kWh export. Microcosm already computes kWh in its build. Exporting them would need item 1's annual inputs, or the monthly split, first. Until then, the event repository can recover kWh from spending.
  • A payment-method draw beyond prepayment would need a payment-method input here, and new published facts (requested in UK facts for four November events: young people and work, the PIP review, the January 2027 price cap and the Scottish Budget 2027-28 chronicle#420).
  • Northern Ireland's placeholder council tax band goes away only once item 3's unbanded member exists for a dataset to write.
  • No data work needed: has_mains_gas (item 1) defaults from spending, and the tariff parameters and item 2 involve no data.
  • Gas spending at the ONS level is data work that needs nothing from this issue.

Not in this issue

Activity

  1. vahid-ahmadi commented on Nov 6, 2026

    @vahid-ahmadi
    Collaborator

    Thanks, María. This is a clear map of the gaps. I checked it against main at a866277 (2.175.8).

    Checks

    • Version. Main is at 2.175.8, not 2.174.1. The current-law pieces you list are on main: the indices came in 2.168.1, and the Household Energy Payment in 2.170.0. domestic_electricity_rate/great_britain.yaml holds 0% from 1 October 2026 and 5% from 1 July 2027.
    • The certified pair still pins 2.151.0. policyengine 6.15.0 on PyPI pins policyengine-uk==2.151.0, so managed_microsimulation() cannot see any of this yet. This is Certify a Microcosm build for policyengine-uk 2.175+ and bump the policyengine.py pin before 20 November uk-energy-price-cap-jan-2027#1. Until a certified Microcosm build and a pin bump land, any pe-uk change below will not reach the event's managed runs.
    • Item 1, kWh. Confirmed: both inputs are monthly, default -1, and their documentation says no dataset fills them. On has_mains_gas: an input cannot default to an expression, so it would be a formula variable with an override. gas_consumption is spending on all gas, and COICOP 04.5.2 includes bottled gas. We need to check that LPG homes do not read as on the mains before we use > 0.
    • Item 1, tariff split. Chronicle's regional nil and benchmark levels exclude VAT. A split derived from them is ex-VAT, so domestic_energy_vat can apply the rate without counting it twice.
    • Item 2. epg_subsidy.py does not read the cap. monthly_epg_consumption_level.py takes price_guarantee / price_cap, and only while energy_price_guarantee_in_effect is true (1 October 2022 to 31 March 2024). So no current-law output crosses the July 2026 break. It matters only for a reform that brings back a price guarantee.
    • Item 3, index. uprate_energy uses ONS CPI D7DT and D7DU and the OBR utilities path. These are UK series, not Great Britain ones, so Northern Ireland already moves on a UK index that includes it at its weight. The open question is whether Northern Ireland's tariffs track that index.
    • Item 3, council tax. simulated_council_tax already returns 0 for Northern Ireland, and the Household Energy Payment is England-only. Today the placeholder band reaches no amount; an unbanded member protects future band-keyed payments. Add it at the end of the enum (see Integer arrays passed to enum inputs are read as 0-based positions with no range check #2602).
    • Item 3, unused parameter. Confirmed. Under gov.contrib.policyengine.economy, only gdp_per_capita has a reader (household_market_income.py). rent.yaml and transport.yaml are unread too, so we can settle all three together.

    Overlap

    Plan

    Item Priority Size Owner Next step
    #2882, #2883, #2884 Before the drill Small Vahid Retype #2882's fragment; take all three out of draft for review
    Certified pair for 2.175+ (event #1) Before the real event Medium Microcosm, policyengine.py Ask for a certified build and a pin bump by 20 November
    has_mains_gas Before the real event Small Vahid Formula variable with an override, after the bottled-gas check
    Tariff split, GB average, Direct Debit Before the real event Medium Vahid Standing charge and unit rate by fuel for 2026 Q4 and 2027 Q1, from Chronicle
    Standing-charge and social-tariff levers Before the real event Medium Vahid Contributed reforms under gov.contrib with in_effect, current law unchanged
    Tariff split by region and payment method Later Large Vahid After the GB version, and with #1807 in mind
    Annual kWh inputs Later Medium Vahid, Microcosm Annual inputs plus a documented monthly split, once a kWh export is planned
    Cap basis (item 2) Later Small Vahid A typical_consumption sibling, only if a price-guarantee lever is planned
    Northern Ireland (item 3) Later Small to medium Vahid Document the UK-index choice; unbanded member with #2891; remove the three unused economy parameters

    Cold Weather Payment stays with #435 unless a change is announced.

    Please say if you disagree with this order.

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

Metadata

Metadata

Assignees

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