init commit
This commit is contained in:
commit
17e9b77fa6
39 changed files with 20569 additions and 0 deletions
149
README.md
Normal file
149
README.md
Normal 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 ±4–7% 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 3–5%/yr (cyclical, project-based work). Engineering and defence
|
||||
sit at 1.5–2%/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.5–2.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 2014–2019 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 4–6 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 P90–P10 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue