ATMResearch
Join Overfit - free
Overfit cover card on dark navy, kicker 'Monte Carlo': the headline 'The 1-in-20 worst case happened 1 time in 4.' over the line 'Simulated worst-case drawdowns were breached 23.3% of the time, not 5%.', with a corner badge reading '3,418 strategies · 1,000 draws'.
  1. Overfit/
  2. Research/
  3. Monte Carlo for Traders: I Checked Whether the Simulation Was Right. It Wasn't.

October 4, 2024

Monte Carlo for Traders: I Checked Whether the Simulation Was Right. It Wasn't.

Share

7 min read

Written by Ali Casey, founder of StatOasis and AlgoChef, creator of the Algo Trading Masterclass (ATM), with over 10 years of experience building systematic trading tools - building algorithmic strategies, testing ideas with data, and teaching traders how to build structured, portfolio-based trading workflows.

Published October 4, 2024 · Updated September 16, 2026 · Method

← Back to Research
Table of contents▾
  • TL;DR — the answer box
  • How I tested
  • The test nobody runs
  • Which button did you press?
  • How much worse than the backtest?
  • The question you were actually asking
  • Two housekeeping answers
  • The verdict — and the honest limits
  • What this means for you
  • Methodology
  • FAQs

The short version

I ran Monte Carlo on 3,418 strategies, then did the part the simulation cannot do for you: checked the simulated worst case against what each strategy actually did next. The simulated 1-in-20 worst-case drawdown was breached 23.3% of the time, 4.7x the 5% it advertises. Returns missed by far less, breaching 9.8% against the same 5% expectation. Of the two, the drawdown is the one the method gets more wrong.

Your backtest shows a 20% maximum drawdown. You know that number is one path out of many, so you do the responsible thing: you run a Monte Carlo, reshuffle the trades a few thousand times, and read off the worst case. Say it comes back at 30%. You size the position so you can survive 30%, and you feel like you did the work.

Here is the question nobody asks. Was 30% right?

Not "is Monte Carlo a good idea". It is. Whether the number it hands you is the number reality respects. That is testable with nothing more than the strategy's own trades. I ran it on 3,418 strategies.

The simulated 1-in-20 worst case was breached 23.3% of the time.

TL;DR — the answer box

  • The simulation's tail is too thin. The 1-in-20 worst-case drawdown was breached 23.3% of the time instead of 5%, 4.7x too often. Real drawdowns landed at the 28th percentile of the simulated distribution at the median.
  • Returns are better calibrated than drawdowns, though neither is right. The simulated 1-in-20 return was breached 9.8% of the time against the 5% expected, which is far better calibrated than the drawdown at 23.3%.
  • The method changes the answer by 27%. Reshuffling the trade order, which is what most retail platforms ship, puts the 1-in-20 drawdown at 1.32x the backtest's. Bootstrapping puts it at 1.67x.
  • In this bootstrap sample, the median case ran roughly two-thirds worse than the backtest. Median 1-in-20 drawdown: 1.66x the backtested figure, 2.30x at the 90th percentile of strategies.
  • You can carry far less size than you think. If your tolerance is a 20% drawdown, the median strategy could safely carry 0.25x of a full unit, and only 12.5% could carry a full one.

How I tested

Eight markets on daily bars (SPY, QQQ, IWM, DIA and ES, NQ, NG, JY futures) and the same three strategy families used across this pillar: RSI mean reversion, moving-average trend, Donchian breakout. Of the 5,472 parameter variants, 3,418 met the study's admission floor of at least 30 trades in the development period, the first 75% of each market's history. Admission reads the development period only, so how many trades a variant went on to take in the untouched final 25% plays no part. Median development trade count: 91.

The resampling itself is the ordinary Monte Carlo method: draw from a distribution enough times and the spread of the draws stands in for the spread of outcomes you might have had. Every simulation is seeded and reproducible. Trades come from the engine's vectorised backtester — signal at the close, entry at the next open, long only, one unit, frictionless.

Throughout, "the 1-in-20 case" means the 5th percentile of the simulated distribution: the outcome you should expect to see roughly one run in twenty. That is the number a trader actually uses for sizing, so that is the number worth checking.

The test nobody runs

Here is the design, because the design is the whole contribution.

