From 96525e93bf7837f82426e7463fff9010a5ce9958 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 27 Oct 2026 12:49:57 -0700 Subject: [PATCH 1/7] Project the minimum wage rates by May-July earnings growth (#2537) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gov.hmrc.minimum_wage.non_apprentice and .apprentice ended at April 2026 with no projection, so every rule that reads them froze: the UC benefit cap earnings exception, the minimum income floor, ESA permitted work, the childcare earnings tests and, from #2699, the Carer's Allowance earnings limit. Uprate each bracket amount (not the age thresholds) and the apprentice rate by gov.economic_assumptions.indices.earnings_uprating, the May-July AWE growth of the year before, never negative, rounded to the nearest penny. May-July 2026 growth was 3.9%, so April 2027 is £12.71 x 1.039 = £13.21. Rates set later take precedence and the projection continues from them. The bracket amounts move under `values:` to carry the uprating metadata, so most of the non_apprentice.yaml diff is indentation (git diff -w). Co-Authored-By: Claude Opus 5.5 --- changelog.d/nlw-projection-earnings.fixed.md | 1 + .../gov/hmrc/minimum_wage/apprentice.yaml | 8 + .../gov/hmrc/minimum_wage/non_apprentice.yaml | 939 +++++++++--------- ...s_allowance_earnings_limit_projection.yaml | 33 +- .../test_esa_permitted_work_nlw_reforms.py | 4 +- .../tests/test_minimum_wage_projection.py | 173 ++++ .../tests/test_minimum_wage_rates.py | 13 +- .../esa_exempt_work_higher_earnings_limit.py | 8 +- ...enefit_cap_earnings_exception_threshold.py | 7 +- 9 files changed, 714 insertions(+), 472 deletions(-) create mode 100644 changelog.d/nlw-projection-earnings.fixed.md create mode 100644 policyengine_uk/tests/test_minimum_wage_projection.py diff --git a/changelog.d/nlw-projection-earnings.fixed.md b/changelog.d/nlw-projection-earnings.fixed.md new file mode 100644 index 0000000000..5fef695fd3 --- /dev/null +++ b/changelog.d/nlw-projection-earnings.fixed.md @@ -0,0 +1 @@ +Project the minimum wage rates, including the national living wage, after the last rate set by the May-July earnings growth of the year before, so the Universal Credit benefit cap earnings exception, the minimum income floor, ESA permitted work, the childcare earnings tests and the Carer's Allowance earnings limit rise with them instead of holding April 2026 rates. diff --git a/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml b/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml index 14c0f8f0dd..dcffdd136e 100644 --- a/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml +++ b/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml @@ -4,6 +4,9 @@ description: Minimum wage rate for apprentices. # rate began on 1 October 2010 (NMW Regulations 1999 reg. 13(3) as substituted # by S.I. 2010/1901 reg. 5). Rates take effect on the commencement date of each # amending S.I.: on 1 October until 2016, then on 1 April from 2017. +# Rates after the last one set here are a projection, not law: each April's +# rise is gov.economic_assumptions.indices.earnings_uprating, rounded to the +# nearest penny, as for the other minimum wage rates (non_apprentice.yaml). values: 2010-10-01: value: 2.5 @@ -100,6 +103,11 @@ metadata: household: false label: Apprentice minimum wage unit: currency-GBP + uprating: + parameter: gov.economic_assumptions.indices.earnings_uprating + rounding: + type: nearest + interval: 0.01 reference: - title: The National Minimum Wage Regulations 2015, regulations 4A(1)(d) and 5 href: https://www.legislation.gov.uk/uksi/2015/621/contents diff --git a/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml b/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml index ae74684457..bcc7ecfd45 100644 --- a/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml +++ b/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml @@ -21,468 +21,515 @@ description: Minimum wage rate for non-apprentices by age. # October 2015 all rate changes took effect on 1 October. The national living # wage has changed each 1 April since 2016; the other rates changed on # 1 October 2016 and each 1 April from 2017. +# +# Rates after the last one set here are a projection, not law. Each amount +# rises each April by gov.economic_assumptions.indices.earnings_uprating: the +# May-July growth in average weekly earnings of the year before, rounded to +# 0.1 percentage points and never negative, which also projects the April +# up-rating of the Pension Credit guarantee. It is then rounded to the nearest +# penny. The Government keeps two-thirds of median hourly earnings for workers +# aged 21 and over as "the key reference point for future rates" (Low Pay +# Commission remit 2026), so the rates move with earnings. May-July 2026 +# growth was 3.9%, so the April 2027 national living wage is projected at +# £12.71 x 1.039 = £13.21. Add each rate when it is set, and the projection +# continues from it. brackets: - threshold: 2010-10-01: 0 amount: - 2010-10-01: - value: 3.64 - reference: - - title: The National Minimum Wage Regulations 1999 (Amendment) Regulations 2010, regulation 5 (substituted regulation 13(2)) - href: https://www.legislation.gov.uk/uksi/2010/1901/made - 2011-10-01: - value: 3.68 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 5(b) - href: https://www.legislation.gov.uk/uksi/2011/2345/made - 2012-10-01: - value: 3.68 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 5(b) (rate from 1 October 2011, unchanged by S.I. 2012/2397) - href: https://www.legislation.gov.uk/uksi/2011/2345/made - 2013-10-01: - value: 3.72 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2013, regulation 2(3)(b) - href: https://www.legislation.gov.uk/uksi/2013/1975/made - 2014-10-01: - value: 3.79 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2014, regulation 3(2)(b) - href: https://www.legislation.gov.uk/uksi/2014/2485/made - 2015-10-01: - value: 3.87 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2015, regulation 2(2)(c) - href: https://www.legislation.gov.uk/uksi/2015/1724/made - 2016-04-01: - value: 3.87 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2016, regulation 3 (substituted regulation 4A(1)(c), under 18) - href: https://www.legislation.gov.uk/uksi/2016/68/made - 2016-10-01: - value: 4.0 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2016, regulation 2(2)(c) - href: https://www.legislation.gov.uk/uksi/2016/953/made - 2017-04-01: - value: 4.05 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2017, regulation 2(3)(c) - href: https://www.legislation.gov.uk/uksi/2017/465/made - 2018-04-01: - value: 4.2 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2018, regulation 2(3)(c) - href: https://www.legislation.gov.uk/uksi/2018/455/made - 2019-04-01: - value: 4.35 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2019, regulation 2(3)(c) - href: https://www.legislation.gov.uk/uksi/2019/603/made - 2020-04-01: - value: 4.55 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2020, regulation 2(3)(c) - href: https://www.legislation.gov.uk/uksi/2020/338/made - 2021-04-01: - value: 4.62 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2021, regulation 2(3)(d) - href: https://www.legislation.gov.uk/uksi/2021/329/made - 2022-04-01: - value: 4.81 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2022, regulation 2(3)(c) - href: https://www.legislation.gov.uk/uksi/2022/382/made - 2023-04-01: - value: 5.28 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2023, regulation 2(3)(c) - href: https://www.legislation.gov.uk/uksi/2023/354/made - 2024-04-01: - value: 6.4 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2024, regulation 2(3)(c) - href: https://www.legislation.gov.uk/uksi/2024/432/made - 2025-04-01: - value: 7.55 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2025, regulation 2(3)(b) - href: https://www.legislation.gov.uk/uksi/2025/401/made - 2026-04-01: - value: 8 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(3)(b) - href: https://www.legislation.gov.uk/uksi/2026/357/made + metadata: + uprating: + parameter: gov.economic_assumptions.indices.earnings_uprating + rounding: + type: nearest + interval: 0.01 + values: + 2010-10-01: + value: 3.64 + reference: + - title: The National Minimum Wage Regulations 1999 (Amendment) Regulations 2010, regulation 5 (substituted regulation 13(2)) + href: https://www.legislation.gov.uk/uksi/2010/1901/made + 2011-10-01: + value: 3.68 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 5(b) + href: https://www.legislation.gov.uk/uksi/2011/2345/made + 2012-10-01: + value: 3.68 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 5(b) (rate from 1 October 2011, unchanged by S.I. 2012/2397) + href: https://www.legislation.gov.uk/uksi/2011/2345/made + 2013-10-01: + value: 3.72 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2013, regulation 2(3)(b) + href: https://www.legislation.gov.uk/uksi/2013/1975/made + 2014-10-01: + value: 3.79 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2014, regulation 3(2)(b) + href: https://www.legislation.gov.uk/uksi/2014/2485/made + 2015-10-01: + value: 3.87 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2015, regulation 2(2)(c) + href: https://www.legislation.gov.uk/uksi/2015/1724/made + 2016-04-01: + value: 3.87 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2016, regulation 3 (substituted regulation 4A(1)(c), under 18) + href: https://www.legislation.gov.uk/uksi/2016/68/made + 2016-10-01: + value: 4.0 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2016, regulation 2(2)(c) + href: https://www.legislation.gov.uk/uksi/2016/953/made + 2017-04-01: + value: 4.05 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2017, regulation 2(3)(c) + href: https://www.legislation.gov.uk/uksi/2017/465/made + 2018-04-01: + value: 4.2 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2018, regulation 2(3)(c) + href: https://www.legislation.gov.uk/uksi/2018/455/made + 2019-04-01: + value: 4.35 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2019, regulation 2(3)(c) + href: https://www.legislation.gov.uk/uksi/2019/603/made + 2020-04-01: + value: 4.55 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2020, regulation 2(3)(c) + href: https://www.legislation.gov.uk/uksi/2020/338/made + 2021-04-01: + value: 4.62 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2021, regulation 2(3)(d) + href: https://www.legislation.gov.uk/uksi/2021/329/made + 2022-04-01: + value: 4.81 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2022, regulation 2(3)(c) + href: https://www.legislation.gov.uk/uksi/2022/382/made + 2023-04-01: + value: 5.28 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2023, regulation 2(3)(c) + href: https://www.legislation.gov.uk/uksi/2023/354/made + 2024-04-01: + value: 6.4 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2024, regulation 2(3)(c) + href: https://www.legislation.gov.uk/uksi/2024/432/made + 2025-04-01: + value: 7.55 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2025, regulation 2(3)(b) + href: https://www.legislation.gov.uk/uksi/2025/401/made + 2026-04-01: + value: 8 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(3)(b) + href: https://www.legislation.gov.uk/uksi/2026/357/made - threshold: 2010-10-01: 18 amount: - 2010-10-01: - value: 4.92 - reference: - - title: The National Minimum Wage Regulations 1999 (Amendment) Regulations 2010, regulation 5 (substituted regulation 13(1), ages 18 to 20) - href: https://www.legislation.gov.uk/uksi/2010/1901/made - 2011-10-01: - value: 4.98 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 5(a) - href: https://www.legislation.gov.uk/uksi/2011/2345/made - 2012-10-01: - value: 4.98 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 5(a) (rate from 1 October 2011, unchanged by S.I. 2012/2397) - href: https://www.legislation.gov.uk/uksi/2011/2345/made - 2013-10-01: - value: 5.03 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2013, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2013/1975/made - 2014-10-01: - value: 5.13 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2014, regulation 3(2)(a) - href: https://www.legislation.gov.uk/uksi/2014/2485/made - 2015-10-01: - value: 5.3 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2015, regulation 2(2)(b) - href: https://www.legislation.gov.uk/uksi/2015/1724/made - 2016-04-01: - value: 5.3 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2016, regulation 3 (substituted regulation 4A(1)(b), ages 18 to 20) - href: https://www.legislation.gov.uk/uksi/2016/68/made - 2016-10-01: - value: 5.55 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2016, regulation 2(2)(b) - href: https://www.legislation.gov.uk/uksi/2016/953/made - 2017-04-01: - value: 5.6 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2017, regulation 2(3)(b) - href: https://www.legislation.gov.uk/uksi/2017/465/made - 2018-04-01: - value: 5.9 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2018, regulation 2(3)(b) - href: https://www.legislation.gov.uk/uksi/2018/455/made - 2019-04-01: - value: 6.15 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2019, regulation 2(3)(b) - href: https://www.legislation.gov.uk/uksi/2019/603/made - 2020-04-01: - value: 6.45 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2020, regulation 2(3)(b) - href: https://www.legislation.gov.uk/uksi/2020/338/made - 2021-04-01: - value: 6.56 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2021, regulation 2(3)(c) - href: https://www.legislation.gov.uk/uksi/2021/329/made - 2022-04-01: - value: 6.83 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2022, regulation 2(3)(b) - href: https://www.legislation.gov.uk/uksi/2022/382/made - 2023-04-01: - value: 7.49 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2023, regulation 2(3)(b) - href: https://www.legislation.gov.uk/uksi/2023/354/made - 2024-04-01: - value: 8.6 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2024, regulation 2(3)(b) - href: https://www.legislation.gov.uk/uksi/2024/432/made - 2025-04-01: - value: 10 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2025, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2025/401/made - 2026-04-01: - value: 10.85 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2026/357/made + metadata: + uprating: + parameter: gov.economic_assumptions.indices.earnings_uprating + rounding: + type: nearest + interval: 0.01 + values: + 2010-10-01: + value: 4.92 + reference: + - title: The National Minimum Wage Regulations 1999 (Amendment) Regulations 2010, regulation 5 (substituted regulation 13(1), ages 18 to 20) + href: https://www.legislation.gov.uk/uksi/2010/1901/made + 2011-10-01: + value: 4.98 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 5(a) + href: https://www.legislation.gov.uk/uksi/2011/2345/made + 2012-10-01: + value: 4.98 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 5(a) (rate from 1 October 2011, unchanged by S.I. 2012/2397) + href: https://www.legislation.gov.uk/uksi/2011/2345/made + 2013-10-01: + value: 5.03 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2013, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2013/1975/made + 2014-10-01: + value: 5.13 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2014, regulation 3(2)(a) + href: https://www.legislation.gov.uk/uksi/2014/2485/made + 2015-10-01: + value: 5.3 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2015, regulation 2(2)(b) + href: https://www.legislation.gov.uk/uksi/2015/1724/made + 2016-04-01: + value: 5.3 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2016, regulation 3 (substituted regulation 4A(1)(b), ages 18 to 20) + href: https://www.legislation.gov.uk/uksi/2016/68/made + 2016-10-01: + value: 5.55 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2016, regulation 2(2)(b) + href: https://www.legislation.gov.uk/uksi/2016/953/made + 2017-04-01: + value: 5.6 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2017, regulation 2(3)(b) + href: https://www.legislation.gov.uk/uksi/2017/465/made + 2018-04-01: + value: 5.9 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2018, regulation 2(3)(b) + href: https://www.legislation.gov.uk/uksi/2018/455/made + 2019-04-01: + value: 6.15 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2019, regulation 2(3)(b) + href: https://www.legislation.gov.uk/uksi/2019/603/made + 2020-04-01: + value: 6.45 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2020, regulation 2(3)(b) + href: https://www.legislation.gov.uk/uksi/2020/338/made + 2021-04-01: + value: 6.56 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2021, regulation 2(3)(c) + href: https://www.legislation.gov.uk/uksi/2021/329/made + 2022-04-01: + value: 6.83 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2022, regulation 2(3)(b) + href: https://www.legislation.gov.uk/uksi/2022/382/made + 2023-04-01: + value: 7.49 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2023, regulation 2(3)(b) + href: https://www.legislation.gov.uk/uksi/2023/354/made + 2024-04-01: + value: 8.6 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2024, regulation 2(3)(b) + href: https://www.legislation.gov.uk/uksi/2024/432/made + 2025-04-01: + value: 10 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2025, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2025/401/made + 2026-04-01: + value: 10.85 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2026/357/made - threshold: 2010-10-01: 21 amount: - 2010-10-01: - value: 5.93 - reference: - - title: The National Minimum Wage Regulations 1999 (Amendment) Regulations 2010, regulation 3 - href: https://www.legislation.gov.uk/uksi/2010/1901/made - 2011-10-01: - value: 6.08 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 3 - href: https://www.legislation.gov.uk/uksi/2011/2345/made - 2012-10-01: - value: 6.19 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2012, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2012/2397/made - 2013-10-01: - value: 6.31 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2013, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2013/1975/made - 2014-10-01: - value: 6.5 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2014, regulation 3(1) - href: https://www.legislation.gov.uk/uksi/2014/2485/made - 2015-10-01: - value: 6.7 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2015, regulation 2(2)(a) - href: https://www.legislation.gov.uk/uksi/2015/1724/made - 2016-04-01: - value: 6.7 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2016, regulation 3 (substituted regulation 4A(1)(a), ages 21 to 24) - href: https://www.legislation.gov.uk/uksi/2016/68/made - 2016-10-01: - value: 6.95 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2016, regulation 2(2)(a) - href: https://www.legislation.gov.uk/uksi/2016/953/made - 2017-04-01: - value: 7.05 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2017, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2017/465/made - 2018-04-01: - value: 7.38 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2018, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2018/455/made - 2019-04-01: - value: 7.7 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2019, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2019/603/made - 2020-04-01: - value: 8.2 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2020, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2020/338/made - 2021-04-01: - value: 8.36 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2021, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2021/329/made - 2022-04-01: - value: 9.18 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2022, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2022/382/made - 2023-04-01: - value: 10.18 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2023, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2023/354/made - 2024-04-01: - value: 11.44 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2024, regulation 2(2) and 2(3)(a) (national living wage from age 21) - href: https://www.legislation.gov.uk/uksi/2024/432/made - 2025-04-01: - value: 12.21 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2025, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2025/401/made - 2026-04-01: - value: 12.71 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2026/357/made + metadata: + uprating: + parameter: gov.economic_assumptions.indices.earnings_uprating + rounding: + type: nearest + interval: 0.01 + values: + 2010-10-01: + value: 5.93 + reference: + - title: The National Minimum Wage Regulations 1999 (Amendment) Regulations 2010, regulation 3 + href: https://www.legislation.gov.uk/uksi/2010/1901/made + 2011-10-01: + value: 6.08 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 3 + href: https://www.legislation.gov.uk/uksi/2011/2345/made + 2012-10-01: + value: 6.19 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2012, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2012/2397/made + 2013-10-01: + value: 6.31 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2013, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2013/1975/made + 2014-10-01: + value: 6.5 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2014, regulation 3(1) + href: https://www.legislation.gov.uk/uksi/2014/2485/made + 2015-10-01: + value: 6.7 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2015, regulation 2(2)(a) + href: https://www.legislation.gov.uk/uksi/2015/1724/made + 2016-04-01: + value: 6.7 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2016, regulation 3 (substituted regulation 4A(1)(a), ages 21 to 24) + href: https://www.legislation.gov.uk/uksi/2016/68/made + 2016-10-01: + value: 6.95 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2016, regulation 2(2)(a) + href: https://www.legislation.gov.uk/uksi/2016/953/made + 2017-04-01: + value: 7.05 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2017, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2017/465/made + 2018-04-01: + value: 7.38 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2018, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2018/455/made + 2019-04-01: + value: 7.7 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2019, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2019/603/made + 2020-04-01: + value: 8.2 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2020, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2020/338/made + 2021-04-01: + value: 8.36 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2021, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2021/329/made + 2022-04-01: + value: 9.18 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2022, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2022/382/made + 2023-04-01: + value: 10.18 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2023, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2023/354/made + 2024-04-01: + value: 11.44 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2024, regulation 2(2) and 2(3)(a) (national living wage from age 21) + href: https://www.legislation.gov.uk/uksi/2024/432/made + 2025-04-01: + value: 12.21 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2025, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2025/401/made + 2026-04-01: + value: 12.71 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2026/357/made - threshold: 2010-10-01: 23 amount: - 2010-10-01: - value: 5.93 - reference: - - title: The National Minimum Wage Regulations 1999 (Amendment) Regulations 2010, regulation 3 - href: https://www.legislation.gov.uk/uksi/2010/1901/made - 2011-10-01: - value: 6.08 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 3 - href: https://www.legislation.gov.uk/uksi/2011/2345/made - 2012-10-01: - value: 6.19 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2012, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2012/2397/made - 2013-10-01: - value: 6.31 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2013, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2013/1975/made - 2014-10-01: - value: 6.5 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2014, regulation 3(1) - href: https://www.legislation.gov.uk/uksi/2014/2485/made - 2015-10-01: - value: 6.7 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2015, regulation 2(2)(a) - href: https://www.legislation.gov.uk/uksi/2015/1724/made - 2016-04-01: - value: 6.7 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2016, regulation 3 (substituted regulation 4A(1)(a), ages 21 to 24) - href: https://www.legislation.gov.uk/uksi/2016/68/made - 2016-10-01: - value: 6.95 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2016, regulation 2(2)(a) - href: https://www.legislation.gov.uk/uksi/2016/953/made - 2017-04-01: - value: 7.05 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2017, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2017/465/made - 2018-04-01: - value: 7.38 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2018, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2018/455/made - 2019-04-01: - value: 7.7 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2019, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2019/603/made - 2020-04-01: - value: 8.2 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2020, regulation 2(3)(a) - href: https://www.legislation.gov.uk/uksi/2020/338/made - 2021-04-01: - value: 8.91 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2021, regulation 2(2) and 2(3)(b) (national living wage from age 23) - href: https://www.legislation.gov.uk/uksi/2021/329/made - 2022-04-01: - value: 9.5 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2022, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2022/382/made - 2023-04-01: - value: 10.42 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2023, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2023/354/made - 2024-04-01: - value: 11.44 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2024, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2024/432/made - 2025-04-01: - value: 12.21 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2025, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2025/401/made - 2026-04-01: - value: 12.71 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2026/357/made + metadata: + uprating: + parameter: gov.economic_assumptions.indices.earnings_uprating + rounding: + type: nearest + interval: 0.01 + values: + 2010-10-01: + value: 5.93 + reference: + - title: The National Minimum Wage Regulations 1999 (Amendment) Regulations 2010, regulation 3 + href: https://www.legislation.gov.uk/uksi/2010/1901/made + 2011-10-01: + value: 6.08 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 3 + href: https://www.legislation.gov.uk/uksi/2011/2345/made + 2012-10-01: + value: 6.19 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2012, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2012/2397/made + 2013-10-01: + value: 6.31 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2013, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2013/1975/made + 2014-10-01: + value: 6.5 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2014, regulation 3(1) + href: https://www.legislation.gov.uk/uksi/2014/2485/made + 2015-10-01: + value: 6.7 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2015, regulation 2(2)(a) + href: https://www.legislation.gov.uk/uksi/2015/1724/made + 2016-04-01: + value: 6.7 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2016, regulation 3 (substituted regulation 4A(1)(a), ages 21 to 24) + href: https://www.legislation.gov.uk/uksi/2016/68/made + 2016-10-01: + value: 6.95 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2016, regulation 2(2)(a) + href: https://www.legislation.gov.uk/uksi/2016/953/made + 2017-04-01: + value: 7.05 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2017, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2017/465/made + 2018-04-01: + value: 7.38 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2018, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2018/455/made + 2019-04-01: + value: 7.7 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2019, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2019/603/made + 2020-04-01: + value: 8.2 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2020, regulation 2(3)(a) + href: https://www.legislation.gov.uk/uksi/2020/338/made + 2021-04-01: + value: 8.91 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2021, regulation 2(2) and 2(3)(b) (national living wage from age 23) + href: https://www.legislation.gov.uk/uksi/2021/329/made + 2022-04-01: + value: 9.5 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2022, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2022/382/made + 2023-04-01: + value: 10.42 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2023, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2023/354/made + 2024-04-01: + value: 11.44 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2024, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2024/432/made + 2025-04-01: + value: 12.21 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2025, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2025/401/made + 2026-04-01: + value: 12.71 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2026/357/made - threshold: 2010-10-01: 25 amount: - 2010-10-01: - value: 5.93 - reference: - - title: The National Minimum Wage Regulations 1999 (Amendment) Regulations 2010, regulation 3 - href: https://www.legislation.gov.uk/uksi/2010/1901/made - 2011-10-01: - value: 6.08 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 3 - href: https://www.legislation.gov.uk/uksi/2011/2345/made - 2012-10-01: - value: 6.19 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2012, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2012/2397/made - 2013-10-01: - value: 6.31 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2013, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2013/1975/made - 2014-10-01: - value: 6.5 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2014, regulation 3(1) - href: https://www.legislation.gov.uk/uksi/2014/2485/made - 2015-10-01: - value: 6.7 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2015, regulation 2(2)(a) - href: https://www.legislation.gov.uk/uksi/2015/1724/made - 2016-04-01: - value: 7.2 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2016, regulation 3 (substituted regulation 4, the national living wage) - href: https://www.legislation.gov.uk/uksi/2016/68/made - 2017-04-01: - value: 7.5 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2017, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2017/465/made - 2018-04-01: - value: 7.83 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2018, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2018/455/made - 2019-04-01: - value: 8.21 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2019, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2019/603/made - 2020-04-01: - value: 8.72 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2020, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2020/338/made - 2021-04-01: - value: 8.91 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2021, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2021/329/made - 2022-04-01: - value: 9.5 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2022, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2022/382/made - 2023-04-01: - value: 10.42 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2023, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2023/354/made - 2024-04-01: - value: 11.44 - reference: - - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2024, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2024/432/made - 2025-04-01: - value: 12.21 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2025, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2025/401/made - 2026-04-01: - value: 12.71 - reference: - - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(2) - href: https://www.legislation.gov.uk/uksi/2026/357/made + metadata: + uprating: + parameter: gov.economic_assumptions.indices.earnings_uprating + rounding: + type: nearest + interval: 0.01 + values: + 2010-10-01: + value: 5.93 + reference: + - title: The National Minimum Wage Regulations 1999 (Amendment) Regulations 2010, regulation 3 + href: https://www.legislation.gov.uk/uksi/2010/1901/made + 2011-10-01: + value: 6.08 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2011, regulation 3 + href: https://www.legislation.gov.uk/uksi/2011/2345/made + 2012-10-01: + value: 6.19 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2012, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2012/2397/made + 2013-10-01: + value: 6.31 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2013, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2013/1975/made + 2014-10-01: + value: 6.5 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2014, regulation 3(1) + href: https://www.legislation.gov.uk/uksi/2014/2485/made + 2015-10-01: + value: 6.7 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2015, regulation 2(2)(a) + href: https://www.legislation.gov.uk/uksi/2015/1724/made + 2016-04-01: + value: 7.2 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2016, regulation 3 (substituted regulation 4, the national living wage) + href: https://www.legislation.gov.uk/uksi/2016/68/made + 2017-04-01: + value: 7.5 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2017, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2017/465/made + 2018-04-01: + value: 7.83 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2018, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2018/455/made + 2019-04-01: + value: 8.21 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2019, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2019/603/made + 2020-04-01: + value: 8.72 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2020, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2020/338/made + 2021-04-01: + value: 8.91 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2021, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2021/329/made + 2022-04-01: + value: 9.5 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2022, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2022/382/made + 2023-04-01: + value: 10.42 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2023, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2023/354/made + 2024-04-01: + value: 11.44 + reference: + - title: The National Minimum Wage (Amendment) (No. 2) Regulations 2024, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2024/432/made + 2025-04-01: + value: 12.21 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2025, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2025/401/made + 2026-04-01: + value: 12.71 + reference: + - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(2) + href: https://www.legislation.gov.uk/uksi/2026/357/made metadata: amount_unit: currency-GBP @@ -497,3 +544,5 @@ metadata: href: https://www.legislation.gov.uk/uksi/2015/621/contents - href: https://www.gov.uk/national-minimum-wage-rates title: GOV.UK - National Minimum Wage + - title: Low Pay Commission remit 2026 (Department for Business and Trade, 16 March 2026) + href: https://www.gov.uk/government/publications/national-minimum-wage-and-national-living-wage-low-pay-commission-remit-2026/low-pay-commission-remit-2026-national-living-wage-and-national-minimum-wage diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/carers_allowance_earnings_limit_projection.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/carers_allowance_earnings_limit_projection.yaml index 9287fc4847..670564c4a6 100644 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/carers_allowance_earnings_limit_projection.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/carers_allowance_earnings_limit_projection.yaml @@ -2,68 +2,71 @@ # week from 6 April 2026, SI 2026/218). From April 2025 the Government sets # the limit at 16 times the hourly national living wage, rounded up to the # nearest pound (Explanatory Memorandum to SI 2025/352, paragraph 5.6), and -# the model projects later years that way. The model's national living wage -# holds at £12.71 after April 2026, so each later limit is 16 x £12.71 = -# £203.36, rounded up to £204. Earnings are entered net, as +# the model projects later years that way. The model projects the national +# living wage by May-July earnings growth of the year before (3.9% for April +# 2027, then 2.4%, 2.1% and 2.2%), to the nearest penny: £13.21 in 2027-28, +# £13.52 in 2028-29, £13.81 in 2029-30 and £14.11 in 2030-31. The limits are +# 16 x £13.21 = £211.36, rounded up to £212; 16 x £13.52 = £216.32, to £217; +# and 16 x £14.11 = £225.76, to £226. Earnings are entered net, as # carers_allowance_earnings, so the cases do not depend on tax or NI. -- name: 2027-28, net earnings of exactly £204 a week have not exceeded the limit. +- name: 2027-28, net earnings of exactly £212 a week have not exceeded the limit. period: 2027 input: age: 45 - carers_allowance_earnings: 204 * 52 + carers_allowance_earnings: 212 * 52 care_hours: 40 country: ENGLAND output: is_gainfully_employed_for_carers_allowance: false -- name: 2027-28, net earnings of £205 a week are over the limit. +- name: 2027-28, net earnings of £213 a week are over the limit. period: 2027 input: age: 45 - carers_allowance_earnings: 205 * 52 + carers_allowance_earnings: 213 * 52 care_hours: 40 country: ENGLAND output: is_gainfully_employed_for_carers_allowance: true carers_allowance: 0 -- name: 2028-29, net earnings of exactly £204 a week have not exceeded the limit. +- name: 2028-29, net earnings of exactly £217 a week have not exceeded the limit. period: 2028 input: age: 45 - carers_allowance_earnings: 204 * 52 + carers_allowance_earnings: 217 * 52 care_hours: 40 country: ENGLAND output: is_gainfully_employed_for_carers_allowance: false -- name: 2028-29, net earnings of £205 a week are over the limit. +- name: 2028-29, net earnings of £218 a week are over the limit. period: 2028 input: age: 45 - carers_allowance_earnings: 205 * 52 + carers_allowance_earnings: 218 * 52 care_hours: 40 country: ENGLAND output: is_gainfully_employed_for_carers_allowance: true carers_allowance: 0 -- name: 2030-31, net earnings of exactly £204 a week have not exceeded the limit. +- name: 2030-31, net earnings of exactly £226 a week have not exceeded the limit. period: 2030 input: age: 45 - carers_allowance_earnings: 204 * 52 + carers_allowance_earnings: 226 * 52 care_hours: 40 country: ENGLAND output: is_gainfully_employed_for_carers_allowance: false -- name: 2030-31, net earnings of £205 a week are over the limit. +- name: 2030-31, net earnings of £227 a week are over the limit. period: 2030 input: age: 45 - carers_allowance_earnings: 205 * 52 + carers_allowance_earnings: 227 * 52 care_hours: 40 country: ENGLAND output: diff --git a/policyengine_uk/tests/test_esa_permitted_work_nlw_reforms.py b/policyengine_uk/tests/test_esa_permitted_work_nlw_reforms.py index fa3c9ea040..0c0c0f3131 100644 --- a/policyengine_uk/tests/test_esa_permitted_work_nlw_reforms.py +++ b/policyengine_uk/tests/test_esa_permitted_work_nlw_reforms.py @@ -14,7 +14,9 @@ pytestmark = pytest.mark.usefixtures("cloned_uk_tax_benefit_system") -YEAR = 2027 +# 2026-27, the last year whose national living wage is set (£12.71), so the +# baseline limit does not depend on the model's projection of later rates. +YEAR = 2026 NLW_REFORM = { f"gov.hmrc.minimum_wage.non_apprentice[{bracket}].amount": {str(YEAR): 13.18} for bracket in (2, 3, 4) diff --git a/policyengine_uk/tests/test_minimum_wage_projection.py b/policyengine_uk/tests/test_minimum_wage_projection.py new file mode 100644 index 0000000000..4e102f4a5f --- /dev/null +++ b/policyengine_uk/tests/test_minimum_wage_projection.py @@ -0,0 +1,173 @@ +"""Minimum wage rates after the last one set (#2537). + +Each rate is set by an amending S.I. (National Minimum Wage Regulations 2015 +regs. 4, 4A and 5). Later years are a projection, not law: from the last rate +set, each rate rises each April with +gov.economic_assumptions.indices.earnings_uprating (the May-July growth in +average weekly earnings of the year before, rounded to 0.1 percentage points +and never negative) and is rounded to the nearest penny. + +Invariants, from the year after the last rate set to 2040: + +1. Projection: each rate is the last rate set times the index's growth since + then, rounded to the nearest penny. +2. Floor: no projected rate is below the last rate set. (Year-on-year + monotonicity and age ordering, 2015 to 2040, are properties 2 and 3 of + test_minimum_wage_rates.) +3. The age thresholds do not move: 0, 18, 21, 23 and 25 in every year. +4. A rate set later takes precedence, and the projection continues from it. +5. Each rule that reads the national living wage follows its projection + (differential against each rule's own statement): the ESA permitted work + limit (16 x NLW up to the next 50p, ESA Regs 2008 reg. 45(4) and (9A)), + the UC benefit cap earnings exception (16 x NLW x 52 / 12 in whole pounds a + month, UC Regs 2013 regs. 82(1)(a) and 6(1A)(za)), the minimum_wage + variable, and the Carer's Allowance earnings limit (16 x NLW up to the next + pound). +""" + +import datetime +import math +from fractions import Fraction +from pathlib import Path + +import numpy as np +import pytest +import yaml +from policyengine_core.parameters.parameter_at_instant import ParameterAtInstant + +from policyengine_uk import Simulation +from policyengine_uk.system import system +from policyengine_uk.tax_benefit_system import ( + process_parameter_tree, + statutory_parameters, +) + +PARAMETER_DIR = ( + Path(__file__).resolve().parent.parent / "parameters/gov/hmrc/minimum_wage" +) +THRESHOLDS = [0, 18, 21, 23, 25] +LAST_CHECKED = 2040 + + +def _last_set(values): + date, entry = max( + (datetime.date.fromisoformat(str(d)), e) for d, e in values.items() + ) + return date, float(entry["value"] if isinstance(entry, dict) else entry) + + +RAW = yaml.safe_load((PARAMETER_DIR / "non_apprentice.yaml").read_text()) +LAST_BRACKET_RATES = [_last_set(b["amount"]["values"]) for b in RAW["brackets"]] +LAST_APPRENTICE_RATE = _last_set( + yaml.safe_load((PARAMETER_DIR / "apprentice.yaml").read_text())["values"] +) +LAST_YEAR = max(date.year for date, _ in [*LAST_BRACKET_RATES, LAST_APPRENTICE_RATE]) +PROJECTED = range(LAST_YEAR + 1, LAST_CHECKED + 1) + + +def _index(parameters, year): + return parameters( + f"{year}-01-01" + ).gov.economic_assumptions.indices.earnings_uprating + + +def _projected(rate, parameters, base_year, year): + growth = _index(parameters, year) / _index(parameters, base_year) + return round(rate * growth / 0.01) * 0.01 + + +@pytest.mark.parametrize("year", PROJECTED) +def test_rates_are_the_last_rate_set_uprated_by_earnings(year): + """Invariants 1 to 3.""" + p = system.parameters + scale = p(f"{year}-01-01").gov.hmrc.minimum_wage.non_apprentice + assert list(scale.thresholds) == THRESHOLDS + for (date, rate), amount in zip(LAST_BRACKET_RATES, scale.amounts): + expected = _projected(rate, p, date.year, year) + assert amount == pytest.approx(expected, abs=1e-9), (year, rate) + assert amount >= rate + date, rate = LAST_APPRENTICE_RATE + apprentice = p(f"{year}-01-01").gov.hmrc.minimum_wage.apprentice + assert apprentice == pytest.approx(_projected(rate, p, date.year, year), abs=1e-9) + assert apprentice >= rate + + +def test_april_2027_national_living_wage_follows_may_to_july_2026_earnings(): + """May-July 2026 average weekly earnings grew 3.9% (ONS KAC3, 20 October + 2026), so the April 2027 national living wage is £12.71 x 1.039 = + £13.2057, £13.21 to the nearest penny.""" + p = system.parameters + assert p("2027-01-01").gov.economic_assumptions.yoy_growth.earnings_uprating == ( + pytest.approx(0.039) + ) + assert p("2026-01-01").gov.hmrc.minimum_wage.non_apprentice.amounts[-1] == 12.71 + assert p("2027-01-01").gov.hmrc.minimum_wage.non_apprentice.amounts[-1] == ( + pytest.approx(13.21, abs=1e-9) + ) + + +def test_a_rate_set_later_takes_precedence_and_the_projection_continues(): + """Invariant 4: a national living wage of £13.20 from 1 April 2027, added + as a rate set by an S.I. would be, holds in 2027-28, and 2028-29 is £13.20 + times that April's earnings growth. The Carer's Allowance earnings limit + follows it: 16 x £13.20 = £211.20, rounded up to £212.""" + tree = statutory_parameters() + scale = tree.gov.hmrc.minimum_wage.non_apprentice + for bracket in scale.brackets[2:]: + amount = bracket.amount + amount.values_list.append( + ParameterAtInstant(amount.name, "2027-04-01", data=13.20) + ) + amount.values_list.sort(key=lambda entry: entry.instant_str, reverse=True) + tree, _ = process_parameter_tree(tree) + + def wage(year): + return tree(f"{year}-01-01").gov.hmrc.minimum_wage.non_apprentice + + assert wage(2026).amounts[-1] == 12.71 + assert wage(2027).amounts[-1] == pytest.approx(13.20, abs=1e-9) + for year in range(2028, 2031): + assert wage(year).amounts[-1] == pytest.approx( + _projected(13.20, tree, 2027, year), abs=1e-9 + ), year + # The younger bands keep their own last rates' projection. + assert wage(2027).amounts[0] == pytest.approx( + system.parameters("2027-01-01").gov.hmrc.minimum_wage.non_apprentice.amounts[0] + ) + + def limit(year): + return tree(f"{year}-01-01").gov.dwp.carers_allowance.earnings_limit + + assert limit(2026) == 204 + assert limit(2027) == 212 + + +def _round_up_to_50p(amount): + return math.ceil(Fraction(str(amount)) * 2) / 2 + + +@pytest.mark.usefixtures("cloned_uk_tax_benefit_system") +def test_rules_that_read_the_national_living_wage_follow_its_projection(): + """Invariant 5, in every projected year to 2040.""" + years = list(PROJECTED) + simulation = Simulation( + situation={ + "people": {"adult": {"age": {str(year): 30 for year in years}}}, + "benunits": {"benunit": {"members": ["adult"]}}, + "households": {"household": {"members": ["adult"]}}, + } + ) + parameters = simulation.tax_benefit_system.parameters + for year in years: + p = parameters(f"{year}-01-01") + wage = p.gov.hmrc.minimum_wage.non_apprentice.amounts[-1] + exact = Fraction(str(round(wage, 2))) + assert simulation.calculate("minimum_wage", year)[0] == pytest.approx(wage) + assert simulation.calculate("esa_exempt_work_higher_earnings_limit", year)[ + 0 + ] == _round_up_to_50p(16 * exact), year + monthly = math.floor(16 * exact * 52 / 12) + assert simulation.calculate( + "uc_benefit_cap_earnings_exception_threshold", year + )[0] == pytest.approx(monthly * 12), year + assert p.gov.dwp.carers_allowance.earnings_limit == math.ceil(16 * exact), year diff --git a/policyengine_uk/tests/test_minimum_wage_rates.py b/policyengine_uk/tests/test_minimum_wage_rates.py index da8fbcdd67..4424480998 100644 --- a/policyengine_uk/tests/test_minimum_wage_rates.py +++ b/policyengine_uk/tests/test_minimum_wage_rates.py @@ -222,8 +222,17 @@ def _in_force(pairs, date): RAW_APPRENTICE = _dated_values(_load_raw("apprentice")["values"]) + + +def _amount_values(bracket): + """A bracket's dated amounts: under ``values`` when the amount carries + metadata (the uprating that projects later years).""" + amount = bracket["amount"] + return amount["values"] if "values" in amount else amount + + RAW_BRACKETS = [ - (_dated_values(bracket["threshold"]), _dated_values(bracket["amount"])) + (_dated_values(bracket["threshold"]), _dated_values(_amount_values(bracket))) for bracket in _load_raw("non_apprentice")["brackets"] ] LATEST_DATED_YEAR = max( @@ -344,7 +353,7 @@ def test_fiscal_year_value_is_the_value_in_force_on_30_april(year): def test_every_rate_cites_a_statutory_instrument(): entries = list(_load_raw("apprentice")["values"].items()) for bracket in _load_raw("non_apprentice")["brackets"]: - entries += list(bracket["amount"].items()) + entries += list(_amount_values(bracket).items()) for instant, entry in entries: assert isinstance(entry, dict), f"{instant} has no reference" hrefs = [reference["href"] for reference in entry.get("reference", [])] diff --git a/policyengine_uk/variables/gov/dwp/esa_exempt_work_higher_earnings_limit.py b/policyengine_uk/variables/gov/dwp/esa_exempt_work_higher_earnings_limit.py index 7e28cf2c6b..1004b47d65 100644 --- a/policyengine_uk/variables/gov/dwp/esa_exempt_work_higher_earnings_limit.py +++ b/policyengine_uk/variables/gov/dwp/esa_exempt_work_higher_earnings_limit.py @@ -14,11 +14,9 @@ class esa_exempt_work_higher_earnings_limit(Variable): "50p (reg 45(9A)). Reg 2(1) defines the National Minimum Wage as the " "rate in reg 11 of the National Minimum Wage Regulations 1999, now " "the national living wage, the adult rate (DMG 41190), so the " - "limit moves with gov.hmrc.minimum_wage.non_apprentice. That " - "parameter holds its April 2026 rate in later years, so the limit " - "stays at £203.50 from 2026-27 until the national living wage is " - "projected, as the Universal Credit benefit cap earnings exception " - "does." + "limit moves with gov.hmrc.minimum_wage.non_apprentice, including " + "its projection by earnings growth after the last rate set (16 x " + "£13.21 = £211.36, rounded up to £211.50, from April 2027)." ) definition_period = YEAR unit = GBP diff --git a/policyengine_uk/variables/gov/dwp/universal_credit/benefit_cap/uc_benefit_cap_earnings_exception_threshold.py b/policyengine_uk/variables/gov/dwp/universal_credit/benefit_cap/uc_benefit_cap_earnings_exception_threshold.py index ec6b360596..96b0ee5ca1 100644 --- a/policyengine_uk/variables/gov/dwp/universal_credit/benefit_cap/uc_benefit_cap_earnings_exception_threshold.py +++ b/policyengine_uk/variables/gov/dwp/universal_credit/benefit_cap/uc_benefit_cap_earnings_exception_threshold.py @@ -13,10 +13,9 @@ class uc_benefit_cap_earnings_exception_threshold(Variable): "wage, the hourly rate in regulation 4 of the National Minimum Wage " "Regulations, multiplied by 52 and divided by 12, with any fraction " "of a pound disregarded (reg. 6(1A)(za)). Before then it was a fixed " - "£430 a month. gov.hmrc.minimum_wage.non_apprentice holds its April " - "2026 rate in later years, so the threshold stays at £10,572 a year " - "from 2026-27 until that parameter is projected, as the minimum " - "income floor does." + "£430 a month. In years after the last rate set, the threshold " + "follows gov.hmrc.minimum_wage.non_apprentice's projection by " + "earnings growth, as the minimum income floor does." ) definition_period = YEAR unit = GBP From 15052a74f019636e641a650026b9250c2d74423d Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 28 Oct 2026 00:31:59 -0400 Subject: [PATCH 2/7] Disclose the projection's assumptions and strengthen its tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - YAML: rounding is applied once from the last rate set; the younger bands' fixed ratio to the national living wage is an assumption (the Government is committed to aligning the 18 to 20 rate); a reform's rate is not projected, so an open-ended reform now holds flat against a rising baseline (also in the changelog). - Docs that listed the index's users or said minimum wage rates only enter through reforms. - Tests: each band from its own last rate set; minimum_wage for every age band; a later rate of £13.50 (distinguishable from the projection); the reform behaviour; the CA YAML cases keep only 2027-28, which rests on published earnings, not OBR forecasts. Co-Authored-By: Claude Opus 5.5 --- changelog.d/nlw-projection-earnings.fixed.md | 2 +- .../book/assumptions/nowcasting-comparison.md | 2 +- .../gov/economic_assumptions/README.md | 3 +- .../create_earnings_uprating.py | 4 +- .../gov/hmrc/minimum_wage/apprentice.yaml | 10 +- .../gov/hmrc/minimum_wage/non_apprentice.yaml | 31 +++-- ...s_allowance_earnings_limit_projection.yaml | 56 ++------- .../test_esa_permitted_work_nlw_reforms.py | 2 +- .../tests/test_minimum_wage_projection.py | 106 ++++++++++++++---- 9 files changed, 125 insertions(+), 91 deletions(-) diff --git a/changelog.d/nlw-projection-earnings.fixed.md b/changelog.d/nlw-projection-earnings.fixed.md index 5fef695fd3..38d05ca8b5 100644 --- a/changelog.d/nlw-projection-earnings.fixed.md +++ b/changelog.d/nlw-projection-earnings.fixed.md @@ -1 +1 @@ -Project the minimum wage rates, including the national living wage, after the last rate set by the May-July earnings growth of the year before, so the Universal Credit benefit cap earnings exception, the minimum income floor, ESA permitted work, the childcare earnings tests and the Carer's Allowance earnings limit rise with them instead of holding April 2026 rates. +Project the minimum wage rates, including the national living wage, after the last rate set by the May-July earnings growth of the year before, so the Universal Credit benefit cap earnings exception, the minimum income floor, ESA permitted work, the childcare earnings tests and the Carer's Allowance earnings limit rise with them instead of holding April 2026 rates. A reform that sets a minimum wage rate from some year onwards now holds that rate flat against a rising baseline, where before it was an uplift on a flat one. diff --git a/docs/book/assumptions/nowcasting-comparison.md b/docs/book/assumptions/nowcasting-comparison.md index f86d67c466..4dabc040f0 100644 --- a/docs/book/assumptions/nowcasting-comparison.md +++ b/docs/book/assumptions/nowcasting-comparison.md @@ -33,7 +33,7 @@ totals over the next two-to-three fiscal years. | Aspect | Resolution Foundation | PolicyEngine UK | |-------|------------------------|-----------------| -| Wage floor | Models the National Living Wage / NMW explicitly each year, lifting anyone below their age-appropriate minimum to the floor. | Earnings are uprated by the OBR average-earnings index without an explicit floor; minimum wage uprating is held in `gov/hmrc/minimum_wage/` and only enters when a reform invokes it. | +| Wage floor | Models the National Living Wage / NMW explicitly each year, lifting anyone below their age-appropriate minimum to the floor. | Earnings are uprated by the OBR average-earnings index without an explicit floor; minimum wage rates are held in `gov/hmrc/minimum_wage/` and projected by earnings growth after the last rate set; they enter through the rules that read them (the Universal Credit minimum income floor and benefit cap earnings exception, the childcare earnings tests, ESA permitted work and the Carer's Allowance earnings limit), not through earnings. | | Spillovers | Includes a spillover effect for workers just above the wage floor (compression of the lower wage distribution). | No automatic spillover; earnings shift uniformly with the OBR index. | | NLW extensions | Models the 2024-25 extension of the NLW to 21- and 22-year-olds, and provisionally the 2029-30 extension to 18-20-year-olds. | NLW age bands are encoded in parameters (`gov/hmrc/minimum_wage`) but extensions only flow into outputs if a household's wage actually falls below the modelled floor — there is no explicit re-anchoring of earnings. | | Beyond 2025-26 | Assumes the wage floor grows in line with average earnings. | Same effective behaviour, but driven by uprating rather than a wage-floor rule. | diff --git a/policyengine_uk/parameters/gov/economic_assumptions/README.md b/policyengine_uk/parameters/gov/economic_assumptions/README.md index b0db05c16f..021e07e557 100644 --- a/policyengine_uk/parameters/gov/economic_assumptions/README.md +++ b/policyengine_uk/parameters/gov/economic_assumptions/README.md @@ -255,7 +255,8 @@ the projection holds amounts unchanged. The Pension Credit standard minimum guarantee and the three lower Housing Benefit pension-age personal allowances, which equal it, use this index after -their last published amounts. [SSAA 1992 s150A(1)(d) and (2)](https://www.legislation.gov.uk/ukpga/1992/5/section/150A) +their last published amounts. The minimum wage rates +(`gov.hmrc.minimum_wage`) use it after the last rate set, as a projection. [SSAA 1992 s150A(1)(d) and (2)](https://www.legislation.gov.uk/ukpga/1992/5/section/150A) require the guarantee to rise at least with earnings; they impose no CPI or 2.5% floor. This projection uses that earnings minimum, allowing published amounts to reflect discretionary increases. For April 2027, May-July 2026 diff --git a/policyengine_uk/parameters/gov/economic_assumptions/create_earnings_uprating.py b/policyengine_uk/parameters/gov/economic_assumptions/create_earnings_uprating.py index bfb7db0ef3..96ddfb2500 100644 --- a/policyengine_uk/parameters/gov/economic_assumptions/create_earnings_uprating.py +++ b/policyengine_uk/parameters/gov/economic_assumptions/create_earnings_uprating.py @@ -13,7 +13,9 @@ ``create_economic_assumption_indices`` compounds it into ``gov.economic_assumptions.indices.earnings_uprating``. The series starts from a 2010 base and runs to one year past the statutory inputs. Published -benefit amounts remain explicit; the index projects later years. +benefit amounts remain explicit; the index projects later years. The +minimum wage rates (``gov.hmrc.minimum_wage``) also use it after the last +rate set. """ from typing import Dict, Iterable diff --git a/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml b/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml index dcffdd136e..7b06c8655d 100644 --- a/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml +++ b/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml @@ -4,9 +4,13 @@ description: Minimum wage rate for apprentices. # rate began on 1 October 2010 (NMW Regulations 1999 reg. 13(3) as substituted # by S.I. 2010/1901 reg. 5). Rates take effect on the commencement date of each # amending S.I.: on 1 October until 2016, then on 1 April from 2017. -# Rates after the last one set here are a projection, not law: each April's -# rise is gov.economic_assumptions.indices.earnings_uprating, rounded to the -# nearest penny, as for the other minimum wage rates (non_apprentice.yaml). +# Rates after the last one set here are a projection, not law: the last rate +# set times the growth since then in +# gov.economic_assumptions.indices.earnings_uprating, rounded to the nearest +# penny, as for the other minimum wage rates (non_apprentice.yaml). Keeping the +# rate's April 2026 ratio to the national living wage is an assumption: the +# Low Pay Commission is asked to set it to support apprentices' employment +# prospects (remit 2026). values: 2010-10-01: value: 2.5 diff --git a/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml b/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml index bcc7ecfd45..b72d869d98 100644 --- a/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml +++ b/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml @@ -22,17 +22,28 @@ description: Minimum wage rate for non-apprentices by age. # wage has changed each 1 April since 2016; the other rates changed on # 1 October 2016 and each 1 April from 2017. # -# Rates after the last one set here are a projection, not law. Each amount -# rises each April by gov.economic_assumptions.indices.earnings_uprating: the -# May-July growth in average weekly earnings of the year before, rounded to -# 0.1 percentage points and never negative, which also projects the April -# up-rating of the Pension Credit guarantee. It is then rounded to the nearest -# penny. The Government keeps two-thirds of median hourly earnings for workers -# aged 21 and over as "the key reference point for future rates" (Low Pay -# Commission remit 2026), so the rates move with earnings. May-July 2026 +# Rates after the last one set here are a projection, not law. Each is the +# last rate set times the growth since then in +# gov.economic_assumptions.indices.earnings_uprating, rounded to the nearest +# penny (the rounding is not repeated each April). Each April's rise in that +# index is the May-July growth in average weekly earnings of the year before, +# rounded to 0.1 percentage points and never negative; it also projects the +# April up-rating of the Pension Credit guarantee. The Government keeps +# two-thirds of median hourly earnings for workers aged 21 and over as "the key +# reference point for future rates" of the national living wage (Low Pay +# Commission remit 2026), so that rate moves with earnings. May-July 2026 # growth was 3.9%, so the April 2027 national living wage is projected at -# £12.71 x 1.039 = £13.21. Add each rate when it is set, and the projection -# continues from it. +# £12.71 x 1.039 = £13.21. +# +# The younger bands' projection is an assumption: each keeps its April 2026 +# ratio to the national living wage. The Government "remains committed to" +# aligning the 18 to 20 rate with the national living wage, at a pace the Low +# Pay Commission sets (remit 2026), which this does not model. +# +# A rate added to this file takes precedence, and the projection continues +# from it. A reform does not: a rate a reform sets for some years is not +# projected forward, so an open-ended reform holds its rate flat while the +# baseline rises. brackets: - threshold: diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/carers_allowance_earnings_limit_projection.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/carers_allowance_earnings_limit_projection.yaml index 670564c4a6..213db6bee8 100644 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/carers_allowance_earnings_limit_projection.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/carers_allowance_earnings_limit_projection.yaml @@ -2,13 +2,13 @@ # week from 6 April 2026, SI 2026/218). From April 2025 the Government sets # the limit at 16 times the hourly national living wage, rounded up to the # nearest pound (Explanatory Memorandum to SI 2025/352, paragraph 5.6), and -# the model projects later years that way. The model projects the national -# living wage by May-July earnings growth of the year before (3.9% for April -# 2027, then 2.4%, 2.1% and 2.2%), to the nearest penny: £13.21 in 2027-28, -# £13.52 in 2028-29, £13.81 in 2029-30 and £14.11 in 2030-31. The limits are -# 16 x £13.21 = £211.36, rounded up to £212; 16 x £13.52 = £216.32, to £217; -# and 16 x £14.11 = £225.76, to £226. Earnings are entered net, as -# carers_allowance_earnings, so the cases do not depend on tax or NI. +# the model projects later years that way. The model projects the April 2027 +# national living wage by May-July 2026 earnings growth, 3.9% (published), to +# £12.71 x 1.039 = £13.21, so the limit is 16 x £13.21 = £211.36, rounded up +# to £212. Later years rest on OBR forecasts, so they are tested in +# test_carers_allowance_earnings_limit_projection.py against whatever the +# model's wage is. Earnings are entered net, as carers_allowance_earnings, so +# the cases do not depend on tax or NI. - name: 2027-28, net earnings of exactly £212 a week have not exceeded the limit. period: 2027 @@ -30,45 +30,3 @@ output: is_gainfully_employed_for_carers_allowance: true carers_allowance: 0 - -- name: 2028-29, net earnings of exactly £217 a week have not exceeded the limit. - period: 2028 - input: - age: 45 - carers_allowance_earnings: 217 * 52 - care_hours: 40 - country: ENGLAND - output: - is_gainfully_employed_for_carers_allowance: false - -- name: 2028-29, net earnings of £218 a week are over the limit. - period: 2028 - input: - age: 45 - carers_allowance_earnings: 218 * 52 - care_hours: 40 - country: ENGLAND - output: - is_gainfully_employed_for_carers_allowance: true - carers_allowance: 0 - -- name: 2030-31, net earnings of exactly £226 a week have not exceeded the limit. - period: 2030 - input: - age: 45 - carers_allowance_earnings: 226 * 52 - care_hours: 40 - country: ENGLAND - output: - is_gainfully_employed_for_carers_allowance: false - -- name: 2030-31, net earnings of £227 a week are over the limit. - period: 2030 - input: - age: 45 - carers_allowance_earnings: 227 * 52 - care_hours: 40 - country: ENGLAND - output: - is_gainfully_employed_for_carers_allowance: true - carers_allowance: 0 diff --git a/policyengine_uk/tests/test_esa_permitted_work_nlw_reforms.py b/policyengine_uk/tests/test_esa_permitted_work_nlw_reforms.py index 0c0c0f3131..cd91060c3b 100644 --- a/policyengine_uk/tests/test_esa_permitted_work_nlw_reforms.py +++ b/policyengine_uk/tests/test_esa_permitted_work_nlw_reforms.py @@ -14,7 +14,7 @@ pytestmark = pytest.mark.usefixtures("cloned_uk_tax_benefit_system") -# 2026-27, the last year whose national living wage is set (£12.71), so the +# 2026-27, a year whose national living wage is set (£12.71), so the # baseline limit does not depend on the model's projection of later rates. YEAR = 2026 NLW_REFORM = { diff --git a/policyengine_uk/tests/test_minimum_wage_projection.py b/policyengine_uk/tests/test_minimum_wage_projection.py index 4e102f4a5f..0b78524088 100644 --- a/policyengine_uk/tests/test_minimum_wage_projection.py +++ b/policyengine_uk/tests/test_minimum_wage_projection.py @@ -7,10 +7,10 @@ average weekly earnings of the year before, rounded to 0.1 percentage points and never negative) and is rounded to the nearest penny. -Invariants, from the year after the last rate set to 2040: +Invariants, from the year after each rate's last one set to 2040: 1. Projection: each rate is the last rate set times the index's growth since - then, rounded to the nearest penny. + then, rounded to the nearest penny (once, not each April). 2. Floor: no projected rate is below the last rate set. (Year-on-year monotonicity and age ordering, 2015 to 2040, are properties 2 and 3 of test_minimum_wage_rates.) @@ -21,8 +21,11 @@ limit (16 x NLW up to the next 50p, ESA Regs 2008 reg. 45(4) and (9A)), the UC benefit cap earnings exception (16 x NLW x 52 / 12 in whole pounds a month, UC Regs 2013 regs. 82(1)(a) and 6(1A)(za)), the minimum_wage - variable, and the Carer's Allowance earnings limit (16 x NLW up to the next - pound). + variable for each age band, and the Carer's Allowance earnings limit (16 x + NLW up to the next pound). +6. A reform's rate is not projected (intended, as for other uprated + parameters): a rate a reform sets for one fiscal year leaves later years on + the baseline's path, and one set from a year onwards holds flat. """ import datetime @@ -62,7 +65,12 @@ def _last_set(values): yaml.safe_load((PARAMETER_DIR / "apprentice.yaml").read_text())["values"] ) LAST_YEAR = max(date.year for date, _ in [*LAST_BRACKET_RATES, LAST_APPRENTICE_RATE]) +FIRST_LAST_YEAR = min( + date.year for date, _ in [*LAST_BRACKET_RATES, LAST_APPRENTICE_RATE] +) +# Years after every rate's last one set: the national living wage is projected. PROJECTED = range(LAST_YEAR + 1, LAST_CHECKED + 1) +NLW = "gov.hmrc.minimum_wage.non_apprentice[{}].amount" def _index(parameters, year): @@ -76,20 +84,24 @@ def _projected(rate, parameters, base_year, year): return round(rate * growth / 0.01) * 0.01 -@pytest.mark.parametrize("year", PROJECTED) +@pytest.mark.parametrize("year", range(FIRST_LAST_YEAR + 1, LAST_CHECKED + 1)) def test_rates_are_the_last_rate_set_uprated_by_earnings(year): - """Invariants 1 to 3.""" + """Invariants 1 to 3, for each rate in the years after its own last one + set.""" p = system.parameters scale = p(f"{year}-01-01").gov.hmrc.minimum_wage.non_apprentice assert list(scale.thresholds) == THRESHOLDS - for (date, rate), amount in zip(LAST_BRACKET_RATES, scale.amounts): + apprentice = p(f"{year}-01-01").gov.hmrc.minimum_wage.apprentice + pairs = [ + *zip(LAST_BRACKET_RATES, scale.amounts), + (LAST_APPRENTICE_RATE, apprentice), + ] + for (date, rate), amount in pairs: + if year <= date.year: + continue expected = _projected(rate, p, date.year, year) assert amount == pytest.approx(expected, abs=1e-9), (year, rate) assert amount >= rate - date, rate = LAST_APPRENTICE_RATE - apprentice = p(f"{year}-01-01").gov.hmrc.minimum_wage.apprentice - assert apprentice == pytest.approx(_projected(rate, p, date.year, year), abs=1e-9) - assert apprentice >= rate def test_april_2027_national_living_wage_follows_may_to_july_2026_earnings(): @@ -107,16 +119,16 @@ def test_april_2027_national_living_wage_follows_may_to_july_2026_earnings(): def test_a_rate_set_later_takes_precedence_and_the_projection_continues(): - """Invariant 4: a national living wage of £13.20 from 1 April 2027, added - as a rate set by an S.I. would be, holds in 2027-28, and 2028-29 is £13.20 - times that April's earnings growth. The Carer's Allowance earnings limit - follows it: 16 x £13.20 = £211.20, rounded up to £212.""" + """Invariant 4: a national living wage of £13.50 from 1 April 2027, added + as a rate set by an S.I. would be, holds in 2027-28, and later years are + £13.50 times the earnings growth since. The Carer's Allowance earnings + limit follows it: 16 x £13.50 = £216 (the projection alone gives £212).""" tree = statutory_parameters() scale = tree.gov.hmrc.minimum_wage.non_apprentice for bracket in scale.brackets[2:]: amount = bracket.amount amount.values_list.append( - ParameterAtInstant(amount.name, "2027-04-01", data=13.20) + ParameterAtInstant(amount.name, "2027-04-01", data=13.50) ) amount.values_list.sort(key=lambda entry: entry.instant_str, reverse=True) tree, _ = process_parameter_tree(tree) @@ -125,10 +137,10 @@ def wage(year): return tree(f"{year}-01-01").gov.hmrc.minimum_wage.non_apprentice assert wage(2026).amounts[-1] == 12.71 - assert wage(2027).amounts[-1] == pytest.approx(13.20, abs=1e-9) + assert wage(2027).amounts[-1] == pytest.approx(13.50, abs=1e-9) for year in range(2028, 2031): assert wage(year).amounts[-1] == pytest.approx( - _projected(13.20, tree, 2027, year), abs=1e-9 + _projected(13.50, tree, 2027, year), abs=1e-9 ), year # The younger bands keep their own last rates' projection. assert wage(2027).amounts[0] == pytest.approx( @@ -139,30 +151,44 @@ def limit(year): return tree(f"{year}-01-01").gov.dwp.carers_allowance.earnings_limit assert limit(2026) == 204 - assert limit(2027) == 212 + assert limit(2027) == 216 def _round_up_to_50p(amount): return math.ceil(Fraction(str(amount)) * 2) / 2 +# One person in each age band, the national living wage's first. +AGES = {"adult": 30, "aged_23": 23, "aged_21": 21, "aged_19": 19, "aged_16": 16} +BANDS = {"adult": 4, "aged_23": 3, "aged_21": 2, "aged_19": 1, "aged_16": 0} + + @pytest.mark.usefixtures("cloned_uk_tax_benefit_system") def test_rules_that_read_the_national_living_wage_follow_its_projection(): """Invariant 5, in every projected year to 2040.""" years = list(PROJECTED) simulation = Simulation( situation={ - "people": {"adult": {"age": {str(year): 30 for year in years}}}, - "benunits": {"benunit": {"members": ["adult"]}}, - "households": {"household": {"members": ["adult"]}}, + "people": { + name: {"age": {str(year): age for year in years}} + for name, age in AGES.items() + }, + "benunits": {f"{name}_unit": {"members": [name]} for name in AGES}, + "households": {"household": {"members": list(AGES)}}, } ) parameters = simulation.tax_benefit_system.parameters for year in years: p = parameters(f"{year}-01-01") - wage = p.gov.hmrc.minimum_wage.non_apprentice.amounts[-1] + amounts = p.gov.hmrc.minimum_wage.non_apprentice.amounts + wage = amounts[-1] exact = Fraction(str(round(wage, 2))) - assert simulation.calculate("minimum_wage", year)[0] == pytest.approx(wage) + minimum_wage = simulation.calculate("minimum_wage", year) + for index, name in enumerate(AGES): + assert minimum_wage[index] == pytest.approx(amounts[BANDS[name]]), ( + year, + name, + ) assert simulation.calculate("esa_exempt_work_higher_earnings_limit", year)[ 0 ] == _round_up_to_50p(16 * exact), year @@ -171,3 +197,35 @@ def test_rules_that_read_the_national_living_wage_follow_its_projection(): "uc_benefit_cap_earnings_exception_threshold", year )[0] == pytest.approx(monthly * 12), year assert p.gov.dwp.carers_allowance.earnings_limit == math.ceil(16 * exact), year + + +@pytest.mark.usefixtures("cloned_uk_tax_benefit_system") +def test_a_reform_rate_is_not_projected(): + """Invariant 6 (intended): £13.50 for 2027-28 alone leaves 2028-29 on + the baseline's path; £13.50 from 6 April 2027 onwards holds at £13.50, + below the baseline from the year the baseline passes it.""" + baseline = system.parameters + one_year = {NLW.format(b): {"2027": 13.50} for b in (2, 3, 4)} + onwards = {NLW.format(b): {"2027-04-06.2100-12-31": 13.50} for b in (2, 3, 4)} + + def wages(parameters): + return { + year: parameters( + f"{year}-01-01" + ).gov.hmrc.minimum_wage.non_apprentice.amounts[-1] + for year in range(2026, LAST_CHECKED + 1) + } + + base = wages(baseline) + for reform, later in ((one_year, base), (onwards, None)): + reformed = wages( + Simulation( + situation={"people": {"adult": {"age": {"2027": 30}}}}, reform=reform + ).tax_benefit_system.parameters + ) + assert reformed[2026] == base[2026] + assert reformed[2027] == pytest.approx(13.50) + for year in range(2028, LAST_CHECKED + 1): + expected = base[year] if later is base else 13.50 + assert reformed[year] == pytest.approx(expected), year + assert base[LAST_CHECKED] > 13.50 From 6cea6acb3d86e85e222706a5535ab7a5ea516c89 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 28 Oct 2026 02:37:21 -0400 Subject: [PATCH 3/7] Correct the projection's long-run and timing notes The Low Pay Commission remit quote no longer adds "for workers aged 21 and over", which the remit doesn't say. The YAML now says the index is dated 1 January, that annual figures read 30 April, and that the indices end in 2039. The younger bands keep their ratio to the national living wage only to the penny. The nowcasting doc's age-band row now names the rules that read a person's band rate, and the README's minimum wage sentence moves out of the Pension Credit paragraph. The reform test's docstring says its open-ended case documents behaviour rather than testing projection. Co-Authored-By: Claude Opus 5.5 --- .../book/assumptions/nowcasting-comparison.md | 2 +- .../gov/economic_assumptions/README.md | 7 +++-- .../gov/hmrc/minimum_wage/apprentice.yaml | 8 +++--- .../gov/hmrc/minimum_wage/non_apprentice.yaml | 26 ++++++++++++------- .../tests/test_minimum_wage_projection.py | 9 ++++--- 5 files changed, 32 insertions(+), 20 deletions(-) diff --git a/docs/book/assumptions/nowcasting-comparison.md b/docs/book/assumptions/nowcasting-comparison.md index 4dabc040f0..ab052e45e0 100644 --- a/docs/book/assumptions/nowcasting-comparison.md +++ b/docs/book/assumptions/nowcasting-comparison.md @@ -35,7 +35,7 @@ totals over the next two-to-three fiscal years. |-------|------------------------|-----------------| | Wage floor | Models the National Living Wage / NMW explicitly each year, lifting anyone below their age-appropriate minimum to the floor. | Earnings are uprated by the OBR average-earnings index without an explicit floor; minimum wage rates are held in `gov/hmrc/minimum_wage/` and projected by earnings growth after the last rate set; they enter through the rules that read them (the Universal Credit minimum income floor and benefit cap earnings exception, the childcare earnings tests, ESA permitted work and the Carer's Allowance earnings limit), not through earnings. | | Spillovers | Includes a spillover effect for workers just above the wage floor (compression of the lower wage distribution). | No automatic spillover; earnings shift uniformly with the OBR index. | -| NLW extensions | Models the 2024-25 extension of the NLW to 21- and 22-year-olds, and provisionally the 2029-30 extension to 18-20-year-olds. | NLW age bands are encoded in parameters (`gov/hmrc/minimum_wage`) but extensions only flow into outputs if a household's wage actually falls below the modelled floor — there is no explicit re-anchoring of earnings. | +| NLW extensions | Models the 2024-25 extension of the NLW to 21- and 22-year-olds, and provisionally the 2029-30 extension to 18-20-year-olds. | NLW age bands are encoded in parameters (`gov/hmrc/minimum_wage`). A change to a band, such as extending the NLW to younger workers, reaches outputs through the rules that read a person's age-band rate (the Universal Credit minimum income floor and the childcare earnings tests); earnings are not re-anchored to the floor. | | Beyond 2025-26 | Assumes the wage floor grows in line with average earnings. | Same effective behaviour, but driven by uprating rather than a wage-floor rule. | **Practical implication.** Low-paid workers' incomes can grow faster under diff --git a/policyengine_uk/parameters/gov/economic_assumptions/README.md b/policyengine_uk/parameters/gov/economic_assumptions/README.md index 021e07e557..a3fe2c68a5 100644 --- a/policyengine_uk/parameters/gov/economic_assumptions/README.md +++ b/policyengine_uk/parameters/gov/economic_assumptions/README.md @@ -255,14 +255,17 @@ the projection holds amounts unchanged. The Pension Credit standard minimum guarantee and the three lower Housing Benefit pension-age personal allowances, which equal it, use this index after -their last published amounts. The minimum wage rates -(`gov.hmrc.minimum_wage`) use it after the last rate set, as a projection. [SSAA 1992 s150A(1)(d) and (2)](https://www.legislation.gov.uk/ukpga/1992/5/section/150A) +their last published amounts. [SSAA 1992 s150A(1)(d) and (2)](https://www.legislation.gov.uk/ukpga/1992/5/section/150A) require the guarantee to rise at least with earnings; they impose no CPI or 2.5% floor. This projection uses that earnings minimum, allowing published amounts to reflect discretionary increases. For April 2027, May-July 2026 earnings growth of 3.9% gives £238 × 1.039 = £247.282 a week for a single person and £363.25 × 1.039 = £377.41675 for a couple, before benefit rounding. +The minimum wage rates (`gov.hmrc.minimum_wage`) also use this index after +the last rate set. That is a projection: each rate is set by an S.I., not by +a formula. + The Savings Credit maximum rises by September CPI, as stated in [HCWS1101](https://questions-statements.parliament.uk/written-statements/detail/2025-11-26/hcws1101). After general uprating, the projected threshold is derived as the standard diff --git a/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml b/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml index 7b06c8655d..1c0398d65f 100644 --- a/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml +++ b/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml @@ -7,10 +7,10 @@ description: Minimum wage rate for apprentices. # Rates after the last one set here are a projection, not law: the last rate # set times the growth since then in # gov.economic_assumptions.indices.earnings_uprating, rounded to the nearest -# penny, as for the other minimum wage rates (non_apprentice.yaml). Keeping the -# rate's April 2026 ratio to the national living wage is an assumption: the -# Low Pay Commission is asked to set it to support apprentices' employment -# prospects (remit 2026). +# penny, as for the other minimum wage rates (non_apprentice.yaml). Growing it +# by the national living wage's index, which keeps its ratio to that rate to +# the penny, is an assumption: the Low Pay Commission is asked to set it to +# support apprentices' employment prospects (remit 2026). values: 2010-10-01: value: 2.5 diff --git a/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml b/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml index b72d869d98..5bc3329464 100644 --- a/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml +++ b/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml @@ -25,20 +25,26 @@ description: Minimum wage rate for non-apprentices by age. # Rates after the last one set here are a projection, not law. Each is the # last rate set times the growth since then in # gov.economic_assumptions.indices.earnings_uprating, rounded to the nearest -# penny (the rounding is not repeated each April). Each April's rise in that +# penny (the rounding is not repeated each year). Each year's rise in that # index is the May-July growth in average weekly earnings of the year before, # rounded to 0.1 percentage points and never negative; it also projects the -# April up-rating of the Pension Credit guarantee. The Government keeps -# two-thirds of median hourly earnings for workers aged 21 and over as "the key -# reference point for future rates" of the national living wage (Low Pay -# Commission remit 2026), so that rate moves with earnings. May-July 2026 -# growth was 3.9%, so the April 2027 national living wage is projected at +# April up-rating of the Pension Credit guarantee. The Low Pay Commission +# remit 2026 says two-thirds of median hourly earnings "should continue to be +# the key reference point for future rates" of the national living wage, so +# the projection moves that rate with earnings. May-July 2026 growth was 3.9%, +# so the April 2027 national living wage is projected at # £12.71 x 1.039 = £13.21. # -# The younger bands' projection is an assumption: each keeps its April 2026 -# ratio to the national living wage. The Government "remains committed to" -# aligning the 18 to 20 rate with the national living wage, at a pace the Low -# Pay Commission sets (remit 2026), which this does not model. +# The index is dated 1 January, so before annualisation a projected rate +# starts on 1 January. Each year's figure is read at 30 April, the rate for +# the fiscal year that starts that April. Like the model's other indices, this +# one ends in 2039, so projected rates hold flat from 2040. +# +# The younger bands' projection is an assumption: each grows from its own +# last rate by the same index, so it keeps its ratio to the national living +# wage to the penny. The Government "remains committed to" aligning the 18 to +# 20 rate with the national living wage, at a pace the Low Pay Commission sets +# (remit 2026), which this does not model. # # A rate added to this file takes precedence, and the projection continues # from it. A reform does not: a rate a reform sets for some years is not diff --git a/policyengine_uk/tests/test_minimum_wage_projection.py b/policyengine_uk/tests/test_minimum_wage_projection.py index 0b78524088..3cc96442b7 100644 --- a/policyengine_uk/tests/test_minimum_wage_projection.py +++ b/policyengine_uk/tests/test_minimum_wage_projection.py @@ -142,7 +142,8 @@ def wage(year): assert wage(year).amounts[-1] == pytest.approx( _projected(13.50, tree, 2027, year), abs=1e-9 ), year - # The younger bands keep their own last rates' projection. + # Adding a national living wage rate leaves the younger bands' projection + # unchanged. assert wage(2027).amounts[0] == pytest.approx( system.parameters("2027-01-01").gov.hmrc.minimum_wage.non_apprentice.amounts[0] ) @@ -202,8 +203,10 @@ def test_rules_that_read_the_national_living_wage_follow_its_projection(): @pytest.mark.usefixtures("cloned_uk_tax_benefit_system") def test_a_reform_rate_is_not_projected(): """Invariant 6 (intended): £13.50 for 2027-28 alone leaves 2028-29 on - the baseline's path; £13.50 from 6 April 2027 onwards holds at £13.50, - below the baseline from the year the baseline passes it.""" + the baseline's path, where projecting from the reform's rate would give + £13.50 x 1.024. £13.50 from 6 April 2027 onwards documents the disclosed + behaviour rather than testing projection: the reform sets every year to + 2100, so nothing is left to project, and the baseline passes it.""" baseline = system.parameters one_year = {NLW.format(b): {"2027": 13.50} for b in (2, 3, 4)} onwards = {NLW.format(b): {"2027-04-06.2100-12-31": 13.50} for b in (2, 3, 4)} From 58da01cc384de7547d06033301bcd751805f72a9 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 28 Oct 2026 03:00:14 -0400 Subject: [PATCH 4/7] Say the earnings uprating index stops in 2039 The module docstring said "the series" runs to one year past the statutory inputs, which reads as the index; the yearly series does, but the index stops in 2039 like the others. The nowcasting doc no longer calls the long-run wage floor the same as one growing with average earnings: the projection runs about a year behind them and holds flat from 2040. Co-Authored-By: Claude Opus 5.5 --- docs/book/assumptions/nowcasting-comparison.md | 2 +- .../gov/economic_assumptions/create_earnings_uprating.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/book/assumptions/nowcasting-comparison.md b/docs/book/assumptions/nowcasting-comparison.md index ab052e45e0..9cfcd759e3 100644 --- a/docs/book/assumptions/nowcasting-comparison.md +++ b/docs/book/assumptions/nowcasting-comparison.md @@ -36,7 +36,7 @@ totals over the next two-to-three fiscal years. | Wage floor | Models the National Living Wage / NMW explicitly each year, lifting anyone below their age-appropriate minimum to the floor. | Earnings are uprated by the OBR average-earnings index without an explicit floor; minimum wage rates are held in `gov/hmrc/minimum_wage/` and projected by earnings growth after the last rate set; they enter through the rules that read them (the Universal Credit minimum income floor and benefit cap earnings exception, the childcare earnings tests, ESA permitted work and the Carer's Allowance earnings limit), not through earnings. | | Spillovers | Includes a spillover effect for workers just above the wage floor (compression of the lower wage distribution). | No automatic spillover; earnings shift uniformly with the OBR index. | | NLW extensions | Models the 2024-25 extension of the NLW to 21- and 22-year-olds, and provisionally the 2029-30 extension to 18-20-year-olds. | NLW age bands are encoded in parameters (`gov/hmrc/minimum_wage`). A change to a band, such as extending the NLW to younger workers, reaches outputs through the rules that read a person's age-band rate (the Universal Credit minimum income floor and the childcare earnings tests); earnings are not re-anchored to the floor. | -| Beyond 2025-26 | Assumes the wage floor grows in line with average earnings. | Same effective behaviour, but driven by uprating rather than a wage-floor rule. | +| Beyond 2025-26 | Assumes the wage floor grows in line with average earnings. | Minimum wage rates after the last one set grow by uprating rather than a wage-floor rule, with the May-July earnings growth of the year before, so about a year behind average earnings. Like the model's other indices, the projection ends in 2039 and holds flat from 2040. | **Practical implication.** Low-paid workers' incomes can grow faster under the RF nowcast than under PolicyEngine because the wage floor binds and diff --git a/policyengine_uk/parameters/gov/economic_assumptions/create_earnings_uprating.py b/policyengine_uk/parameters/gov/economic_assumptions/create_earnings_uprating.py index 96ddfb2500..10c02ab4c5 100644 --- a/policyengine_uk/parameters/gov/economic_assumptions/create_earnings_uprating.py +++ b/policyengine_uk/parameters/gov/economic_assumptions/create_earnings_uprating.py @@ -11,8 +11,9 @@ triple lock and rounds to the 0.1 percentage points published by the ONS. ``create_economic_assumption_indices`` compounds it into -``gov.economic_assumptions.indices.earnings_uprating``. The series starts -from a 2010 base and runs to one year past the statutory inputs. Published +``gov.economic_assumptions.indices.earnings_uprating``. The yearly series +starts from a 2010 base and runs to one year past the statutory inputs; the +index, like the others built there, stops in 2039. Published benefit amounts remain explicit; the index projects later years. The minimum wage rates (``gov.hmrc.minimum_wage``) also use it after the last rate set. From 1c17f28b38a608a843ad8ce11f883a8af94ce43f Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 28 Oct 2026 10:40:13 -0400 Subject: [PATCH 5/7] Add the April 2027 minimum wage rates Budget 2026 announced MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Budget 2026 paragraph 6.128: from 1 April 2027 the national living wage is £13.21, the 18 to 20 rate £11.27, and the 16 to 17 and apprentice rates £8.31, each up 3.9%. They are dated values citing the Budget until the amending S.I. is made, and the projection now starts from them. The index's April 2027 rise is also 3.9% (May-July 2026 earnings), so projecting the April 2026 rates gave these to the penny; a test keeps that as a one-year backtest. test_minimum_wage_rates checks the files and the model against an ANNOUNCED_RATES table, and every dated value must be a commencement or announced date. The precedence test moves to a rate set for April 2028, and no test hard-codes a projected value. Co-Authored-By: Claude Opus 5.5 --- changelog.d/nlw-april-2027-rates.added.md | 1 + .../gov/hmrc/minimum_wage/apprentice.yaml | 5 ++ .../gov/hmrc/minimum_wage/non_apprentice.yaml | 36 +++++++++-- ...s_allowance_earnings_limit_projection.yaml | 8 +-- .../tests/test_minimum_wage_projection.py | 62 ++++++++++++------- .../tests/test_minimum_wage_rates.py | 51 ++++++++++++--- .../esa_exempt_work_higher_earnings_limit.py | 5 +- 7 files changed, 124 insertions(+), 44 deletions(-) create mode 100644 changelog.d/nlw-april-2027-rates.added.md diff --git a/changelog.d/nlw-april-2027-rates.added.md b/changelog.d/nlw-april-2027-rates.added.md new file mode 100644 index 0000000000..54ed52e987 --- /dev/null +++ b/changelog.d/nlw-april-2027-rates.added.md @@ -0,0 +1 @@ +Add the April 2027 minimum wage rates Budget 2026 announced (paragraph 6.128): £13.21 for the national living wage, £11.27 for ages 18 to 20, and £8.31 for ages 16 to 17 and apprentices. The projection by earnings growth now starts from them. diff --git a/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml b/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml index 1c0398d65f..9038984cef 100644 --- a/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml +++ b/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml @@ -102,6 +102,11 @@ values: reference: - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(3)(c) href: https://www.legislation.gov.uk/uksi/2026/357/made + 2027-04-01: + value: 8.31 + reference: + - title: Budget 2026, paragraph 6.128 (announced 28 October 2026; the amending S.I. is not yet made) + href: https://www.gov.uk/government/publications/budget-2026-document/budget-2026-html metadata: economy: false household: false diff --git a/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml b/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml index 5bc3329464..b5e377e474 100644 --- a/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml +++ b/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml @@ -20,7 +20,9 @@ description: Minimum wage rate for non-apprentices by age. # Rates take effect on the commencement date of each amending S.I. Until # October 2015 all rate changes took effect on 1 October. The national living # wage has changed each 1 April since 2016; the other rates changed on -# 1 October 2016 and each 1 April from 2017. +# 1 October 2016 and each 1 April from 2017. The 1 April 2027 rates are the +# ones Budget 2026 announced (paragraph 6.128); the amending S.I. is not yet +# made. # # Rates after the last one set here are a projection, not law. Each is the # last rate set times the growth since then in @@ -31,9 +33,10 @@ description: Minimum wage rate for non-apprentices by age. # April up-rating of the Pension Credit guarantee. The Low Pay Commission # remit 2026 says two-thirds of median hourly earnings "should continue to be # the key reference point for future rates" of the national living wage, so -# the projection moves that rate with earnings. May-July 2026 growth was 3.9%, -# so the April 2027 national living wage is projected at -# £12.71 x 1.039 = £13.21. +# the projection moves that rate with earnings. The index rose 3.9% for April +# 2027 (May-July 2026 growth), as did each rate Budget 2026 announced, so +# projecting the April 2026 rates gives the April 2027 ones to the penny: +# £12.71 x 1.039 = £13.21, £10.85 x 1.039 = £11.27 and £8.00 x 1.039 = £8.31. # # The index is dated 1 January, so before annualisation a projected rate # starts on 1 January. Each year's figure is read at 30 April, the rate for @@ -152,6 +155,11 @@ brackets: reference: - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(3)(b) href: https://www.legislation.gov.uk/uksi/2026/357/made + 2027-04-01: + value: 8.31 + reference: + - title: Budget 2026, paragraph 6.128 (announced 28 October 2026; the amending S.I. is not yet made) + href: https://www.gov.uk/government/publications/budget-2026-document/budget-2026-html - threshold: 2010-10-01: 18 amount: @@ -252,6 +260,11 @@ brackets: reference: - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(3)(a) href: https://www.legislation.gov.uk/uksi/2026/357/made + 2027-04-01: + value: 11.27 + reference: + - title: Budget 2026, paragraph 6.128 (announced 28 October 2026; the amending S.I. is not yet made) + href: https://www.gov.uk/government/publications/budget-2026-document/budget-2026-html - threshold: 2010-10-01: 21 amount: @@ -352,6 +365,11 @@ brackets: reference: - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(2) href: https://www.legislation.gov.uk/uksi/2026/357/made + 2027-04-01: + value: 13.21 + reference: + - title: Budget 2026, paragraph 6.128 (announced 28 October 2026; the amending S.I. is not yet made) + href: https://www.gov.uk/government/publications/budget-2026-document/budget-2026-html - threshold: 2010-10-01: 23 amount: @@ -452,6 +470,11 @@ brackets: reference: - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(2) href: https://www.legislation.gov.uk/uksi/2026/357/made + 2027-04-01: + value: 13.21 + reference: + - title: Budget 2026, paragraph 6.128 (announced 28 October 2026; the amending S.I. is not yet made) + href: https://www.gov.uk/government/publications/budget-2026-document/budget-2026-html - threshold: 2010-10-01: 25 amount: @@ -547,6 +570,11 @@ brackets: reference: - title: The National Minimum Wage (Amendment) Regulations 2026, regulation 2(2) href: https://www.legislation.gov.uk/uksi/2026/357/made + 2027-04-01: + value: 13.21 + reference: + - title: Budget 2026, paragraph 6.128 (announced 28 October 2026; the amending S.I. is not yet made) + href: https://www.gov.uk/government/publications/budget-2026-document/budget-2026-html metadata: amount_unit: currency-GBP diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/carers_allowance_earnings_limit_projection.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/carers_allowance_earnings_limit_projection.yaml index 213db6bee8..faee2c4fba 100644 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/carers_allowance_earnings_limit_projection.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/carers_allowance_earnings_limit_projection.yaml @@ -2,10 +2,10 @@ # week from 6 April 2026, SI 2026/218). From April 2025 the Government sets # the limit at 16 times the hourly national living wage, rounded up to the # nearest pound (Explanatory Memorandum to SI 2025/352, paragraph 5.6), and -# the model projects later years that way. The model projects the April 2027 -# national living wage by May-July 2026 earnings growth, 3.9% (published), to -# £12.71 x 1.039 = £13.21, so the limit is 16 x £13.21 = £211.36, rounded up -# to £212. Later years rest on OBR forecasts, so they are tested in +# the model projects later years that way. Budget 2026 (paragraph 6.128) sets +# the April 2027 national living wage at £13.21, so the limit is +# 16 x £13.21 = £211.36, rounded up to £212. Later years rest on the model's +# projection of the national living wage, so they are tested in # test_carers_allowance_earnings_limit_projection.py against whatever the # model's wage is. Earnings are entered net, as carers_allowance_earnings, so # the cases do not depend on tax or NI. diff --git a/policyengine_uk/tests/test_minimum_wage_projection.py b/policyengine_uk/tests/test_minimum_wage_projection.py index 3cc96442b7..b84fb0da01 100644 --- a/policyengine_uk/tests/test_minimum_wage_projection.py +++ b/policyengine_uk/tests/test_minimum_wage_projection.py @@ -1,8 +1,9 @@ """Minimum wage rates after the last one set (#2537). Each rate is set by an amending S.I. (National Minimum Wage Regulations 2015 -regs. 4, 4A and 5). Later years are a projection, not law: from the last rate -set, each rate rises each April with +regs. 4, 4A and 5); the April 2027 rates are the ones Budget 2026 announced +(paragraph 6.128), ahead of their S.I. Later years are a projection, not law: +from the last rate set, each rate rises each April with gov.economic_assumptions.indices.earnings_uprating (the May-July growth in average weekly earnings of the year before, rounded to 0.1 percentage points and never negative) and is rounded to the nearest penny. @@ -104,31 +105,42 @@ def test_rates_are_the_last_rate_set_uprated_by_earnings(year): assert amount >= rate -def test_april_2027_national_living_wage_follows_may_to_july_2026_earnings(): - """May-July 2026 average weekly earnings grew 3.9% (ONS KAC3, 20 October - 2026), so the April 2027 national living wage is £12.71 x 1.039 = - £13.2057, £13.21 to the nearest penny.""" +def test_projecting_april_2026_gives_the_april_2027_rates_announced(): + """Backtest of the index for one year. It rose 3.9% for April 2027 + (May-July 2026 average weekly earnings, ONS KAC3, 20 October 2026), and + Budget 2026 raised each rate by 3.9% (paragraph 6.128). Projecting each + April 2026 rate gives the rate announced, to the penny: £12.71 x 1.039 = + £13.2057, £10.85 x 1.039 = £11.2732 and £8.00 x 1.039 = £8.312.""" p = system.parameters assert p("2027-01-01").gov.economic_assumptions.yoy_growth.earnings_uprating == ( pytest.approx(0.039) ) - assert p("2026-01-01").gov.hmrc.minimum_wage.non_apprentice.amounts[-1] == 12.71 - assert p("2027-01-01").gov.hmrc.minimum_wage.non_apprentice.amounts[-1] == ( - pytest.approx(13.21, abs=1e-9) + april_2026 = p("2026-01-01").gov.hmrc.minimum_wage + april_2027 = p("2027-01-01").gov.hmrc.minimum_wage + assert list(april_2026.non_apprentice.amounts) == [8.00, 10.85, 12.71, 12.71, 12.71] + assert list(april_2027.non_apprentice.amounts) == pytest.approx( + [8.31, 11.27, 13.21, 13.21, 13.21], abs=1e-9 ) + assert april_2027.apprentice == pytest.approx(8.31, abs=1e-9) + pairs = [ + *zip(april_2026.non_apprentice.amounts, april_2027.non_apprentice.amounts), + (april_2026.apprentice, april_2027.apprentice), + ] + for before, announced in pairs: + assert _projected(before, p, 2026, 2027) == pytest.approx(announced, abs=1e-9) def test_a_rate_set_later_takes_precedence_and_the_projection_continues(): - """Invariant 4: a national living wage of £13.50 from 1 April 2027, added - as a rate set by an S.I. would be, holds in 2027-28, and later years are - £13.50 times the earnings growth since. The Carer's Allowance earnings - limit follows it: 16 x £13.50 = £216 (the projection alone gives £212).""" + """Invariant 4: a national living wage of £14.00 from 1 April 2028, added + as a rate set by an S.I. would be, holds in 2028-29, and later years are + £14.00 times the earnings growth since. The Carer's Allowance earnings + limit follows it: 16 x £14.00 = £224, above the projection's own limit.""" tree = statutory_parameters() scale = tree.gov.hmrc.minimum_wage.non_apprentice for bracket in scale.brackets[2:]: amount = bracket.amount amount.values_list.append( - ParameterAtInstant(amount.name, "2027-04-01", data=13.50) + ParameterAtInstant(amount.name, "2028-04-01", data=14.00) ) amount.values_list.sort(key=lambda entry: entry.instant_str, reverse=True) tree, _ = process_parameter_tree(tree) @@ -136,23 +148,24 @@ def test_a_rate_set_later_takes_precedence_and_the_projection_continues(): def wage(year): return tree(f"{year}-01-01").gov.hmrc.minimum_wage.non_apprentice - assert wage(2026).amounts[-1] == 12.71 - assert wage(2027).amounts[-1] == pytest.approx(13.50, abs=1e-9) - for year in range(2028, 2031): + assert wage(2027).amounts[-1] == pytest.approx(13.21, abs=1e-9) + assert wage(2028).amounts[-1] == pytest.approx(14.00, abs=1e-9) + for year in range(2029, 2032): assert wage(year).amounts[-1] == pytest.approx( - _projected(13.50, tree, 2027, year), abs=1e-9 + _projected(14.00, tree, 2028, year), abs=1e-9 ), year # Adding a national living wage rate leaves the younger bands' projection # unchanged. - assert wage(2027).amounts[0] == pytest.approx( - system.parameters("2027-01-01").gov.hmrc.minimum_wage.non_apprentice.amounts[0] + assert wage(2028).amounts[0] == pytest.approx( + system.parameters("2028-01-01").gov.hmrc.minimum_wage.non_apprentice.amounts[0] ) def limit(year): return tree(f"{year}-01-01").gov.dwp.carers_allowance.earnings_limit - assert limit(2026) == 204 - assert limit(2027) == 216 + assert limit(2027) == 212 + assert limit(2028) == 224 + assert system.parameters("2028-01-01").gov.dwp.carers_allowance.earnings_limit < 224 def _round_up_to_50p(amount): @@ -166,8 +179,9 @@ def _round_up_to_50p(amount): @pytest.mark.usefixtures("cloned_uk_tax_benefit_system") def test_rules_that_read_the_national_living_wage_follow_its_projection(): - """Invariant 5, in every projected year to 2040.""" - years = list(PROJECTED) + """Invariant 5, in the year of the last rate set (April 2027, announced) + and every projected year to 2040.""" + years = list(range(LAST_YEAR, LAST_CHECKED + 1)) simulation = Simulation( situation={ "people": { diff --git a/policyengine_uk/tests/test_minimum_wage_rates.py b/policyengine_uk/tests/test_minimum_wage_rates.py index 4424480998..0cdce26383 100644 --- a/policyengine_uk/tests/test_minimum_wage_rates.py +++ b/policyengine_uk/tests/test_minimum_wage_rates.py @@ -37,13 +37,14 @@ 2. For every year from 2015 to 2040, no rate falls as age rises, and the apprenticeship rate is never above the rate for any age from 16. 3. No rate falls from one year to the next, 2015 to 2040. This holds for - every rate set from October 2010 to April 2026; it is a property of the - enacted rates, not a rule in the Act, so a future cut would need this test - changing. - -Rates dated after the last row of ``RATES_FROM_COMMENCEMENT`` (for example -announced rates whose S.I. is not yet made) need a reference but are not -checked against the tables until a row is added for them. + every rate set from October 2010 to April 2026 and every rate announced + for April 2027; it is a property of the rates, not a rule in the Act, so + a future cut would need this test changing. + +Rates announced but not yet set by an S.I. are in ``ANNOUNCED_RATES``, checked +against the parameter files and the model from the date they take effect. +They need a reference, but not to an S.I.; move a row to +``RATES_FROM_COMMENCEMENT``, citing the S.I., once it is made. """ import datetime @@ -166,6 +167,16 @@ ), ] +# (date in force, announcement, rates by band) for rates announced whose +# amending S.I. is not yet made. +ANNOUNCED_RATES = [ + ( + "2027-04-01", + "Budget 2026, paragraph 6.128", + (8.31, 8.31, 11.27, 13.21, 13.21, 13.21), + ), +] + # Rates in force on 30 April of each year, and the S.I. that set them. RATES_AT_30_APRIL = { # 2015 Regs reg. 4(1) as made (in force 6 April 2015), carrying over the @@ -317,17 +328,37 @@ def test_parameter_files_match_each_instrument_from_commencement( ) +@pytest.mark.parametrize( + "start, announcement, row", + ANNOUNCED_RATES, + ids=[announcement for _, announcement, _ in ANNOUNCED_RATES], +) +def test_parameter_files_and_model_match_each_announced_rate(start, announcement, row): + date = datetime.date.fromisoformat(start) + expected = _rates(row) + assert _in_force(RAW_APPRENTICE, date) == pytest.approx(expected["apprentice"]) + assert _model_apprentice_rate(date.year) == pytest.approx(expected["apprentice"]) + for band, ages in BAND_AGES.items(): + for age in ages: + assert _raw_rate(date, age) == pytest.approx(expected[band]), ( + f"{announcement}, age {age} ({band})" + ) + assert _model_rate(date.year, age) == pytest.approx(expected[band]), ( + f"{announcement}, {date.year}, age {age} ({band})" + ) + + def test_parameter_files_change_only_on_commencement_dates(): commencements = { - datetime.date.fromisoformat(date) for date, _, _ in RATES_FROM_COMMENCEMENT + datetime.date.fromisoformat(date) + for date, _, _ in [*RATES_FROM_COMMENCEMENT, *ANNOUNCED_RATES] } series = [RAW_APPRENTICE] for thresholds, amounts in RAW_BRACKETS: series += [thresholds, amounts] for pairs in series: for start, _ in pairs: - if start <= LAST_TRANSCRIBED: - assert start in commencements, f"{start} is not a commencement date" + assert start in commencements, f"{start} is not a commencement date" def test_30_april_table_agrees_with_commencement_table(): diff --git a/policyengine_uk/variables/gov/dwp/esa_exempt_work_higher_earnings_limit.py b/policyengine_uk/variables/gov/dwp/esa_exempt_work_higher_earnings_limit.py index 1004b47d65..8909fc911e 100644 --- a/policyengine_uk/variables/gov/dwp/esa_exempt_work_higher_earnings_limit.py +++ b/policyengine_uk/variables/gov/dwp/esa_exempt_work_higher_earnings_limit.py @@ -15,8 +15,9 @@ class esa_exempt_work_higher_earnings_limit(Variable): "rate in reg 11 of the National Minimum Wage Regulations 1999, now " "the national living wage, the adult rate (DMG 41190), so the " "limit moves with gov.hmrc.minimum_wage.non_apprentice, including " - "its projection by earnings growth after the last rate set (16 x " - "£13.21 = £211.36, rounded up to £211.50, from April 2027)." + "its projection by earnings growth after the last rate set. From " + "April 2027 it is 16 x £13.21 (the rate Budget 2026 announced) = " + "£211.36, rounded up to £211.50." ) definition_period = YEAR unit = GBP From 8742d96ac650d65c5f897046bf35546e1655fbe1 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 28 Oct 2026 11:46:09 -0400 Subject: [PATCH 6/7] Project minimum wage rates by the OBR's national living wage forecast MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The OBR forecasts the national living wage itself (EFO October 2026, detailed economy tables, Table 1.13), and HM Treasury costed the Budget 2026 Carer's Allowance taper on those projections. Add gov.economic_assumptions.yoy_growth.obr.national_living_wage: growth in the rates set to 2027, the OBR's estimates for 2028 to 2031 (£13.51, £13.85, £14.23, £14.62), then average_earnings growth. Project the minimum wage rates by its index instead of earnings_uprating. Tests check the series against the published table to the penny and its long-run years against average_earnings. Co-Authored-By: Claude Opus 5.5 --- changelog.d/nlw-projection-earnings.fixed.md | 2 +- .../book/assumptions/nowcasting-comparison.md | 4 +- .../gov/economic_assumptions/README.md | 17 +++- .../create_earnings_uprating.py | 4 +- .../gov/economic_assumptions/yoy_growth.yaml | 82 ++++++++++++++++ .../gov/hmrc/minimum_wage/apprentice.yaml | 12 +-- .../gov/hmrc/minimum_wage/non_apprentice.yaml | 31 +++--- .../tests/test_minimum_wage_projection.py | 94 +++++++++++++------ .../esa_exempt_work_higher_earnings_limit.py | 3 +- ...enefit_cap_earnings_exception_threshold.py | 5 +- 10 files changed, 188 insertions(+), 66 deletions(-) diff --git a/changelog.d/nlw-projection-earnings.fixed.md b/changelog.d/nlw-projection-earnings.fixed.md index 38d05ca8b5..9ce5cb9e5b 100644 --- a/changelog.d/nlw-projection-earnings.fixed.md +++ b/changelog.d/nlw-projection-earnings.fixed.md @@ -1 +1 @@ -Project the minimum wage rates, including the national living wage, after the last rate set by the May-July earnings growth of the year before, so the Universal Credit benefit cap earnings exception, the minimum income floor, ESA permitted work, the childcare earnings tests and the Carer's Allowance earnings limit rise with them instead of holding April 2026 rates. A reform that sets a minimum wage rate from some year onwards now holds that rate flat against a rising baseline, where before it was an uplift on a flat one. +Project the minimum wage rates, including the national living wage, after the last rate set by the OBR's national living wage forecast (EFO economy Table 1.13) and average earnings growth after it, so the Universal Credit benefit cap earnings exception, the minimum income floor, ESA permitted work, the childcare earnings tests and the Carer's Allowance earnings limit rise with them instead of holding April 2026 rates. A reform that sets a minimum wage rate from some year onwards now holds that rate flat against a rising baseline, where before it was an uplift on a flat one. diff --git a/docs/book/assumptions/nowcasting-comparison.md b/docs/book/assumptions/nowcasting-comparison.md index 9cfcd759e3..482e4dc14d 100644 --- a/docs/book/assumptions/nowcasting-comparison.md +++ b/docs/book/assumptions/nowcasting-comparison.md @@ -33,10 +33,10 @@ totals over the next two-to-three fiscal years. | Aspect | Resolution Foundation | PolicyEngine UK | |-------|------------------------|-----------------| -| Wage floor | Models the National Living Wage / NMW explicitly each year, lifting anyone below their age-appropriate minimum to the floor. | Earnings are uprated by the OBR average-earnings index without an explicit floor; minimum wage rates are held in `gov/hmrc/minimum_wage/` and projected by earnings growth after the last rate set; they enter through the rules that read them (the Universal Credit minimum income floor and benefit cap earnings exception, the childcare earnings tests, ESA permitted work and the Carer's Allowance earnings limit), not through earnings. | +| Wage floor | Models the National Living Wage / NMW explicitly each year, lifting anyone below their age-appropriate minimum to the floor. | Earnings are uprated by the OBR average-earnings index without an explicit floor; minimum wage rates are held in `gov/hmrc/minimum_wage/` and projected after the last rate set by the OBR's national living wage forecast, then average earnings; they enter through the rules that read them (the Universal Credit minimum income floor and benefit cap earnings exception, the childcare earnings tests, ESA permitted work and the Carer's Allowance earnings limit), not through earnings. | | Spillovers | Includes a spillover effect for workers just above the wage floor (compression of the lower wage distribution). | No automatic spillover; earnings shift uniformly with the OBR index. | | NLW extensions | Models the 2024-25 extension of the NLW to 21- and 22-year-olds, and provisionally the 2029-30 extension to 18-20-year-olds. | NLW age bands are encoded in parameters (`gov/hmrc/minimum_wage`). A change to a band, such as extending the NLW to younger workers, reaches outputs through the rules that read a person's age-band rate (the Universal Credit minimum income floor and the childcare earnings tests); earnings are not re-anchored to the floor. | -| Beyond 2025-26 | Assumes the wage floor grows in line with average earnings. | Minimum wage rates after the last one set grow by uprating rather than a wage-floor rule, with the May-July earnings growth of the year before, so about a year behind average earnings. Like the model's other indices, the projection ends in 2039 and holds flat from 2040. | +| Beyond 2025-26 | Assumes the wage floor grows in line with average earnings. | Minimum wage rates after the last one set grow by uprating rather than a wage-floor rule: with the OBR's national living wage forecast to the end of the EFO, then with average earnings. Like the model's other indices, the projection ends in 2039 and holds flat from 2040. | **Practical implication.** Low-paid workers' incomes can grow faster under the RF nowcast than under PolicyEngine because the wage floor binds and diff --git a/policyengine_uk/parameters/gov/economic_assumptions/README.md b/policyengine_uk/parameters/gov/economic_assumptions/README.md index a3fe2c68a5..e37151b33b 100644 --- a/policyengine_uk/parameters/gov/economic_assumptions/README.md +++ b/policyengine_uk/parameters/gov/economic_assumptions/README.md @@ -25,6 +25,7 @@ GDP and population assumptions remain supported. | `consumer_price_index_ahc` | CPI excluding rents/maintenance/water (AHC measure) | ONS ad hoc 3582; forecast derived by `utils/create_ahc_deflator.py` | | `rpi` | Retail Price Index year-on-year growth | EFO Table 1.7 | | `average_earnings` | Average weekly earnings growth | EFO Table 1.6 | +| `national_living_wage` | National living wage growth, for April of each year | EFO economy Table 1.13 | | `non_labour_income` | Non-labour household income growth | derived from EFO | | `road_fuel_volume` | Petrol + diesel road-fuel clearances | HMRC Hydrocarbon Oils + OBR fuel-duty forecast | | `petrol_spending_litre_proxy` | Spending growth that preserves road-fuel litres | HMRC + OBR | @@ -44,6 +45,18 @@ in an earlier EFO), the EFO's forecast years, and after them the `average_earnings` path. Years before the outturn year are kept, so each index keeps its base year. +`national_living_wage` projects the minimum wage rates +(`gov.hmrc.minimum_wage`) after the last rate set. It is the growth of the +rates set to 2027, then the OBR's estimates in Table 1.13 of the detailed +economy tables, then `average_earnings`' long-run growth. The checked-in +estimates are the October 2026 EFO's, ahead of the other series' March 2026 +vintage, because HM Treasury costed Budget 2026's Carer's Allowance taper on +them. `utils/import_obr_forecasts.py` doesn't read Table 1.13, so the series +is updated by hand with each EFO. `test_minimum_wage_projection.py` holds the +table and fails if the series stops reproducing it, or if its long-run years +stop matching `average_earnings`. Each rate is set by an S.I., so this is a projection, not +a formula. + ## Time horizons Three horizons are stitched together for each OBR and ONS series (not @@ -262,10 +275,6 @@ amounts to reflect discretionary increases. For April 2027, May-July 2026 earnings growth of 3.9% gives £238 × 1.039 = £247.282 a week for a single person and £363.25 × 1.039 = £377.41675 for a couple, before benefit rounding. -The minimum wage rates (`gov.hmrc.minimum_wage`) also use this index after -the last rate set. That is a projection: each rate is set by an S.I., not by -a formula. - The Savings Credit maximum rises by September CPI, as stated in [HCWS1101](https://questions-statements.parliament.uk/written-statements/detail/2025-11-26/hcws1101). After general uprating, the projected threshold is derived as the standard diff --git a/policyengine_uk/parameters/gov/economic_assumptions/create_earnings_uprating.py b/policyengine_uk/parameters/gov/economic_assumptions/create_earnings_uprating.py index 10c02ab4c5..ca15588194 100644 --- a/policyengine_uk/parameters/gov/economic_assumptions/create_earnings_uprating.py +++ b/policyengine_uk/parameters/gov/economic_assumptions/create_earnings_uprating.py @@ -14,9 +14,7 @@ ``gov.economic_assumptions.indices.earnings_uprating``. The yearly series starts from a 2010 base and runs to one year past the statutory inputs; the index, like the others built there, stops in 2039. Published -benefit amounts remain explicit; the index projects later years. The -minimum wage rates (``gov.hmrc.minimum_wage``) also use it after the last -rate set. +benefit amounts remain explicit; the index projects later years. """ from typing import Dict, Iterable diff --git a/policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml b/policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml index 5bb37c791a..c2412ca705 100644 --- a/policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml +++ b/policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml @@ -203,6 +203,88 @@ obr: - title: OBR long-run economic methodology (2031+ values derived from this, unchanged from November 2025) href: https://obr.uk/forecasts-in-depth/the-economy-forecast/potential-output-and-the-output-gap/ + national_living_wage: + description: National living wage year-on-year growth, for the rate from April of each year. + # The OBR forecasts the national living wage itself (EFO detailed economy + # tables, Table 1.13): rates set to 2027, then "OBR estimates consistent + # with the rest of our economy forecast". Each value here is one year's + # rate over the year before's, to six decimals, so compounding them from + # £13.21 reproduces the table to the penny: £13.51 (2028), £13.85 (2029), + # £14.23 (2030) and £14.62 (2031). HM Treasury costed the Budget 2026 + # Carer's Allowance taper on these "OBR projections for increases in the + # National Living Wage" (policy costings, October 2026). After the EFO + # horizon the series takes average_earnings' long-run growth: the Low Pay + # Commission's reference point for the rate is two-thirds of median + # hourly earnings (remit 2026). Refresh 2028 onwards with each EFO. + values: + # Rates set: S.I. 2021/329 to 2026/357, and £13.21 for 2027 (Budget + # 2026, paragraph 6.128), from £8.72 in 2020. + 2021-01-01: 0.021789 + 2022-01-01: 0.066218 + 2023-01-01: 0.096842 + 2024-01-01: 0.097889 + 2025-01-01: 0.067308 + 2026-01-01: 0.040950 + 2027-01-01: 0.039339 + # OBR estimates (2028-2031), EFO October 2026 Table 1.13 + 2028-01-01: 0.022984 + 2029-01-01: 0.025251 + 2030-01-01: 0.027289 + 2031-01-01: 0.026986 + # Long run (2032+): average_earnings growth + 2032-01-01: 0.0371 + 2033-01-01: 0.0374 + 2034-01-01: 0.0377 + 2035-01-01: 0.0380 + 2036-01-01: 0.0383 + 2037-01-01: 0.0383 + 2038-01-01: 0.0383 + 2039-01-01: 0.0383 + 2040-01-01: 0.0383 + 2041-01-01: 0.0383 + 2042-01-01: 0.0383 + 2043-01-01: 0.0383 + 2044-01-01: 0.0383 + 2045-01-01: 0.0383 + 2046-01-01: 0.0383 + 2047-01-01: 0.0383 + 2048-01-01: 0.0383 + 2049-01-01: 0.0383 + 2050-01-01: 0.0383 + 2051-01-01: 0.0383 + 2052-01-01: 0.0383 + 2053-01-01: 0.0383 + 2054-01-01: 0.0383 + 2055-01-01: 0.0383 + 2056-01-01: 0.0383 + 2057-01-01: 0.0383 + 2058-01-01: 0.0383 + 2059-01-01: 0.0383 + 2060-01-01: 0.0383 + 2061-01-01: 0.0383 + 2062-01-01: 0.0383 + 2063-01-01: 0.0383 + 2064-01-01: 0.0383 + 2065-01-01: 0.0383 + 2066-01-01: 0.0383 + 2067-01-01: 0.0383 + 2068-01-01: 0.0383 + 2069-01-01: 0.0383 + 2070-01-01: 0.0383 + 2071-01-01: 0.0383 + 2072-01-01: 0.0383 + 2073-01-01: 0.0383 + metadata: + unit: /1 + label: National living wage growth + reference: + - title: OBR EFO October 2026, detailed forecast tables (economy), Table 1.13 + href: https://obr.uk/efo/economic-and-fiscal-outlook-october-2026/ + - title: HM Treasury, Budget 2026 policy costings, Carer's Allowance taper (cost base) + href: https://assets.publishing.service.gov.uk/media/6ae1883fe4367e5c8b0467df/AB26_Policy_Costing.pdf + - title: Low Pay Commission remit 2026 + href: https://www.gov.uk/government/publications/national-minimum-wage-and-national-living-wage-low-pay-commission-remit-2026/low-pay-commission-remit-2026-national-living-wage-and-national-minimum-wage + consumer_price_index: description: Consumer price index year-on-year growth. values: diff --git a/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml b/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml index 9038984cef..abc2abc61f 100644 --- a/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml +++ b/policyengine_uk/parameters/gov/hmrc/minimum_wage/apprentice.yaml @@ -6,11 +6,11 @@ description: Minimum wage rate for apprentices. # amending S.I.: on 1 October until 2016, then on 1 April from 2017. # Rates after the last one set here are a projection, not law: the last rate # set times the growth since then in -# gov.economic_assumptions.indices.earnings_uprating, rounded to the nearest -# penny, as for the other minimum wage rates (non_apprentice.yaml). Growing it -# by the national living wage's index, which keeps its ratio to that rate to -# the penny, is an assumption: the Low Pay Commission is asked to set it to -# support apprentices' employment prospects (remit 2026). +# gov.economic_assumptions.indices.obr.national_living_wage, rounded to the +# nearest penny, as for the other minimum wage rates (non_apprentice.yaml). +# Growing it by the national living wage's index, which keeps its ratio to +# that rate to the penny, is an assumption: the Low Pay Commission is asked +# to set it to support apprentices' employment prospects (remit 2026). values: 2010-10-01: value: 2.5 @@ -113,7 +113,7 @@ metadata: label: Apprentice minimum wage unit: currency-GBP uprating: - parameter: gov.economic_assumptions.indices.earnings_uprating + parameter: gov.economic_assumptions.indices.obr.national_living_wage rounding: type: nearest interval: 0.01 diff --git a/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml b/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml index b5e377e474..78f3619d9e 100644 --- a/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml +++ b/policyengine_uk/parameters/gov/hmrc/minimum_wage/non_apprentice.yaml @@ -26,17 +26,16 @@ description: Minimum wage rate for non-apprentices by age. # # Rates after the last one set here are a projection, not law. Each is the # last rate set times the growth since then in -# gov.economic_assumptions.indices.earnings_uprating, rounded to the nearest -# penny (the rounding is not repeated each year). Each year's rise in that -# index is the May-July growth in average weekly earnings of the year before, -# rounded to 0.1 percentage points and never negative; it also projects the -# April up-rating of the Pension Credit guarantee. The Low Pay Commission -# remit 2026 says two-thirds of median hourly earnings "should continue to be -# the key reference point for future rates" of the national living wage, so -# the projection moves that rate with earnings. The index rose 3.9% for April -# 2027 (May-July 2026 growth), as did each rate Budget 2026 announced, so -# projecting the April 2026 rates gives the April 2027 ones to the penny: -# £12.71 x 1.039 = £13.21, £10.85 x 1.039 = £11.27 and £8.00 x 1.039 = £8.31. +# gov.economic_assumptions.indices.obr.national_living_wage, rounded to the +# nearest penny (the rounding is not repeated each year). To the end of the +# EFO that index follows the OBR's own forecast of the national living wage +# (detailed economy tables, Table 1.13), so the projected national living +# wage is the OBR's estimate to the penny: £13.51, £13.85, £14.23 and £14.62 +# from April 2028 to April 2031 (October 2026 EFO). HM Treasury costed the +# Budget 2026 Carer's Allowance taper on these projections. After the EFO the +# index grows with average earnings: the Low Pay Commission remit 2026 says +# two-thirds of median hourly earnings "should continue to be the key +# reference point for future rates" of the national living wage. # # The index is dated 1 January, so before annualisation a projected rate # starts on 1 January. Each year's figure is read at 30 April, the rate for @@ -60,7 +59,7 @@ brackets: amount: metadata: uprating: - parameter: gov.economic_assumptions.indices.earnings_uprating + parameter: gov.economic_assumptions.indices.obr.national_living_wage rounding: type: nearest interval: 0.01 @@ -165,7 +164,7 @@ brackets: amount: metadata: uprating: - parameter: gov.economic_assumptions.indices.earnings_uprating + parameter: gov.economic_assumptions.indices.obr.national_living_wage rounding: type: nearest interval: 0.01 @@ -270,7 +269,7 @@ brackets: amount: metadata: uprating: - parameter: gov.economic_assumptions.indices.earnings_uprating + parameter: gov.economic_assumptions.indices.obr.national_living_wage rounding: type: nearest interval: 0.01 @@ -375,7 +374,7 @@ brackets: amount: metadata: uprating: - parameter: gov.economic_assumptions.indices.earnings_uprating + parameter: gov.economic_assumptions.indices.obr.national_living_wage rounding: type: nearest interval: 0.01 @@ -480,7 +479,7 @@ brackets: amount: metadata: uprating: - parameter: gov.economic_assumptions.indices.earnings_uprating + parameter: gov.economic_assumptions.indices.obr.national_living_wage rounding: type: nearest interval: 0.01 diff --git a/policyengine_uk/tests/test_minimum_wage_projection.py b/policyengine_uk/tests/test_minimum_wage_projection.py index b84fb0da01..19bad37271 100644 --- a/policyengine_uk/tests/test_minimum_wage_projection.py +++ b/policyengine_uk/tests/test_minimum_wage_projection.py @@ -4,9 +4,9 @@ regs. 4, 4A and 5); the April 2027 rates are the ones Budget 2026 announced (paragraph 6.128), ahead of their S.I. Later years are a projection, not law: from the last rate set, each rate rises each April with -gov.economic_assumptions.indices.earnings_uprating (the May-July growth in -average weekly earnings of the year before, rounded to 0.1 percentage points -and never negative) and is rounded to the nearest penny. +gov.economic_assumptions.indices.obr.national_living_wage (the OBR's forecast +of the national living wage, EFO economy Table 1.13, to the end of the EFO, +then average earnings growth) and is rounded to the nearest penny. Invariants, from the year after each rate's last one set to 2040: @@ -69,15 +69,13 @@ def _last_set(values): FIRST_LAST_YEAR = min( date.year for date, _ in [*LAST_BRACKET_RATES, LAST_APPRENTICE_RATE] ) -# Years after every rate's last one set: the national living wage is projected. -PROJECTED = range(LAST_YEAR + 1, LAST_CHECKED + 1) NLW = "gov.hmrc.minimum_wage.non_apprentice[{}].amount" def _index(parameters, year): return parameters( f"{year}-01-01" - ).gov.economic_assumptions.indices.earnings_uprating + ).gov.economic_assumptions.indices.obr.national_living_wage def _projected(rate, parameters, base_year, year): @@ -86,7 +84,7 @@ def _projected(rate, parameters, base_year, year): @pytest.mark.parametrize("year", range(FIRST_LAST_YEAR + 1, LAST_CHECKED + 1)) -def test_rates_are_the_last_rate_set_uprated_by_earnings(year): +def test_rates_are_the_last_rate_set_uprated_by_the_index(year): """Invariants 1 to 3, for each rate in the years after its own last one set.""" p = system.parameters @@ -105,35 +103,69 @@ def test_rates_are_the_last_rate_set_uprated_by_earnings(year): assert amount >= rate -def test_projecting_april_2026_gives_the_april_2027_rates_announced(): - """Backtest of the index for one year. It rose 3.9% for April 2027 - (May-July 2026 average weekly earnings, ONS KAC3, 20 October 2026), and - Budget 2026 raised each rate by 3.9% (paragraph 6.128). Projecting each - April 2026 rate gives the rate announced, to the penny: £12.71 x 1.039 = - £13.2057, £10.85 x 1.039 = £11.2732 and £8.00 x 1.039 = £8.312.""" +# OBR EFO October 2026, detailed forecast tables (economy), Table 1.13: the +# national living wage in April of each year, £ an hour. "The NLW has been set +# by the Government up until 2027 ... Figures beyond 2027 are OBR estimates +# consistent with the rest of our economy forecast." +OBR_NATIONAL_LIVING_WAGE = { + 2020: 8.72, + 2021: 8.91, + 2022: 9.5, + 2023: 10.42, + 2024: 11.44, + 2025: 12.21, + 2026: 12.71, + 2027: 13.21, + 2028: 13.513623297578135, + 2029: 13.854853379339588, + 2030: 14.23293930734993, + 2031: 14.617023376183901, +} +GROWTH = yaml.safe_load( + (PARAMETER_DIR.parents[1] / "economic_assumptions/yoy_growth.yaml").read_text() +)["obr"] + + +def _growth(series, year): + return GROWTH[series]["values"][datetime.date(year, 1, 1)] + + +def test_the_series_reproduces_the_obr_table(): + """Differential against the published table. The growth series is each + year's rate over the year before's, to six decimals, from 2021 to the end + of the EFO, and the model's national living wage in each April is the + table's, rounded to the nearest penny: the rates set to 2027 (£13.21 from + Budget 2026), then the OBR's estimates of £13.51, £13.85, £14.23 and + £14.62 from 2028 to 2031.""" p = system.parameters - assert p("2027-01-01").gov.economic_assumptions.yoy_growth.earnings_uprating == ( - pytest.approx(0.039) - ) - april_2026 = p("2026-01-01").gov.hmrc.minimum_wage - april_2027 = p("2027-01-01").gov.hmrc.minimum_wage - assert list(april_2026.non_apprentice.amounts) == [8.00, 10.85, 12.71, 12.71, 12.71] - assert list(april_2027.non_apprentice.amounts) == pytest.approx( - [8.31, 11.27, 13.21, 13.21, 13.21], abs=1e-9 - ) - assert april_2027.apprentice == pytest.approx(8.31, abs=1e-9) - pairs = [ - *zip(april_2026.non_apprentice.amounts, april_2027.non_apprentice.amounts), - (april_2026.apprentice, april_2027.apprentice), - ] - for before, announced in pairs: - assert _projected(before, p, 2026, 2027) == pytest.approx(announced, abs=1e-9) + for year in range(2021, max(OBR_NATIONAL_LIVING_WAGE) + 1): + expected = OBR_NATIONAL_LIVING_WAGE[year] / OBR_NATIONAL_LIVING_WAGE[year - 1] + assert _growth("national_living_wage", year) == pytest.approx( + round(expected - 1, 6), abs=1e-12 + ), year + for year, rate in OBR_NATIONAL_LIVING_WAGE.items(): + wage = p(f"{year}-01-01").gov.hmrc.minimum_wage.non_apprentice.amounts[-1] + assert wage == pytest.approx(round(rate, 2), abs=1e-9), year + + +def test_after_the_efo_the_series_is_average_earnings_growth(): + """The Low Pay Commission's reference point is two-thirds of median hourly + earnings (remit 2026), so after the OBR's last estimate the series takes + average_earnings' growth, year for year, to the end of both series.""" + last = max(OBR_NATIONAL_LIVING_WAGE) + wage = {d.year for d in GROWTH["national_living_wage"]["values"] if d.year > last} + earnings = {d.year for d in GROWTH["average_earnings"]["values"] if d.year > last} + assert wage == earnings + for year in sorted(wage): + assert _growth("national_living_wage", year) == _growth( + "average_earnings", year + ), year def test_a_rate_set_later_takes_precedence_and_the_projection_continues(): """Invariant 4: a national living wage of £14.00 from 1 April 2028, added as a rate set by an S.I. would be, holds in 2028-29, and later years are - £14.00 times the earnings growth since. The Carer's Allowance earnings + £14.00 times the index's growth since. The Carer's Allowance earnings limit follows it: 16 x £14.00 = £224, above the projection's own limit.""" tree = statutory_parameters() scale = tree.gov.hmrc.minimum_wage.non_apprentice @@ -218,7 +250,7 @@ def test_rules_that_read_the_national_living_wage_follow_its_projection(): def test_a_reform_rate_is_not_projected(): """Invariant 6 (intended): £13.50 for 2027-28 alone leaves 2028-29 on the baseline's path, where projecting from the reform's rate would give - £13.50 x 1.024. £13.50 from 6 April 2027 onwards documents the disclosed + £13.50 x 1.023. £13.50 from 6 April 2027 onwards documents the disclosed behaviour rather than testing projection: the reform sets every year to 2100, so nothing is left to project, and the baseline passes it.""" baseline = system.parameters diff --git a/policyengine_uk/variables/gov/dwp/esa_exempt_work_higher_earnings_limit.py b/policyengine_uk/variables/gov/dwp/esa_exempt_work_higher_earnings_limit.py index 8909fc911e..0edcb660f9 100644 --- a/policyengine_uk/variables/gov/dwp/esa_exempt_work_higher_earnings_limit.py +++ b/policyengine_uk/variables/gov/dwp/esa_exempt_work_higher_earnings_limit.py @@ -15,7 +15,8 @@ class esa_exempt_work_higher_earnings_limit(Variable): "rate in reg 11 of the National Minimum Wage Regulations 1999, now " "the national living wage, the adult rate (DMG 41190), so the " "limit moves with gov.hmrc.minimum_wage.non_apprentice, including " - "its projection by earnings growth after the last rate set. From " + "its projection after the last rate set (the OBR's national living " + "wage forecast). From " "April 2027 it is 16 x £13.21 (the rate Budget 2026 announced) = " "£211.36, rounded up to £211.50." ) diff --git a/policyengine_uk/variables/gov/dwp/universal_credit/benefit_cap/uc_benefit_cap_earnings_exception_threshold.py b/policyengine_uk/variables/gov/dwp/universal_credit/benefit_cap/uc_benefit_cap_earnings_exception_threshold.py index 96b0ee5ca1..54f276d6bf 100644 --- a/policyengine_uk/variables/gov/dwp/universal_credit/benefit_cap/uc_benefit_cap_earnings_exception_threshold.py +++ b/policyengine_uk/variables/gov/dwp/universal_credit/benefit_cap/uc_benefit_cap_earnings_exception_threshold.py @@ -14,8 +14,9 @@ class uc_benefit_cap_earnings_exception_threshold(Variable): "Regulations, multiplied by 52 and divided by 12, with any fraction " "of a pound disregarded (reg. 6(1A)(za)). Before then it was a fixed " "£430 a month. In years after the last rate set, the threshold " - "follows gov.hmrc.minimum_wage.non_apprentice's projection by " - "earnings growth, as the minimum income floor does." + "follows gov.hmrc.minimum_wage.non_apprentice's projection (the " + "OBR's national living wage forecast), as the minimum income floor " + "does." ) definition_period = YEAR unit = GBP From 56570138edcfb2fda0b1f77fec77dc47a704e278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= Date: Fri, 30 Oct 2026 15:57:18 +0000 Subject: [PATCH 7/7] Take the long-run national living wage growth from the October 2026 EFO's average earnings The 2032 to 2035 values copied average_earnings as it stood before #2717 refreshed it. test_after_the_efo_the_series_is_average_earnings_growth requires the two series to match after the OBR's last estimate. The merge commit before this one brought main in and carries this message by mistake; it changes no values. Co-Authored-By: Claude Fable 5.1 --- .../gov/economic_assumptions/yoy_growth.yaml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml b/policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml index 6c6a9cf582..dc96368222 100644 --- a/policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml +++ b/policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml @@ -233,11 +233,12 @@ obr: 2029-01-01: 0.025251 2030-01-01: 0.027289 2031-01-01: 0.026986 - # Long run (2032+): average_earnings growth - 2032-01-01: 0.0371 - 2033-01-01: 0.0374 - 2034-01-01: 0.0377 - 2035-01-01: 0.0380 + # Long run (2032+): average_earnings growth, as refreshed by the + # October 2026 EFO (#2717) + 2032-01-01: 0.0285 + 2033-01-01: 0.0309 + 2034-01-01: 0.0334 + 2035-01-01: 0.0358 2036-01-01: 0.0383 2037-01-01: 0.0383 2038-01-01: 0.0383