No description
Find a file
2026-07-22 12:02:22 +08:00
src init commit 2026-07-22 12:00:12 +08:00
.gitignore init commit 2026-07-22 12:02:22 +08:00
Cargo.lock init commit 2026-07-22 12:00:12 +08:00
Cargo.toml init commit 2026-07-22 12:00:12 +08:00
graphs.py init commit 2026-07-22 12:00:12 +08:00
LICENSE init commit 2026-07-22 12:00:12 +08:00
README.md init commit 2026-07-22 12:00:12 +08:00

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.