Monte Carlo Simulation in Investing: 10,000 Futures, One Decision
A practical guide to Monte Carlo simulation for investment decisions: geometric Brownian motion, fat-tail corrections with the t-distribution, and the pitfalls that make most retail simulators useless.
Monte Carlo simulation is one of the most misused tools in retail finance. The pitch is seductive: "We ran 10,000 simulations and your portfolio has an 87% chance of beating inflation." The reality is that 95% of those simulators assume returns are normally distributed and independent across time, two assumptions that are demonstrably wrong for almost every financial asset. The output looks rigorous, but it is closer to astrology than statistics.
This article explains how Monte Carlo simulation actually works for equities, the standard model (geometric Brownian motion), why GBM is a bad fit for real markets, and what corrections turn it into something usable.
What Monte Carlo simulation actually does
A Monte Carlo simulation samples thousands of possible future paths from a probability distribution and aggregates the resulting outcomes into a distribution. For a stock, you fix a starting price, a model of how the price evolves, and a time horizon (say, 252 trading days). You then run that model 10,000 times. Each run gives you one possible ending price. The 10,000 ending prices form an empirical distribution from which you can read the median, the 5th percentile (the bad scenario), the 95th percentile (the good scenario), and any other quantile you care about.
The reason this matters is that a single forecast, "AAPL will be at $230 in a year", is almost meaningless without a range of likely outcomes. Monte Carlo gives you the range. The harder question is whether the range it gives you is right.
Geometric Brownian motion: the textbook model
The standard model for stock prices in introductory finance courses is geometric Brownian motion (GBM). The price S_t evolves according to the stochastic differential equation:
dS_t = μ S_t dt + σ S_t dW_tIn plain English: the price changes by a deterministic drift (μ times the current price) plus a random shock (σ times the current price times a standard normal increment). The closed-form solution for the price at time t given the price at time 0 is:
S_t = S_0 · exp((μ − σ²/2) t + σ √t · Z) where Z ~ N(0, 1)To simulate, you draw Z from a standard normal, plug it into the formula, and you have one possible ending price. Repeat 10,000 times, and you have your distribution.
GBM has two virtues. It is analytically tractable (Black-Scholes is built on it), and the prices it produces are always positive (because of the exponential), which is realistic for equities. It has one enormous vice: it assumes the random shocks Z are normally distributed.
The fat-tail problem
If you fit a normal distribution to daily S&P 500 returns from 1950 to today, the fitted distribution will tell you that a single-day move of -5% is a roughly 1-in-10-million event. In reality, the S&P has had a single-day move of -5% or worse at least 14 times since 1950, closer to a 1-in-1,000-day event, or four orders of magnitude more frequent than the normal distribution predicts. October 19, 1987 (Black Monday) was a 22-sigma event under a normal model. Twenty-two sigma. The probability of a 22-sigma event in a normal distribution is approximately zero. And yet, it happened.
The lesson is that financial returns have fat tails. Large moves are rare, but they are vastly more common than the normal distribution predicts. A Monte Carlo simulator that uses normal shocks will systematically underestimate the probability of extreme losses, which is exactly the case where you need accurate probabilities.
Fix #1: Replace normal with Student's t
The simplest and most effective fix is to replace the normal distribution with Student's t-distribution. The t-distribution has a single extra parameter, degrees of freedom (ν), that controls how fat the tails are. As ν → ∞, t converges to normal. For typical equity return data, ν is somewhere between 4 and 8. ARIA fits ν per asset using maximum likelihood estimation on the trailing 1,000 daily returns.
In the GBM formula, you replace Z ~ N(0, 1) with a scaled t draw:
S_t = S_0 · exp((μ − σ²/2) t + σ √t · T_ν) where T_ν ~ t(ν), scaled to unit varianceThe result is a simulation that produces extreme moves at roughly the empirical frequency. The 1-in-a-million events become 1-in-a-thousand events, which is much closer to reality.
Fix #2: Autocorrelation matters at short horizons
A second assumption that GBM gets wrong is that consecutive returns are independent. They are not. Daily equity returns show small but persistent autocorrelation: positive serial correlation at very short lags (microstructure effects) and negative correlation at longer lags (mean reversion over 1-5 days). At weekly and monthly horizons, returns are closer to independent, but at daily, the assumption fails.
For simulations with daily steps, ARIA models log-returns with an AR(1)-GARCH(1,1) structure: returns are autoregressive at lag 1, and volatility clusters (high-vol days follow high-vol days). This is overkill for monthly simulations but materially improves the realism of daily ones.
Fix #3: Volatility is not constant
GBM treats σ as a constant. The empirical fact is that σ is wildly non-constant, VIX can move from 12 to 80 in a week, and realized volatility has obvious regimes (low-vol regimes lasting years interrupted by short high-vol spikes). Constant-σ Monte Carlo cannot produce realistic drawdown sequences because it cannot produce volatility clustering.
GARCH-family models address this by making σ a function of past returns and past volatility. The GARCH(1,1) update rule is:
σ²_t = ω + α · r²_{t-1} + β · σ²_{t-1}With this addition, a single large negative return increases σ for the next several periods, generating clusters of large moves, exactly the pattern observed in real markets.
A worked example: simulating an NVDA-like stock
Suppose we want to simulate a year of an NVDA-like stock with the following parameters: starting price $500, annualized drift μ = 25%, annualized volatility σ = 50%, t-distribution with ν = 5. We run 10,000 paths of 252 daily steps each.
Under normal GBM, the resulting distribution gives a 5th percentile of approximately $260 (a -48% drawdown) and a 95th percentile of approximately $920 (an 84% gain). Under t-distributed GBM with ν = 5, the 5th percentile drops to approximately $215 (-57% drawdown) and the 95th percentile rises to approximately $1,050. The median is roughly the same in both, around $610, but the tails are substantially wider.
The asymmetry matters because position sizing should be calibrated to the bad tail, not the median. If you size a position assuming a worst-case of -48% and the real worst-case is -57%, you have built in a 20% over-leverage.
Common pitfalls
- Assuming normality. The single most common error. If your simulator does not use a fat-tailed distribution, throw it out.
- Ignoring autocorrelation at daily horizons. Compounds with normality to produce unrealistically smooth drawdowns.
- Treating volatility as constant. Misses regime changes entirely.
- Forgetting transaction costs and slippage. A simulation of a strategy that ignores costs will overstate returns by 0.5–2% annually depending on turnover.
- Confusing simulated probability with frequentist probability. A Monte Carlo says "in the model, 5% of paths end below X." It does not say "there is a 5% real-world probability." The map is not the territory.
- Snapping to a point estimate. The whole point of MC is the distribution. If you report only the median, you have wasted the simulation.
Where Monte Carlo fits in a real investment workflow
Monte Carlo is a sizing and risk-assessment tool, not a forecasting tool. The forecast, "this stock has expected return μ", comes from your scoring system. We covered that in "How AI Scores Stocks." Monte Carlo answers a different question: "given that forecast and the variance around it, what is the distribution of outcomes, and how should I size the position?"
For most retail use cases, the right workflow is: score the asset, derive a μ and σ from the score and the trailing realized volatility, run a t-distributed GBM with GARCH volatility for the holding period, read the 5th-percentile drawdown and the median return, then plug those into a Kelly-style sizing formula with a real-world fraction discount (see our Kelly criterion guide). VaR and CVaR, which we explained in "Value at Risk (VaR): A 5-Minute Guide for Investors," are read directly from the simulation output.
Conclusion
Monte Carlo simulation is a powerful tool when it is implemented honestly: fat-tailed shocks, time-varying volatility, autocorrelation at short horizons, and an output that emphasizes the distribution rather than the point estimate. Most retail simulators do none of these, which is why they give such reassuring numbers, and why those numbers do not survive contact with a real bear market.
ARIA runs 10,000-path simulations with t-distributed shocks and GARCH volatility on every analysis. Try it free on any stock, or see the Premium plan for Monte Carlo on portfolios and walk-forward backtests.
Frequently asked questions
What is the difference between VaR and CVaR in a Monte Carlo simulation?
VaR (Value at Risk) is the loss at a given percentile, for example, the 95% VaR is the loss you would not exceed 95% of the time. CVaR (Conditional VaR, also called Expected Shortfall) is the average loss in the worst 5% of paths. CVaR is the better metric for fat-tailed distributions because it captures the severity of the bad tail, not just where it starts. A portfolio with a 95% VaR of -10% but a CVaR of -40% is more dangerous than one with a 95% VaR of -12% and a CVaR of -15%.
How many Monte Carlo paths do I need for a stable estimate?
For the median and the 25th/75th percentiles, 1,000 paths is enough. For the 5th and 95th percentiles, you want at least 10,000 to get stable estimates. For deep tail metrics like 1% VaR or extreme CVaR, you want 50,000+, at which point most retail simulators get too slow to be useful interactively. ARIA uses 10,000 paths as the default, which gives 2-3 significant figures of stability at the 5% tail.
What is the maximum drawdown in a Monte Carlo simulation?
Maximum drawdown is the largest peak-to-trough decline along a single path, expressed as a percentage. In a Monte Carlo with 10,000 paths, you get a distribution of max drawdowns, the median max drawdown is typically much smaller than the worst-path max drawdown. For sizing decisions, the relevant metric is usually the 95th percentile of max drawdowns across paths, not the worst single path. The single worst path is unstable across simulation runs; the 95th percentile is robust.
Ready to put this into practice?
ARIA Analyst applies these methods on any stock, crypto, forex, commodity, or fund. Three free analyses per day on the free tier.