7.8 KiB
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.