fire-planner/README.md
2026-05-07 17:06:19 +00:00

51 lines
1.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# fire-planner
Risk-adjusted, tax-minimised FIRE retirement planner. Consumes today's
portfolio, savings rate, and RSU vest schedule from sibling services
(`wealthfolio`, `payslip-ingest`, `hmrc-sync`) and returns the after-tax
probability of success for each combination of jurisdiction, withdrawal
strategy, and "year you break UK tax residency".
## Layout
- `fire_planner/` — package
- `tax/` — per-jurisdiction tax engines (UK, nomad, Malaysia, Thailand,
Cyprus, Bulgaria)
- `returns/` — Shiller 1871+ data + block bootstrap sampler
- `strategies/` — Trinity 4% SWR, Guyton-Klinger guardrails, VPW
- `ingest/` — pulls from `wealthfolio` / `payslip-ingest` / `hmrc-sync`
- `simulator.py` — vectorised NumPy MC engine
- `scenarios.py` — Cartesian product over (jurisdiction × strategy ×
leave-UK-year × glide)
- `app.py` — FastAPI on-demand `/recompute`
- `__main__.py``click` CLI: `ingest`, `simulate`, `recompute-all`,
`migrate`
## Common commands
```bash
poetry install
pytest -v
mypy .
ruff check .
yapf --recursive .
# Run migrations against the local DB:
DB_CONNECTION_STRING=postgresql+asyncpg://... alembic upgrade head
# CLI
DB_CONNECTION_STRING=... python -m fire_planner ingest
DB_CONNECTION_STRING=... python -m fire_planner simulate --scenario=cyprus-vpw-leave-y3
DB_CONNECTION_STRING=... python -m fire_planner recompute-all
```
## Schema
Six tables in `fire_planner` schema on `pg-cluster-rw`:
- `account_snapshot` — daily NW per account (Wealthfolio)
- `scenario` — Cartesian-product scenario definition
- `mc_run` — execution metadata + summary stats per (scenario, run_at)
- `mc_path` — sparse storage (top decile, bottom decile, median)
- `projection_yearly` — deterministic point projection per scenario
- `scenario_summary` — denormalised fast-read for Grafana