How Retirement Replay works
The whole machine, opened up: where every number comes from, how prices and yields become returns, exactly which tax rules run, and what we deliberately simplified. The dataset is downloadable below, so every claim on the tool is checkable.
The method: every start year, replayed
Retirement Replay runs your household through every historical start year the chosen assets support, one strand per January, month by month. Each strand earns the returns of its own stretch of history, pays its own inflation, and funds your spending after tax. Nothing is sampled or randomized: the same inputs always produce the same strands, and any strand can be replayed and audited event by event in the theatre.
Everything runs in today's dollars under current law. Canadian brackets, benefit amounts, and thresholds are indexed to inflation, so 2026 rules in real dollars stay aligned with them, and the historical series carry the inflation itself. When the tax engine rolls to a new year, this tool inherits it automatically.
The data, series by series
Starts and ends below are read from the data file itself, so this table cannot drift from what the simulator uses.
| Series | Runs | Source | Construction |
|---|---|---|---|
| Canadian inflation (CPI, all items) | 1914-01 → 2026-04 | StatCan WDS v41690973 (18-10-0004) | levels as published |
| US dollar in Canadian dollars | 1950-10 → 2026-05 | StatCan WDS v37426 (10-10-0009) + BoC Valet FXMUSDCAD | splice continuity asserted <1% |
| US equity, total return (USD) | 1871-02 → 2026-05 | Shiller ie_data.xls | (P_t + D_t/12)/P_{t-1} - 1 |
| Canadian large-cap equity, total return | 1956-02 → 2026-05 | StatCan WDS v122620+v122628 (10-10-0125) + Yahoo XIU.TO adjusted close | C_t/C_{t-1}-1+Y_t/1200, then adjclose ratios |
| Government of Canada long bonds, total return | 1936-02 → 2026-05 | StatCan WDS v122487 (10-10-0122) | constant-maturity par-bond N=10, annual coupon + y/12 income |
| Cash (3-month T-bills), total return | 1935-07 → 2026-05 | StatCan WDS v122541 (10-10-0122) | y_{t-1}/1200 |
| 5-year GIC ladder, total return | 1968-07 → 2026-05 | BoC Valet V80691336 | trailing-60-month ladder mean /1200 (expanding first 60m) |
| Posted 5-year GIC rate | 1968-07 → 2026-05 | BoC Valet V80691336 | monthly average of weekly postings |
| GoC long bond yield | 1936-01 → 2026-05 | StatCan WDS v122487 | as published |
| 3-month T-bill yield | 1935-06 → 2026-05 | StatCan WDS v122541 | as published |
| US inflation (parity testing) | 1871-01 → 2026-05 | Shiller ie_data.xls col E | levels as published |
| US 10-year bonds (parity testing) | 1871-02 → 2026-05 | Shiller ie_data.xls col G (GS10) | constant-maturity par-bond N=10, annual coupon + y/12 income |
Take the data
One wide CSV of every monthly series (returns as decimals, yields and rates in percent, CPI as index levels), and the life tables behind the mortality view, population and pensioner side by side. Sources: Statistics Canada (Open Licence), the Bank of Canada, Robert Shiller's public dataset, and exchange-traded fund market data; attribute them, not us.
From prices and yields to returns
Where a published total-return series exists we use it; where it does not, returns are reconstructed with the standard methods below and labelled generically.
US equity, 1871 onward
TR = (P + D/12) / P[prev] − 1Shiller's monthly-average prices and dividends. Averaging smooths the wildest single days, and one convention runs the whole series.
Canadian equity, 1956 onward
TR = C/C[prev] − 1 + Y/1200Composite close plus composite dividend yield until late 1999, then dividend-adjusted ETF closes. The two agree within 0.39% a year where they overlap.
Bonds (constant maturity)
TR = parPrice(Δy, 10y) − 1 + y[prev]/1200A par bond repriced for the month's yield move plus accrued coupon, the standard simulation approach for yield-only history.
Cash and GICs
cash: y[prev]/1200 · GIC: mean(rate, 60m)/1200T-bills earn last month's yield. The GIC ladder holds five annual rungs, so each month earns the trailing five-year average of posted rates.
US returns convert to Canadian dollars at each month's actual exchange rate before anything else happens, so currency risk lives in the data rather than in an assumption. Real values deflate by Canadian CPI.
The tax layer, rule by rule
The rules below run inside every simulated year, using the same 2026 engine that powers the site's calculators.
After-tax spending
Each year the solver searches for the gross withdrawals whose after-tax remainder equals your spending target, account by account, against full federal and provincial brackets.
RRIF minimums
Forced withdrawals from age 72 at the CRA factors, taxed as income, with anything beyond spending reinvested outside the RRIF.
OAS recovery tax
Each person's OAS claws back at 15% of net income above $95,323, and the repaid amount is deductible, so fully clawed-back OAS nets exactly zero.
Capital gains
Non-registered withdrawals realize gains against a continuously tracked cost base at the 50% inclusion rate.
Couples
Two taxpayers: withdrawal income splits evenly across both ladders and each faces the clawback on their own income, which is where much of the couples advantage comes from.
Survivorship
After a modelled death the survivor's CPP combines with 60% of the deceased's, capped at the maximum single pension ($1,507.65/month at 65); the deceased's OAS ends.
Guaranteed Income Supplement
Low income plus OAS in pay earns GIS automatically: up to $1,109.85 a month for a single person, shrinking as income other than OAS and TFSA withdrawals rises, gone at $22,512. Deferring OAS forfeits it. Rates for April to June 2026.
Pensions, indexed or not
A pension with cost-of-living raises holds its real value. Switch it to no raises and each history erodes it along its own recorded inflation path; a survivor share keeps following the original nominal trajectory.
Deliberate simplifications
- Age and pension-income credits are not modelled, which slightly overstates tax. The error is conservative.
- GIS runs as a straight line from each published maximum to its published income cutoff rather than the official bracket tables; it never pays past the real cutoff. The Allowance for a partner aged 60 to 64 is not modelled.
- Tax solves once per simulated year, not monthly.
- Investment income inside non-registered accounts is taxed on withdrawal as realized gains, not as it accrues. One knock-on effect: taxable income in early retirement can read lower than a portfolio paying interest and dividends would report, which can overstate GIS in those years.
- VPW caps its withdrawal percentage at 10% a year, following the published tables.
- Years before retirement use a single labelled growth assumption rather than historical sequences, so every strand starts at the same balance.
Caveats
- Overlapping windows are not independent samples: a 1965 start and a 1966 start share most of their history. Treat the cohort as a tour of recorded sequences rather than a probability distribution.
- Shiller's prices are monthly averages of daily closes, which softens the very worst single months.
- Pre-1999 Canadian equity is a reconstruction (price index plus dividend yield), labelled generically on purpose.
- The life tables are averages: the Canadian population by default, or CPM2014 pensioners on the toggle (base table, without the CPM-B improvement scale, so current pensioners likely run a little lighter still). Your health, income, and habits move you off either.
- History constrains imagination in both directions: the future can be kinder and crueller than anything in the record.
Sources
Statistics Canada data is used under the Statistics Canada Open Licence; Bank of Canada data under its terms of use. Reconstructed series are labelled generically and are not products of, or endorsed by, any index provider.
Historical results are not a guarantee of future ones. Retirement Replay is an educational simulation, not financial advice.