finance-business · personal-investing · risk-behaviour

Monte Carlo Retirement Success Calculator

Simulate 100 market futures for a retirement plan inside a seeded, reproducible workbook and see the share in which the money lasts, the spread of balances year by year, when failures happen, and how a smaller withdrawal, a later start or lower volatility moves the odds. Returns are lognormal with the average and volatility you enter, less fees; withdrawals rise with inflation. Estimates for education, not advice.

Last updated

Calculator overview

Inputs and outputs

This summary comes from the calculator's published input and output contract.

Inputs

Starting balance (required)
About this input

Money invested at the start, in dollars. The simulation starts every future from this amount.

Unit currency Default 1200000 Range 0 to 1000000000000
Random seed
When omitted Blank
About this input

The starting number of the workbook's random-number generator, a whole number from 1 to 2,147,483,646. The same seed and inputs always give the same result, so passing a result's seed again reproduces it. Leave blank for 42, the seed of the published examples. The web page does not show this input: each Run simulation press first sets it to the last result's next seed.

Default Not set Range 1 to 2147483646
Volatility (standard deviation of yearly returns) (required)
About this input

How much yearly returns swing around the average, as a standard deviation. 0 makes every future identical; a larger figure spreads the futures wider.

Unit % Default 0.11 Range 0 to 0.6
Years until withdrawals start
When omitted Blank
About this input

Years of saving before withdrawals start. Leave blank, or enter 0, if withdrawals start now. Must be less than the years the money must last.

Unit years Default Not set Range 0 to 49
Yearly withdrawal, in today's dollars (required)
About this input

What you take out each year once withdrawals start, in today's dollars. It rises with inflation from the first year, so it keeps its buying power, and it is taken at the start of each year before that year's return.

Unit currency/yr Default 48000 Range 0 to 1000000000000
Expected yearly return (average) (required)
About this input

The average yearly return you assume, before fees, as an arithmetic mean. Each simulated year draws a growth before fees whose expected value matches this figure; the fees are then taken.

Unit % Default 0.055 Range -0.2 to 0.3
Yearly contribution until then, in today's dollars
When omitted Blank
About this input

What you add each year until withdrawals start, in today's dollars, up to 100,000 a year, rising with inflation and added at the start of each year. Leave blank for none. When withdrawals start now it does not enter your plan, but the retire-later comparison adds it in its 2 extra saving years.

Unit currency/yr Default Not set Range 0 to 100000
Yearly fees (required)
About this input

Yearly costs as a share of the balance, such as fund expenses and advice fees. They reduce each year's growth.

Unit % Default 0.002 Range 0 to 0.05
Yearly inflation (required)
About this input

The yearly rise in prices applied to withdrawals and contributions. It does not change the returns, which are nominal.

Unit % Default 0.025 Range 0 to 0.1
Years the money must last (required)
About this input

How many years the money has to last, from today to the end of the plan, including any saving years. A future succeeds when its balance is still above zero at the end of the last year.

Unit years Default 30 Range 1 to 50

Outputs

Workbook self-check
About this output

PASS when the workbook's model consistency checks hold for this result: the generator states in range, every grid complete and every future counted, and every statistic consistent and in order. FAIL means the result should not be trusted; please report it.

No unit declared
Share of futures where the money lasts
About this output

The share of simulated futures in which the balance is still above zero at the end of the horizon. It is an estimate from a sample of futures, within about the sampling error shown.

Unit %
Seed used
About this output

The seed this result used: the seed supplied, or 42 when left blank. Pass it again with the same inputs to reproduce this result exactly.

No unit declared
Balances and share run out by year
About this output

Balances by year at the 10th, 25th, 50th, 75th and 90th percentiles of the simulated futures, and the share of futures that have run out by each year. The table behind the fan and depletion charts.

No unit declared
Sampling error of the success rate
About this output

About how far, in percentage points, this success rate could sit from the rate that a very large number of futures would give: the 95 percent margin of a share estimated from this many futures, at its widest. 9.8 points at 100 futures. Two runs with different seeds are two such estimates, so the 95 percent range of their difference is wider, about 1.4 times this margin (13.9 points at 100 futures).

Unit percentage points
Futures simulated
About this output

The number of futures this result simulated: always 100.

Unit trials
Lowest balance at the horizon
About this output

The lowest ending balance of any simulated future, often zero.

Unit currency
Success retiring 2 years later Conditional
About this output

The success rate if withdrawals started 2 years later, with 2 more years of contributions, over the same horizon and the same simulated markets. It is blank, and not shown, when withdrawals would then start at or after the end of the horizon.

