Skip to content

Conversation

@MaxGhenis
Copy link
Collaborator

Summary

  • Add 2026 Plan 2 student loan interest rate thresholds from GOV.UK announcement
  • Freeze lower threshold 2027-2029 to match Budget 2025 repayment threshold freeze

Changes

Lower threshold (lower_threshold.yaml):

  • 2026-09-01: £29,385
  • 2027-09-01: £29,385 (frozen per Budget 2025)
  • 2028-09-01: £29,385 (frozen per Budget 2025)
  • 2029-09-01: £29,385 (frozen per Budget 2025)

Upper threshold (upper_threshold.yaml):

  • 2026-09-01: £52,885

Rationale

The lower interest threshold equals the repayment threshold (as noted in the existing documentation). Budget 2025 froze the Plan 2 repayment threshold from 2027-28 until 2029-30, so the lower interest threshold should also be frozen.

The upper threshold has no announced freeze, so only the 2026 value is added.

Sources

Fixes #1419

🤖 Generated with Claude Code

MaxGhenis and others added 21 commits November 29, 2025 19:51
Add parameters documenting student loan interest rate rules:
- Plan 1: Lower of RPI or base rate + 1%
- Plan 2: Income-contingent (RPI to RPI+3% based on income thresholds)
- Plan 4: Same as Plan 1
- Plan 5: RPI only (no income-based component)
- Postgraduate: RPI + 3%

Add student_loan_interest_rate variable that calculates the applicable
rate based on plan type and income, with Plan 2 tapering between the
lower and upper income thresholds.

Fixes #1417

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Lower threshold: £29,385 (2026-09-01), frozen at same value through 2029
  per Budget 2025 repayment threshold freeze
- Upper threshold: £52,885 (2026-09-01)

Source: GOV.UK Student Loans Interest and Repayment Threshold Announcement

Fixes #1419

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
…holds

- Update lower_threshold.yaml and upper_threshold.yaml to use underscore separators (e.g., 29_385)
- Replace Python test file with YAML test file (student_loan_interest_rate.yaml)
- Tests cover Plan 2 income-contingent rates, threshold freeze 2027-2029, and other plan types

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Use p = parameters(period).gov.hmrc.student_loans.interest_rates then
call p.x directly in calculations to make explicit that values come
from parameters.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Create dedicated variable for Plan 2 income-contingent interest rate
calculation. This makes the tapered rate logic reusable and explicit.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Replace hardcoded Plan 1, 4, 5 interest rate parameters with formula-based
variables that calculate rates from underlying inputs:

- Plan 1/4: min(RPI, BoE base rate + 1%)
- Plan 5: RPI only
- Plan 2: RPI to RPI+3% (income-contingent)

New parameters:
- gov.boe.base_rate: Bank of England base rate
- gov.hmrc.student_loans.interest_rates.rpi: Student loan RPI rate

Removed parameters:
- interest_rates/plan_1.yaml (now calculated)
- interest_rates/plan_4.yaml (now calculated)
- interest_rates/plan_5.yaml (now calculated)
- interest_rates/plan_2/base_rate.yaml (replaced by rpi.yaml)

Sources:
- Plan 1: SI 2009/470, Regulation 21
- Plan 4: Same formula via amendments to SI 2009/470
- Bank of England rate history

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Remove interest_rates/rpi.yaml (duplicative)
- Reference gov.economic_assumptions.yoy_growth.obr.rpi in formulas
- Add legislative references to all interest rate variables
- Add OBR EFO November 2025 reference to BoE base rate forecasts
- Update tests to use OBR RPI values (4.33% for 2025, 3.71% for 2026)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Calendar year 2026 uses 2025-09-01 thresholds (28,470 / 51,245),
not the 2026-09-01 values which take effect in September.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Move uprating from dated value entries to top-level metadata
- Reference Regulation 21A(12) for lower threshold (L)
- Reference Regulation 21A(13) for upper threshold (H)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Remove 2020-2024 values that lacked proper references
- Keep only 2025+ values with corroborating sources:
  - 2025-09-01: From Student loans guide 2025-26
  - 2026-09-01: From government announcement
  - 2027-2029: Freeze per Budget 2025
- Update references to cite correct regulations (21AA/21AB)

Every value now has a corroborating reference.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Lower threshold (2020-2024):
- 2020-09-01: £26,575 (GOV.UK previous thresholds)
- 2021-09-01: £27,295 (GOV.UK previous thresholds)
- 2024-09-01: £27,295 (2024-25 Terms Guide)

Upper threshold (2024):
- 2024-09-01: £49,130 (SI 2022/1335 + 2024-25 Terms Guide)

Every value now has a corroborating reference.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Uprating is set at the parameter level in top-level metadata.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Per Regulation 21AB, the lower interest threshold equals the Plan 2
repayment threshold. Instead of duplicating values in a separate
parameter, reference the repayment threshold directly in the formula.

This removes the lower_threshold.yaml file and updates plan_2_interest_rate
to use gov.hmrc.student_loans.thresholds.plan_2.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
…ttern

- Create plan_1/boe_margin.yaml parameter for the 1% margin
- Update plan_1_interest_rate to use parameter instead of hardcoded 0.01
- Apply p = parameters(period).gov pattern to plan_5_interest_rate

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
p = parameters(period).gov.hmrc.student_loans for cleaner code.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@MaxGhenis MaxGhenis merged commit 97d4919 into master Dec 1, 2025
3 checks passed
@MaxGhenis MaxGhenis deleted the student-loan-interest-thresholds-2026 branch December 1, 2025 03:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add 2026 student loan interest rate thresholds and clarify uprating methodology

2 participants