Monte Carlo simulation for trading strategies
Your backtest shows one maximum drawdown. That number is the drawdown from one particular order of trades — the order history happened to deal them. Monte Carlo simulation deals the same trades thousands of different ways and shows you the range of drawdowns you should actually be prepared for.
Why one equity curve isn't enough
Suppose a strategy produced 300 trades. The backtest lines them up in date order and reports, say, an 18% maximum drawdown. But if the five worst losses had happened to fall back-to-back instead of spread across four years, the drawdown would have been far deeper — with exactly the same trades, the same win rate and the same total profit.
Live, you don't get to choose the order. So the historical drawdown is better read as one possible outcome than as the worst case. Planning position size around it is how traders end up surprised by a losing run their backtest "never showed".
The three common methods
1. Reshuffling
Take the actual trade results and randomly reorder them, thousands of times. The total profit never changes, but every reshuffle produces a different path and a different drawdown. This isolates sequence risk — how much of your historical drawdown was luck of the order.
2. Resampling with replacement
Build each simulated history by drawing trades at random from your trade list, putting each one back after it is drawn. Some trades appear twice, some not at all. Now the total profit varies too, which gives a rough sense of how much the overall result itself depends on a few large trades.
3. Stress variations
Randomly skip a share of trades (missed signals, platform outages), add extra slippage to each trade, or widen costs. These test how fragile the result is to the frictions a backtest tends to understate.
What to read from the output
The output is a distribution rather than a single number. The useful figures are percentiles:
| Figure | What it tells you |
|---|---|
| Median maximum drawdown | The drawdown a typical ordering of your trades produces |
| 95th percentile drawdown | A bad-but-plausible case — a sensible number to size against |
| Longest losing streak (95th percentile) | How many losses in a row you should expect to sit through at some point |
| Share of runs ending below a threshold | A rough risk-of-ruin figure for a given account limit |
An illustration of how far apart these can be: a backtest showing an 18% historical drawdown can quite ordinarily produce a 95th-percentile drawdown in the high twenties once the same trades are reshuffled — around one and a half times the typical figure is common. If you sized the account for 18%, the strategy hasn't failed when it reaches 28% — your expectations have.
Where it matters most: hard drawdown limits
If you trade a funded or prop-firm account, the drawdown limit is a wall, not a guideline. Monte Carlo turns the question "could this strategy breach the limit?" into a number: run thousands of paths, apply the firm's actual daily and overall limits, and count how many paths breach. If one path in five breaches a 10% maximum loss at your current risk per trade, you have a sizing problem, not bad luck. The rule details matter a great deal here — see how prop firm drawdown rules actually work.
What Monte Carlo cannot do
- It can't fix a biased backtest. Reshuffling trades that were produced with look-ahead bias or missing costs gives you a precise distribution of the wrong answer.
- It assumes trades are independent. Real losses often cluster — the same regime that causes one loss causes the next. Simple reshuffling breaks that clustering apart and can understate the real risk. Block resampling, which moves runs of consecutive trades together, partly addresses this.
- It can't invent conditions the history never contained. If your data has no crash in it, no reshuffle will produce one.
It also can't tell you whether the edge is real — that needs walk-forward testing and an adequate sample of trades. Monte Carlo answers a different and equally practical question: given that the edge is real, how much pain should you budget for?
A simple version you can run yourself
- Export the trade list with each trade's result in R or as a percentage of the account.
- In Python or a spreadsheet, shuffle the list and compute the running equity and its maximum drawdown.
- Repeat at least 1,000 times and record each drawdown.
- Sort the results and read off the median and the 95th percentile.
- Size your risk per trade so the 95th-percentile drawdown is one you could sit through without abandoning the strategy.
Know your real drawdown before it happens
Monte Carlo and regime analysis are part of our portfolio and research work.