Initial extraction from monorepo
This commit is contained in:
commit
f7ef7ca4ab
56 changed files with 6163 additions and 0 deletions
31
fire_planner/tax/nomad.py
Normal file
31
fire_planner/tax/nomad.py
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
"""Perpetual-traveller / nomad regime — 0% income tax + 1% regulatory
|
||||
risk premium on all flows.
|
||||
|
||||
The 1% premium captures the real-world risk that a "no tax residence"
|
||||
posture eventually attracts adverse rulings, the OECD CRS net tightens,
|
||||
or a destination starts taxing previously-exempt foreign income (e.g.
|
||||
Thailand 2024 remittance rule). We don't try to model the actual
|
||||
mechanism — it's a Bayesian fudge factor. Tunable via the constructor.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from decimal import Decimal
|
||||
|
||||
from fire_planner.tax.base import TaxBreakdown, TaxInputs, TaxRegime
|
||||
|
||||
|
||||
class NomadTaxRegime(TaxRegime):
|
||||
name = "nomad"
|
||||
|
||||
def __init__(self, regulatory_premium_rate: Decimal = Decimal("0.01")) -> None:
|
||||
self.regulatory_premium_rate = regulatory_premium_rate
|
||||
|
||||
def compute_tax(self, inputs: TaxInputs) -> TaxBreakdown:
|
||||
# ISA withdrawals are tax-free in the UK; for a nomad they're
|
||||
# just cash. The risk premium applies to cash that flows
|
||||
# *outside* a UK wrapper because that's the boundary the
|
||||
# premium is hedging.
|
||||
chargeable = (inputs.earned_income + inputs.pension_withdrawal + inputs.capital_gains +
|
||||
inputs.dividends + inputs.interest)
|
||||
return TaxBreakdown(other=chargeable * self.regulatory_premium_rate,
|
||||
notes=("nomad", f"premium_rate={self.regulatory_premium_rate}"))
|
||||
Loading…
Add table
Add a link
Reference in a new issue