Unit %
Success with volatility 3 points lower
About this output

The success rate if volatility were 3 percentage points lower (not below 0), keeping the same average return and the same random draws.

Unit %
Success with a 10% smaller withdrawal
About this output

The success rate if the yearly withdrawal were 10 percent smaller, using the same simulated markets.

Unit %
90th-percentile balance at the horizon
About this output

The ending balance that 90 percent of futures fall below; only 1 future in 10 does better.

Unit currency
Ending balances
About this output

The ending balances sorted into 20 equal bins from zero to the chart's top. The first bin includes every future that ran out.

No unit declared
Top of the ending-balance chart
About this output

The top of the ending-balance chart: the 95th percentile of ending balances, so that a few extreme futures do not flatten it. When no future that lasted ends at or below that percentile, it is the highest ending balance instead; that happens once 95 or more of the 100 futures run out. When every future runs out, it is the highest balance any future reached.

Unit currency
Futures ending above the chart's top bin
About this output

How many futures end above the chart's top bin: at most about 5 percent of them, and none when the top is the highest ending balance.

Unit futures
Highest balance at the horizon
About this output

The highest ending balance of any simulated future. A single lucky future, not a forecast.

Unit currency
Balance at the horizon at the average return
About this output

Where the plan ends if every year earned exactly the average return after fees, with no ups and downs. It usually sits above the median, because losses in bad years compound.

Unit currency
Next seed in the same stream
About this output

A new seed from the same generator, the start of the next unused stretch of its sequence: a run with it draws fresh futures that share no draw with these. On the web page each Run simulation press first enters it as the seed, except the first press after a worked example or Reset.

No unit declared
10th-percentile balance at the horizon: more than 1 future in 10 ran out
About this output

The ending balance that 10 percent of futures fall below. Zero means more than 10 percent of futures ran out of money, and the label then says so.

Unit currency
Model Status
About this output

Whether the inputs describe a plan the workbook can simulate, any result to notice, or OK. The NOT VALID and CHECK reasons are listed in the methodology.

No unit declared
Median balance at the horizon
About this output

The middle ending balance: half the futures end above it and half below.

Unit currency
Median of each future's lowest balance
About this output

For each future, its lowest balance along the way, counting today's starting balance; this is the middle of those lowest points. It shows how far a typical future dips, and it reads 0 whenever the starting balance is 0.

Unit currency
This page is provided by LogicCommons for informational purposes only. Results are model outputs computed from the inputs you supply and are not financial, investment, tax, accounting, or legal advice, and no advisory relationship is created. Verify all inputs and results independently before relying on them in any decision.

LogicCommons is in beta. If a result, label, or reference looks wrong, tell us here; we read every message.

Methodology

Purpose and model boundary

This calculator estimates how often a retirement plan's money lasts. You enter a starting balance, the yearly withdrawal you plan, an expected return and its volatility, fees, inflation and the number of years the money must last, and optionally a number of saving years first. The spreadsheet then simulates 100 possible market futures, one yearly return after another, and reports the share of futures in which the balance is still above zero at the end of the horizon, how the balances spread year by year, when the futures that fail run out, and how a smaller withdrawal, a later start or lower volatility moves the odds.

It is a probabilistic companion to a fixed-return drawdown projection such as the Retirement Drawdown Withdrawal Calculator, not a replacement for it: the drawdown calculator answers what happens at one steady return, this one how the answer spreads when returns vary from year to year. The Retirement Savings Projection Calculator covers the saving years in more detail. Every figure on this page is computed by the spreadsheet; the page adds nothing to it. It is an educational estimate from the assumptions you enter. It does not predict markets and it is not financial, investment, tax or legal advice.

Inputs and units

  • Starting balance: the money invested today, in dollars.
  • Yearly withdrawal, in today's dollars: what you take out each year once withdrawals start. It rises with inflation from the first year, so it keeps its buying power.
  • Years until withdrawals start: the saving years before the first withdrawal. Optional; blank means withdrawals start now. It must be less than the years the money must last.
  • Yearly contribution until then, in today's dollars: what you add each year until withdrawals start, up to $100,000 a year, rising with inflation and added at the start of each year. Leave blank for none. When withdrawals start now it does not enter your plan, but the retire-later comparison adds it in its 2 extra saving years.
  • Years the money must last: the horizon, from today to the end of the plan, saving years included, from 1 to 50 years.
  • Expected yearly return (average): the average yearly return you assume, before fees, as an arithmetic mean, from −20% to 30%. Each simulated year draws a growth before fees whose expected value matches this figure; the fees are then taken.
  • Volatility (standard deviation of yearly returns): how much yearly returns swing around the average, as a standard deviation, from 0% to 60%. 0 makes every future identical; a larger figure spreads the futures wider.
  • Yearly fees: a share of the balance taken every year, from 0% to 5%.
  • Yearly inflation: the rise applied to withdrawals and contributions, from 0% to 10%. It does not change the returns.
  • Number of simulated futures: always 100. It is not an input.
  • Random seed: the starting number of the spreadsheet's random-number generator, a whole number from 1 to 2,147,483,646. Blank means 42, the seed of the worked examples. The page does not show it: each press of Run simulation first sets it to the next seed of the last result, except that the first press after a worked example or Reset uses that example's seed. Through the API or MCP the seed you pass is used as given, so passing a result's seed again reproduces it.

