Project compound growth, or stress-test a retirement target with Monte Carlo simulation.
Pick what you want the calculator to solve for. Everything else uses market-average defaults — no advanced inputs to fiddle with.
This Quick Plan uses these market-average assumptions so you don't have to think about them:
The Monte Carlo simulation under the hood is identical to the full Retirement · Monte Carlo tab — same 5,000-trial decumulation model, same horizon-adjusted SWR, same SS claim-age table. The only difference is that all advanced inputs are pinned to defaults here.
Contributions are held constant in today's dollars (auto-escalated for inflation).
P) — initial balance, in today's dollars.g) — nominal annual rate of return on the portfolio.i) — annual rate at which prices rise.C₀) — in today's dollars; auto-escalates with inflation so its real value stays constant.Y) — number of years invested.Annual rates are converted to monthly by dividing by 12 (nominal / APR convention, same as Money Guy's calculator):
r_g = g / 12 (monthly growth rate) r_i = i / 12 (monthly inflation rate) N = Y × 12 (total months)
1. Apply growth: total = total × (1 + r_g) 2. Inflate C: C_m = C₀ × (1 + r_i)^(m − 1) 3. Add C_m: total = total + C_m
Contributions are added at month-end (ordinary annuity convention).
real(y) = nominal(y) / (1 + r_i)^(12 × y)
Outcomes from today through end of life if you invest the required amount each month. Accumulation grows the balance; decumulation draws it down. Dark band = middle 50% of trials, light band = middle 90%. Dashed line = reference target.
Unlike a calculator that just asks "do you hit 25× by retirement?", this runs your entire timeline — accumulating from today to retirement, then withdrawing through end of life — and reports the probability your portfolio survives. The 4% rule is shown as a reference benchmark, not the optimization target.
Net of Social Security, grossed up for taxes, with a withdrawal rate that auto-adjusts to your retirement length, plus the present value of any pre-Medicare healthcare bump.
Withdrawal rate by horizon (Bengen / Trinity / FIRE-community consensus — the 4% rule is calibrated for 30-year retirements; longer horizons need a lower rate to survive sequence-of-returns risk):
30 yrs → 4.0% (linear interpolation between) 40 yrs → 3.5% 50+ yrs → 3.0%
Reference target formula:
ss_actual = ss_at_FRA × claim_age_factor
net_spend = max(0, monthly_spend − ss_actual)
gross_up = 1 / (1 − pretax_share × tax_rate)
swr = horizonSWR(life_expectancy − retire_age)
baseline_target = (net_spend × 12 × gross_up) / swr
years_pre65 = max(0, min(65, life_expectancy) − retire_age)
pre65_buffer_PV = PV of (pre65_health × 12 × gross_up) for years_pre65
discounted at (real_return_at_retirement − fees)
reference_target = baseline_target + pre65_buffer_PV
The MC simulation actually exercises this — it draws down the portfolio year by year through retirement, with the pre-65 healthcare bump applied automatically until age 65 — so the "Required Monthly Investment" stat is the honest answer; the reference target is just the heuristic benchmark for comparison.
For retirees younger than 65, an additional monthly cost (default $1,500/mo, household-typical) is added to spending each year until Medicare eligibility kicks in at 65. Marketplace insurance + out-of-pocket runs roughly $700–1,500/mo per person before subsidies, often higher for households or those with health conditions. Set to $0 if you have employer-sponsored retiree health, qualify for ACA subsidies, or otherwise don't need to budget extra.
If you retire at 65+, the bump auto-zeros (no early-retirement years to apply to). The bump is grossed up for taxes the same way regular spending is, since it's also funded from the portfolio. Note: real-world healthcare cost inflation typically runs 1–2% above CPI; we keep it constant in real terms here for simplicity — bump the input value if you want to budget for that drift.
Real portfolios get more conservative near retirement. We linearly interpolate both the mean return and volatility from "now" to "at retirement" over the accumulation phase, then hold at the "at retirement" values through decumulation:
mu_y = mu_now + (mu_retire − mu_now) × y / years_to_retire sigma_y = sigma_now + (sigma_retire − sigma_now) × y / years_to_retire
Setting "at retirement" equal to "now" disables the glide path (constant assumptions throughout).
Your stated benefit is at Full Retirement Age (FRA = 67). If you claim earlier or later (per SSA's actuarial table):
62 → 70% | 63 → 75% | 64 → 80% 65 → 86.7% | 66 → 93.3% | 67 → 100% 68 → 108% | 69 → 116% | 70 → 124%
If your SS claim age > retirement age, there's a "gap" period during which the portfolio funds 100% of spending.
"Flat" assumes constant real spending throughout retirement. "Smile" applies a –1%/year real decline for the first 15 years (then flat at 85%) — a documented pattern (Blanchett 2014, Bengen) where retirees naturally spend less in middle retirement years. We don't model the late-life healthcare uptick separately.
Withdrawals from pre-tax accounts (401k traditional, traditional IRA) are taxed as income; Roth and HSA withdrawals are tax-free. We approximate the blended effect:
effective_withdrawal = monthly_spend / (1 − pretax_share × tax_rate)
The portfolio must fund this larger gross amount each month so the post-tax received equals your stated spend. We do not separately model SS taxation, taxable-account dividend tax, or capital gains on rebalancing.
balance = current_investments
mult = 1
for each year y in 1..(life_expectancy − current_age):
{mu_y, sigma_y} = glide-path values
return_y = (mu_y − fees) + sigma_y × randn()
balance *= max(0.01, 1 + return_y)
if y ≤ years_to_retirement:
balance += 12 × (user_C + employer_E) × mult
mult *= (1 + real_wage_growth)
else:
spend_factor = 1 (flat) or smile(y − years_to_retire)
ss_now = (age ≥ ss_claim_age) ? ss_actual : 0
net_withdraw = 12 × (effective_spend × spend_factor − ss_now)
balance -= net_withdraw
if balance < 0: balance = 0; trial_failed = true
trial succeeds if balance never hit 0 throughout life
Deterministic version ("If Markets Were Steady"): runs the same loop with sigma=0, finds the user contribution that leaves balance exactly at zero at end of life. The simulation is linear in C, so we use 2-point linear interpolation: F(0) and F(1), then C* = −F(0) / (F(1) − F(0)).
Probabilistic version ("Required Monthly Investment"): binary-searches the user contribution where the fraction of MC trials surviving (positive balance throughout) equals the chosen target probability.
The chart spans your full life: you'll see the balance grow during the accumulation years, peak around retirement, then decline as you withdraw. Trials that hit zero stay flat at the bottom.
Each cell shows the % of your annual income to invest, starting from $0, to replace your income at retirement using the 4% rule. Adjust assumptions to see how the table shifts.
Rows = your current age. Columns = your target retirement age. Color = how aggressive that rate is.
↓ Current Age · → Target Retirement AgeThe cell at row A (current age) and column R (retirement age) shows: "if you currently have $0 invested, what % of your annual income do you need to invest every year — held constant as a % of your growing income — to be able to retire at age R and replace 80% of your then-current income, assuming 4% withdrawals?"
Following Money Guy's published convention, the assumed nominal annual return depends on your current age:
r_nominal(age) = max(5.5%, 10% − 0.1% × (age − 20))
So a 20-year-old uses 10% throughout the projection, a 30-year-old uses 9%, a 40-year-old uses 8%, and so on, floor at 5.5% by age 65. The idea: younger people can hold more equity exposure for longer.
To work in today's dollars, the nominal return is converted to a real (inflation-adjusted) return:
r_real = (1 + r_nominal) / (1 + inflation) − 1
If wage growth equals inflation (the default 3% / 3%), real income is constant at $1. Otherwise it grows at the real wage growth rate:
g_real = (1 + wage_growth) / (1 + inflation) − 1 real_income(year y) = (1 + g_real)^y
Replace p of your future real income at withdrawal rate w:
target_real = (p × real_income_at_retirement) / w
= (0.80 × (1 + g_real)^N) / 0.04
= 20 × (1 + g_real)^N
(With the default 3%/3% assumption, this just equals 20× current real income.)
sIf you contribute s × real_income(y) at the start of each year for N years, the future value (in real $) is:
FV = s × R × (g^N − R^N) / (g − R) where g = 1 + g_real, R = 1 + r_real
Set FV = target_real and solve for s. Cells where s > 90% are shown as N/A — the goal is mathematically possible but not realistic.
Spot-checked across the table: most cells match exactly, a handful differ by 1pp due to rounding/convention differences in their internal calculation. The math here is the standard FV-of-growing-annuity formula and is reproducible from the assumptions above.