For each strategy, take only its development trades, the ones from the first 75% of history. Resample them into 1,000 alternative paths, each as long as the development trade rate predicts for the final 25%: development trades per bar, times the bars in that slice. That length is known before the final 25% begins, and the median path is 30 trades. Now you have a forecast: a full distribution of drawdowns the strategy "should" produce over that many trades.

Then look at what it actually did in that final 25%, and find where the real drawdown falls inside the forecast. Grading a procedure on a slice of data it never saw is the standard way to test one; the unusual part here is doing it to a simulation's own forecast rather than to a strategy's returns.

If Monte Carlo is calibrated, those percentiles should be uniform. Reality should land below the 5th percentile exactly 5% of the time.

Expected if calibratedActual
Real drawdown worse than the simulated 1-in-205%23.3%
Real drawdown worse than the simulated median50%66.5%
Median percentile where reality landed50th28th
A calibrated simulation would put the right-hand bar at 5%. The real breach rate across 3,418 strategies was 23.3%, 4.7x too often.

Nearly five times too often. The thing you built specifically to stop being surprised is surprising you once every four or five strategies.

Reality piles up at the bad end: the realised drawdown landed at the 28th percentile of the simulated distribution at the median, and came in worse than the simulation's median in 66.5% of strategies.

A calibrated simulation makes that histogram flat. This one has a wall at the bad end.

It holds across every family: 26.4% for mean reversion, 25.1% for trend, 17.0% for breakout. Breakout is the least bad, and it is still more than three times the rate it should be.

Why. Not a bug — an assumption. Resampling treats each trade as independent, as though the outcome of one tells you nothing about the next. Real losing trades do not arrive that way; they arrive in runs. Shuffling the order destroys whatever clustering is there, which is one candidate explanation for why the simulated drawdown ran shallow. The limit to state: this test cannot separate how much of the miss is trade clustering and how much is the market regime changing between the two periods.

And note the asymmetry, because it tells you where the assumption bites: the simulated 1-in-20 return was breached only 9.8% of the time, and reality's median return percentile was 58th, slightly better than the simulation expected. Monte Carlo gets the destination roughly right and the road badly wrong. Drawdown is a property of ordering. Ordering is the one thing the method throws away.

Which button did you press?

Before the fix, one more thing worth knowing: "run a Monte Carlo" is not one thing.

Method1-in-20 drawdown as a multiple of the backtest
Reshuffle trade order (permutation)1.32x
Block bootstrap (keeps runs of 5)1.59x
Bootstrap with replacement1.67x
The method most retail platforms ship is the most optimistic of the three: the reshuffle puts the 1-in-20 drawdown at 1.32x the backtest, against 1.67x for the bootstrap.

Same strategies, same 2,000 simulations, three standard methods, and a 27% spread in the answer.

Reshuffling is the most optimistic, and it is the one most retail platforms ship. The reason is structural: a permutation reorders the same trades, so every simulated run ends at exactly the same final equity as the backtest. You are only sampling paths, never sampling outcomes. Bootstrapping with replacement, the standard statistical way to resample a sample, lets the sample itself vary, which is the honest version if you believe your trades are a sample of something rather than the population.

Given the calibration result, the ranking matters: the most common method is also the one that produces the shallowest 1-in-20 estimate of the three tested.

How much worse than the backtest?

Using the bootstrap, across 1,000 strategies:

Value
Median 1-in-20 drawdown vs the backtest1.66x
90th percentile of strategies2.30x
Backtest's own drawdown, as a percentile of simulated outcomes43rd
Strategies with at least one losing simulated run95.8%
Strategies losing money in more than 1 run in 2064.0%
The backtested drawdown is not the floor it looks like: the simulated 1-in-20 drawdown was 1.66x it at the median strategy, and 2.30x at the 90th percentile.

Two useful things here.

The backtest's own drawdown sits at the 43rd percentile of the simulated distribution. It is not a worst case. It is a near-typical case, with 43% of alternative histories producing a deeper drawdown, which means the drawdown you have been staring at and steeling yourself for is roughly the middle of the range.

And 64.0% of these strategies lost money in more than one simulated run in twenty. That is the real content of a Monte Carlo: not a scarier drawdown number, but the share of alternative histories in which the same strategy ends up losing money.

The question you were actually asking

Nobody runs a Monte Carlo out of curiosity. They run it to decide how much money to put behind the thing. So here is that answer directly.

