Methodology & Assumptions
Planner-facing reference for how RetireRange produces its results. Every default below is editable in the app — these are starting points, not constraints baked into the engine.
1. How the engine works
RetireRange treats the future as unknowable but bounded. Instead of projecting one "expected" path, it generates thousands of plausible multi-decade paths, each with its own random sequence of returns and inflation, and reports the distribution of how the plan fares across them.
For each month of each simulation, in order:
- Returns and contributions. Each account grows by that month’s correlated random return on last month’s ending balance, and the month’s contributions are added.
- Mortality events (if enabled) may fire. A death flips filing status to Single from the next January, recomputes Social Security to the survivor benefit, applies pension and annuity survivor benefits, reassigns account ownership for future RMDs, and pays any life insurance death benefit into a Taxable account.
- Property and policy values. Rental properties appreciate, and a property reaching its sale date is sold. The proceeds (net of tax, as entered) are deposited into the chosen Taxable account as cost basis. Life insurance cash value grows.
- Roth conversions fire in the first month of each calendar year.
- Income arrives. Social Security (net of the earnings test), pensions, annuities, net rental income, Other Income streams (part-time work, consulting, royalties; earned income net of payroll tax), and policy loans are all paid for the month. Before retirement this income is deposited into the first Taxable account.
- The withdrawal target is set from the strategy and current spending phase. In retirement the month’s income offsets it dollar for dollar, so the portfolio only funds the gap. Income above the target is deposited into the first Taxable account rather than discarded.
- Withdrawals are drawn: the remaining lifestyle target, medical costs (including IRMAA and any Medicare or pre-Medicare premiums), and any scheduled lump sums. They are allocated across tax types per the strategy, cascading to other types when a bucket is depleted. Within a tax type, accounts are drawn pro-rata by balance, or in strict priority order if the strategy is Ordered. Medical is drawn first from VEBA → HSA, overflowing to the general pool only if both are exhausted.
- Cash-reserve refill and rebalancing, if enabled: the reserve is topped back up after a strong year, and accounts are rebalanced to the target mix.
- RMDs are tracked per account per owner and spread across the year; a forced December top-up is booked if draws fell short of the requirement.
- Taxes accrue in a monthly accumulator. A full year-end (December) calculation books Social Security taxability and federal + state tax, draws the bill from the portfolio, and sets up the following year’s IRMAA lookback.
The defining property is sequence-of-returns risk: two paths with identical long-run average returns can end very differently if the bad years cluster early (when balances are high and withdrawals large). Monte Carlo captures this automatically; an average-return spreadsheet cannot.
Shared seeds. When comparing named strategies, all strategies run against the same set of random sequences, so any difference in outcome is attributable to the strategy, not the draw.
2. Assumptions catalog (defaults)
Return & inflation assumptions
Every figure in this section is a default the user can change on the Assumptions tab — return, volatility, and inflation are all editable, so a given plan may run on different numbers than those shown here.
| Asset class | Annual return | Annual volatility |
|---|---|---|
| Stocks | 7.5% | 18.0% |
| Bonds | 4.5% | 6.0% |
| Cash / equivalents | 3.0% | 1.0% |
| VEBA | 5.33% | 8.29% |
| Inflation | 2.7% | 1.2% |
Return type is per-asset-class: CAGR (default — the engine applies a variance-drag correction so the realized compound return targets the input) or Arithmetic Mean (no correction; realized compound return runs lower than the input because of volatility drag). Most published return figures are arithmetic means; CAGR is closer to what a long-horizon investor experiences, and it keeps results comparable to CAGR-stated 4%-rule figures.
Return generation mode: Block Bootstrap (the default for new scenarios) resamples blocks of consecutive actual historical returns (1928–2025, default 5-year blocks) with replacement, preserving real autocorrelation; Stochastic (parametric) draws each month from a normal distribution. In bootstrap mode the configured per-asset expected return, volatility, correlation, and general inflation are not read — only the derived rates (VEBA growth, separate medical inflation, separate Social Security COLA) still come from assumptions. Scenarios saved without an explicit mode resolve to stochastic for back-compatibility. The Historical Backtest tab is a third cross-check using literal historical sequences.
Correlation: stock/bond default −0.20 (mild negative, long-run average); all other pairs 0. Correlated draws use Cholesky decomposition for stocks/bonds; cash, VEBA, and inflation are drawn independently. Correlation is constant — it does not rise in crises the way real correlations do.
Annual → monthly: monthlyReturn = ln(1 + annualReturn) / 12; monthlyVol = annualVol / √12 (standard log-normal conversion).
Inflation tagging: every cash flow (contributions, spending target, medical, lump sums, pensions/annuities) is tagged None (fixed nominal), Full CPI, or 80% CPI. Medical inflation and SS COLA can optionally each be modeled as a separate stochastic process layered on general CPI.
Withdrawal strategy defaults
| Field | Default |
|---|---|
| Method | Classic (Bengen-style, hold real spending flat) |
| Target type | % of portfolio at retirement |
| Target rate | 4% |
| Inflation adjustment | Full CPI |
| Guardrail bounds | 5% upper / 3% lower (Guardrails method only) |
| Medical expense | $1,200/month (today’s dollars) |
| Net-of-medical | Off (medical stacks on top of lifestyle) |
| Cash reserve / downturn rules / Roth conversions / spending phases | Off / none by default |
Tax treatment
| Source | Treatment |
|---|---|
| Traditional 401(k)/IRA withdrawals | 100% ordinary income |
| Roth withdrawals | Tax-free, except a Pre-Retirement Withdrawal before 59½: ordinary income plus the 10% penalty, unless a Roth IRA basis assertion covers it (5-year rule not modeled) |
| Taxable withdrawals | Modeled as 100% ordinary income — overstates tax vs. real LTCG/qualified-dividend rates |
| Roth conversions | 100% taxable in the conversion year |
| Social Security | IRS Pub 915 three-tier worksheet; up to 85% taxable, ceiling enforced |
| Other income | Per stream: Ordinary (ordinary income), Earned (ordinary income plus payroll tax; see §3, "Other income and earned income"), or Tax-free (excluded) |
| Federal brackets | MFJ / Single per filing status, inflated forward via simulated CPI |
| State brackets | All 50 states + DC; inflated forward only for states that formally CPI-index |
| IRMAA | Prior-year MAGI drives the current-year Part B/D surcharge; thresholds and the Part B/D surcharge amounts inflated by CPI each year (no phantom tier crossings from ordinary inflation) |
Heir rates (after-tax legacy), Assumptions-tab defaults (three inputs): Heir’s Federal Ordinary Rate 25%, State Rate 0%, LTCG Rate 15%. See §3, "Taxes."
Social Security, RMDs, mortality, plan settings
- Social Security actuarial factors: early-claim reduction 5/9 of 1%/month (first 36) then 5/12 of 1%/month; delayed credits 8%/year to 70; spousal 50% of the other’s FRA benefit on its own steeper early-claim schedule — 25/36 of 1%/month for the first 36 months before FRA, then 5/12 of 1%/month — with no delayed retirement credits past FRA (so spousal at 62 against an FRA of 67 pays 32.5% of the worker’s PIA, and waiting past FRA adds nothing to it); higher of own/spousal paid, evaluated per person. Survivor benefit uses the SSA age-graded factor — 71.5% at age 60 rising to 100% at the survivor’s FRA (full 100% at/after FRA), paid as the larger of the survivor’s own benefit or the deceased’s × factor. WEP/GPO not modeled (repealed for benefits payable Jan 2024+).
- RMDs: IRS Uniform Lifetime Table (Pub 590-B Table III); cohort onset 73 (born 1951–1959) / 75 (born 1960+), selected per account owner; applies to Traditional 401(k)/IRA only.
- Mortality: None (default) / Deterministic / Stochastic (SSA 2021 Period Life Table).
- Plan: end age 100 (younger person); 5,000 simulations (raise to 10,000 for close calls); filing status MFJ, auto-flips to Single on first death.
3. Methodology by topic
Returns and inflation
In Stochastic (parametric) mode, returns are drawn from normal distributions per asset class, independent across months. Real markets have fat tails and regime shifts the parametric model doesn’t reproduce; sustained inflationary regimes (1970–82) appear only as a long run of high draws. Cross-check tail behavior with Block Bootstrap — the default mode, which avoids this by construction — and the Historical Backtest. Bootstrap has its own ceiling: it can only reproduce patterns present in 1928–2025. No transaction costs, expense ratios, or rebalancing costs other than realized capital gains are modeled. By default the engine also never rebalances — each account grows at its own return model, so the realized mix at plan end is emergent and typically far more equity-heavy than the starting mix (see Rebalancing under Withdrawal methods).
Withdrawal methods
- Classic — set the target at retirement (% of portfolio or fixed dollar), then hold it flat in real terms. Stable income; can leave large legacy in good markets or sustain shortfalls in prolonged downturns.
- Dynamic — recompute (current % × current portfolio) each month. Never mathematically zeroes; income swings with markets.
- Guardrails — Classic with automatic cuts above an upper spending-rate bound and raises below a lower bound. Preferred for most households.
Target types: % of portfolio at retirement; fixed monthly dollar; or % + fixed dollar. A fourth option, Net-of-Tax (Dollar), is now a legacy alias for fixed monthly dollar — retained so older saved scenarios still load. Under Engine V2 it no longer grosses up draws: V2 already pays the actual tax bill from the portfolio under every target, so the old gross-up would double-count tax.
Target convention — read this before benchmarking against a standard Safe Withdrawal Rate (SWR) study. The withdrawal target is a total household spending target, not a portfolio-only draw. Guaranteed income — Social Security, pensions, and annuities — is subtracted from the gross target dollar for dollar each month, and the portfolio funds only the remainder (gt = max(0, gt − SS − pension − annuity)). This applies to every method and every target type; there is no setting that changes it.
This differs from the Bengen/Trinity convention, where the 4% is a portfolio-only withdrawal and Social Security is additive on top. A "4%" target in RetireRange is therefore not directly comparable to a published 4%-rule result: it is a lower effective portfolio draw once benefits begin, and a higher one before. To reproduce the Bengen convention, set the target to spending net of guaranteed income.
Two consequences worth flagging to clients:
- Claiming-age analysis is symmetric. Delaying Social Security raises portfolio draws during the delay years (the portfolio funds 100% of the target), so the model captures the drawdown cost of waiting, not just the larger later benefit. Delay is not assumed to be optimal.
- Guaranteed income raises the force-drawn share of the RMD. Because benefits shrink voluntary withdrawals, less of the RMD is satisfied by ordinary draws; the balance is force-distributed (spread evenly across the year under always-on smoothing) and any excess over the lifestyle target is redeposited gross to Taxable. Only account withdrawals satisfy an RMD — benefits do not.
- Guaranteed-income surplus is invested, not discarded. When Social Security, pension, annuity, rental, other-income, or policy-loan income together exceed the spending target in a given month, the excess is deposited into the household’s first Taxable account and added to its cost basis — the same treatment the engine gives pre-retirement guaranteed income. This is why a household with guaranteed income well above its spending shows a materially better outcome than an otherwise-identical household with less guaranteed income, rather than a worse one: the unspent portion keeps compounding instead of being lost. A household with no Taxable account has nowhere to deposit the surplus and loses it, so a client whose guaranteed income can exceed spending should hold at least one Taxable account.
Allocation: Proportional (percentage weights per tax type, cascade when depleted) or Ordered (strict priority list). Within a type, pro-rata by balance. Downturn-aware withdrawals (optional): when the trailing 12-month stock return falls below a threshold, switch to priority drainage of Cash → Bonds → Stocks to preserve equity; revert on recovery. VEBA and HSA are medical-only and are excluded from general withdrawals entirely, so they never appear in this ordering. Cash reserve target (optional): hold N months of portfolio withdrawals in cash — the floor is monthsOfExpenses × max(net monthly portfolio draw, monthly RMD equivalent), where the net draw is the spending target after Social Security / pension / annuity / rental / policy-loan offsets. The two demands combine with max, not a sum: voluntary Traditional draws largely satisfy RMDs, so summing would double-count the overlap. A household with large guaranteed income therefore insures a smaller dollar figure than the same N bought before this basis changed. An optional recovery refill tops it back up from equity gains when the trailing 12-month stock return exceeds a threshold (default +10%), rebalancing within a tax type only; the per-account refill target is the floor divided by the total count of cash accounts across every tax type, so a household holding cash sleeves in two tax types no longer refills to roughly twice the requested reserve.
Rebalancing (optional, off by default): targets are set across return models (stocks / bonds / cash), not accounts. Once a year, in a configured month, each (owner, tax type) pool with at least two accounts is moved toward the target. Dollars never cross a pool boundary, because that would be a distribution, rollover or conversion; return models the user did not name are left alone; targets are renormalized over the models actually present in the pool. An optional drift band skips the rebalance unless some model’s share is at least that many percentage points off target. Selling inside a Taxable pool realizes that fraction of the account’s unrealized gain as income in that year and raises Taxable basis by the realized amount; Traditional and Roth pools book nothing. Medical-only accounts (HSA, VEBA) are excluded. The cash reserve floor outranks the target: only cash above the floor may be sold, and the buy side shrinks by the same dollars so the pool stays net-zero. The step runs in both the accumulation and retirement phases, after withdrawals and the cash-reserve refill and before RMDs and the December tax calculation. Glide path (waves). The target can change later in the plan through an ordered set of waves, each a start age and a full target mix. Waves are steps: each mix is held until the next wave’s age, with no interpolation. Ages are the age of the household’s oldest person, so one schedule governs every pool in the household. Any shape is accepted; there is no monotonicity check, so risk may rise before it falls. If more than one wave’s age has already been reached at plan start, the wave with the highest age applies from the first month regardless of list order, and validation warns on each superseded wave. A wave raising the cash target stacks on the cash-reserve floor (the floor still outranks the target), and each wave that moves money inside a Taxable pool realizes gains in that year. With the setting off, results are identical to before it existed.
Taxes
The monthly accumulator drives the Tax Summary chart, the IRMAA lookback, and Social Security taxability. Engine V2 draws the realized federal + state tax bill from the portfolio at each year-end (December), via the normal allocation/cascade, with no target-type check — so realized tax reduces balances (and ending legacy) under every withdrawal target, and Filing State / a planned move affect the legacy number under every target, not just one special mode. Federal brackets, state brackets (all 50 + DC, with per-state Social Security, retirement-income and military-pay rules), and IRMAA are all modeled; capital-gains rates, qualified dividends, AMT, NIIT, and QCDs are not (see limitations).
State retirement exclusions are applied per recipient. The December block splits each retirement figure by owner: pension and annuity streams by the person they’re entered under, pre-tax draws pro-rata across the accounts they came from, RMDs by their (owner, tax type) pool, conversions by source account. It then computes each person’s exclusion with that person’s own age and income, so a per-person cap can’t be lent to a spouse. Income it can’t attribute goes to the youngest person. Five states set one cap for the return and are computed pooled: ID, MI, MN, NJ and VT. NJ and MI count only the qualifying spouse’s income toward the cap. ID, MN and VT keep the household’s youngest age, because one age field feeds several rules with different floors there. Social Security offsets against two spouses’ caps are apportioned by each spouse’s share of the gross benefit. A federal pension’s Federal retirement plan (CSRS / FERS / Not sure) drives the CSRS-only exclusions in NE (in full), VT ($10,000, income-tested, elected against VT’s Social Security exclusion, with the larger kept), ID (from 65, sharing one per-return maximum with military pay) and MN (a stepped phase-out reproduced exactly). Not sure applies none of them.
How the state tax data is kept current. The 51-jurisdiction state table is reviewed once a year, in late autumn, state by state, against each state’s own forms, instructions or statute. Two points matter to anyone relying on it. State tax data is never updated automatically: it is deliberately excluded from the annual automated tax-data refresh, because an automated pass could overwrite the per-state verification record but never reproduce it, so every state entry changes only by a sourced, human-reviewed edit. Changes already enacted for a future year are recorded but not pre-applied. Seven states have such changes on the books (Georgia, Hawaii, Indiana, Mississippi, Nebraska, New York and Virginia), and every one makes the state cheaper, so those households currently show slightly more state tax than they eventually will (the cautious direction). Each is tracked with the year it comes due. "Current" therefore means verified per state as of the last review, with scheduled changes recorded rather than anticipated.
Heir tax / after-tax legacy. After-tax legacy applies tax to inherited balances by account type and by beneficiary. Each account’s Beneficiary setting (spouse / non-spouse) drives the haircut: a spouse inherits Traditional and HSA with tax-advantaged status preserved (no haircut); a non-spouse heir takes them as ordinary income at the heir’s rate + optional state rate (an HSA at full balance, per IRS Pub 969). Roth, Taxable, and VEBA pass at full value regardless (Taxable via step-up in basis). The SECURE-Act 10-year drawdown bracket math on inherited Traditional and the capital-gains drag on inherited Taxable growth are not modeled — today the haircut is a flat ordinary+state rate on the ending balance. An account left on the default beneficiary (Spouse for married filing jointly) is treated as passing to a spouse with no heir tax; that is optimistic when both spouses have died by plan end, so the Accounts tab labels the default explicitly and suggests Non-spouse for a conservative legacy figure.
Unpaid tax bills. If the December tax draw cannot be fully paid from the portfolio, the unpaid part is recorded as a shortfall for that month, so it lowers Success Rate and raises Shortfall Rate rather than disappearing.
Early distributions. A pre-retirement withdrawal from a Traditional account is ordinary income in its year, and the 10% §72(t) penalty, when it applies, is drawn from the account. A Roth withdrawal before 59½ is treated as earnings. The whole amount is ordinary income in its year, so it reaches federal and state tax, the taxable share of Social Security, and the next year’s IRMAA lookback, and the penalty applies unless waived. A §72(t) exception or the Rule of 55 waives the penalty only, never the tax. Only a Roth IRA honors a contributions-first Roth basis assertion, which removes both. An employer-plan Roth is pro-rata, and with no basis tracked it is treated as all earnings. The 5-year rule isn’t modeled, so any Roth withdrawal at 59½ or older is treated as qualified.
Social Security, pensions, annuities
Pre-retirement income. A pension, annuity, Social Security, rental, other-income or policy-loan stream whose start date falls before the person’s retirement date is paid from its own start date, deposited to the first taxable account, and taxed to the extent that stream is taxable (policy loans are tax-free). It is not held back until retirement.
Benefits are entered per person in today’s dollars at 62 / FRA / 70 from the SSA statement; the engine interpolates other claim ages with standard actuarial factors. Estimates can be typed in by hand or imported from the SSA statement data XML (my Social Security → Download Your Statement Data), which is parsed in the browser and never uploaded.
The continued-earnings caveat now depends on how the figures got in. SSA’s own projections assume the worker keeps earning at their current rate until claiming, so an early retiree who enters them verbatim overstates their benefit. That still holds for hand-entered figures and for an XML import accepted as-is — the engine cannot detect it. It does not hold for an import accepted under the Recompute PIA from earnings history mode: there the engine rebuilds the PIA from the year-by-year FICA earnings in the file, under a stop-earning age and annual future-earnings figure the user supplies. AIME is the top-35 wage-indexed years ÷ 420 months; indexing uses the bundled SSA National Average Wage Index series, with years past the published series projected at an assumed AWI growth rate (default 3.5%/yr, the SSA Trustees’ intermediate wage-growth assumption); PIA then comes from the eligibility-year bend points already in the reference data. Both the AWI series and the growth assumption are visible on the Reference Data tab. Not modeled by the recompute: WEP/GPO offsets, the disability freeze on the indexing period, and death before 60. Pensions and annuities are modeled as income streams with COLA, survivor %, QLAC deferral, and (annuities) an exclusion ratio. Each carries a start date and, optionally, an end date and/or a fixed term in monthly payments (the term counts the first payment, so 120 payments from January 2025 end December 2034). When both are set, the earlier stop wins. With neither, the stream pays for life. A survivor benefit runs only for what remains of a bounded stream. There is no refund-of-premium or cash-refund option, and buying a new annuity mid-plan is not a modeled transaction.
Spousal benefits follow SSA’s filing gate and reduction age. A spousal benefit is 50% of the other person’s PIA at their FRA — a base unaffected by when that person actually claims — and the engine pays max(own, spousal) each month. Two rules govern when and at what size it starts:
- Filing gate. No spousal benefit is payable until the worker spouse has filed. The spousal start month is therefore
max(dependent's own claim, worker's claim). - Reduction age. The early-claiming reduction is computed at the dependent’s age when the spousal benefit actually begins — not at the dependent’s own claim age. At or after the dependent’s FRA the reduction is zero; there are no delayed-retirement credits on a spousal benefit, so it caps at 50%.
Worked example. Worker A has a $3,000 PIA, FRA 67, and claims at 70. Dependent B has no earnings record of their own and claims at 62. B receives nothing in spousal terms until A files — at which point B is 70, past their own FRA, so the benefit begins unreduced at $1,500/month. (Before this was modeled correctly the engine paid $975/month from B’s age 62, both too early and too heavily reduced; the two errors ran in opposite directions, so no household’s totals were reliably conservative.)
The practical consequence for a claiming-age search: couples’ rankings are sensitive to this, because the configurations a search tends to favor — the higher earner delaying to 70 — are exactly where the gate bites hardest. A delay strategy that wins narrowly is worth reading with the spousal timing in view.
Other income and earned income
Other income streams (Accounts tab) are recurring non-portfolio income: a part-time job, consulting, royalties, a side business, an installment payout. Each pays a monthly amount in today’s dollars between a start and an optional end date, grown either with simulated CPI (growth rate blank) or at a fixed rate. Like the other guaranteed-income sources, it offsets the withdrawal target dollar-for-dollar before and after retirement, and any surplus is deposited to the first Taxable account. Two things differ from rental income. First, there’s no asset behind it: no value, appreciation or sale. Second, it has owner scope: a stream assigned to a person stops at that person’s death, while a Household stream runs until the last death.
Three mechanisms apply only to streams marked Earned income:
1. Payroll tax. An Employee stream pays 6.2% Social Security up to that year’s wage base plus 1.45% Medicare with no cap. The wage base starts at the current figure and is indexed each year with the simulated inflation path, as SSA indexes it (before October 2026 it stayed at the plan-start figure while wages inflated, so high earners stopped paying Social Security tax too early in later years). A Self-employed stream pays both halves: 15.3% on 92.35% of net profit (the Schedule SE adjustment), with half of the self-employment tax deducted from taxable income under IRC §164(f). The 0.9% Additional Medicare Tax applies above $200,000 single / $250,000 MFJ, measured on household earnings; those thresholds stay fixed, as the statute sets them. The wage base is per earner, so two spouses each under it both pay the full rate; household-scoped earned income is pooled into one notional earner rather than being given a fresh ceiling per stream. Payroll tax is withheld monthly at source, so it never enters the year-end tax settlement and is never funded by selling investments. The Other Income chart band and the Year-by-Year column report the stream net of payroll tax: what the household actually receives.
2. The Social Security earnings test. For a person collecting before FRA, benefits are withheld at $1 per $2 of that person’s earnings above the lower annual exempt amount. In the calendar year FRA is reached, the rate is $1 per $3 above the higher amount, counting only earnings before the FRA month. From the FRA month onward there is no test at any earnings level. The withheld money is not lost. At FRA the benefit is permanently recomputed as though the claim had been later by the number of months fully withheld (SSA’s Adjustment of the Reduction Factor), so over a normal lifespan most of the withholding is recovered. This is the single most misunderstood rule in retirement planning: clients routinely believe working while collecting early costs them permanently. In the model, as in reality, it’s a deferral. Only earned income assigned to that person counts; pensions, annuities, rental income, portfolio withdrawals and Household-scoped streams are never tested.
3. PIA credit. Earned streams count as covered employment in the SSA-import Recompute PIA from earnings history mode, capped each year at the wage base, with self-employment credited at 92.35%. A year covered by a stream replaces the flat future-earnings assumption for that year. This is the only path by which a modeled job raises the benefit: hand-entered estimates are not adjusted.
All thresholds (wage base, both exempt amounts) are reference data, visible on the Reference Data tab and refreshed annually; the rates, the Additional Medicare thresholds and the withholding ratios are statutory. Remaining simplifications are listed in Model limitations.
RMDs
Annual RMD = prior year-end balance ÷ Uniform Lifetime factor for the owner’s age; cohort onset 73/75. Requirements are pooled by (owner, tax type), matching IRS aggregation: a person’s Traditional IRA requirement can be satisfied from any Traditional IRA they hold, rather than each account having to cover its own share. The pooled shortfall is drawn through the same code path ordinary spending uses, so it honors the cash reserve and downturn-aware ordering — in a downturn the cash sleeve inside a Traditional plan drains first instead of the equity sleeve being force-sold, and in normal markets at the reserve floor the RMD comes pro-rata from the non-cash sleeves. Scope stays at (owner, tax type), so two separate employer plans of the same type held by one person pool loosely: the dollars distributed and taxed are identical either way, only which sleeve is sold differs. Voluntary draws count toward the requirement; any shortfall is spread evenly across the year (RMD smoothing is always on — there is no December-lump mode or toggle). Any RMD exceeding the lifestyle target is redeposited to the owner’s chosen Taxable account. The Joint Life Table (Table II) is intentionally not populated — it applies only when the sole-beneficiary spouse is >10 years younger; a lookup would throw as a safety net.
RMD and tax chart alignment for a mid-year plan start. The engine always books a full year’s RMD in December, and the RMD chart, the Tax chart’s annual taxable-income and Social Security figures, and the year-by-year export table all align to the calendar year that December booking falls in, not a twelve-month window anchored to the plan’s start anniversary. A household whose owner turns 75 in June 2047 sees their first large RMD charted against 2047, taxed under 2047 brackets — a January-start plan’s anniversary window already coincides with the calendar year, so it needs no special handling. The required amount for the year an owner first reaches RMD age spreads evenly from the birthday month through December, matching the smoothing applied in every later year, so the Portfolio Draw column doesn’t show a one-off spike in that first year.
Medical costs & Medicare
Base medical expense (default $1,200/month, inflated by medical or general CPI) is a round approximation of a retired household’s all-in monthly cost before any of the optional premium fields below are configured — in the same range as HealthView Services’ 2026 estimate of roughly $1,417/month for a healthy 65-year-old couple’s first year of retirement (Medicare Part B/D, Medigap, dental, and out-of-pocket combined). A household that fills in Medicare Part B/D, the pre-Medicare bridge, or Medigap separately should lower this field so those aren’t counted twice. It is drawn VEBA → HSA → general pool; VEBA/HSA are never touched by the general withdrawal loop (a tested invariant). Because this base medical expense is added on top of the withdrawal target by default, the withdrawal target should represent non-medical living spending — medical is not part of it and isn’t double-counted. The Net-of-Medical toggle flips this: medical then comes out of the total target instead of adding to it. Optional Medicare Part B/D base premiums start at 65 per person, plus any Medigap supplement. The pre-Medicare bridge is a chain of 1–5 sequential coverage periods (COBRA → ACA → retiree) per person, each with a premium and growth rate, running to Medicare eligibility. The HSA "stealth IRA" option defers HSA drawdown so it compounds tax-free, with reimbursements pulled later under the IRS unlimited-lookback rule.
Mortality & surviving spouse
Three modes (None / Deterministic / Stochastic). Use Deterministic for Compare — shared seeds + shared death timing isolates strategy as the only variable. On a death: filing flips to Single, ownership transfers to the survivor, Social Security becomes the higher of own/survivor (via the SSA age-graded survivor factor, up to 100% at FRA), future RMDs use the survivor’s age. On the last death the plan terminates that month and balances freeze — the ending balance / after-tax legacy is measured at the death month, not plan end.
Roth conversions
Annual Traditional → Roth conversions by year range and amount, taxable in the conversion year and potentially triggering IRMAA two years later. The engine assumes conversion taxes are paid from outside the portfolio — if paid from portfolio funds, reduce the entered amount to net-of-tax. Conversions do not satisfy RMDs.
Sensitivity analysis
Methodology. A tornado sweep: stockReturn, bondReturn, inflation each ±1% and withdrawalTarget ±10%, one dimension at a time — 8 perturbations + baseline = 9 full Monte Carlo passes. All nine passes share one common random-number stream (a single seeded draw sequence), so each bar is a true marginal sensitivity rather than a mix of signal and sampling noise. The baseline pass reuses the exact 32-bit seed stamped on the client’s last Run Simulation, so the tornado’s baseline column reproduces the Results-tab run bit-for-bit and cannot contradict the headline numbers. Each bar is the perturbed metric minus the baseline metric (median / P10 legacy, success rate, shortfall, after-tax legacy). Perturbations are relative to the client’s own assumptions — it nudges their inputs, not a standardized set. It isolates marginal contributions and does not model interactions between inputs.
Benefit. Ranks which market/spending inputs the plan is most exposed to, so stress-testing and client conversations focus on the levers that actually move the outcome rather than the ones that merely feel important. Note it is deliberately a fixed four-input sweep — it does not test decisions (Social Security claiming age, allocation, Roth conversions, healthcare costs, retirement date); use the Optimizer or a Compare set for those, and don’t read a decision’s absence from the chart as insensitivity.
Sampling noise. Because every pass replays the same draw stream, common random numbers (above) cancel between-pass noise: a perturbation moves the metric only through the input that changed, so the bars are monotonic in the perturbation direction. Residual sampling error still applies to the absolute metric levels (as everywhere), but not to the differences the tornado is built from — so a client can even lower the simulation count for a quick read rather than raising it to fight noise. This is the same shared-seed principle the Compare tab applies across strategies.
Optimizer
Searches a configurable decision space (allocation, withdrawal target/method, guardrails, Social Security claim ages, Roth amounts, contributions, filing state, move year) via Grid / Latin Hypercube / Random, runs as a background worker, and emails results. Candidates are scored under common random numbers (CRN). One run-level seed is threaded through the coarse pass, the top-candidate re-evaluation, and coarse-to-fine refinement, and is persisted in the job checkpoint so a resumed run reuses it — every candidate faces byte-identical simulated markets, and the gap between two candidates is the strategy rather than two uncorrelated draws. One leak remains: under stochastic mortality, death ages are sampled from the same random stream, so per-strategy draw consumption drifts at the same simulation index and the pairing degrades. Deterministic mortality is unaffected, and is the right setting when a ranking is close. This is the same caveat the Compare tab has always carried; the optimizer inherits it rather than introducing it. Under Engine V2 the Filing-State/Move-Year dimensions produce a legacy signal under every target (V2 draws actual tax from the portfolio regardless of target), so the old Net-of-Tax gate is gone. Some dimensions appear only when relevant to the plan (e.g., contribution dimensions require an account with a contribution rule).
4. Interpreting the results
- Success Rate — share of simulations with the portfolio still positive at plan end. 90%+ is typically solid; higher is not automatically better (99% on a long horizon can signal over-caution or over-optimistic inputs — sanity-check against the backtest).
- Shortfall Rate — share of simulations where the spending target was unmet for at least one month, or where a year-end tax bill could not be fully paid from the portfolio. A more sensitive income-reliability measure than success rate; a "successful" run can still have had a lean stretch.
- Percentile ending balances (P10/P50/P90) — P10 is the bad-luck floor, P50 the median, P90 the good-luck ceiling. The P10–P90 width itself signals sensitivity to luck.
- After-Tax Legacy (P50) — median legacy after heir tax by account type (see §3). The realistic legacy figure and the right one for Roth-vs-Traditional comparisons.
- Ruin-probability (by year) — when failures occur, which success rate alone can’t tell you: early-clustered failures (sequence risk) are a very different problem from late ones, even at the same success rate.
- Sampling error — at 5,000 sims the standard error on success rate is ~±0.7pp (~±0.5pp at 10,000). Treat sub-1-point differences as noise.
- Real vs. nominal — nominal for comparison to statements; real (deflated to plan-start dollars) to judge whether purchasing power holds.
- Lifetime Taxes Paid — the federal plus state income tax actually assessed each December, summed over the plan, including any 10% early-distribution penalty. It is comparable to a real tax bill (earlier versions summed taxable income and overstated it several-fold, so older exports and screenshots show inflated figures).
- Lifetime Taxes Paid caution — never minimize it on its own: at high withdrawal rates taxes fall simply because the portfolio depletes faster. Find the high-success-rate region first, then compare taxes within it.
- Monthly Retirement Income chart is a calendar-year average, not a sampled month. Each band — Social Security, Pension, Annuity, Rental, Other Income, Policy Loan, Portfolio Draw, Medical, Shortfall — is now that source’s total for the calendar year divided by the in-plan, post-retirement months in it, matching the Annual total (calendar year) column it sits beside. Previously each band showed the value from one sampled month per year (an accident of plan-start month — December for a January-start plan), which let bookkeeping timing such as the December tax draw or RMD smoothing read as a real income spike. A calendar year containing a mid-year event — retirement, a Social Security claim — reads as a blend: someone claiming Social Security in June sees roughly seven-twelfths of a full month’s benefit on that year’s row, because that is what the calendar year actually paid. That is deliberate, not a cut in benefits — all bands share one divisor so the stacked bars still sum to the annual total. The year-by-year export (CSV/XLSX/PDF/PPTX) is also more accurate now, not just relabeled: it previously multiplied the sampled month by 12, which overstated a partial retirement year’s withdrawal income by roughly 70% for a mid-year retiree. Ending balances, success rate, taxes, and optimizer/comparison scoring were never derived from the sampled values and are unaffected.
- "If the first five years go badly" — sequence-of-returns conditioning. A card that appears on every run with any retirement in it, reporting Survived a Bad Start, Survived Otherwise, Median Legacy — Bad Start, and Median Legacy — Otherwise. It sorts every simulation by how its first five retirement years of investment returns actually performed, takes the worst fifth, and reports how that group finished against everyone else — isolating sequence-of-returns risk (the same average return can end very differently depending on which years were bad) from average-return risk. The split is on the market only, not on the outcome, so the comparison is not circular; the household’s own spending doesn’t color the ranking. The gap between the two success-rate figures is what a bad start costs this plan: a large gap means sequence risk is the binding constraint and Downturn-Aware Withdrawals / Cash Reserve (§3, Withdrawal methods) are worth testing — a near-zero gap means the plan is not sequence-risk-sensitive, which is good news and should be read as such. The five-year window is fixed and not user-adjustable.
5. Cross-checks & verification
- Historical Backtest — replays the plan against actual 1928–2025 sequences (98 start years, deterministic). Worst starts to watch: 1929, 1966, 2000. Limitations: 98 data points (wider CI than Monte Carlo); U.S. large-cap + Treasuries only; late start years wrap to 1928 (flagged).
- Block Bootstrap — a middle ground that resamples real historical blocks while still randomizing.
- What-If Quick Calculator — a deterministic, zero-volatility single path for instant directional checks ("which way does this change push the outcome?"). Not a substitute for Monte Carlo.
- Test suite — the engine’s unit/integration tests target silent forecast errors: finite-number assertions on every result field, histogram bins summing to the simulation count, medical-account isolation (VEBA/HSA never drawn by the general pool), rate fields bounded in [0,1], cascade correctness, and Social Security-taxability worksheet coverage across all three Pub 915 tiers.
6. Limitations
The model’s approximations and gaps — mapped to the accounts, assets, and income sources a household actually holds, each flagged conservative or optimistic — are in Model limitations, by portfolio inventory. The items that lean optimistic are the ones to weigh most carefully with a client: long-term care (not modeled), investment fees (not deducted), and cash-value life-insurance drag.