glidepath 0.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- glidepath/__init__.py +3 -0
- glidepath/app/__init__.py +364 -0
- glidepath/app/backtest.py +281 -0
- glidepath/app/charts.py +759 -0
- glidepath/app/copy.py +174 -0
- glidepath/app/display.py +148 -0
- glidepath/app/drawdown.py +436 -0
- glidepath/app/example.py +66 -0
- glidepath/app/exports.py +487 -0
- glidepath/app/files.py +249 -0
- glidepath/app/firstrun.py +114 -0
- glidepath/app/forms.py +1750 -0
- glidepath/app/inspector.py +506 -0
- glidepath/app/labels.py +66 -0
- glidepath/app/montecarlo.py +399 -0
- glidepath/app/plan.py +354 -0
- glidepath/app/retirement.py +446 -0
- glidepath/app/scenarios.py +831 -0
- glidepath/app/shell.py +185 -0
- glidepath/app/tables.py +138 -0
- glidepath/core/__init__.py +390 -0
- glidepath/core/annuities.py +240 -0
- glidepath/core/backtest.py +514 -0
- glidepath/core/comparison.py +278 -0
- glidepath/core/config.py +82 -0
- glidepath/core/contributions.py +337 -0
- glidepath/core/engine.py +2811 -0
- glidepath/core/entities.py +264 -0
- glidepath/core/glide.py +289 -0
- glidepath/core/investments.py +175 -0
- glidepath/core/money.py +107 -0
- glidepath/core/montecarlo.py +609 -0
- glidepath/core/pensions.py +298 -0
- glidepath/core/periods.py +367 -0
- glidepath/core/provenance.py +271 -0
- glidepath/core/randomness.py +128 -0
- glidepath/core/region.py +46 -0
- glidepath/core/reporting.py +231 -0
- glidepath/core/results.py +504 -0
- glidepath/core/retirement.py +291 -0
- glidepath/core/returns.py +312 -0
- glidepath/core/scenarios.py +579 -0
- glidepath/core/state_pension.py +264 -0
- glidepath/core/tax.py +139 -0
- glidepath/core/withdrawals.py +461 -0
- glidepath/core/wrappers.py +278 -0
- glidepath/gui/__init__.py +6 -0
- glidepath/gui/assets/icon_128.png +0 -0
- glidepath/gui/assets/icon_16.png +0 -0
- glidepath/gui/assets/icon_24.png +0 -0
- glidepath/gui/assets/icon_256.png +0 -0
- glidepath/gui/assets/icon_32.png +0 -0
- glidepath/gui/assets/icon_48.png +0 -0
- glidepath/gui/assets/icon_64.png +0 -0
- glidepath/gui/assets/wordmark.png +0 -0
- glidepath/gui/charts.py +829 -0
- glidepath/gui/forms.py +359 -0
- glidepath/gui/inspector.py +186 -0
- glidepath/gui/main.py +51 -0
- glidepath/gui/scenarios.py +402 -0
- glidepath/gui/style.py +376 -0
- glidepath/gui/tableview.py +67 -0
- glidepath/gui/widgets.py +989 -0
- glidepath/persistence/__init__.py +48 -0
- glidepath/persistence/assumptions.py +112 -0
- glidepath/persistence/decode.py +747 -0
- glidepath/persistence/document.py +101 -0
- glidepath/persistence/encode.py +433 -0
- glidepath/persistence/migrations.py +158 -0
- glidepath/persistence/values.py +298 -0
- glidepath/py.typed +0 -0
- glidepath/regions/__init__.py +7 -0
- glidepath/regions/uk/__init__.py +189 -0
- glidepath/regions/uk/ages.py +156 -0
- glidepath/regions/uk/contributions.py +717 -0
- glidepath/regions/uk/data/age_rules.toml +78 -0
- glidepath/regions/uk/data/assumptions_default.toml +170 -0
- glidepath/regions/uk/data/returns_history.toml +150 -0
- glidepath/regions/uk/data/tax_year_2026_27.toml +98 -0
- glidepath/regions/uk/extension.py +479 -0
- glidepath/regions/uk/loader.py +704 -0
- glidepath/regions/uk/region.py +160 -0
- glidepath/regions/uk/schema.py +563 -0
- glidepath/regions/uk/state_pension.py +129 -0
- glidepath/regions/uk/tax.py +466 -0
- glidepath/regions/uk/wrappers.py +283 -0
- glidepath/regions/uk/years.py +92 -0
- glidepath-0.2.0.dist-info/METADATA +189 -0
- glidepath-0.2.0.dist-info/RECORD +93 -0
- glidepath-0.2.0.dist-info/WHEEL +4 -0
- glidepath-0.2.0.dist-info/entry_points.txt +3 -0
- glidepath-0.2.0.dist-info/licenses/LICENSE +21 -0
- glidepath-0.2.0.dist-info/licenses/LICENSE-DATA +28 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# UK age rules: durable, effective-dated policy parameters that are not
|
|
2
|
+
# re-set each tax year (docs/planning.md §5.3, §6). The SPA timetable was
|
|
3
|
+
# re-verified against the live gov.uk timetable page on 2026-08-02.
|
|
4
|
+
|
|
5
|
+
schema_version = 2
|
|
6
|
+
|
|
7
|
+
[meta]
|
|
8
|
+
verified_on = 2026-08-02
|
|
9
|
+
sources = [
|
|
10
|
+
"https://www.gov.uk/government/publications/state-pension-age-timetable/state-pension-age-timetable",
|
|
11
|
+
"https://www.gov.uk/government/publications/increasing-normal-minimum-pension-age",
|
|
12
|
+
"https://www.gov.uk/personal-pensions-your-rights/how-you-can-take-pension",
|
|
13
|
+
"https://www.gov.uk/lifetime-isa/who-can-open-a-lifetime-isa",
|
|
14
|
+
"https://www.gov.uk/lifetime-isa/withdrawing-money-from-your-lifetime-isa",
|
|
15
|
+
"https://www.gov.uk/deferring-state-pension/if-you-reach-state-pension-age-on-or-after-6-april-2016",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
# Normal minimum pension age: 55 today, 57 from 6 April 2028. Protected
|
|
19
|
+
# pension ages are out of scope for v1 (planning §6).
|
|
20
|
+
[nmpa]
|
|
21
|
+
steps = [
|
|
22
|
+
{ age = 55 },
|
|
23
|
+
{ age = 57, effective_from = 2028-04-06 },
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
# State pension age from date of birth (Pensions Act 2011: SPA 66 for
|
|
27
|
+
# DOBs 1954-10-06 to 1960-04-05; Pensions Act 2014: 66 -> 67 bands as
|
|
28
|
+
# ages; Pensions Act 2007: 67 -> 68 bands as fixed SPA dates, exactly
|
|
29
|
+
# as legislated). Coverage deliberately starts at 1954-10-06: earlier
|
|
30
|
+
# cohorts had lower, phased SPAs and different (pre-2016) deferral
|
|
31
|
+
# rules that this forward-looking planner does not model. Age logic
|
|
32
|
+
# must REJECT dates of birth before the first band, never guess.
|
|
33
|
+
[state_pension_age]
|
|
34
|
+
bands = [
|
|
35
|
+
{ dob_from = 1954-10-06, dob_to = 1960-04-05, age = { years = 66 } },
|
|
36
|
+
{ dob_from = 1960-04-06, dob_to = 1960-05-05, age = { years = 66, months = 1 } },
|
|
37
|
+
{ dob_from = 1960-05-06, dob_to = 1960-06-05, age = { years = 66, months = 2 } },
|
|
38
|
+
{ dob_from = 1960-06-06, dob_to = 1960-07-05, age = { years = 66, months = 3 } },
|
|
39
|
+
{ dob_from = 1960-07-06, dob_to = 1960-08-05, age = { years = 66, months = 4 } },
|
|
40
|
+
{ dob_from = 1960-08-06, dob_to = 1960-09-05, age = { years = 66, months = 5 } },
|
|
41
|
+
{ dob_from = 1960-09-06, dob_to = 1960-10-05, age = { years = 66, months = 6 } },
|
|
42
|
+
{ dob_from = 1960-10-06, dob_to = 1960-11-05, age = { years = 66, months = 7 } },
|
|
43
|
+
{ dob_from = 1960-11-06, dob_to = 1960-12-05, age = { years = 66, months = 8 } },
|
|
44
|
+
{ dob_from = 1960-12-06, dob_to = 1961-01-05, age = { years = 66, months = 9 } },
|
|
45
|
+
{ dob_from = 1961-01-06, dob_to = 1961-02-05, age = { years = 66, months = 10 } },
|
|
46
|
+
{ dob_from = 1961-02-06, dob_to = 1961-03-05, age = { years = 66, months = 11 } },
|
|
47
|
+
{ dob_from = 1961-03-06, dob_to = 1977-04-05, age = { years = 67 } },
|
|
48
|
+
{ dob_from = 1977-04-06, dob_to = 1977-05-05, reaches_on = 2044-05-06 },
|
|
49
|
+
{ dob_from = 1977-05-06, dob_to = 1977-06-05, reaches_on = 2044-07-06 },
|
|
50
|
+
{ dob_from = 1977-06-06, dob_to = 1977-07-05, reaches_on = 2044-09-06 },
|
|
51
|
+
{ dob_from = 1977-07-06, dob_to = 1977-08-05, reaches_on = 2044-11-06 },
|
|
52
|
+
{ dob_from = 1977-08-06, dob_to = 1977-09-05, reaches_on = 2045-01-06 },
|
|
53
|
+
{ dob_from = 1977-09-06, dob_to = 1977-10-05, reaches_on = 2045-03-06 },
|
|
54
|
+
{ dob_from = 1977-10-06, dob_to = 1977-11-05, reaches_on = 2045-05-06 },
|
|
55
|
+
{ dob_from = 1977-11-06, dob_to = 1977-12-05, reaches_on = 2045-07-06 },
|
|
56
|
+
{ dob_from = 1977-12-06, dob_to = 1978-01-05, reaches_on = 2045-09-06 },
|
|
57
|
+
{ dob_from = 1978-01-06, dob_to = 1978-02-05, reaches_on = 2045-11-06 },
|
|
58
|
+
{ dob_from = 1978-02-06, dob_to = 1978-03-05, reaches_on = 2046-01-06 },
|
|
59
|
+
{ dob_from = 1978-03-06, dob_to = 1978-04-05, reaches_on = 2046-03-06 },
|
|
60
|
+
{ dob_from = 1978-04-06, age = { years = 68 } },
|
|
61
|
+
]
|
|
62
|
+
|
|
63
|
+
# Lifetime ISA age gates: open 18-39, contribute to 50, charge-free
|
|
64
|
+
# access at 60 (or first home / terminal illness / death).
|
|
65
|
+
[lisa]
|
|
66
|
+
open_age_min = 18
|
|
67
|
+
open_age_max = 39
|
|
68
|
+
contribute_until_age = 50
|
|
69
|
+
access_age = 60
|
|
70
|
+
|
|
71
|
+
# Post-2016 deferral: the weekly rate increases by 1% per 9 weeks
|
|
72
|
+
# deferred, accruing at increment_rate/per_weeks for each whole week
|
|
73
|
+
# once at least per_weeks weeks are deferred (~5.8% per 52 weeks).
|
|
74
|
+
# The uplift applies to the rate payable at claim; increments are
|
|
75
|
+
# CPI-uprated from then on.
|
|
76
|
+
[state_pension_deferral]
|
|
77
|
+
increment_rate = "0.01"
|
|
78
|
+
per_weeks = 9
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Shipped default assumptions — the machine mirror of the §7 table in
|
|
2
|
+
# docs/planning.md (recorded 2026-08-01). A doc-sync test keeps the two
|
|
3
|
+
# aligned: same keys, same order, same numeric values. Every default is
|
|
4
|
+
# user-overridable in the app; §6 announced-policy items are facts, these
|
|
5
|
+
# are estimates.
|
|
6
|
+
|
|
7
|
+
schema_version = 2
|
|
8
|
+
|
|
9
|
+
[meta]
|
|
10
|
+
verified_on = 2026-08-04
|
|
11
|
+
sources = [
|
|
12
|
+
"https://obr.uk/efo/economic-and-fiscal-outlook-march-2026/",
|
|
13
|
+
"https://www.gov.scot/publications/scottish-budget-2026-2027/pages/4/",
|
|
14
|
+
"https://www.handbook.fca.org.uk/handbook/COBS/13/Annex2.html",
|
|
15
|
+
"https://www.ons.gov.uk/peoplepopulationandcommunity/healthandsocialcare/healthandlifeexpectancies/articles/lifeexpectancycalculator/2019-06-07",
|
|
16
|
+
"https://www.which.co.uk/money/pensions-and-retirement/accessing-your-pensions/annuities/annuity-rates-aQGfH6W5n2rm",
|
|
17
|
+
"https://www.hl.co.uk/retirement/annuities/best-buy-rates",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
[[assumption]]
|
|
21
|
+
key = "inflation.cpi"
|
|
22
|
+
value = "0.02"
|
|
23
|
+
basis = "OBR EFO March 2026: CPI at target from 2027"
|
|
24
|
+
|
|
25
|
+
[[assumption]]
|
|
26
|
+
key = "earnings.growth.real"
|
|
27
|
+
value = "0.005"
|
|
28
|
+
basis = "OBR EFO March 2026 medium-term real earnings growth"
|
|
29
|
+
|
|
30
|
+
[[assumption]]
|
|
31
|
+
key = "returns.equity.real"
|
|
32
|
+
value = "0.04"
|
|
33
|
+
basis = "Below long-run global equity history (~5% real); above the FCA intermediate rate (5% nominal - 2% CPI = 3% real) as a conservative cross-check (FCA COBS 13 Annex 2)"
|
|
34
|
+
|
|
35
|
+
[[assumption]]
|
|
36
|
+
key = "returns.bonds.real"
|
|
37
|
+
value = "0.005"
|
|
38
|
+
basis = "Consistent with current gilt real-yield ballpark and the FCA lower rate"
|
|
39
|
+
|
|
40
|
+
[[assumption]]
|
|
41
|
+
key = "returns.cash.real"
|
|
42
|
+
value = "-0.005"
|
|
43
|
+
basis = "Cash trails inflation over long horizons; cash-kind accounts bear no default fees, so this is their whole return - a cash slice inside a platform wrapper bears that wrapper's fees on top"
|
|
44
|
+
|
|
45
|
+
[[assumption]]
|
|
46
|
+
key = "volatility.equity"
|
|
47
|
+
value = "0.18"
|
|
48
|
+
basis = "Long-run global equity annual volatility (commonly cited 15-20%)"
|
|
49
|
+
|
|
50
|
+
[[assumption]]
|
|
51
|
+
key = "volatility.bonds"
|
|
52
|
+
value = "0.07"
|
|
53
|
+
basis = "Long-run gilt/IG portfolio volatility"
|
|
54
|
+
|
|
55
|
+
[[assumption]]
|
|
56
|
+
key = "volatility.cash"
|
|
57
|
+
value = "0.01"
|
|
58
|
+
basis = "Near-riskless nominal"
|
|
59
|
+
|
|
60
|
+
[[assumption]]
|
|
61
|
+
key = "correlation.equity_bonds"
|
|
62
|
+
value = "0.2"
|
|
63
|
+
basis = "Long-run average; regime-dependent (label prominently)"
|
|
64
|
+
|
|
65
|
+
[[assumption]]
|
|
66
|
+
key = "correlation.equity_cash"
|
|
67
|
+
value = "0.0"
|
|
68
|
+
basis = "Near-zero long-run historical correlation"
|
|
69
|
+
|
|
70
|
+
[[assumption]]
|
|
71
|
+
key = "correlation.bonds_cash"
|
|
72
|
+
value = "0.2"
|
|
73
|
+
basis = "Modest positive long-run historical correlation (short rates feed both)"
|
|
74
|
+
|
|
75
|
+
[[assumption]]
|
|
76
|
+
key = "fees.platform"
|
|
77
|
+
value = "0.0025"
|
|
78
|
+
basis = "Typical UK platform fee"
|
|
79
|
+
|
|
80
|
+
[[assumption]]
|
|
81
|
+
key = "fees.fund"
|
|
82
|
+
value = "0.0015"
|
|
83
|
+
basis = "Typical index-tracker OCF"
|
|
84
|
+
|
|
85
|
+
[[assumption]]
|
|
86
|
+
key = "yield.equity"
|
|
87
|
+
value = "0.02"
|
|
88
|
+
basis = "Long-run global equity dividend yield (~2%); consistent with the shipped 4% real return default as income plus real capital growth"
|
|
89
|
+
|
|
90
|
+
[[assumption]]
|
|
91
|
+
key = "yield.bonds"
|
|
92
|
+
value = "0.025"
|
|
93
|
+
basis = "Bond income approximates the nominal return for portfolios held near par: the shipped 0.5% real return default plus 2% CPI"
|
|
94
|
+
|
|
95
|
+
[[assumption]]
|
|
96
|
+
key = "yield.cash"
|
|
97
|
+
value = "0.015"
|
|
98
|
+
basis = "Cash return is wholly income: the shipped -0.5% real return default plus 2% CPI"
|
|
99
|
+
|
|
100
|
+
[[assumption]]
|
|
101
|
+
key = "horizon.planning_age"
|
|
102
|
+
value = 95
|
|
103
|
+
basis = "~1-in-4 longevity risk at 65 per ONS cohort life expectancy (exact values from 2024-based cohort tables at implementation)"
|
|
104
|
+
|
|
105
|
+
[[assumption]]
|
|
106
|
+
key = "glidepath.default_shape"
|
|
107
|
+
value = { equity_start = "0.80", derisk_years_before_retirement = 15, equity_at_retirement = "0.40", transition = "linear", in_drawdown = "hold" }
|
|
108
|
+
basis = "Typical UK target-date/lifestyling shape; a starting point only - per-person glide paths override it"
|
|
109
|
+
|
|
110
|
+
[[assumption]]
|
|
111
|
+
key = "policy.state_pension.uprating"
|
|
112
|
+
value = { rule = "triple_lock", floor = "0.025", deterministic_cpi_margin = "0.005" }
|
|
113
|
+
basis = "Triple lock = max(earnings, CPI, floor 2.5%), proxied as max(CPI + 0.5%, floor) - the margin stands in for the long-run earnings premium; alternative scenario: cpi. The proxy applies in every run mode: CPI is deterministic across Monte Carlo paths and no earnings series is modelled. Triple lock committed only to ~2029 (planning §6)"
|
|
114
|
+
|
|
115
|
+
[[assumption]]
|
|
116
|
+
key = "policy.tax.future_years"
|
|
117
|
+
value = { mode = "frozen_then_cpi_indexed", frozen_until_tax_year = "2030/31", scotland = { lower_bands_frozen_until_tax_year = "2026/27", upper_bands_frozen_until_tax_year = "2028/29" } }
|
|
118
|
+
basis = "rUK thresholds + PA/taper (reserved, both regimes) frozen to 2030/31 is legislated fact (planning §6); Scottish band uppers are set annually - lower bands uprate in practice (CPI proxy past the shipped year), Higher/Advanced/Top committed frozen to 2028/29 per Scottish Budget 2026-27 (announced policy, not legislation); post-freeze CPI indexation is assumption. Alternative: frozen indefinitely"
|
|
119
|
+
|
|
120
|
+
[[assumption]]
|
|
121
|
+
key = "annuity.level.single.65"
|
|
122
|
+
value = "0.0775"
|
|
123
|
+
basis = "Which? market table, snapshot 2026-07-27, retrieved 2026-08-01; best rate 7.946% - volatile market snapshot, refresh before relying on"
|
|
124
|
+
|
|
125
|
+
[[assumption]]
|
|
126
|
+
key = "annuity.escalating3.single.65"
|
|
127
|
+
value = "0.0547"
|
|
128
|
+
basis = "Which? market table, same snapshot"
|
|
129
|
+
|
|
130
|
+
[[assumption]]
|
|
131
|
+
key = "annuity.inflation_linked.single.65"
|
|
132
|
+
value = "0.055"
|
|
133
|
+
basis = "Indicative only - secondary source (IFA Magazine); weakest-sourced default here"
|
|
134
|
+
|
|
135
|
+
# Per-age/type relativities to the single-life-at-65 base rates above,
|
|
136
|
+
# plus the joint-life factor and the escalating product's fixed annual
|
|
137
|
+
# increase. Derived from the Hargreaves Lansdown best-buy annuity tables
|
|
138
|
+
# (annual income per GBP 100,000: single life level / RPI-linked / 3%
|
|
139
|
+
# escalation, joint life 50% level), snapshot 2026-07-31, retrieved
|
|
140
|
+
# 2026-08-03; the inflation-linked curve uses the RPI-linked product's
|
|
141
|
+
# relativities. Ages between the knots interpolate linearly; ages
|
|
142
|
+
# outside 55-75 are a modelling error, never an extrapolation.
|
|
143
|
+
[[assumption]]
|
|
144
|
+
key = "annuity.age_adjustment"
|
|
145
|
+
basis = "Relativities from the Hargreaves Lansdown best-buy annuity tables, snapshot 2026-07-31, retrieved 2026-08-03; joint factor is joint-life 50% over single-life level at 65 (~0.92); escalation is the escalating product's fixed 3%/yr increase"
|
|
146
|
+
|
|
147
|
+
[assumption.value]
|
|
148
|
+
escalation = "0.03"
|
|
149
|
+
joint_factor = "0.92"
|
|
150
|
+
|
|
151
|
+
[assumption.value.level]
|
|
152
|
+
"55" = "0.846"
|
|
153
|
+
"60" = "0.897"
|
|
154
|
+
"65" = "1.0"
|
|
155
|
+
"70" = "1.072"
|
|
156
|
+
"75" = "1.230"
|
|
157
|
+
|
|
158
|
+
[assumption.value.escalating3]
|
|
159
|
+
"55" = "0.797"
|
|
160
|
+
"60" = "0.870"
|
|
161
|
+
"65" = "1.0"
|
|
162
|
+
"70" = "1.124"
|
|
163
|
+
"75" = "1.333"
|
|
164
|
+
|
|
165
|
+
[assumption.value.inflation_linked]
|
|
166
|
+
"55" = "0.794"
|
|
167
|
+
"60" = "0.874"
|
|
168
|
+
"65" = "1.0"
|
|
169
|
+
"70" = "1.144"
|
|
170
|
+
"75" = "1.380"
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Historical annual return series for the backtest engine (roadmap 9.18;
|
|
2
|
+
# conventions per docs/planning.md §5.3): world equity total returns in
|
|
3
|
+
# GBP terms (GDP-weighted over the JST countries, currency moves
|
|
4
|
+
# included), UK long gilt total returns, UK bills, and UK CPI inflation.
|
|
5
|
+
# All rates are NOMINAL; real rates are derived in code as
|
|
6
|
+
# (1 + nominal) / (1 + cpi) - 1. Derived from the Jordà-Schularick-Taylor
|
|
7
|
+
# Macrohistory Database R6 by scripts/build_returns_history.py — never
|
|
8
|
+
# edit a figure by hand; regenerate, re-verify, and update [meta].
|
|
9
|
+
#
|
|
10
|
+
# Data licence: unlike the code in this repository, the figures below are
|
|
11
|
+
# a derived work of the JST Macrohistory Database (© Òscar Jordà, Moritz
|
|
12
|
+
# Schularick, Alan M. Taylor and co-authors), distributed under
|
|
13
|
+
# CC BY-NC-SA 4.0 (https://creativecommons.org/licenses/by-nc-sa/4.0/).
|
|
14
|
+
# Cite Jordà, Schularick & Taylor (2017) and, for the return series,
|
|
15
|
+
# Jordà, Knoll, Kuvshinov, Schularick & Taylor (2019).
|
|
16
|
+
|
|
17
|
+
schema_version = 2
|
|
18
|
+
|
|
19
|
+
[meta]
|
|
20
|
+
verified_on = 2026-08-05
|
|
21
|
+
sources = [
|
|
22
|
+
"https://www.macrohistory.net/database/",
|
|
23
|
+
"https://doi.org/10.1093/qje/qjz012",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
# One entry per calendar year, contiguous.
|
|
27
|
+
[returns]
|
|
28
|
+
series = [
|
|
29
|
+
{ year = 1900, equity = "0.089265", bonds = "-0.004351", cash = "0.036600", cpi = "0.051000" },
|
|
30
|
+
{ year = 1901, equity = "0.083569", bonds = "-0.016046", cash = "0.031600", cpi = "0.005000" },
|
|
31
|
+
{ year = 1902, equity = "0.064752", bonds = "0.019486", cash = "0.029700", cpi = "0.000000" },
|
|
32
|
+
{ year = 1903, equity = "-0.014222", bonds = "-0.027631", cash = "0.034100", cpi = "0.004000" },
|
|
33
|
+
{ year = 1904, equity = "0.183341", bonds = "0.041458", cash = "0.026800", cpi = "-0.002000" },
|
|
34
|
+
{ year = 1905, equity = "0.148694", bonds = "0.035830", cash = "0.025600", cpi = "0.004000" },
|
|
35
|
+
{ year = 1906, equity = "0.096150", bonds = "-0.010846", cash = "0.039900", cpi = "0.000000" },
|
|
36
|
+
{ year = 1907, equity = "-0.121251", bonds = "0.000132", cash = "0.044700", cpi = "0.012000" },
|
|
37
|
+
{ year = 1908, equity = "0.204636", bonds = "0.035945", cash = "0.023200", cpi = "0.005000" },
|
|
38
|
+
{ year = 1909, equity = "0.145710", bonds = "0.018180", cash = "0.022900", cpi = "0.005000" },
|
|
39
|
+
{ year = 1910, equity = "0.001891", bonds = "-0.013062", cash = "0.031600", cpi = "0.009000" },
|
|
40
|
+
{ year = 1911, equity = "0.047476", bonds = "0.002250", cash = "0.029100", cpi = "0.001000" },
|
|
41
|
+
{ year = 1912, equity = "0.063221", bonds = "0.007547", cash = "0.036200", cpi = "0.030000" },
|
|
42
|
+
{ year = 1913, equity = "-0.038684", bonds = "-0.013174", cash = "0.043700", cpi = "-0.004000" },
|
|
43
|
+
{ year = 1914, equity = "-0.057368", bonds = "0.044682", cash = "0.029100", cpi = "-0.003000" },
|
|
44
|
+
{ year = 1915, equity = "0.179977", bonds = "0.034000", cash = "0.036600", cpi = "0.125000" },
|
|
45
|
+
{ year = 1916, equity = "0.095367", bonds = "-0.202986", cash = "0.052000", cpi = "0.181000" },
|
|
46
|
+
{ year = 1917, equity = "-0.054226", bonds = "0.030637", cash = "0.047900", cpi = "0.252000" },
|
|
47
|
+
{ year = 1918, equity = "0.152737", bonds = "0.127967", cash = "0.035700", cpi = "0.220000" },
|
|
48
|
+
{ year = 1919, equity = "0.090777", bonds = "-0.084263", cash = "0.034800", cpi = "0.101000" },
|
|
49
|
+
{ year = 1920, equity = "-0.133812", bonds = "-0.073387", cash = "0.062100", cpi = "0.154000" },
|
|
50
|
+
{ year = 1921, equity = "0.023880", bonds = "0.164649", cash = "0.045800", cpi = "-0.086000" },
|
|
51
|
+
{ year = 1922, equity = "0.116231", bonds = "0.159672", cash = "0.025700", cpi = "-0.140000" },
|
|
52
|
+
{ year = 1923, equity = "0.209454", bonds = "0.042221", cash = "0.026200", cpi = "-0.060000" },
|
|
53
|
+
{ year = 1924, equity = "0.152745", bonds = "0.073520", cash = "0.033900", cpi = "-0.007000" },
|
|
54
|
+
{ year = 1925, equity = "0.082649", bonds = "0.003139", cash = "0.040900", cpi = "0.003000" },
|
|
55
|
+
{ year = 1926, equity = "0.205101", bonds = "0.028755", cash = "0.045100", cpi = "-0.008000" },
|
|
56
|
+
{ year = 1927, equity = "0.281417", bonds = "0.071688", cash = "0.042500", cpi = "-0.024000" },
|
|
57
|
+
{ year = 1928, equity = "0.288268", bonds = "0.059311", cash = "0.041500", cpi = "-0.003000" },
|
|
58
|
+
{ year = 1929, equity = "-0.072253", bonds = "-0.015965", cash = "0.052600", cpi = "-0.009000" },
|
|
59
|
+
{ year = 1930, equity = "-0.210017", bonds = "0.131428", cash = "0.024800", cpi = "-0.028000" },
|
|
60
|
+
{ year = 1931, equity = "-0.283587", bonds = "-0.005443", cash = "0.035900", cpi = "-0.043000" },
|
|
61
|
+
{ year = 1932, equity = "0.212621", bonds = "0.403182", cash = "0.014900", cpi = "-0.026000" },
|
|
62
|
+
{ year = 1933, equity = "0.270342", bonds = "0.031661", cash = "0.005900", cpi = "-0.021000" },
|
|
63
|
+
{ year = 1934, equity = "-0.031001", bonds = "0.276968", cash = "0.007300", cpi = "0.000000" },
|
|
64
|
+
{ year = 1935, equity = "0.291837", bonds = "-0.031190", cash = "0.005500", cpi = "0.007000" },
|
|
65
|
+
{ year = 1936, equity = "0.252380", bonds = "0.002684", cash = "0.005800", cpi = "0.007000" },
|
|
66
|
+
{ year = 1937, equity = "-0.184306", bonds = "-0.092034", cash = "0.005600", cpi = "0.034000" },
|
|
67
|
+
{ year = 1938, equity = "0.065716", bonds = "-0.021813", cash = "0.006100", cpi = "0.016000" },
|
|
68
|
+
{ year = 1939, equity = "0.146198", bonds = "0.009540", cash = "0.013200", cpi = "0.028000" },
|
|
69
|
+
{ year = 1940, equity = "0.226479", bonds = "0.159367", cash = "0.010300", cpi = "0.168000" },
|
|
70
|
+
{ year = 1941, equity = "0.009918", bonds = "0.105643", cash = "0.010100", cpi = "0.108000" },
|
|
71
|
+
{ year = 1942, equity = "0.122409", bonds = "0.027593", cash = "0.010000", cpi = "0.071000" },
|
|
72
|
+
{ year = 1943, equity = "0.175061", bonds = "-0.004982", cash = "0.010000", cpi = "0.034000" },
|
|
73
|
+
{ year = 1944, equity = "0.134137", bonds = "0.057250", cash = "0.010000", cpi = "0.027000" },
|
|
74
|
+
{ year = 1945, equity = "0.242946", bonds = "0.148149", cash = "0.009000", cpi = "0.028000" },
|
|
75
|
+
{ year = 1946, equity = "0.171915", bonds = "0.107610", cash = "0.005000", cpi = "0.031000" },
|
|
76
|
+
{ year = 1947, equity = "0.214035", bonds = "-0.143347", cash = "0.005100", cpi = "0.070000" },
|
|
77
|
+
{ year = 1948, equity = "-0.138832", bonds = "0.006970", cash = "0.005100", cpi = "0.077000" },
|
|
78
|
+
{ year = 1949, equity = "0.491191", bonds = "-0.089347", cash = "0.005200", cpi = "0.028000" },
|
|
79
|
+
{ year = 1950, equity = "0.161823", bonds = "0.040642", cash = "0.005200", cpi = "0.039185" },
|
|
80
|
+
{ year = 1951, equity = "0.357201", bonds = "-0.096837", cash = "0.005600", cpi = "0.090498" },
|
|
81
|
+
{ year = 1952, equity = "0.071894", bonds = "-0.006850", cash = "0.022000", cpi = "0.106501" },
|
|
82
|
+
{ year = 1953, equity = "0.078079", bonds = "0.138610", cash = "0.023000", cpi = "0.036250" },
|
|
83
|
+
{ year = 1954, equity = "0.518630", bonds = "0.060638", cash = "0.017900", cpi = "0.022919" },
|
|
84
|
+
{ year = 1955, equity = "0.240524", bonds = "-0.101183", cash = "0.037500", cpi = "0.050708" },
|
|
85
|
+
{ year = 1956, equity = "0.026371", bonds = "-0.029814", cash = "0.049500", cpi = "0.051627" },
|
|
86
|
+
{ year = 1957, equity = "-0.070412", bonds = "-0.063057", cash = "0.048100", cpi = "0.038420" },
|
|
87
|
+
{ year = 1958, equity = "0.361389", bonds = "0.170271", cash = "0.045600", cpi = "0.028777" },
|
|
88
|
+
{ year = 1959, equity = "0.279276", bonds = "0.009832", cash = "0.033800", cpi = "0.005994" },
|
|
89
|
+
{ year = 1960, equity = "0.054619", bonds = "-0.071032", cash = "0.048900", cpi = "0.007944" },
|
|
90
|
+
{ year = 1961, equity = "0.202969", bonds = "-0.079440", cash = "0.051400", cpi = "0.032512" },
|
|
91
|
+
{ year = 1962, equity = "-0.089243", bonds = "0.247768", cash = "0.041700", cpi = "0.041985" },
|
|
92
|
+
{ year = 1963, equity = "0.157864", bonds = "0.036340", cash = "0.036700", cpi = "0.021062" },
|
|
93
|
+
{ year = 1964, equity = "0.085160", bonds = "-0.023652", cash = "0.045900", cpi = "0.032287" },
|
|
94
|
+
{ year = 1965, equity = "0.068515", bonds = "0.043927", cash = "0.059100", cpi = "0.042572" },
|
|
95
|
+
{ year = 1966, equity = "-0.056785", bonds = "0.042149", cash = "0.061200", cpi = "0.040000" },
|
|
96
|
+
{ year = 1967, equity = "0.365652", bonds = "0.023494", cash = "0.058100", cpi = "0.022436" },
|
|
97
|
+
{ year = 1968, equity = "0.195415", bonds = "-0.023348", cash = "0.070300", cpi = "0.039969" },
|
|
98
|
+
{ year = 1969, equity = "0.008073", bonds = "-0.002488", cash = "0.076300", cpi = "0.051997" },
|
|
99
|
+
{ year = 1970, equity = "-0.014822", bonds = "0.034527", cash = "0.070200", cpi = "0.065186" },
|
|
100
|
+
{ year = 1971, equity = "0.096383", bonds = "0.269080", cash = "0.055800", cpi = "0.094149" },
|
|
101
|
+
{ year = 1972, equity = "0.373878", bonds = "-0.041294", cash = "0.055200", cpi = "0.071911" },
|
|
102
|
+
{ year = 1973, equity = "-0.001318", bonds = "-0.087871", cash = "0.093800", cpi = "0.093463" },
|
|
103
|
+
{ year = 1974, equity = "-0.206434", bonds = "-0.157680", cash = "0.113800", cpi = "0.157315" },
|
|
104
|
+
{ year = 1975, equity = "0.509732", bonds = "0.361257", cash = "0.101800", cpi = "0.227005" },
|
|
105
|
+
{ year = 1976, equity = "0.298244", bonds = "0.138826", cash = "0.111500", cpi = "0.156573" },
|
|
106
|
+
{ year = 1977, equity = "-0.054435", bonds = "0.455556", cash = "0.076600", cpi = "0.149425" },
|
|
107
|
+
{ year = 1978, equity = "0.168867", bonds = "-0.025752", cash = "0.085100", cpi = "0.074722" },
|
|
108
|
+
{ year = 1979, equity = "0.005701", bonds = "0.041836", cash = "0.130000", cpi = "0.113724" },
|
|
109
|
+
{ year = 1980, equity = "0.124930", bonds = "0.191252", cash = "0.151200", cpi = "0.151543" },
|
|
110
|
+
{ year = 1981, equity = "0.192427", bonds = "0.099868", cash = "0.129800", cpi = "0.118098" },
|
|
111
|
+
{ year = 1982, equity = "0.252504", bonds = "0.535222", cash = "0.113800", cpi = "0.081110" },
|
|
112
|
+
{ year = 1983, equity = "0.371905", bonds = "0.078283", cash = "0.095900", cpi = "0.049350" },
|
|
113
|
+
{ year = 1984, equity = "0.321407", bonds = "0.037561", cash = "0.093000", cpi = "0.042580" },
|
|
114
|
+
{ year = 1985, equity = "0.210940", bonds = "0.199184", cash = "0.116000", cpi = "0.049223" },
|
|
115
|
+
{ year = 1986, equity = "0.424598", bonds = "0.125390", cash = "0.103400", cpi = "0.033261" },
|
|
116
|
+
{ year = 1987, equity = "-0.062390", bonds = "0.178991", cash = "0.092300", cpi = "0.032049" },
|
|
117
|
+
{ year = 1988, equity = "0.211144", bonds = "0.068684", cash = "0.098000", cpi = "0.037592" },
|
|
118
|
+
{ year = 1989, equity = "0.391700", bonds = "0.082100", cash = "0.132800", cpi = "0.052376" },
|
|
119
|
+
{ year = 1990, equity = "-0.201779", bonds = "0.082109", cash = "0.140900", cpi = "0.069727" },
|
|
120
|
+
{ year = 1991, equity = "0.141957", bonds = "0.184824", cash = "0.108200", cpi = "0.075326" },
|
|
121
|
+
{ year = 1992, equity = "0.181181", bonds = "0.200163", cash = "0.089400", cpi = "0.042615" },
|
|
122
|
+
{ year = 1993, equity = "0.253227", bonds = "0.227906", cash = "0.052100", cpi = "0.025065" },
|
|
123
|
+
{ year = 1994, equity = "0.011726", bonds = "-0.104130", cash = "0.051500", cpi = "0.019785" },
|
|
124
|
+
{ year = 1995, equity = "0.170583", bonds = "0.175601", cash = "0.063300", cpi = "0.026565" },
|
|
125
|
+
{ year = 1996, equity = "0.072023", bonds = "0.077644", cash = "0.057800", cpi = "0.024003" },
|
|
126
|
+
{ year = 1997, equity = "0.194018", bonds = "0.167595", cash = "0.064800", cpi = "0.018246" },
|
|
127
|
+
{ year = 1998, equity = "0.206531", bonds = "0.211694", cash = "0.068200", cpi = "0.015574" },
|
|
128
|
+
{ year = 1999, equity = "0.265622", bonds = "-0.041475", cash = "0.050400", cpi = "0.013287" },
|
|
129
|
+
{ year = 2000, equity = "0.016360", bonds = "0.097945", cash = "0.058000", cpi = "0.007965" },
|
|
130
|
+
{ year = 2001, equity = "-0.167235", bonds = "0.029549", cash = "0.047600", cpi = "0.012335" },
|
|
131
|
+
{ year = 2002, equity = "-0.245099", bonds = "0.102087", cash = "0.038600", cpi = "0.012589" },
|
|
132
|
+
{ year = 2003, equity = "0.176649", bonds = "0.021114", cash = "0.035600", cpi = "0.013616" },
|
|
133
|
+
{ year = 2004, equity = "0.119649", bonds = "0.066381", cash = "0.044400", cpi = "0.013435" },
|
|
134
|
+
{ year = 2005, equity = "0.209706", bonds = "0.085014", cash = "0.045500", cpi = "0.020569" },
|
|
135
|
+
{ year = 2006, equity = "0.108019", bonds = "-0.005020", cash = "0.046500", cpi = "0.023287" },
|
|
136
|
+
{ year = 2007, equity = "0.098177", bonds = "0.062061", cash = "0.055300", cpi = "0.023228" },
|
|
137
|
+
{ year = 2008, equity = "-0.165409", bonds = "0.159729", cash = "0.043200", cpi = "0.036019" },
|
|
138
|
+
{ year = 2009, equity = "0.129192", bonds = "-0.015164", cash = "0.005300", cpi = "0.021653" },
|
|
139
|
+
{ year = 2010, equity = "0.129113", bonds = "0.101185", cash = "0.005000", cpi = "0.032982" },
|
|
140
|
+
{ year = 2011, equity = "-0.045778", bonds = "0.184079", cash = "0.004800", cpi = "0.044637" },
|
|
141
|
+
{ year = 2012, equity = "0.114294", bonds = "0.038486", cash = "0.003130", cpi = "0.028282" },
|
|
142
|
+
{ year = 2013, equity = "0.244511", bonds = "-0.061271", cash = "0.003020", cpi = "0.025648" },
|
|
143
|
+
{ year = 2014, equity = "0.088731", bonds = "0.155964", cash = "0.003800", cpi = "0.014610" },
|
|
144
|
+
{ year = 2015, equity = "0.069384", bonds = "0.007676", cash = "0.004400", cpi = "0.000401" },
|
|
145
|
+
{ year = 2016, equity = "0.234059", bonds = "0.071265", cash = "0.002024", cpi = "0.006597" },
|
|
146
|
+
{ year = 2017, equity = "0.129036", bonds = "0.037439", cash = "0.004123", cpi = "0.027000" },
|
|
147
|
+
{ year = 2018, equity = "0.047819", bonds = "0.022330", cash = "0.006998", cpi = "0.025000" },
|
|
148
|
+
{ year = 2019, equity = "0.118576", bonds = "0.057202", cash = "0.007098", cpi = "0.018000" },
|
|
149
|
+
{ year = 2020, equity = "0.089930", bonds = "0.057524", cash = "0.000394", cpi = "0.009000" },
|
|
150
|
+
]
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# UK tax year 2026/27 policy figures (docs/planning.md §5.3, §6).
|
|
2
|
+
# Income tax, pension and ISA figures verified 2026-08-01/02; savings,
|
|
3
|
+
# dividend, AA carry-forward and DB valuation figures 2026-08-04; the
|
|
4
|
+
# scheme-pays minimum 2026-08-06 — all from the primary sources below;
|
|
5
|
+
# never edit a figure without re-verifying and updating [meta].
|
|
6
|
+
|
|
7
|
+
schema_version = 2
|
|
8
|
+
|
|
9
|
+
[meta]
|
|
10
|
+
tax_year = "2026/27"
|
|
11
|
+
start_date = 2026-04-06
|
|
12
|
+
end_date = 2027-04-05
|
|
13
|
+
verified_on = 2026-08-06
|
|
14
|
+
sources = [
|
|
15
|
+
"https://www.gov.uk/hmrc-internal-manuals/pensions-tax-manual/ptm056410",
|
|
16
|
+
"https://www.legislation.gov.uk/ukpga/2004/12/section/237B",
|
|
17
|
+
"https://www.gov.uk/income-tax-rates",
|
|
18
|
+
"https://www.gov.uk/guidance/rates-and-thresholds-for-employers-2026-to-2027",
|
|
19
|
+
"https://www.gov.uk/scottish-income-tax",
|
|
20
|
+
"https://www.gov.uk/government/publications/rates-and-allowances-pension-schemes/pension-schemes-rates",
|
|
21
|
+
"https://www.gov.uk/tax-on-your-private-pension/pension-tax-relief",
|
|
22
|
+
"https://www.legislation.gov.uk/ukpga/2004/12/section/190",
|
|
23
|
+
"https://www.gov.uk/hmrc-internal-manuals/pensions-tax-manual/ptm044100",
|
|
24
|
+
"https://www.gov.uk/guidance/check-if-you-have-unused-annual-allowances-on-your-pension-savings",
|
|
25
|
+
"https://www.gov.uk/hmrc-internal-manuals/pensions-tax-manual/ptm056510",
|
|
26
|
+
"https://www.gov.uk/hmrc-internal-manuals/pensions-tax-manual/ptm053301",
|
|
27
|
+
"https://www.legislation.gov.uk/ukpga/2004/12/section/234",
|
|
28
|
+
"https://www.gov.uk/individual-savings-accounts",
|
|
29
|
+
"https://www.gov.uk/lifetime-isa",
|
|
30
|
+
"https://www.gov.uk/tax-on-dividends",
|
|
31
|
+
"https://www.gov.uk/apply-tax-free-interest-on-savings",
|
|
32
|
+
"https://www.gov.uk/government/publications/budget-2025-overview-of-tax-legislation-and-rates-ootlar/budget-2025-overview-of-tax-legislation-and-rates-ootlar",
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
[income_tax.ruk]
|
|
36
|
+
personal_allowance = "12570"
|
|
37
|
+
pa_taper_threshold = "100000" # adjusted net income; PA -£1 per £2 above
|
|
38
|
+
pa_taper_rate = "0.5"
|
|
39
|
+
# Band widths are TAXABLE income above the personal allowance, ascending.
|
|
40
|
+
bands = [
|
|
41
|
+
{ name = "basic", rate = "0.20", upper = "37700" },
|
|
42
|
+
{ name = "higher", rate = "0.40", upper = "125140" },
|
|
43
|
+
{ name = "additional", rate = "0.45" }, # no upper = unbounded
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
[income_tax.scotland] # non-savings/non-dividend income only
|
|
47
|
+
personal_allowance = "12570"
|
|
48
|
+
pa_taper_threshold = "100000"
|
|
49
|
+
pa_taper_rate = "0.5"
|
|
50
|
+
bands = [
|
|
51
|
+
{ name = "starter", rate = "0.19", upper = "3967" },
|
|
52
|
+
{ name = "basic", rate = "0.20", upper = "16956" },
|
|
53
|
+
{ name = "intermediate", rate = "0.21", upper = "31092" },
|
|
54
|
+
{ name = "higher", rate = "0.42", upper = "62430" },
|
|
55
|
+
{ name = "advanced", rate = "0.45", upper = "125140" },
|
|
56
|
+
{ name = "top", rate = "0.48" },
|
|
57
|
+
]
|
|
58
|
+
|
|
59
|
+
[pension]
|
|
60
|
+
annual_allowance = "60000"
|
|
61
|
+
aa_taper_threshold_income = "200000"
|
|
62
|
+
aa_taper_adjusted_income = "260000"
|
|
63
|
+
aa_taper_rate = "0.5"
|
|
64
|
+
aa_taper_floor = "10000"
|
|
65
|
+
mpaa = "10000"
|
|
66
|
+
aa_carry_forward_years = 3 # unused AA carries from the previous 3 tax years
|
|
67
|
+
scheme_pays_min_charge = "2000" # mandatory scheme pays above this charge (FA 2004 s237B)
|
|
68
|
+
member_relief_basic_amount = "3600" # low/no-earner relief floor, RAS only
|
|
69
|
+
member_relief_max_age = 75 # no relief on contributions from age 75 (FA 2004 s188)
|
|
70
|
+
relief_at_source_rate = "0.20"
|
|
71
|
+
tax_free_lump_sum_fraction = "0.25"
|
|
72
|
+
lump_sum_allowance = "268275"
|
|
73
|
+
lump_sum_death_benefit_allowance = "1073100"
|
|
74
|
+
db_valuation_factor = 16 # FA 2004 s234 relevant valuation factor (PIA = 16 x pension)
|
|
75
|
+
|
|
76
|
+
[isa]
|
|
77
|
+
annual_allowance = "20000"
|
|
78
|
+
lisa_allowance = "4000" # counts within the overall ISA allowance
|
|
79
|
+
lisa_bonus_rate = "0.25"
|
|
80
|
+
lisa_withdrawal_charge = "0.25"
|
|
81
|
+
|
|
82
|
+
# Nil rates consume band width (§6); savings above them are taxed at the
|
|
83
|
+
# rUK band rates until the separate savings rates land in the 2027/28 file.
|
|
84
|
+
[savings]
|
|
85
|
+
starting_rate_limit = "5000" # reduced £1 per £1 of non-savings income above the PA
|
|
86
|
+
psa_basic = "1000"
|
|
87
|
+
psa_higher = "500"
|
|
88
|
+
psa_additional = "0"
|
|
89
|
+
|
|
90
|
+
# Rates align positionally with the rUK bands (dividends are UK-wide).
|
|
91
|
+
# 2026/27 figures include the Budget 2025 +2ppt change, in force.
|
|
92
|
+
[dividend]
|
|
93
|
+
allowance = "500" # a nil rate, not a deduction
|
|
94
|
+
rates = [
|
|
95
|
+
{ name = "ordinary", rate = "0.1075" },
|
|
96
|
+
{ name = "upper", rate = "0.3575" },
|
|
97
|
+
{ name = "additional", rate = "0.3935" },
|
|
98
|
+
]
|