Retirement Runway Model

Projects how long the investable pool lasts against expenses, or the expenses it can sustain for a target horizon — accounting for Singapore inflation, CPF growth, CPF LIFE payouts at 65, and the mortgage schedule.

Sync from Google Sheet

Just paste a Spreadsheet ID or URL — tabs are discovered and read automatically. Add another row only if this data spans more than one spreadsheet.
Syncs via the server-side API. Settings are saved in this browser only (localStorage).

Mode

In Years → Expense mode, drives the solved expense. The success threshold used in the Monte Carlo stress test — a trial only counts as a "success" if it survives at least until this age.
Only the months after this one are projected forward for Year 0. Starting balances already reflect whatever dividends, options income, and spending happened this year up to now, this avoids double-counting year-to-date income.

Starting pool (from your latest snapshot)

Investment assets are split into two sub-pools — stocks/REITs and bonds.
REIT/stock holdings plus crypto added at face value.
Bonds (SSBs + corp bond ETF) are modelled with 0% capital growth — they just pay coupon/yield and otherwise sit flat in price.
HDB and CPF Medisave are excluded.
Applies to the stocks/REIT pool only.
Paid out as cash income like a dividend; the bond principal itself is assumed flat (0% growth) rather than compounding.
Real dividends still expected/received for the rest of this year. Overrides the yield-based estimate for Year 0 only; every later year still uses the formulas.
Used only when Volatility mode below is "Off". Bonds always use 0% growth in every mode. Historical REIT-heavy price-only appreciation (excluding yield) has run roughly 0.5–2.0%/yr — most of the total return comes from the dividend yield above, not price growth, since S-REITs pay out ≥90% of income and retain little to fund internal growth.
Surplus cash is tracked separately and does not get capital-growth treatment. Set above 0% if you'd sweep idle cash into a savings account or T-bills.

Options wheel income (optional)

This is carved out of the "Liquid cash & equivalents" figure above so it isn't double-counted — the rest of that figure is treated as ordinary idle cash with no wheel activity.
Applied to the cash balance at the start of each year. Premiums earned are added back into the cash pile and compound there.
Only applies in Fixed $ mode — in % mode, growth already happens naturally as the cash pile compounds. This income stream is inherently volatile and market-dependent — treat any single rate as a rough average, not a guarantee.
Real premium income still expected/received for the rest of this year. Overrides the % or fixed-$ estimate for Year 0 only; still gets added to the IB pile the same way. Every later year still uses the formula above.

Inflation & economy

Headline CPI (all items) has run hotter and choppier historically — 1991–2025 mean ~1.8%/yr, std dev ~2.0–2.5%/yr. MAS Core (excludes accommodation & private transport) is calmer — mean ~1.7–2.5%/yr, std dev ~1.25–1.5%/yr. Switching presets the two fields below; feel free to override afterward.
SG CPI has averaged roughly 2–2.5%/yr long-run (higher in 2022–24). Adjust as you like. This is the mean rate used every year in flat mode, and the mean of the yearly draw when stochastic inflation (below) is enabled.
SG CPI history is abundant, free, and goes back decades via SingStat — unlike REIT returns, there's no data-sufficiency problem here. Each simulated year draws inflation from Normal(mean above, stdev here) instead of using the flat rate every year, floored at -5% so a freak draw can't go absurdly negative. Correlation lets you tilt the inflation draw to move with (positive) or against (negative) that year's investment return draw — real assets often behave differently in high-inflation years; leave at 0 to draw inflation fully independently. Only applies in Monte Carlo / bootstrap volatility modes (needs repeated trials to mean anything); ignored in "Off" and "Sequence override".

Mortgage (paid via CPF-OA, cash if OA short)

The loan's final payment month. Remaining tenure in months is calculated automatically from today's date each time you open this — no need to recompute it yourself.
The model works out the actual repricing date and months-until-switch from today automatically.

People & CPF

(BRS = FRS/2), both historically rising ~3.5%/yr. Each person's RA is capped at the FRS applicable in their own 55th-birthday year; excess SA above that is freed up as withdrawable cash.
Grounded in CPF Board's own worked example: $288,900 in RA at age 65 pays ~$1,470–1,570/month for life under the Standard Plan — about 6.3%/yr of the age-65 balance.

Volatility / stress-testing

By default the model assumes a flat capital-growth rate every year. These modes replace that flat rate with a variable one, year by year, for stocks/REITs only.

Dynamic spending (Guyton-Klinger guardrails)

By default the model spends a fixed inflation-escalating amount every year, regardless of how the portfolio is doing. Guardrails instead cut spending after bad years and raise it after good ones — closer to how people actually behave, and it directly addresses the standard Monte Carlo critique that a rigid withdrawal overstates "probability of ruin." Only meaningful when a Volatility mode above is not "Off", since a flat growth rate never triggers either band.
Cuts compound and persist with no natural stopping point — in a long, persistently bad sequence (common in the 10th-percentile stress-test rows), the model could otherwise keep applying another 10% cut every single year for decades, driving nominal spending toward zero even as inflation keeps rising, which no real retiree would actually do. This floor caps how far cumulative cuts can push spending down, as a % of what the plan would be with no guardrail adjustment at all (i.e. inflation-escalated only) — a stand-in for "bare-bones essential spending you won't cut below no matter what." Prosperity raises are not floored/capped, since there's no equivalent unrealism on the upside.
Mechanics: each year, current withdrawal rate = (that year's planned expense − dividend/bond income − CPF LIFE income) ÷ prior year-end portfolio value. This is a net rate — what you're actually drawing down from the portfolio, not gross spending — so if dividends alone cover your spending, the rate sits at or below zero and guardrails stay dormant until spending outgrows that income. If it rises more than the trigger band above your first-year net withdrawal rate, next year's spending is cut by the adjustment %. If it falls more than the band below, spending is raised by the adjustment %. Adjustments compound and persist (they shift the ongoing spending trajectory, not just a one-year blip) — this is a simplification of Guyton's full rule set, which also has separate inflation and portfolio-management rules; those aren't modeled here. "Portfolio value" here is your total invested + cash pool. The "freeze" input disables capital-preservation cuts (not prosperity raises) once fewer than N years remain, since a rule meant to extend the portfolio's life mostly stops making sense right before the horizon ends.

Sensitivity analysis (tornado)

Flexes each key assumption up and down by itself, reruns the flat-rate projection, and shows which one moves "years lasted" the most. Needs zero new data — it just tells you where the model's output is actually sensitive, so you know which assumptions are worth refining and which barely matter.

Rolling historical stress test

The bootstrap mode above resamples years randomly. This instead replays your historical return list in its original order, once per possible starting point (start at index 0, then index 1, then index 2, …, wrapping around), so you see a real historical worst-case/best-case band — "what if the sequence starting in whichever historical year happens to hit you first" — rather than one hand-picked scenario or a fully randomized resample.