init commit

This commit is contained in:
Breadway 2026-07-22 12:00:12 +08:00
commit 17e9b77fa6
39 changed files with 20569 additions and 0 deletions

149
README.md Normal file
View file

@ -0,0 +1,149 @@
# Career Permutation Generator — README
Models 2,535 different combinations of career path, property location/strategy,
deposit size, savings rate, and purchase timing for Breadway (solo, age 18→50),
running each combination 200 times with randomised income shocks, interest
rate movements, and property crash risk to produce a realistic RANGE of
outcomes rather than one fragile prediction.
---
## Files
| File | What it is |
|---|---|
| `income_schedules.py` | The 13 career path income curves + HECS debt totals. Edit this to change/add careers. |
| `generator_v2.py` | The simulation engine. Run this file to regenerate everything. |
| `career_permutations_v3.csv` | Full output — one row per scenario combination (2,535 rows). |
| `leaderboard_v3.csv` | Top 10 scenarios in four categories, pulled from the full CSV. |
| `super_cgt_notes.txt` | Plain-English notes on the superannuation and capital gains tax rules actually applied. |
**To regenerate:** put `income_schedules.py` and `generator_v2.py` in the same
folder, run `python3 generator_v2.py`. Takes about 75 seconds. It overwrites
`career_permutations_v2.csv` and `leaderboard.csv` in that folder — copy them
out afterwards.
---
## How it works, in order
**1. Pick a career path.** 13 options, each with a year-by-year income
schedule from age 18 to 50 (gap year → study → graduate → career progression).
All salaries are pulled to the conservative end of researched ranges, not the
midpoint.
**2. Pick a property approach.** Location (Geraldton house, Geraldton land,
Perth, Canberra, or none/rent-forever) × strategy (buy and hold, buy land then
build, or rent forever) × deposit size (20% or 50%) × the age you attempt to
buy (23 or 28) × what age you might sell and rebuild in Geraldton instead
(never, 35, 40, 45, or 50). Invalid combinations are automatically skipped
(e.g. you can't "buy land then build" in Perth, you can't set a sell age if
you're renting forever).
**3. Pick a savings rate.** How much of your leftover income after costs
actually gets saved rather than spent — 65%, 75%, or 85%.
**4. Run that exact combination 200 times.** Each run is identical in its
setup but different in its luck: random job-loss events, random year-to-year
income variation, a randomly generated 33-year interest rate path, and random
property market crashes. This produces 200 different final net-worth numbers
for the same scenario. The CSV reports the 10th percentile (bad luck), 50th
percentile (typical), and 90th percentile (good luck) of those 200 outcomes.
**5. Repeat for all 2,535 valid combinations**, producing one summary row per
combination — so 507,000 individual 33-year simulations in total.
---
## What gets randomised, and why
**Income jitter** — every year's "scripted" salary gets ±47% random noise
(varies by career; software/data jitters more, RAAF jitters least) to reflect
that real raises and bonuses aren't perfectly smooth.
**Job loss / income gap risk** — from age 23 onward, each career has an
annual probability of a bad year (redundancy, project ending, injury-equivalent
income hit), calibrated by how stable that sector actually is. FIFO and
trades sit at 35%/yr (cyclical, project-based work). Engineering and defence
sit at 1.52%/yr. RAAF sits at 0.5%/yr (military job security is real).
**These probabilities are my own calibrated estimates, not sourced unemployment
data** — directionally sensible, not empirically precise.
**Interest rate path** — instead of a flat 5.9% for 33 years, each run
generates its own random 33-year rate path: a mean-reverting walk anchored to
a 5.5% "neutral" mortgage rate, with normal year-to-year drift plus an
occasional (~1-in-12-year chance) sharp move up or down, mimicking real RBA
cycles (confirmed history: cash rate has ranged from 0.10% in 2020 to 17% in
1989; mortgage rates track roughly 1.52.5% above cash rate). Mortgage
repayments are recalculated every year against the rate that actually applied
that year, the way a real variable-rate loan behaves.
**Property crash risk** — each location has its own annual probability of a
market downturn and how severe it is if one hits, based on confirmed history:
Perth fell ~15% peak-to-trough 20142019 after the mining boom ended; Pilbara
mining towns (Karratha, Port Hedland) fell close to 80% in the same period.
Geraldton sits between the two — more diversified than a pure mining town,
less stable than Perth. Canberra (government town) gets the smallest crash
risk of anywhere modelled. A crash applies a temporary value discount that
recovers in a straight line over 46 years.
**Cost inflation** — rent and living costs inflate at 3%/yr from age 26
onward, rather than sitting flat for three decades.
---
## What's deliberately NOT in this model
- Addi's income, a shared household, marriage, or splitting up — this is
Breadway solo only, by request.
- Children — explicitly parked, not modelled at all.
- Health/injury shocks that take someone out of work for an extended period
(the job-loss risk models *economic* job loss, not a serious injury).
- Car ownership and replacement costs.
- Lifestyle inflation — the model assumes the same fixed living costs whether
you're earning $80k or $200k, which isn't how real spending works.
- Correlation between bad property markets and job loss — in reality a
commodity price crash often causes both at once (that's exactly what
happened in the Pilbara). This model treats them as independent risks,
which understates how bad the worst-case scenarios could really get.
- Anything past age 50.
---
## Column reference (career_permutations_v3.csv)
| Column | Meaning |
|---|---|
| `career_path` | Which of the 13 careers |
| `location` | Property location (or NONE if renting forever) |
| `strategy` | BUY_HOLD / BUY_LAND_BUILD / RENT_FOREVER |
| `sell_age` | Age at which the Perth/Canberra house is sold and Geraldton is built instead (N/A if never) |
| `deposit_pct` | Deposit size attempted (0.20 or 0.50) |
| `savings_rate` | Share of leftover income actually saved (0.65 / 0.75 / 0.85) |
| `requested_buy_age` | The age the purchase was *attempted* |
| `pct_scenarios_bought_property` | Of the 200 runs, what % actually managed to buy (some never afford the deposit) |
| `median_actual_buy_age` | Of the runs that did buy, the typical age it actually happened (may be later than requested if savings took time to catch up) |
| `pct_debt_free_by_50` | Of the 200 runs, what % had zero mortgage/loan balance by age 50 |
| `median_debt_free_age` | Typical age debt-free was reached, across runs that got there |
| `net_worth_p10_age50` | 10th percentile outcome — roughly "if things went badly" |
| `net_worth_p50_age50` | 50th percentile — the typical/median outcome |
| `net_worth_p90_age50` | 90th percentile — roughly "if things went well" |
| `net_worth_range_age50` | P90 minus P10 — how much luck matters for this combination |
| `median_liquid_age50` / `median_super_age50` / `median_property_value_age50` / `median_mortgage_remaining_age50` | Median breakdown of the net worth figure across the 200 runs |
`leaderboard_v3.csv` uses the same columns with one extra: `leaderboard_category`,
which tags each row as one of: Max Wealth (highest P50), Fastest Debt Free
(lowest median debt-free age), Most Reliable (smallest P90P10 spread among
above-median-wealth scenarios), or Best Worst-Case (highest P10 — the safest
floor if things go badly).
---
## Honest framing
This is a wealth-accumulation model. It answers "how much money might I have
at 50 under this combination of choices" with a realistic spread rather than
a single confident number. It does not answer whether the work itself is
enjoyable, sustainable, or compatible with the rest of a life — FIFO tops
almost every wealth ranking here because the model only measures money, and
real people don't only optimise for that.