Energy Price Cap#

The energy price cap sets a cap on the standing and unit costs that energy suppliers can charge UK consumers for. It is calculated by Ofgem regularly (historically, every 6 months but every 3 since Q3 2022). This is different than the Energy Price Guarantee (EPG), which was introduced in Q3 2022 and subsidises energy bills for UK households by paying the difference between the energy price capped bill and a set lower amount.

PolicyEngine UK models the EPG as a subsidy that increases the incomes of UK households, using the following methodology:

  1. Impute domestic energy consumption to the FRS from the LCFS.

  2. Uprate domestic energy consumption using forecast price cap levels from Cornwall Insight.[1]

  3. For each month in a year: a. Divide total annual energy consumption with a simple model of seasonality.[2] b. Find the price cap for that month. c. Find the price guarantee for that month. d. Calculate the relative difference between the price guarantee and the price cap: this is the subsidy rate. e. Multiply the subsidy rate by the monthly consumption to get the subsidy amount.

  4. Sum total monthly subsidies to get the annual subsidy.

The chart below shows the parameter values for the price cap and price guarantee in PolicyEngine UK.

Hide code cell source
from policyengine_uk import CountryTaxBenefitSystem
import plotly.express as px
import pandas as pd

system = CountryTaxBenefitSystem()
ofgem = system.parameters.gov.ofgem

df = pd.DataFrame()

df["Date"] = [
    parameter.instant_str for parameter in ofgem.energy_price_cap.values_list
]
df["Energy price cap"] = [
    parameter.value for parameter in ofgem.energy_price_cap.values_list
]
df["Energy price guarantee"] = [
    parameter.value for parameter in ofgem.energy_price_guarantee.values_list
]

px.line(
    df,
    x="Date",
    y=["Energy price cap", "Energy price guarantee"],
    title="Energy price cap and guarantee",
    color_discrete_sequence=["#BDBDBD", "#2C6496"],
).update_layout(
    yaxis_title="Average annual energy price",
    yaxis_tickprefix="£",
    yaxis_tickformat=",.0f",
    xaxis_title="Date",
    xaxis_tickformat="%Y-%m",
    height=600,
    width=800,
    legend_title_text="",
    template="plotly_white",
).update_traces(
    line_shape="hv",
)

The chart below shows the estimated cost of the EPG for each month from mid 2022 to the end of 2023.

Hide code cell source
from policyengine_uk import Microsimulation

sim = Microsimulation()

time_periods = [
    *[f"2022-{month:02d}" for month in range(6, 13)],
    *[f"2023-{month:02d}" for month in range(1, 13)],
]

epg_costs = [
    sim.calc("monthly_epg_subsidy", period).sum() for period in time_periods
]

df = pd.DataFrame(
    {
        "Month": time_periods,
        "EPG subsidy cost": epg_costs,
    }
)
df["EPG subsidy cost"] /= 1e9
df["EPG cumulative cost"] = df["EPG subsidy cost"].cumsum()
px.bar(
    df,
    x="Month",
    y="EPG cumulative cost",
    color_discrete_sequence=["#2C6496"],
).update_layout(
    yaxis_title="Cumulative cost of EPG subsidy (£bn)",
    xaxis_title="Month",
    height=600,
    width=800,
    legend_title_text="",
    template="plotly_white",
    title="Estimated cumulative cost of the Energy Price Guarantee",
).update_traces(
    # inline text in bars
    textposition="inside",
    texttemplate="%{y:.1f}",
)