Rates are percentages, such as 5.5% for the expected return. Money is in dollars and nominal: balances are not deflated, and only the withdrawals and contributions are stated in today's dollars and grown with inflation. The arithmetic is the same in any currency.

Governing relationships

Each future draws its yearly random numbers from one seeded generator, the minimal standard generator with multiplier 48,271:

x(next) = 48271 × x mod (2^31 − 1)

Future r starts 64 × r steps along the generator's stream from the seed, so no two futures share a draw and the same seed always gives the same futures. Each state x becomes a uniform draw u = x ÷ (2^31 − 1), strictly between 0 and 1.

Each uniform draw becomes a yearly return after fees through the lognormal distribution whose mean is 1 plus the expected return μ and whose standard deviation is the volatility v, where Z is the standard normal value whose probability is u and f is the fee rate:

1 + R = e^(m + s × Z) × (1 − f)

s² = ln(1 + v² ÷ (1 + μ)²)

m = ln(1 + μ) − s² ÷ 2

With these two parameters the growth factor before fees has a mean of exactly 1 + μ and a standard deviation of exactly v. With a volatility of 0 every year earns exactly (1 + μ)(1 − f).

The balance moves year by year. Contributions are added, or the withdrawal taken, at the start of the year, and the year's return applies to what remains. In year t the flows are the typed amounts grown with inflation i from the first year:

C(t) = contribution × (1 + i)^(t − 1) and W(t) = withdrawal × (1 + i)^(t − 1)

B(t) = (B(t − 1) + C(t)) × (1 + R(t)) in a saving year

B(t) = max(0, (B(t − 1) − W(t)) × (1 + R(t))) in a withdrawal year

A balance that reaches zero stays at zero. A future succeeds when its balance at the end of the horizon is above zero.

Calculation sequence

  1. The spreadsheet fills the three optional inputs with their standard values (no saving years, no contribution, seed 42), fixes the count at 100 futures, and checks every input, as described below.
  2. From the seed it computes each future's starting point along the generator's stream, then each future's generator states for every year of the horizon.
  3. The states become uniform draws, and the draws become yearly returns after fees.
  4. Each future's balance is carried year by year from the starting balance, with the year's contribution or withdrawal and its return.
  5. For each year the spreadsheet takes the 10th, 25th, 50th, 75th and 90th percentiles of the balances, and the share of futures that have run out.
  6. At the horizon it counts the futures still above zero, takes the summary figures, sorts the ending balances into the chart's bins, and repeats the balance step on the same draws for the three variants.
  7. It runs its self-check and chooses the status line.

Outputs and interpretation

Share of futures where the money lasts is the headline: the share of simulated futures whose balance is still above zero at the end of the horizon. It is an estimate from a sample of futures. The sampling error is about how far, in percentage points, this success rate could sit from the rate that a very large number of futures would give: the 95 percent margin of a share estimated from this many futures, at its widest. It is 9.8 points at 100 futures. Two runs with different seeds are two such estimates, so the 95 percent range of their difference is wider, about 1.4 times this margin (13.9 points at 100 futures). The worked example's 63.0% at seed 42 is 59.0% at seed 7, 4.0 points apart.

The 90th-percentile balance at the horizon is the ending balance that a tenth of the futures end above. The lowest balance at the horizon is a single future, often zero. The balance chart and the balances table give the 10th, 25th, 50th (the median), 75th and 90th percentiles for every year, the horizon included: half the futures end above the median, and when the 10th percentile reaches zero, more than one future in ten has run out.

The dashed average-return path on the balance chart is the plan with no ups and downs: every year earns exactly (1 + the expected return)(1 − fees). It usually sits above the median, because losses in bad years compound: this gap is the cost of volatility. In the first worked example it ends at $928,226 against a median of $478,174.