For each allocation multiple, scale every trade return by it and recompute the simulated drawdown. The safe allocation is the largest multiple that keeps the chance of breaching your tolerance at 1 in 20 or better.

If you can tolerateMedian safe allocationSafe at full sizeNo safe size at all
A 10% drawdown0.00x1.0%59.0%
A 20% drawdown0.25x12.5%10.5%
A 30% drawdown0.50x27.8%0.2%
Tolerate a 20% drawdown and the median strategy can safely carry 0.25x of a full unit. Only 12.5% can carry a full one.

At a 20% tolerance, the number traders say out loud most often, the median strategy carries a quarter of a full unit. Only one strategy in eight can carry a full one. Across the 400 variants, the median probability of breaching 20% at full allocation was 60.9%.

At a 10% tolerance, 59.0% of these strategies have no safe size at or above 0.25x a full unit, which is the smallest allocation the study put on the grid. Below that the study did not test, so the finding is that nothing on the tested grid was safe, not that no size exists.

This is where Monte Carlo earns its place. Not as a scary number generator, but as the step that turns "this strategy looks good" into "this strategy gets 25% of a unit." And now apply the calibration finding on top: the simulated 1-in-20 worst case was breached 23.3% of the time, 4.7x the rate it advertises. These allocations come from the same simulation, and the study did not rerun the sizing on a tail widened to match that miss, so treat them as what the tested model says is safe, not as a calibrated safe size adjusted for the miss.

Two housekeeping answers

How many simulations? About a thousand.

DrawsMedian error vs a 10,000-draw reference
1004.0%
1,0001.5%
5,0000.8%

Above 1,000 you are buying decimal places. If your platform takes ten minutes to run however many draws it defaults to, that time is buying decimal places.

Does a longer track record help? For the estimate, yes. For the outcome, no.

Development trades1-in-20 drawdown vs the backtest
30-491.76x
50-991.67x
100-1991.58x
200-3991.67x
400+1.75x

No trend, anywhere. This one surprised me — I expected the ratio to tighten with sample size. It does not. More trades make your estimate of the distribution more reliable; they do not make the distribution narrower. Across the study's trade-count buckets the median 1-in-20-to-backtest ratio showed no trend.

The verdict — and the honest limits

Monte Carlo is worth running. Just do not read its 1-in-20 drawdown as a 1-in-20.

What it does well. It tells you how often a strategy loses across alternative histories, with 64.0% of these strategies losing in more than 1 run in 20, and it converts a backtest into a position size, which nothing else on the report does. Both of those are load-bearing.

What it does badly. Drawdowns. The 1-in-20 case was breached 23.3% of the time against the 5% advertised. It underestimates the depth of trouble because it assumes trouble does not cluster, and trouble is the one thing that always clusters.

How to use it anyway. This study never tested which of the three resampling methods is closest to the truth. It only shows that bootstrap gives the least optimistic (most conservative) of the three 1-in-20 estimates. Absent that accuracy test, size against the conservative one: use bootstrap. Run a thousand draws. Take the 1-in-20 drawdown and relabel the threshold: it was breached 23.3% of the time in this calibration sample, so what the software calls a 1-in-20 outcome behaved closer to a 1-in-4. The study did not rerun its sizing on that relabelled threshold, so read it as a warning about the allocation numbers rather than a replacement for them.

Limits. Long only, one unit, no leverage, no shorting, no stops, no position sizing beyond the allocation multiplier. Frictionless — costs deepen every drawdown, simulated and real alike. The allocation analysis scales trade returns linearly, which is the standard approximation and ignores margin rules, borrowing cost and gap risk. And the calibration test compares a development-period trade distribution against a later period, so some of the miss is regime change rather than trade clustering; this study does not separate the two, and an honest reading is that both contribute. Every result is a property of these eight markets over these date ranges.

