TV Licence#

In the UK, a TV licence is a legal requirement for households to watch TV on any channel via any TV service, watch live on streaming services, or use BBC iPlayer on any device. Each household must renew TV licence annually. The revenue generated from the collection of TV licence fees is used to fund the operations and production of the British Broadcasting Corporation (BBC).

TV licence parameters can be found in policyengine_uk/parameters/gov/dcms/bbc/tv_licence and logic in policyengine_uk/variables/gov/dcms/bbc/tv_licence.

Legislation#

The TV licence is defined in The Communications (Television Licensing) Regulations 2004. It clearly outlines the definition, function, and fees of the TV licence.

Fees#

Full price of a TV licence for a colour TV is £159.00, effective from April 2021. Watching or recording any TV or live programmes, or using BBC iPlayer without a valid TV licence would lead to a fine up to £1000 plus any potential legal costs and/or compensation that households may be ordered to pay.

Concessions#

There are two types of concessions on TV licence fees:

  • Blind persons:

    Blind TV licence holders who can provide appropriate evidence are eligible for a 50% discount on licence fees. PolicyEngine does not currently model this parameter on population level impacts.

  • Aged persons:

    Licence holders who are 75 years or older and have claimed pension credit are qualified for a free TV licence (100% discount).

The table below shows historical TV licence fees for a colour TV:

Hide code cell source
import pandas as pd
from policyengine_uk import CountryTaxBenefitSystem

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

df = pd.DataFrame()
df["Date"] = [
    parameter.instant_str
    for parameter in dcms.bbc.tv_licence.colour.values_list
]
df["Full TV Licence Fee"] = [
    f{parameter.value:.2f}"
    for parameter in dcms.bbc.tv_licence.colour.values_list
]
df["Blind TV Licence Fee"] = [
    f{0.5 * parameter.value:.2f}"
    for parameter in dcms.bbc.tv_licence.colour.values_list
]
df.sort_values("Date").set_index("Date")
Full TV Licence Fee Blind TV Licence Fee
Date
2017-04-01 £147.00 £73.50
2018-04-01 £150.50 £75.25
2019-04-01 £154.50 £77.25
2020-04-01 £157.50 £78.75
2021-04-01 £159.00 £79.50

Microsimulation#

PolicyEngine-UK simulates TV licence based on its annual licence fee, aged concession policies, TV ownership, and evasion rate for households. The following table shows the budgeraty impact of policy reformation on TV licence simulated by PolicyEngine-UK. Here we assume that only one policy is reformed per microsimulation while holding other policies unchanged.

Hide code cell source
import pandas as pd

# aged discount
aged_discount = {
    "Reformed value": [0, 0.25, 0.50, 0.75],
    "Current value": [],
    "Change against current": [],
    "Tax revenues impact (£m)": [91.7, 68.8, 45.9, 22.9],
    "Reference": [],
}
reference_list_ad = [
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27903&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27083&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=19090&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27909&region=uk&timePeriod=2023&baseline=1",
]
for i in range(len(aged_discount["Reformed value"])):
    aged_discount["Current value"] += ["100%"]
    aged_discount["Change against current"] += [
        f"{aged_discount['Reformed value'][i]-1:.0%}"
    ]
    aged_discount["Reformed value"][
        i
    ] = f"{aged_discount['Reformed value'][i]:.0%}"
    aged_discount["Reference"] += [
        f"<a href=\"{reference_list_ad[i]}\">Budgetary impact of changing aged discount to {aged_discount['Reformed value'][i]}</a>"
    ]

df_aged_discount = pd.DataFrame(aged_discount)
df_aged_discount["Reformed policy"] = "Aged discount"

# minimum age
age_list = list(range(70, 81))
age_list.remove(75)
min_age = {
    "Reformed value": age_list,
    "Current value": [],
    "Change against current": [],
    "Tax revenues impact (£m)": [
        -19.6,
        -11.4,
        -7.7,
        -2.4,
        -1.5,
        1.3,
        2.2,
        3.7,
        7.1,
        91.7,
    ],
    "Reference": [],
}
reference_list_minage = [
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27932&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27939&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27941&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27944&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27947&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27949&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27951&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27953&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27955&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27960&region=uk&timePeriod=2023&baseline=1",
]
for i in range(len(min_age["Reformed value"])):
    min_age["Current value"] += [75]
    min_age["Change against current"] += [min_age["Reformed value"][i] - 75]
    min_age["Reference"] += [
        f'<a href="{reference_list_minage[i]}">Budgetary impact of changing minimum age for aged discount to {age_list[i]}</a>'
    ]

df_min_age = pd.DataFrame(min_age)
df_min_age["Reformed policy"] = "Minimum age"

# licence fee
fee_list = list(range(157, 162))
fee_list.remove(159)
licence_fee = {
    "Reformed value": fee_list,
    "Current value": [],
    "Change against current": [],
    "Tax revenues impact (£m)": [-52.1, -26, 26, 52.1],
    "Reference": [],
}
reference_list_fee = [
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27089&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=27087&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=26981&region=uk&timePeriod=2023&baseline=1",
    "https://policyengine.org/uk/policy?focus=policyOutput.netIncome&reform=26983&region=uk&timePeriod=2023&baseline=1",
]
for i in range(len(licence_fee["Reformed value"])):
    licence_fee["Current value"] += ["£159"]
    licence_fee["Change against current"] += [
        f{licence_fee['Reformed value'][i]-159}"
    ]
    licence_fee["Reformed value"][i] = f{licence_fee['Reformed value'][i]}"
    licence_fee["Reference"] += [
        f"<a href=\"{reference_list_fee[i]}\">Budgetary impact of changing licence fee to {licence_fee['Reformed value'][i]}</a>"
    ]

df_licence_fee = pd.DataFrame(licence_fee)
df_licence_fee["Reformed policy"] = "TV licence fee"

# concat df
df_reform = pd.concat([df_aged_discount, df_min_age, df_licence_fee])
df_reform.set_index(
    ["Reformed policy", "Current value", "Reformed value"]
).style.format(lambda x: x)