Monte Carlo · Methodology
Output Statistics
Every number the simulation reports, defined exactly. Several of these are routinely misread in the industry, usually in the direction of making a plan look more certain than it is, so each definition below states both what the number is and what it is not.
The wealth fan chart
At each month-end, wealth across all paths is sorted and the P5, P25, P50, P75 and P95 quantiles are recorded. The chart is available on a nominal and an inflation-adjusted basis, with a linear/log axis toggle, the goal and wealth-floor lines drawn on their matching basis, and the engine's deterministic invested-capital schedule overlaid on the nominal view.
A band edge is not a path, and not a confidence interval
These are pointwise quantiles: the P95 line at year 10 and the P95 line at year 20 generally belong to different paths. No single simulated path traces the upper edge. And the band is a spread of simulated outcomes under a fixed model, not a confidence interval for the model being right. The two are constantly confused and they are not the same object.
Goal probability and its four bases
Goal probability is the fraction of paths whose terminal wealth meets or exceeds your goal. A goal is evaluated against exactly one terminal series, chosen explicitly and stored with the result:
| Basis | Deducts |
|---|---|
| Nominal pre-tax | Nothing. Raw terminal wealth. |
| Nominal liquidation-net | Illustrative terminal tax and terminal trade cost. |
| Real pre-tax | Simulated inflation. |
| Real liquidation-net | Inflation, plus terminal tax and trade cost. |
With tax disabled but a non-zero trade cost, liquidation-net wealth still differs from pre-tax wealth. A liquidation-net goal line is deliberately not drawn on the pre-tax fan chart, because those axes are not comparable and overlaying them would be misleading.
Alongside the terminal figure, a pathwise per-month goal-attainment series with per-point Wilson intervals is reported as the goal-probability-over-time chart. When the goal basis is liquidation-net, that monthly curve monitors the pre-tax counterpart and says so on the chart, because monthly wealth is tracked pre-tax.
Wilson intervals on every probability
A probability estimated from a finite number of paths carries sampling error. Goal, terminal-depletion, wealth-floor and withdrawal-health probabilities all carry a 90% Wilson score interval:
The Wilson interval is used rather than the textbook normal approximation because the latter breaks down exactly where these probabilities matter most. Near 0 or 1 it produces intervals that extend outside [0, 1] and whose actual coverage is far below nominal. A goal probability of 0.98 is precisely the case where you want the interval to be trustworthy, and Wilson stays well behaved there.
These intervals cover simulation sampling error only, conditional on the recorded model and frozen history. They are not confidence bands for model correctness. Running more paths narrows them toward zero width; it does not make the underlying model any more right.
Terminal wealth distribution
A nominal pre-tax histogram plus an exceedance curve, giving P(ending at or above any wealth level), drawn from the engine's exact P0 to P100 terminal quantile grid. Real and illustrative liquidation-net terminal percentiles are reported in separate tiles rather than being silently overlaid on an incompatible axis.
The selected terminal basis also carries separate 90% path-bootstrap intervals on its P5, P50 and P95 wealth quantiles, shown with the terminal tiles. Quantile uncertainty is not the same as probability uncertainty, so it gets its own estimator rather than reusing the Wilson interval.
Path risk: drawdown and underwater spells
Maximum drawdown and the longest underwater spell are computed daily inside every path, then summarized across paths. Computing them from monthly snapshots would systematically understate both, because a sharp intra-month decline and recovery would never appear.
The underwater spell is the longest consecutive stretch during which wealth sat below its running peak. Spells still unrecovered at the horizon are right-censored, and P(unrecovered at horizon) is reported beside the duration distribution. Silently treating a censored spell as if it ended at the horizon would bias the reported durations downward, which is the classic survival-analysis error.
Dense P0 to P100 quantile grids are reported for maximum drawdown, longest underwater spell and the one-year NAV return, along with P(negative one-year NAV return) and its Wilson interval.
Drawdown state by month
For each month-end, the engine reports the share of paths currently underwater and the share currently at least 5%, 10%, 20% or 30% below their running peak.
Read the word “currently” carefully. This is the state at that month, not “ever breached by then”. The distinction matters: an ever-breached measure is monotonically increasing and eventually approaches one for any horizon, which tells you almost nothing. A current-state measure rises and falls, showing how drawdown risk builds early and decays as contributions and growth lift the typical path above its old peaks.
Forward VaR and CVaR
One-year VaR is stored as a signed lower-tail return: the 5th percentile at the 95% level, or the 1st percentile at 99%. CVaR is the signed average return beyond that cutoff. Negative values are losses, so a VaR of −0.28 means a 28% loss. No sign flipping is applied anywhere, which removes an entire category of misreading.
The two are computed independently and returned with separate bootstrap interval blocks, because they are different estimators with different sampling behaviour. Each CVaR bootstrap replicate recomputes both its own VaR cutoff and its tail mean, rather than holding the cutoff fixed at the point estimate. The shared interval metadata records the confidence level, bootstrap method, resampling unit, signed-tail semantics, and the model-conditional scope.
Tail estimates need enough extreme paths to mean anything. The result includes expected and observed tail counts plus a reliability warning when fewer than 25 tail observations are expected, which is exactly the situation where a 99% CVaR from a small run would otherwise look authoritative while resting on a handful of paths.
Depletion and wealth-floor measures
Three different questions get three different numbers, and they are deliberately not merged:
- P(terminal depletion) is the fraction of paths whose wealth is exactly zero at the horizon. Terminal only.
- P(ever depleted) is the fraction that hit zero at any point. A path can deplete and later be revived by a contribution, so this is strictly the larger number and answers a different question.
- P(wealth-floor breach) is the chance the selected wealth basis touches or falls below your configured floor at the start, after any cash-flow or rebalance event, or at month-end. It is not a terminal test, and it does not observe every intra-month daily move.
Withdrawal plans additionally report the probability that every scheduled withdrawal was funded, cumulative-shortfall percentiles, and first-shortfall-year percentiles.
For accumulation-only plans, exact-zero terminal depletion is hidden rather than displayed as 0%. Under the gross-return floor it is structurally near-impossible, so it is not a useful solvency indicator and showing it would invite false comfort. Configure a nominal or real wealth floor to measure planning-relevant low-wealth risk instead.
Crisis scenario outputs
Scenarios re-run the full simulation under stressed sampling and are shown side by side with the base run. Common random numbers pair scenario and base paths, so the delta isolates the stress instead of mixing in fresh sampling noise.
- 2008 repeat and COVID repeatgive block starts inside the named historical window a 5× sampling multiplier at every restart. These are repeated crisis-frequency stresses, not a one-time chronological replay of the event. Available only under block_bootstrap.
- Single-name blowupapplies one −40% one-day shock per simulated path-year to an eligible concentrated holding above 5% weight, testing idiosyncratic risk that index-level history never shows.
- Bear regime start forces every path to open in the high-volatility state. Available only under regime_bootstrap.
Scenario output is conditional stress performance. It is not an estimate of how likely the named event is, and the engine never attaches a probability to a scenario. A scenario your data cannot support, such as a COVID window when the frozen history starts after 2020, is reported in skipped_scenarios with the reason rather than silently dropped.
The standing caveat on all of it
Every probability on this page is conditional on the selected return process, the frozen history, and the drift, cash-flow, inflation, tax and cost assumptions recorded with the run. No rolling-origin probability-calibration claim has been established for any of them.
History bounds the tail: a future crisis worse than anything in your sample is, by construction, not in the distribution. Beyond roughly 15 years the drift assumption dominates every other choice, so 30-year percentiles are scenario analysis, not prediction.