PolicyEngine / PolicyEngine/policyengine-uk
Model income shifting between capital gains and income
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 50
- Forks
- 33
- Avg merge
- 20h 58m
- Merged PRs (30d)
- 14
Description
Summary
PolicyEngine UK has no income-shifting margin between capital gains and income. Every CGT reform it costs therefore misses the effect that dominates the published estimate of the reform package most likely to be legislated.
The realisation response now works (#1803), so a rate change moves gains. But a taxpayer who currently takes remuneration as gains because gains are taxed at 24% instead of 45% has a second response available: take it as income instead. In the model that person can only realise fewer gains, which reads as revenue lost. In reality much of it reappears as income tax.
Why it matters
The CenTax package (Advani, Lonsdale and Summers 2024) rests on this. They attribute a substantial share of the additional revenue from equalisation to income tax rather than CGT, on the reasoning that equalising the rates removes the incentive to package labour income as gains — and they state explicitly that they do not attempt to estimate the split between the two taxes.
That is a gap PolicyEngine is unusually well placed to fill. CenTax works from CGT administrative data, so the income side sits outside their model. PolicyEngine already computes income tax, NI and CGT for the same person in one system, so the balance between bases is something it could estimate rather than assume. It is the part of the CGT debate where the model has a comparative advantage over the existing literature.
Without it, PolicyEngine systematically understates rate-equalisation packages, and the understatement grows with the assumed realisation elasticity — exactly the range where the public disagreement sits.
Scope
- A parameter for the share of the realisation response that reappears as income rather than disappearing, defaulting to zero so existing costings do not move.
- Apply it to the response computed in
capital_gains_behavioural_response, adding the redirected amount to employment or self-employment income so it flows through income tax and NI. - Concentrate it where the shifting margin actually exists — owner-managed company gains rather than gains on listed shares or property — which needs a source-of-gain split the current single
capital_gainsinput does not carry. HMRC Table 7 breaks gains down by asset type and could seed one. - Document that the parameter is an assumption about behaviour, not an estimate, in the same way the realisation elasticity is.
Dependencies
- Source-of-gain detail depends on the imputation work in PolicyEngine/populace#552; a single blended share is a usable first cut without it.
- Related coverage gaps for CGT rules are tracked in #1775 (B2).
Reference: Advani, Lonsdale and Summers (2024), 'Reforming Capital Gains Tax: Revenue and Distributional Effects', CenTax — https://centax.org.uk/wp-content/uploads/2024/10/AdvaniLonsdaleSummers2024_CGTReform.pdf
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by tracing the existing capital_gains_behavioural_response implementation and how its realisation response reaches income calculations. Define the redirection parameter and its default, then verify that the selected share reaches employment or self-employment income, income tax, and NI while preserving current results at the default; review the listed HMRC and CenTax references for the assumption and source-of-gain scope.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100