Monte Carlo · Methodology

Drift and Estimation Risk

Read this before trusting any fan chart. Over a long horizon, the assumed average return dominates every other modeling choice on this site combined, and it is the input we know least precisely. This page explains why, and what the engine does about it.

The problem, quantified

Every resampling simulator centres its future on the historical average return. That average is an estimate, and its precision is governed by the length of the sample in years, not by the number of observations. With roughly 23 years of usable NSE history at about 18% annualized volatility, the standard error of the mean is

A two-standard-error interval on the expected return is therefore roughly 15 percentage points wide. Compounded over 15 to 40 years, that uncertainty dwarfs everything else in the simulation, and it is worth being precise about why: sampling to daily frequency does not help. Going from annual to daily data multiplies the observation count by 252 while dividing the per-observation variance by the same factor. The standard error of the annualized mean is unchanged. Only a longer calendar span helps, and you cannot buy more history.

This is also why more paths do not fix it. Running 50,000 paths instead of 1,000 reduces Monte Carlo sampling noise. It does nothing whatsoever to the uncertainty in the parameter those paths are all centred on.

Per-path mean perturbation, on by default

The engine's primary answer is to stop pretending the mean is known. When drift uncertainty is enabled, which is the default, each path draws its own mean perturbation

held constant for the whole of that path's life. The resulting fan therefore reflects two distinct sources of dispersion: path noise, which shrinks as you add paths, and parameter uncertainty, which does not. That is the honest decomposition, and it is why the default is on rather than off.

The covariance is the Newey-West long-run covariance of the sample mean, not the IID :

with Bartlett kernel weights and the standard bandwidth . The reason is consistency: under the serial dependence that the block bootstrap deliberately preserves, the IID formula understates mean-estimation risk. Using a HAC estimator means the uncertainty layer assumes the same dependence structure the sampler reproduces, instead of contradicting it. The Bartlett kernel also guarantees a positive-semidefinite result, so it is always a valid covariance to draw from.

The four drift modes

Perturbation handles uncertainty around a centre. The drift mode chooses the centre itself.

historical— the default

Use the sample mean as it stands. Appropriate when you have no view, and the natural baseline. It inherits the full estimation error described above, which the perturbation layer then exposes rather than hides.

override— state your own assumption

Replace the historical mean with an explicit annual figure. The engine adds one constant daily shift to every asset so that the portfolio hits the target, which leaves tails, cross-asset structure and relative asset means untouched. Same shape, different level, or as the engine comments put it, “same tails, humbler mean”.

shrunk— blend history with a view

A weighted average of the historical mean and your anchor, with the weight on history supplied directly as shrink_weight. Simple and transparent, but the weight is a judgment call you make rather than a quantity derived from anything.

forward_shrunk— precision-weighted blend

Rather than picking a weight, you declare how confident you are in your forward anchor, as one annualized standard deviation. The weight on history is then derived by precision weighting:

where is the HAC variance of the portfolio's daily sample mean and is your declared anchor uncertainty in daily units. The behaviour is the intuitive one: a confident anchor, meaning small prior variance, pulls the resolved drift toward your view, while a vague anchor defers to history. This is the standard Bayesian posterior mean for a normal prior on a normal likelihood, and the point is that the weight is derived from two stated uncertainties rather than being an arbitrary slider.

Arithmetic mean, not CAGR

The annual input is an annualized arithmetic mean. The engine converts it as . It is not a target CAGR, and conflating the two is one of the most common errors in retirement modeling.

The gap between them is volatility drag. To a good approximation,

so at 18% volatility the compound growth rate sits roughly 1.6 percentage points below the arithmetic mean. Entering 12% here does not mean the median path grows at 12%. FolioLab keeps the two quantities under separate names in the result: the historical arithmetic annual mean, and a separately calculated daily-rebalanced constant-weight proxy CAGR. The proxy is descriptive calibration context. It is not the CAGR of a buy-and-hold portfolio, and it is not labeled as one.

How drift enters each process

Simple-return processes (block bootstrap, regime bootstrap, Gaussian, Student-t) receive drift as an additive constant daily shift applied to every asset, with the per-path perturbation added on top in the same units.

Log-domain processes (both FHS variants and lognormal GBM) fold drift and the perturbation into the log mean themselves, because adding a simple-return shift on top of a log-space simulation would break positive support and miss the Jensen correction. Their per-asset log mean is set so the conditional expected gross return equals the declared daily arithmetic target exactly, using the empirical cumulant generating function of the residual pool for FHS and the closed-form for GBM. The engine's additive drift layer is explicitly skipped on those paths, so the correction is applied once rather than twice.

Either way, the drift target is resolved once per run from the frozen panel plus the configuration, so the base run and every crisis scenario share one drift. A scenario measures the stress, not a different drift assumption.

How to read the result

Every goal probability is labeled with the drift assumption behind it, and forward_shrunk runs additionally report the derived historical weight and the method used to derive it. Nothing about the drift choice is implicit.

The practical reading rule: treat long-horizon percentiles as ranges under stated assumptions, never as forecasts. Beyond roughly 15 years the drift assumption dominates the process choice, the tax model and the inflation model put together. If a plan only works under the historical mean and fails under a mean two percentage points lower, you have learned something far more useful than any single probability the simulation can print.

References

  • Newey, W. K., & West, K. D. (1987). A Simple, Positive Semi-Definite, Heteroskedasticity and Autocorrelation Consistent Covariance Matrix. Econometrica, 55(3), 703–708.
  • Merton, R. C. (1980). On Estimating the Expected Return on the Market. Journal of Financial Economics, 8(4), 323–361. The classic statement that expected returns are far harder to estimate than variances.
  • Jorion, P. (1986). Bayes-Stein Estimation for Portfolio Analysis. Journal of Financial and Quantitative Analysis, 21(3), 279–292.
  • Best, M. J., & Grauer, R. R. (1991). On the Sensitivity of Mean-Variance-Efficient Portfolios to Changes in Asset Means. Review of Financial Studies, 4(2), 315–342.

Related: Expected Returns covers the estimation problem in the optimization context, and Black-Litterman applies the same precision-weighting idea to blending views with equilibrium returns.