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 22.5% of the time, not 5%.', with a corner badge reading '3,232 strategies · 2,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

6 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 August 19, 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,232 strategies, then did the part nobody does — checked the simulated worst case against what each strategy actually did next. The simulated 1-in-20 worst-case drawdown was breached 22.5% of the time, 4.5x the 5% it advertises. Returns came out close to calibrated; it is specifically the drawdown the method gets 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, and it takes about ninety seconds of compute once you have the trades. I ran it on 3,232 strategies.

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

TL;DR — the answer box

  • The simulation's tail is too thin. The 1-in-20 worst-case drawdown was breached 22.5% of the time instead of 5% — 4.5x too often. Real drawdowns landed at the 27th percentile of the simulated distribution at the median.
  • Returns are fine; drawdowns are not. The simulated 1-in-20 return was breached 9.5% of the time, close to the 5% expected. It is specifically the path, not the destination, that Monte Carlo gets wrong.
  • The method changes the answer by 24%. Reshuffling the trade order — what most retail platforms ship — puts the 1-in-20 drawdown at 1.33x the backtest's. Bootstrapping puts it at 1.65x.
  • Plan for roughly two-thirds worse than the backtest. Median 1-in-20 drawdown: 1.66x the backtested figure, 2.35x 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 9.8% 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,232 had enough trades to simulate honestly: at least 30 in the development period (the first 75% of each market's history) and at least 10 in the untouched final 25%. Median development trade count: 96.

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 thousands of alternative paths, each exactly as long as the number of trades the strategy went on to take in the final 25%. 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.

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%22.5%
Real drawdown worse than the simulated median50%68.2%
Median percentile where reality landed50th27th
A calibrated simulation would put the right-hand bar at 5%. The real breach rate across 3,232 strategies was 22.5% — 4.5x too often.

Four and a half 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 27th percentile of the simulated distribution at the median, and came in worse than the simulation's median in 68.2% of strategies.

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

It holds across every family: 24.6% for mean reversion, 26.2% for trend, 17.3% for breakout. Breakout is the least bad, and it is still three and a half 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, because the conditions that produce them — a regime the strategy is wrong about — last for weeks or months. Shuffling the order breaks exactly the clustering that makes real drawdowns deep.

And note the asymmetry, because it tells you where the assumption bites: the simulated 1-in-20 return was breached only 9.5% of the time, and reality's median return percentile was 57th — 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.33x
Block bootstrap (keeps runs of 5)1.60x
Bootstrap with replacement1.65x
The method most retail platforms default to is the most optimistic of the three: the reshuffle puts the 1-in-20 drawdown at 1.33x the backtest, against 1.65x for the bootstrap.

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

Reshuffling is the most optimistic, and it is the one most retail platforms default to. 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 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 understates the tail most.

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.35x
Backtest's own drawdown, as a percentile of simulated outcomes42nd
Strategies with at least one losing simulated run94.7%
Strategies losing money in more than 1 run in 2061.6%
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.35x at the 90th percentile.

Two useful things here.

The backtest's own drawdown sits at the 42nd percentile of the simulated distribution. It is not a worst case. It is a slightly-worse-than-typical case, which means the drawdown you have been staring at and steeling yourself for is roughly the middle of the range.

And 61.6% of these strategies — all of which made money in the backtest — 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 fact that a profitable backtest and a losing outcome are frequently the same strategy.

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.00x0.2%62.5%
A 20% drawdown0.25x9.8%12.0%
A 30% drawdown0.50x25.8%0.8%
Tolerate a 20% drawdown and the median strategy can safely carry 0.25x of a full unit; only 9.8% 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. Not one strategy in ten can carry a full one. Run the median strategy at full size and you have a 61.9% chance of breaching your own stated limit.

At a 10% tolerance, 62.5% of these strategies have no safe size whatsoever. There is no allocation small enough, because the drawdown scales with the allocation and so does nothing else.

This is where Monte Carlo earns its place. Not as a scary number generator — as the only tool that turns "this strategy looks good" into "this strategy gets 25% of a unit." And now apply the calibration finding on top: since the simulated tail is about 4.5x too thin, treat these allocations as ceilings, not targets.

Two housekeeping answers

How many simulations? About a thousand.

DrawsMedian error vs a 10,000-draw reference
1004.3%
1,0001.3%
5,0000.7%

Above 1,000 you are buying decimal places. If your platform takes ten minutes to run 50,000 simulations, that time is doing nothing for you.

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

Development trades1-in-20 drawdown vs the backtest
30–491.80x
50–991.67x
100–1991.59x
200–3991.71x
400+1.77x

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. A 500-trade strategy is exactly as capable of a 1.7x drawdown as a 40-trade one.

The verdict — and the honest limits

Monte Carlo is worth running. Its output is worth about half of what you think.

What it does well. It tells you what fraction of alternative histories lose money — 61.6% of these profitable strategies lost 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 22.5% 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. Bootstrap rather than reshuffle. Run a thousand draws. Take the 1-in-20 drawdown, and then multiply it — the breach rate says roughly 4.5x too optimistic in frequency, so treat the simulated 1-in-20 as something closer to a 1-in-4. Size off that, and the simulation becomes a floor under your risk rather than a story about it.

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.65x versus 1.33x — the default button is the optimistic one.
  2. Run 1,000 draws and stop. 1.3% median error against a 10,000-draw reference.
  3. Read the backtest drawdown as a median, not a worst case. It sits at the 42nd percentile of simulated outcomes.
  4. Multiply the simulated 1-in-20 before you size off it. It was breached 22.5% of the time, not 5%.
  5. Check the share of losing runs, not just the drawdown. 61.6% of these profitable 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.

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
The engine's default floor of 50 trades. Variants below it 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 tools/controls_report.py; 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, 3,232 strategies were each simulated 2,000 times.

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.35x. The backtest's own drawdown sat at only the 42nd percentile of the simulated distribution.

Is Monte Carlo simulation accurate for trading?⌄

Not for drawdowns. Resampling each strategy's development trades and comparing against what it actually did next, the simulated 1-in-20 worst-case drawdown was breached 22.5% of the time — 4.5x the 5% it should be. Returns were far better calibrated, breaching 9.5% of the time against an expected 5%.

Which Monte Carlo method should I use?⌄

Not the reshuffle. Reordering the same trades — what most retail platforms ship — put the 1-in-20 drawdown at 1.33x the backtest, versus 1.65x for bootstrapping with replacement and 1.60x 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 9.8% could carry a full one. Running the median strategy at full size gave a 61.9% chance of breaching 20%.

How many Monte Carlo simulations do I need?⌄

About 1,000. At 1,000 draws the 1-in-20 estimate was within 1.3% of a 10,000-draw reference at the median. At 100 draws the error was 4.3%. 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.59x and 1.80x 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, since the conditions that cause them persist for weeks. Shuffling the order destroys that clustering, which is exactly what makes the simulated drawdown too shallow.

↓Download the dataset (383 KB)

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 · 16 min read

Robustness testing is the step between a good backtest and a strategy worth funding. I measured which checks actually predict what happens next, 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 stop working entirely.

Read more→
#140

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

Aug 22, 2026 · 9 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
  • Digital Products
  • 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