Engine version 3.0.0. Production dataset as of 2026-05-10.
For a given household — starting portfolio, contribution schedule, horizon, withdrawal rule, allocation, and Social Security — the engine runs 10,000 independent simulated paths of the portfolio over the years to and through retirement. Each path uses real (CPI-deflated) monthly returns sampled from history; contributions and withdrawals happen on a monthly grid. The headline output is the share of paths where the portfolio survives the full horizon — that is the success probability.
A path's monthly returns are constructed by block bootstrap: we sample contiguous 12-month windows from the historical series and glue them end-to-end. This preserves regime persistence — clustered drawdowns, momentum, mean reversion — without committing to any parametric distribution. The 1973–74 bear, the 2000–02 dot-com bust, and the 2008 GFC all live as samplable blocks rather than as independent monthly draws.
The classic Trinity-study Monte Carlo treats monthly returns as independent log-normal draws calibrated to a long-run mean and standard deviation. That misses two structural features of real markets that drive retirement-portfolio failure:
The production dataset is 1149 months of real (CPI-deflated) total returns for stocks, bonds, and cash, covering 1928-01 through 2023-09:
The dataset ships with the app and carries its asOf date (2026-05-10) and a sha256 of the source CSV body (b76e7613e7ec…). It is refreshed via scripts/plan/refresh-historical-returns.ts; the window above is read from the dataset header at render time, so this page always states the true coverage. If the production data has not been loaded — for example, in a fresh dev environment — the engine falls through to a small calibrated synthetic fixture and brands the result datasetKind="fixture", which the plan surfaces label as illustrative.
fixedReal (constant real-dollar income per year), fixedPctInitial (percentage of the start-of-retirement balance, locked), guytonKlinger (guardrail bands at 1.2× / 0.8× the initial rate with 10% adjustments, per the 2006 paper defaults), and vpw (variable percentage withdrawal, annuitizing the remaining balance at a 4% default expected return).Every run is deterministic given (inputs, dataset version, engine version, seed). The default seed is 0xC0FFEE; two runs with the same inputs against the same dataset and engine version produce identical results. Saved scenarios store their inputs verbatim and can be re-rendered exactly at any time.