The percentile table gives, for every year, the five percentiles and the share of futures run out by then. That share is zero in the saving years and never falls after withdrawals start; at the horizon it is one minus the success share. The ending-balance table sorts the futures into 20 equal bins from zero to the chart's top. The top is the 95th percentile of the ending balances, so that a few extreme futures do not flatten the chart. When no future that lasted ends at or below that percentile, it is the highest ending balance instead; that happens once 95 or more of the 100 futures run out. When every future runs out, it is the highest balance any future reached. Bin 1 counts every future that ran out together with those that ended with a small positive balance, and the futures that ran out are counted separately beside it. The futures that end above the top are in no bin and are not drawn: at most about 5% of them, and none when the top is the highest ending balance.

What moves the odds gives the success share with one change, each on the same simulated markets: a withdrawal 10% smaller; withdrawals starting 2 years later, with 2 more years of contributions, over the same horizon; and volatility 3 percentage points lower (not below zero) with the same average return and the same random draws. When withdrawals would start at or after the end of the horizon, the retire-later result is blank: the page does not show it, an API or MCP caller receives no value for it, and its bar is left out of the chart, whose slot is named "Retire 2 years later (no withdrawal years left)".

The futures simulated always reads 100. The seed used says which run this is: 42 when the seed is blank, otherwise the seed the run used. The same inputs and seed always give the same result. The next seed in the same stream starts the next unused stretch of the generator's sequence: Run simulation normally enters it before running, drawing fresh futures that share no draw with the one before. The first press after a worked example or Reset keeps its seed, and a press with no usable prior result or retrying a failed run keeps the seed already held. The workbook self-check reads PASS when the spreadsheet's own checks hold for this result.

An API or MCP caller also receives nine figures the page does not print: the fixed future count, the median and 10th-percentile balances at the horizon, the highest balance at the horizon, the median of each future's lowest balance along the way (counting today's starting balance, so it reads 0 whenever the starting balance is 0), the balance at the horizon at the average return, the top of the ending-balance chart, the number of futures ending above it, and the next seed.

Validation and status logic

The status line is the spreadsheet's own verdict. It is the first of these that applies:

  • NOT VALID: the years the money must last must be a whole number from 1 to 50
  • NOT VALID: years until withdrawals start must be a whole number from 0 to 49
  • NOT VALID: withdrawals must start before the horizon ends
  • NOT VALID: the number of simulated futures is not 100; this is a defect in the workbook, please report it
  • NOT VALID: the random seed must be a whole number from 1 to 2,147,483,646
  • NOT VALID: the starting balance and withdrawal must be amounts from 0 to 1 trillion dollars, and the contribution from 0 to 100,000 dollars
  • NOT VALID: the expected return must be between -20% and 30% a year
  • NOT VALID: volatility must be between 0% and 60% a year
  • NOT VALID: fees must be between 0% and 5% a year
  • NOT VALID: inflation must be between 0% and 10% a year
  • NOT VALID: there is nothing to simulate; enter a starting balance, or a contribution with years until withdrawals start
  • NOT VALID: the simulation did not complete; this is a defect in the workbook, please report it
  • CHECK: the self-check of the workbook failed for this result, so do not rely on it; please report it
  • CHECK: volatility is 0, so every simulated future is the same and the success rate can only be 0% or 100%
  • CHECK: fewer than 100 futures were simulated; this is a defect in the workbook, please report it
  • CHECK: no withdrawal is entered, so no future can run out of money
  • OK

A NOT VALID: verdict replaces the figures: every figure reads zero, the seed used included, and the tables are empty. A CHECK: verdict comes with the figures.

The self-check reads the Model consistency checks on Calculations, not a separate reference comparison. These checks do not depend on how an engine computes the normal distribution. They cover the generator states being inside their valid integer range; the counts, with every grid filled for every future and year, and the bins plus the futures above the top accounting for every future; and the consistency and ordering of every statistic: the percentiles rise from the 10th to the 90th in every year, the share run out is zero in the saving years and never falls, the success share and the share run out at the horizon add up to one, the lowest ending balance is at most the 10th percentile and the highest at least the 90th, and a smaller or later withdrawal never leaves a future lower than your plan does. It reads FAIL when any of them does not hold, and the status line then says not to rely on the result. The checks that depend on how an engine computes the normal distribution are kept out of it, so that engine's last-digit differences do not fail it.

Every check this workbook makes applies to the web page, an API call and an MCP call alike; the platform first refuses out-of-bounds, mistyped and missing required values in its own words. So a horizon, saving years or a seed outside its range or not a whole number, an amount, return, volatility, fee or inflation outside its range, and a blank required input are refused before the spreadsheet is asked, and the spreadsheet's own lines for them are a second line of defence. Saving years that reach the horizon and a plan with nothing to simulate are refused by the spreadsheet; zero volatility or zero withdrawal computes with a CHECK.

