Skip to content

feat: add student loan plan uprating to economic assumptions#1499

Merged
nwoodruff-co merged 6 commits intomainfrom
feat/student-loan-plan-uprating
Feb 19, 2026
Merged

feat: add student loan plan uprating to economic assumptions#1499
nwoodruff-co merged 6 commits intomainfrom
feat/student-loan-plan-uprating

Conversation

@nwoodruff-co
Copy link
Contributor

@nwoodruff-co nwoodruff-co commented Feb 19, 2026

Summary

  • Refactored uprate_student_loan_plans() in economic_assumptions.py to be idempotent — each year's output depends only on base year data and year parameter, not accumulated state from previous years
  • Re-labels existing loan holders based on cohort start year: Plan 1 for pre-2012, Plan 2 for 2012–2022, Plan 5 for 2023+ in England
  • Extends Plan 1/2 cohorts to cover age bands beyond base year's coverage:
    • Plan 2: extends from ages 21-29 (base year) to 21-35 by 2030
    • Plan 1: extends from ages 32-40 (base year) to 37-46 by 2030
  • Uses highest_education == TERTIARY as signal for graduate status when adding new cohort members
  • Applies flat 40% take-up rate (derived from SLC forecasts ~4M above threshold vs ~8-10M UK graduates)
  • Writes off Plan 1 loans after 29 years

Changes from v1

  • Fixed cumulative sampling bug: Previous version did independent stochastic draws each year, inflating counts over time
  • Added Plan 1/2 cohort extensions: Now assigns loans to tertiary-educated NONE people in extended age bands
  • Simplified take-up: Replaced unsourced income-decile table with flat 40% rate
  • Removed test script: Cleaned up after validation

Validation results

Age distributions by year:

Year Plan 1 ages Plan 2 ages Plan 5 ages
2025 32-46 21-31 19-20
2030 37-46 21-36 19-25

Totals (weighted):

Year Plan 1 Plan 2 Plan 5
2025 1.62M 2.65M 0.02M
2030 0.71M 2.96M 0.90M

Plan 2 totals remain below SLC targets (~4-5M) due to FRS under-coverage of graduate cohort — reweighting tracked as follow-on work in policyengine-uk-data.

Test plan

  • Age distributions extend correctly over time
  • Plan 5 grows from scratch as new cohorts enter
  • Plan 1 shrinks as loans are written off
  • CI passes

Re-labels student loan plans each year based on cohort start year,
writes off Plan 1 loans after 29 years, and samples new Plan 5
entrants for England using empirical age/income take-up probabilities.
- Replace cumulative stochastic sampling with idempotent approach
- Each year's assignment depends only on base year data + year parameter
- Add Plan 1/2 holders in extended age bands (30-35 for Plan 2, 41-46 for Plan 1)
- Use highest_education == TERTIARY as signal for graduate status
- Apply flat 40% take-up rate derived from SLC forecasts
- Remove income-decile take-up table (unsourced)
@nwoodruff-co nwoodruff-co merged commit e6c025e into main Feb 19, 2026
2 checks passed
@nwoodruff-co nwoodruff-co deleted the feat/student-loan-plan-uprating branch February 19, 2026 17:30
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.

1 participant