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.
Default here is the 3-year average.
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.
Default is your own backtested 2022–2026 sequence (a real bad-start-then-recovery pattern). After the list runs out, the model reverts to the flat "Capital growth" rate above. One value = one simulated year, regardless of which calendar year it lands on.
This is total return (price + dividends), matching how the underlying index/ETF data is quoted — the model subtracts your dividend yield above from every draw before applying it as price growth, so income isn't paid out twice (once as the modeled dividend, once baked into an already-dividend-inclusive return draw). Each trial draws an independent random return every year from a normal distribution with this mean/stdev, instead of the flat rate. Defaults are the sample mean/stdev of the same 14-year 65% S-REIT / 30% STI / 5% S&P 500 blend used in the bootstrap pool below (2009–2014, 2018–2025; 2015–2017 unavailable for free). This span includes the GFC recovery and 2011 eurozone-scare drawdown, so both figures are noticeably higher than the old ~10-year-only calibration (was 5.3% / 12.1%) — the wider spread is a more honest reflection of full-cycle S-REIT volatility, not a modeling error. More trials = smoother, more stable percentiles but slower to compute.
Real equity/REIT returns crash harder and more often than a Normal distribution predicts ("fat tails"). Student-t with 5 degrees of freedom is a common finance convention for widening the tails while keeping the same mean/stdev above — a distributional choice, not a fitted parameter, so it doesn't run into the 14-point data-sufficiency problem GARCH/regime-switching do. Only changes the shape of each year's draw, not its average.
These are total-return figures (price + dividends) as commonly quoted for REIT/equity indices — the model subtracts your dividend yield above from each drawn value before applying it as price growth, so income isn't counted both as the modeled dividend and inside an already-dividend-inclusive return. Each simulated year picks one return at random (with replacement) from the list above, instead of assuming a normal distribution. Default is a 65% S-REIT / 30% STI / 5% S&P 500 weighted blend, computed year-by-year for 2009–2014 and 2018–2025 (14 points; 2015–2017 unavailable without a paid data license). S-REIT leg splices FTSE ST REIT Index (2009–2014), Lion-Phillip S-REIT ETF (2018–2021), and CSOP iEdge S-REIT Leaders ETF (2022–2025) — three related but not identical index methodologies. S&P 500 leg is USD, unconverted to SGD. Paste a longer real return series here if you source one yourself for a more robust result. With block size >1, the model draws a random overlapping run of that many consecutive years from the list (e.g. years 3–4, or 7–9) instead of one independent year at a time — this captures some "bad years cluster together" effect (a crash followed by its recovery gets sampled as a pair sometimes) without inventing a transition-probability model your 14 points can't actually support.
Same seed + same inputs = identical trials every time you click "Run projection". Click "New random seed" to deliberately get a fresh batch of trials instead.
By default expenses escalate on a perfectly smooth inflation line every year — but real spending is lumpy. This mode multiplies each simulated year's expense by an independently-drawn random factor. Real expense shocks aren't symmetric. So the std deviation drives the upside tail uncapped, while the downside is hard-clamped at the "max downside" cap. Applies to Monte Carlo and bootstrap modes; ignored in "Off" and "Sequence override" modes.
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.