Methodology
This page describes exactly how the model works, what it assumes, and — just as importantly — what it does not yet do. We would rather be honest about an approximation than let you believe a number is more precise than it is. The simulation engine is deterministic: the same inputs always produce the same answer, and every number you see in the app comes from the engine, never from a language model.
Read this first — about the return data. The default return model bootstraps from a calibrated-synthetic series, not the real historical record. We generate a 96-year stream whose statistical moments (equity mean ≈6.6%, stdev ≈18%; bonds ≈2%/7%; a slight negative stock-bond correlation) and a handful of injected crash years match the empirical record, but the year-by-year sequence is manufactured, not the actual 1928–2023 history. We did this on purpose: shipping a plausible-looking but subtly wrong historical dataset is worse than an honest approximation. Swapping in a real Shiller/DMS series is a queued change that requires no model rework — just the data file.
The core question and the simulation loop
For each scenario we run a Monte Carlo simulation — by default 10,000 independent “paths,” each a different possible future for your finances. Every path walks year by year from your current age out to the planning horizon. In each year we:
- Sample that year’s real (inflation-adjusted) portfolio return.
- Check mortality: if your simulated age of death is this year, the path ends (you can’t run out of money after you’re gone).
- Compute the year’s net cash need — your spending target, plus healthcare, income tax, and any property carrying costs, minus Social Security and net rental income.
- Add any one-off (“lumpy”) expense scheduled for that year.
- Withdraw that amount. If the portfolio can’t cover it while you’re still alive, the path is marked ruined and the depletion age is recorded.
- Compound the surviving balance by the sampled return.
The headline probability of ruin is simply the share of paths that deplete before death. We also report the median and percentile spread of terminal real wealth, the median depletion age among ruined paths, and an “expected years of security” figure. All accounting is in today’s dollars throughout — returns are real, spending is real — so you never have to mentally deflate the output.
Returns
Two return models are available:
- Historical bootstrap (default): we sample contiguous multi-year blocks (5 years by default) from the return series and stitch them together. Blocks preserve short-horizon serial correlation and fat tails far better than independent annual draws — sequence-of-returns risk is real, and i.i.d. sampling hides it. As noted above, the underlying series is calibrated-synthetic in this version.
- Parametric normal: independent annual draws from normal distributions with means and standard deviations you control per asset class. Simpler and fully transparent, at the cost of thinner tails than markets actually exhibit.
Either way, the per-year portfolio return is the allocation-weighted blend of the equity and bond draws, set by your equities/bonds split. There is no glide path yet — your allocation is held constant across the horizon.
Mortality
A path can’t “run out of money” after death, so when you die matters as much as how your portfolio performs. We model age of death with a Gompertz-Makeham parametric hazard, with separate parameters for men and women calibrated to approximate the SSA 2020 period life table, tuned for fit in the retirement ages (60–95) that drive ruin math. Health status and smoking apply multiplicative loads to the hazard (e.g. “excellent” health ≈0.62×, smoking ≈1.6×). Each path draws its own age of death by inverse-CDF sampling.
Caveat: this is a parametric approximation, not the industry-standard SOA Pri-2012 annuitant tables the architecture ultimately calls for. The parametric form is fast, dependency-free, and close enough through the ages that matter; the SOA table swap-in is queued.
Taxes
Each retirement year we compute household income tax on the gross withdrawal needed to fund spending, then gross the withdrawal up so the after-tax amount meets your target. Filing status is inferred (married-filing-jointly if a spouse is present, otherwise single).
- Federal: 2024 ordinary-income brackets and standard deduction, plus 85% of Social Security treated as taxable (the cap nearly everyone hits at these income levels).
- State: explicit 2024 progressive brackets for CA, NY, and VA; zero for the nine no-income-tax states (AK, FL, NV, NH, SD, TN, TX, WA, WY); and a flat ≈5% approximation for every other state, flagged as approximate. Social Security is treated as state-tax-exempt (true in the bracketed states we model).
Not modeled yet: separate long-term capital-gains brackets (we treat all draws as ordinary income), IRMAA, NIIT, AMT, itemized deductions, and — importantly — per-account withdrawal ordering across taxable/traditional/Roth/HSA and Roth conversions. The engine currently treats your savings as a single pooled balance, so the tax figure is a credible household-level estimate rather than a bucket-by-bucket calculation.
Healthcare
Healthcare is modeled as a flat real-dollar annual cost per person, switching from a pre-Medicare rate to a post-Medicare rate at age 65 (configurable). For a couple, both people’s costs are summed and each switches at their own age. By default healthcare costs apply only in retirement; you can opt to fund them from the portfolio earlier.
Caveat: there is no ACA premium-subsidy modeling yet. Proper ACA-subsidy-aware costs (and Medicare IRMAA tiers) depend on per-path MAGI, which in turn depends on the withdrawal mix and a more detailed tax model than we currently run. The flat per-person figure is realistic in aggregate and transparent; it just won’t capture the subsidy cliff for early retirees managing income to stay under a threshold.
Social Security
You provide each person’s Primary Insurance Amount (the monthly benefit at Full Retirement Age, 67) and a claim age between 62 and 70. We apply the standard adjustment factors — roughly −30% at 62 up to +24% at 70 — and pay the benefit as a real, flat annual income from the claim age onward (Social Security’s COLA approximately tracks inflation, which fits our real-dollar convention). Benefits offset the withdrawal need dollar for dollar.
The separate claim-age optimizer grid-searches ages 62–70 to find the claim age that minimizes ruin probability for your scenario. Not modeled yet: spousal and survivor benefits — each person’s benefit is computed on their own record.
Real estate and one-off expenses
Properties contribute three flows: carrying costs (drawn from the portfolio in retirement, or assumed paid from working income before it), net rental income (which offsets spending in retirement and is reinvested before it), and sale proceeds (which land in the portfolio in the sale year). Separately, lumpy expenses let you schedule one-off real-dollar costs in specific years — a new roof, a wedding, a car. In retirement a lumpy expense the portfolio can’t cover triggers ruin; before retirement it simply reduces savings rather than ruining the plan.
Withdrawal strategies
- Fixed real (Bengen family): a constant inflation-adjusted withdrawal every year, regardless of how the portfolio is doing. Simple and the most demanding — a path ruins the moment it can’t meet the draw.
- Guyton-Klinger guardrails: start at your target, then cut spending ~10% if the withdrawal rate climbs above an upper guardrail (the portfolio fell) or raise it ~10% if it drops below a lower guardrail (the portfolio grew). Flexible spending materially lowers ruin risk versus fixed-real.
- Fixed percentage: withdraw a constant fraction of the current balance each year (the fraction is locked at retirement so year one matches your target). Income flexes fully with the market and the portfolio never strictly hits zero, at the cost of volatile spending. This is the honest, data-free cousin of a CAPE rule — true CAPE withdrawal needs a market-valuation series we don’t model yet.
What “target spending” includes and excludes
Your target real spending is your baseline lifestyle cost in today’s dollars. It is the foundation of the withdrawal each year, but it is not the whole story. On top of it, the engine separately adds income tax, healthcare costs, property carrying costs, and any scheduled lumpy expenses, and it subtracts Social Security and net rental income. So your target should reflect ordinary living expenses and exclude those separately-modeled items — otherwise you’d be double-counting taxes or healthcare. The budget planner helps you build this number up from categories.
What this tool is and is not
This is an educational and illustrative simulation. Every output is conditional on the assumptions you provide — change the assumptions and the numbers change. It is not investment, tax, or insurance advice, it does not recommend specific securities, funds, or products, and it does not predict the future. The probability of ruin is a property of your stated assumptions and a stochastic model, not a forecast of your actual life. Before making real-money decisions, talk to a fiduciary financial advisor and a CPA.
Model version 1.4. This page describes the engine as currently shipped; items marked “queued” or “not modeled yet” are on the roadmap and will be reflected here as they land.