Assumptions and limitations

  • Each year's return is drawn independently of every other year: there is no mean reversion, no change of market regime and no sequence effect beyond independent yearly draws.
  • One portfolio with one return distribution, lognormal with the average and volatility you enter; no fat tails and no several assets with correlated returns.
  • Fees are a flat share of the balance every year.
  • Withdrawals and contributions are constant in today's dollars, grown with inflation from the first year and taken at the start of each year; spending does not respond to markets.
  • Balances are nominal and are not deflated.
  • No taxes, account types, Social Security, pensions or required minimum distributions are modelled.
  • The success share is an estimate from 100 futures, within about the sampling error; another seed gives another estimate.
  • The horizon is at most 50 years.

Restrictions and non-computing states

Each numeric control offers a working range chosen for usable entry, which is not always the limit this calculator enforces; a value outside that limit is rejected with a message rather than quietly accepted. The calculator additionally enforces allowed choices, active-field types, complete fixed-grid rows, and conditional or cross-field rules before computing.

The horizon, the saving years and the seed must be whole numbers. Saving years that last as long as the horizon or longer leave no withdrawal year and are not computed. A plan with no starting balance and no contribution in a saving year has nothing to simulate and is not computed.

Errors and warnings

The page calculates once when it opens, with the shipped inputs, and afterwards only when you press Run simulation. While you change the inputs the last result stays on the page, dimmed, until you run again. Each press first enters the next seed in the stream, so pressing again runs new futures. The first press after a worked example or Reset keeps its seed, so a worked example shows its documented figures, and so does a press after a result that could not be computed or a run that failed. A value outside an input's limit is flagged under the field before you run; the calculation service still decides, and if it refuses an input the page names the input and the reason and keeps the last result. A blank required input is asked for before anything is sent. If the service does not answer within 30 seconds, the page says so and keeps your inputs and the last result. A NOT VALID: status means the figures cannot be computed and none are shown; a CHECK: status is shown with the figures. A self-check of FAIL, or the status saying the simulation did not complete, points to a defect in the workbook rather than in your inputs: please report it.

References

Sources and further reading

The model is the spreadsheet's own simulation of the assumptions you enter. It uses no published return, rate, table or market data: every return, fee, inflation rate and amount is your own. The sources below define the random-number generator, the return distribution and the percentile rule it uses; they supply no figure to it.

  • S. K. Park and K. W. Miller, "Random number generators: good ones are hard to find," Communications of the ACM 31(10), 1988, pages 1192 to 1201. doi.org/10.1145/63039.63042. The minimal standard generator and its modulus 2^31 − 1.
  • S. K. Park, K. W. Miller and P. K. Stockmeyer, response in "Technical correspondence," Communications of the ACM 36(7), 1993, pages 105 to 110. doi.org/10.1145/159544.376068. The multiplier 48,271 this generator uses. The same generator, with the same multiplier and modulus, is the C++ standard library's minstd_rand: cppreference, std::linear_congruential_engine.
  • NIST/SEMATECH e-Handbook of Statistical Methods, section 1.3.6.6.9, "Lognormal Distribution." itl.nist.gov/div898/handbook/eda/section3/eda3669.htm. The lognormal distribution's mean and standard deviation, which the moment matching of the yearly returns inverts.
  • R. J. Hyndman and Y. Fan, "Sample quantiles in statistical packages," The American Statistician 50(4), 1996, pages 361 to 365. doi.org/10.1080/00031305.1996.10473566. The percentile rule the spreadsheet uses is their definition 7.
  • Microsoft Support, "NORM.S.INV function" (support.microsoft.com) and "PERCENTILE.INC function" (support.microsoft.com). The inverse standard normal distribution that turns each uniform draw into a normal value, and the percentile of a range interpolated between its values.

Links were current at build time. If one moves, search the document's title rather than reporting a broken link as a defect.

No table or text from any standard or publisher is reproduced. The generator's constants are mathematical facts. Microsoft Excel is a trademark of its owner. None of the bodies named here endorses this calculator or has reviewed it.

This model is an educational estimate. It is not financial, investment, tax or legal advice, and it is not a recommendation to save, invest, withdraw or spend any amount. Decisions about retirement spending should be taken with a qualified professional who knows your circumstances.

Results are informational and not professional advice. See our Terms of Use. Powered by SpreadsheetWeb · About · Privacy · Terms