From 875eae4d2d0cf91d6f3052d516cbb7f77539d645 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Wed, 28 Oct 2026 22:06:18 -0400 Subject: [PATCH 1/2] Count other investment income in market and HBAI income Income tax charges other_investment_income as savings income (taxable_savings_interest_income), but market_income, household_market_income and hbai_household_net_income left it out, so household net income carried the tax without the income. Add it to all three lists, with a YAML test that pins it against the same amount of bank interest. Fixes #2733. Co-Authored-By: Claude Opus 5.5 --- changelog.d/2733.fixed.md | 1 + ...investment_income_in_household_income.yaml | 39 +++++++++++++++++++ .../income/hbai_household_net_income.py | 3 ++ .../income/household_market_income.py | 3 ++ .../household/income/market_income.py | 3 ++ 5 files changed, 49 insertions(+) create mode 100644 changelog.d/2733.fixed.md create mode 100644 policyengine_uk/tests/policy/baseline/household/income/other_investment_income_in_household_income.yaml diff --git a/changelog.d/2733.fixed.md b/changelog.d/2733.fixed.md new file mode 100644 index 0000000000..d74116d6d1 --- /dev/null +++ b/changelog.d/2733.fixed.md @@ -0,0 +1 @@ +Count `other_investment_income` in `market_income`, `household_market_income` and `hbai_household_net_income`. Income tax already charged it as savings income, so household net income carried the tax on it without the income. diff --git a/policyengine_uk/tests/policy/baseline/household/income/other_investment_income_in_household_income.yaml b/policyengine_uk/tests/policy/baseline/household/income/other_investment_income_in_household_income.yaml new file mode 100644 index 0000000000..59748095f8 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/household/income/other_investment_income_in_household_income.yaml @@ -0,0 +1,39 @@ +# Other investment income (National Savings, gilt and other securities +# interest) is savings income for income tax (taxable_savings_interest_income), +# so market income and HBAI income count it as they count bank interest. +# 2026-27: personal allowance £12,570, basic rate 20%, personal savings +# allowance £1,000 for a basic rate taxpayer, starting rate for savings +# £5,000 less non-savings income above the personal allowance (here nil), +# employee NI 8% from £12,570 to £50,270. + +- name: Other investment income counts in market and HBAI income + period: 2026 + absolute_error_margin: 0.01 + input: + age: 40 + employment_income: 40_000 + other_investment_income: 2_000 + output: + # 40,000 + 2,000. + market_income: 42_000 + household_market_income: 42_000 + # (40,000 - 12,570) x 20% = 5,486, plus (2,000 - 1,000 PSA) x 20% = 200. + income_tax: 5_686 + # (40,000 - 12,570) x 8%. + national_insurance: 2_194.40 + # 42,000 - 5,686 - 2,194.40. + hbai_household_net_income: 34_119.60 + +- name: The same amount as bank interest gives the same incomes + period: 2026 + absolute_error_margin: 0.01 + input: + age: 40 + employment_income: 40_000 + savings_interest_income: 2_000 + output: + market_income: 42_000 + household_market_income: 42_000 + income_tax: 5_686 + national_insurance: 2_194.40 + hbai_household_net_income: 34_119.60 diff --git a/policyengine_uk/variables/household/income/hbai_household_net_income.py b/policyengine_uk/variables/household/income/hbai_household_net_income.py index 604ec70078..7b09beb6f7 100644 --- a/policyengine_uk/variables/household/income/hbai_household_net_income.py +++ b/policyengine_uk/variables/household/income/hbai_household_net_income.py @@ -7,6 +7,9 @@ "employment_income", "self_employment_income", "savings_interest_income", + # National Savings, gilt and other securities interest, which income + # tax charges as savings income (taxable_savings_interest_income). + "other_investment_income", "tax_free_savings_income", "individual_savings_account_dividend_income", "dividend_income", diff --git a/policyengine_uk/variables/household/income/household_market_income.py b/policyengine_uk/variables/household/income/household_market_income.py index 1fd5503c79..766b11e901 100644 --- a/policyengine_uk/variables/household/income/household_market_income.py +++ b/policyengine_uk/variables/household/income/household_market_income.py @@ -7,6 +7,9 @@ "employment_income", "self_employment_income", "savings_interest_income", + # National Savings, gilt and other securities interest, which income + # tax charges as savings income (taxable_savings_interest_income). + "other_investment_income", "tax_free_savings_income", "individual_savings_account_dividend_income", "dividend_income", diff --git a/policyengine_uk/variables/household/income/market_income.py b/policyengine_uk/variables/household/income/market_income.py index f759e64f76..01aa0c71a0 100644 --- a/policyengine_uk/variables/household/income/market_income.py +++ b/policyengine_uk/variables/household/income/market_income.py @@ -16,6 +16,9 @@ def formula(person, period, parameters): "employment_income", "self_employment_income", "savings_interest_income", + # National Savings, gilt and other securities interest, which income + # tax charges as savings income (taxable_savings_interest_income). + "other_investment_income", "tax_free_savings_income", "individual_savings_account_dividend_income", "dividend_income", From 22ae4d34940817d39a718008d8a60ba2304c5cae Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Wed, 28 Oct 2026 23:29:50 -0400 Subject: [PATCH 2/2] List other investment income in the HBAI mapping table The HBAI validation page's investment income row now names other_investment_income, which hbai_household_net_income counts since the previous commit (Max's review of #2736, point 4). Co-Authored-By: Claude Opus 5.5 --- docs/book/validation/hbai.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/book/validation/hbai.md b/docs/book/validation/hbai.md index 30839e69d7..d493d606bb 100644 --- a/docs/book/validation/hbai.md +++ b/docs/book/validation/hbai.md @@ -26,7 +26,7 @@ The table below shows how the HBAI income components map to PolicyEngine variabl | Income received from dividends (from FYE 2022) |`dividend_income`| | State support - all benefits and tax credits |`hbai_benefits`| | Income from occupational and private pensions |`private_pension_income` (includes occupational pension income)| -| Investment income |`dividend_income`, `savings_interest_income`, `property_income_after_finance_costs`| +| Investment income |`dividend_income`, `savings_interest_income`, `other_investment_income`, `property_income_after_finance_costs`| | Maintenance payments |`maintenance_income`, `spousal_maintenance_income`| | Income from educational grants and scholarships (including, for students, student loans and parental contributions) |`student_payments`| | The cash value of certain forms of income in kind (free school meals, free school breakfast, free school milk, free school fruit and vegetables, Healthy Start vouchers and free TV licences for those aged 75 and over who receive Pension Credit) |`free_school_meals`, `free_school_fruit_veg`, `free_school_milk`, `healthy_start_vouchers`, `free_tv_licence_value`|