What this means for you

  1. Bootstrap, don't reshuffle. 1.67x versus 1.32x. The default button is the optimistic one.
  2. Run 1,000 draws and stop. 1.5% median error against a 10,000-draw reference, and 3.7% at the 90th percentile of the 200 variants tested.
  3. Read the backtest drawdown as a near-typical outcome, not a worst case. It sits at the 43rd percentile of simulated outcomes.
  4. Treat the simulated 1-in-20 bound as weaker than it advertises. Across 3,418 variants it was breached 23.3% of the time, not 5%.
  5. Check the share of losing runs, not just the drawdown. 64.0% of these strategies lost money in more than one run in twenty.
  6. Convert the output into an allocation. At a 20% tolerance the median strategy carries 0.25x — and that is before adjusting for the calibration miss.
  7. Stop expecting more trades to tighten the tail. The ratio was flat from 30 trades to 400-plus.

This is one spoke of the robustness testing guide. The others cover how to configure a walk-forward and which backtest metric actually predicts anything.

Running this on your own equity curve is one of the things AlgoChef does with an imported backtest — five resampling methods, including the bootstrap this study ended up recommending.

Methodology

Data source
Daily OHLC for SPY, QQQ, IWM, DIA (ETFs) and ES, NQ, NG, JY (continuous back-adjusted futures)
Date range
1993-02-02 to 2026-07-02, per-market ranges in the facts sheet
Entry / exit rules
Signals read at the close, entry at the next open, exit at an open; long only, one unit, no pyramiding
Sizing
One unit as the base case; the capital analysis scales trade returns by an allocation multiple
Overlap mode
Overlapping signals extend the hold rather than adding a second position
Look-ahead
Signals are read at the close of bar t and the position is taken at the open of bar t+1; exits are taken at an open. This is structural rather than declared - engine/vector_backtest.py builds positions as pos[u] = state[u-1] and returns as open-to-open, so a same-bar fill is not expressible in the code.
Minimum sample
A variant qualified on at least 30 trades in the development period. Admission reads the development period only: how many trades a variant went on to take in the untouched test period plays no part. Variants are flagged, never dropped, so a thin cell is visible rather than quietly removed.
Buy-and-hold benchmark
Fully-invested buy and hold on each of the eight markets over the same bars: SPY 8.82% CAGR at 0.551 Sharpe, QQQ 10.20% at 0.489, IWM 7.03% at 0.403, DIA 6.92% at 0.460, ES 6.71% at 0.537, NQ 9.11% at 0.710, and two markets that lost money outright, NG -9.68% at -0.170 and JY -3.15% at -0.330.
Random control
Frequency-matched random positions, matched on time in market (22-30% exposure, the median of the study's own variants) and averaged over 10 seeds from base seed 20260803. On SPY: 2.82% CAGR (sd 1.36pp) at Sharpe 0.339 (sd 0.147, 95th percentile 0.558) - so a Sharpe under about 0.56 on SPY is inside what random entries reach roughly one time in twenty. Computed by the StatOasis control harness; the full eight-market table is in _facts.md.
Parameter scopeParameters swept

The study searched the parameter space and reports the spread, not one tuned setting.

The full family grids are swept on all eight markets, and every simulation method is judged against the same space rather than against one strategy. Method choice, not parameter choice, is the variable under test.

Run to v1 of the StatOasis research standard - the rules every study here has to meet before it is published. The version is the study's own: a standard that gained a rule later never reaches back and claims this one met it.

Historical backtest results are not a guarantee of future returns. This content is for educational purposes only and is not investment advice. Hypothetical performance disclosure (CFTC Rule 4.41).

Frequently asked questions

What is Monte Carlo simulation in trading?⌄

It takes the trades a strategy actually made and re-plays them in thousands of different orders or combinations, producing a distribution of outcomes instead of the single path the backtest happened to show. In this study the calibration test simulated 3,418 strategies with 1,000 draws each. The 2,000-draw runs cover the distribution work on a smaller set.

How much worse than the backtest should I expect?⌄

About two-thirds worse. The median simulated 1-in-20 drawdown was 1.66x the backtested drawdown, and at the 90th percentile of strategies it was 2.30x. The backtest's own drawdown sat at only the 43rd percentile of the simulated distribution.

Is Monte Carlo simulation accurate for trading?⌄

Not for drawdowns, in this study's calibration across these eight markets and date ranges. Resampling each strategy's development trades and comparing against what it actually did next, the simulated 1-in-20 worst-case drawdown was breached 23.3% of the time, 4.7x the 5% it should be. Returns were far better calibrated, breaching 9.8% of the time against an expected 5%.

Which Monte Carlo method should I use?⌄

Not the reshuffle. Reordering the same trades, which is what most retail platforms ship, put the 1-in-20 drawdown at 1.32x the backtest, versus 1.67x for bootstrapping with replacement and 1.59x for block resampling. Reshuffling is the most optimistic of the three because it forces every run to end at the same final equity.

How much capital should I allocate to a strategy?⌄

Less than you think. If you can tolerate a 20% drawdown, the median strategy in this study could safely carry only 0.25x of a full unit, and just 12.5% could carry a full one. Across the 400 variants, the median probability of breaching 20% at full allocation was 60.9%.

How many Monte Carlo simulations do I need?⌄

About 1,000. At 1,000 draws the 1-in-20 estimate was within 1.5% of a 10,000-draw reference at the median. At 100 draws the error was 4.0%. Above 1,000, extra simulations buy decimal places.

Does having more trades make Monte Carlo more reliable?⌄

It makes the estimate more reliable, not the outcome less variable. The ratio of the 1-in-20 drawdown to the backtested drawdown stayed between 1.58x and 1.76x across every trade-count bucket from 30 trades to 400-plus, with no trend.

Why does Monte Carlo underestimate drawdowns?⌄

Because resampling assumes each trade tells you nothing about the next. Real losing trades arrive in runs, either because the conditions that cause them persist, or because the market regime shifted between the study's two periods; this test cannot separate the two. Shuffling the order destroys that clustering, one candidate explanation for why the simulated drawdown ran shallow, alongside the regime shift this design cannot rule out.

Read the Backtesting & Validation hub
← Back to Research

Table of contents

  • TL;DR — the answer box
  • How I tested
  • The test nobody runs
  • Which button did you press?
  • How much worse than the backtest?
  • The question you were actually asking
  • Two housekeeping answers
  • The verdict — and the honest limits
  • What this means for you
  • Methodology
  • FAQs

Overfit - the newsletter

Skip the hype. Trust the data.One practical takeaway per issue.

Running a quick security check before this can be sent.

Delivered +2 times a month - when the work is ready, not on a calendar.I'll never sell your address.Unsubscribe in one click, any time.

Related Articles

Back to all research
#122

Robustness Testing: Why Most Traders Fail, and What 36,252 Backtests Say Actually Works

Mar 28, 2025 · 18 min read

Robustness testing is the step between a good backtest and deciding whether to trade it. I measured which checks actually predict what a strategy does in held-back history, then retested the whole thing on 53 markets — where the stack still works, several individual checks turn out to have been overstated threefold, and two of them point the wrong way on some asset classes.

Read more→
#140

Can AI Build a Profitable Trading Strategy? I Backtested 5 LLM-Generated Rules on SPY to Find Out

Aug 22, 2026 · 11 min read

Two experiments on SPY: a 2,304-variant optimizer sweep standing in for what AI does when it hunts for "the best strategy," and 5 AI-generated rules implemented verbatim. The optimizer's top-25 risk-adjusted score collapsed 85% out-of-sample, and 0 of 2,068 eligible strategies beat buy-and-hold.

Read more→

Overfit - the newsletter

Skip the hype. Trust the data.

One practical, evidence-driven takeaway per issue - strategy testing, portfolio construction, market structure, trading psychology, tactical asset allocation.

Running a quick security check before this can be sent.

Delivered +2 times a month - when the work is ready, not on a calendar.I'll never sell your address.Unsubscribe in one click, any time.

StatOasis is calm, evidence-based algorithmic-trading education, founded by Ali Casey. Ali builds systematic trading strategies and teaches the workflow behind them: research, build, test, combine, deploy. He writes the Overfit newsletter, published since 2024, and runs the Algo Trading Masterclass.

Socials

  • X ↗
  • YouTube ↗
  • Instagram ↗
  • LinkedIn ↗
  • GitHub ↗
  • Muck Rack ↗
  • LinkedIn SO ↗
  • GitHub SO ↗

Products

  • Overfit - the newsletter
  • Algo Trading Masterclass
  • StatOasis Community
  • 36 Ways to Buy the Dip
  • AlgoChef ↗

Reading & tools

  • Research
  • Methodology
  • Survive the Decade
  • Wall of Love

StatOasis

  • About Ali Casey
  • Contact
© 2026 StatOasis. Calm, evidence-based.
PrivacyTermsHypothetical resultsCalifornia