Skip to main content

Monte Carlo Simulation

A single backtest gives you one trade sequence — the one that happened to occur historically. But the order of those trades wasn't preordained: the same strategy with the same trades arranged in a different sequence could have produced a 30% drawdown instead of a 12% one. Monte Carlo simulation stress-tests your strategy by running thousands of randomized variations of your backtest results, so you see the full distribution of possible outcomes rather than the single number a backtest produces.

VolatiCloud supports up to 50,000 iterations per simulation, three randomization methods (Trade Shuffle, Bootstrap, Parametric), full equity curve confidence bands, and a configurable Risk of Ruin threshold.

Monte Carlo Simulations entry in the VolatiCloud sidebar showing the feature summary — up to 50,000 iterations, Trade Shuffle / Bootstrap / Parametric methods, percentile distributions, equity curve confidence bands, and Risk of Ruin analysis

What Monte Carlo Simulation Does

Imagine you have a backtest that produced 200 trades. Those trades happened in a specific order dictated by the market. But what if the market had arranged those same opportunities differently? What if some trades happened more frequently than others?

Monte Carlo simulation answers these "what if" questions by:

  1. Taking your historical trades from a completed backtest
  2. Randomizing them thousands of times (shuffling order, resampling, or generating synthetic trades)
  3. Recalculating performance metrics for each randomized version
  4. Showing you the distribution of possible outcomes rather than a single number

The result is a confidence range: instead of "my strategy returned 45%," you learn "my strategy returns between 20% and 65% in 90% of scenarios."

Why Use Monte Carlo on Crypto Backtests?

A single backtest result can be misleading. Monte Carlo simulation helps you understand:

Single BacktestMonte Carlo
"I made 45% profit""I make between 20% and 65% in 90% of scenarios"
"Max drawdown was 15%""There's a 10% chance drawdown exceeds 30%"
"Sharpe ratio is 1.8""Sharpe ratio ranges from 0.9 to 2.4"

Key Benefits

  • Detect overfitting — if results vary wildly across permutations, your strategy may be overfit to the specific trade sequence (see the avoiding overfitting guide)
  • Quantify risk — understand the probability of large drawdowns or account ruin
  • Build deployment confidence — a strategy with tight confidence bands is more robust than one with wide bands
  • Compare strategies — two strategies with similar single-backtest returns may have very different risk profiles under Monte Carlo analysis
warning

Monte Carlo uses your historical trades as the basis for randomization. It cannot predict how your strategy will perform in fundamentally different market conditions (e.g., a black swan event). It tells you about the range of outcomes given the types of trades your strategy has historically produced.

How Monte Carlo Simulation Works

VolatiCloud supports three simulation methods, each designed for different analytical questions.

Trade Shuffle

What it does: randomly reorders your trades and recalculates the equity curve for each permutation.

What it answers: "How much does the sequence of trades matter to my final result?"

Example: your backtest had 3 winning trades followed by 3 losing trades. Trade shuffle might produce a sequence like: win, lose, win, lose, win, lose. The total profit is the same, but the equity curve path and maximum drawdown are different.

Best for: understanding path dependency and drawdown risk. This is the recommended default method.

Bootstrap

What it does: samples trades with replacement from your trade history. In each iteration, some trades appear multiple times while others are omitted entirely.

What it answers: "What if certain types of trades happened more or less frequently?"

Example: if your strategy has 100 trades, each bootstrap iteration picks 100 trades randomly from that pool. A highly profitable trade might appear 3 times in one iteration and 0 times in another, changing the overall result.

Best for: understanding sensitivity to individual trade outcomes. If a few large winners drive your performance, bootstrap will reveal this dependency.

Parametric

What it does: fits a normal (bell curve) distribution to your trade returns, then generates entirely synthetic trades drawn from that distribution.

What it answers: "What does my performance look like under idealized statistical assumptions?"

Example: if your average trade return is 1.2% with a standard deviation of 3.5%, the parametric method generates thousands of synthetic trades from a N(1.2%, 3.5%) distribution.

Best for: generating smooth distributions and testing performance under theoretical assumptions. Useful when your trade count is small (< 30 trades).

tip

Which method should I use? Start with Trade Shuffle — it makes the fewest assumptions about your data and directly answers the most common question: "How dependent is my result on trade ordering?" Use Bootstrap when you want to understand sensitivity to individual trades, and Parametric when you have very few trades.

Method Comparison

FeatureTrade ShuffleBootstrapParametric
Trade count preservedYesYesConfigurable
Trade values preservedYesYes (resampled)No (synthetic)
Tests order dependencyYesPartiallyNo
Tests frequency sensitivityNoYesNo
Works with few trades (< 30)Limited insightLimited insightGood
AssumptionsNoneIndependenceNormal distribution

Understanding Monte Carlo Results

After a simulation completes, you see several result panels.

Equity Curve Bands

The equity curve chart shows five colored bands representing different percentile outcomes:

BandColorMeaning
p95Light greenBest-case scenario (only 5% of simulations did better)
p75GreenAbove-average outcome
p50BlueMedian outcome — the "typical" result
p25OrangeBelow-average outcome
p5RedWorst-case scenario (only 5% of simulations did worse)

How to interpret: a narrow band (p5 and p95 are close together) means your strategy performs consistently regardless of trade ordering. A wide band suggests high sensitivity to the specific sequence of trades.

Final Balance Distribution

A histogram showing the distribution of final account balances across all iterations.

  • Mean — average final balance
  • Median (p50) — the "typical" final balance (more robust than mean if outliers exist)
  • Standard deviation — how spread out the results are
info

If the mean is significantly higher than the median, a few extreme winning scenarios are pulling the average up. The median is a more reliable expectation.

Risk of Ruin

Shows the probability of your account balance dropping below a configured threshold during any simulation run. You configure a single riskOfRuinThreshold percentage (default: 50%), and the engine calculates the fraction of simulations where the balance fell below that level.

How it works:

  • The ruin line is calculated as initialCapital * (1 - riskOfRuinThreshold / 100). For example, with $10,000 initial capital and a 50% threshold, the ruin line is $5,000.
  • For each simulation iteration, if the balance dropped below the ruin line at any point, that iteration counts as "ruin."
  • Risk of Ruin = number of ruin iterations ÷ total iterations. The result is a single probability between 0% and 100%.

Example: with a 50% threshold and 1,000 iterations, if 3 iterations saw the balance dip below 50% of initial capital, Risk of Ruin = 0.3%.

Target: risk of ruin should be near zero for a robust strategy. If it exceeds a few percent, consider reducing position sizes or adding stop-loss rules. You can adjust the riskOfRuinThreshold to test different loss levels (e.g., set it to 25 to check the probability of losing 25% of capital).

Drawdown Distribution

Shows the distribution of maximum drawdown values across all iterations. Similar to final balance, but focuses on the worst peak-to-trough decline in each iteration.

Sharpe and Sortino Distributions

Histograms of risk-adjusted return metrics across iterations:

  • Sharpe ratio — return divided by total volatility. Target: > 1.0 in the median (p50)
  • Sortino ratio — return divided by downside volatility only. Target: > 1.5 in the median

A Sharpe ratio that stays above 1.0 even at p5 indicates a consistently risk-efficient strategy.

Advanced Monte Carlo Configuration

ParameterDefaultRangeDescription
Iterations1,00010–50,000Number of Monte Carlo iterations. More iterations = smoother distributions but longer runtime
Methodtrade_shuffletrade_shuffle, bootstrap, parametricSimulation method (see above)
Initial CapitalFrom backtestAny positive numberStarting account balance for equity curve calculation
Confidence Levels5, 25, 50, 75, 95Any percentiles (0–100)Which percentile bands to compute
SeedRandomAny integer (as string)Set a fixed seed for reproducible results. Accepts 64-bit integers (e.g., nanosecond timestamps)
Include FeestrueBooleanWhether to include trading fees in the simulation. When enabled, fees are deducted from PnL during equity curve calculation
Fee Rate(not set)0–1.0 (optional)Custom fee rate to use instead of the backtest's original fee amounts. Expressed as a decimal (e.g., 0.001 = 0.1%). When set, overrides the per-trade fees from the backtest
Risk-Free Rate00 to < 1.0Annualized risk-free rate used for Sharpe and Sortino ratio calculations. Expressed as a decimal (e.g., 0.05 = 5%)
Risk of Ruin Threshold50> 0–100The percentage loss threshold for Risk of Ruin calculation. A value of 50 means "probability of losing 50% of initial capital"
tip

Iteration count guidance:

  • 1,000 — quick exploration, good for initial checks (< 10 seconds)
  • 5,000 — solid analysis, smooth distributions (< 30 seconds)
  • 10,000 — publication-quality results (< 60 seconds)
  • 50,000 — maximum precision, Enterprise only (1–3 minutes)

Best Practices for Monte Carlo Analysis

Interpreting Results

  1. Look at p5, not the mean. The 5th percentile tells you what happens in bad scenarios. If p5 is still profitable, your strategy is robust.

  2. Compare methods. Run both Trade Shuffle and Bootstrap. If results differ significantly, your strategy is sensitive to both trade ordering and individual trade outcomes.

  3. Check risk of ruin first. Before celebrating returns, verify that the probability of a 30%+ drawdown is acceptably low for your risk tolerance.

  4. Use seeds for comparison. When comparing two strategy versions, use the same seed so differences in results reflect strategy changes, not randomization differences.

  5. More trades = better analysis. Monte Carlo is most informative with 50+ trades. With fewer than 30, consider using the Parametric method or running longer backtests.

Common Mistakes

warning

Don't cherry-pick methods. If Trade Shuffle shows poor results but Parametric looks good, the strategy likely has order-dependency issues. The conservative (worst) result is the one to trust.

  • Ignoring wide confidence bands — if p5 and p95 are far apart, the strategy is inconsistent. Tightening the band (e.g., adjusting position sizing or adding filters) is more important than chasing higher returns.
  • Too few iterations — with only 100 iterations, percentile estimates are noisy. Use at least 1,000 for meaningful results.
  • Confusing Monte Carlo with forward testing — Monte Carlo reshuffles historical trades. It does not simulate future market conditions. Always combine Monte Carlo analysis with paper trading before deploying live, and consider walk-forward optimization for a complementary check on parameter stability across time.

Plan Requirements

info

Monte Carlo simulation is available on Pro and Enterprise plans.

ProEnterprise
AccessFullFull
Max concurrent simulations310
Max iterations per simulation10,00050,000

Starter plan users can upgrade to Pro to access Monte Carlo simulation. See Plans & Pricing for details.

Quick Start: Run Your First Monte Carlo Simulation

Step 1: Complete a backtest

Monte Carlo simulation requires trade data from a completed backtest. If you haven't run one yet, see Running a Backtest.

Step 2: Open Simulation

From your completed backtest results page, click Run Monte Carlo Simulation. Alternatively, navigate to your strategy page and select the Simulations tab.

Step 3: Configure

  1. Select a backtest — choose which backtest's trades to analyze
  2. Choose a method — start with Trade Shuffle (recommended)
  3. Set iterations — 1,000 for a quick check, 5,000+ for thorough analysis
  4. Initial capital — defaults to your backtest's starting capital

Step 4: Run

Click Run Simulation. You'll see real-time progress updates as iterations complete. A typical 1,000-iteration simulation finishes in under 10 seconds.

Step 5: Interpret Results

  1. Check Risk of Ruin — is the probability of a 30% drawdown acceptable?
  2. Review Equity Curve Bands — are the bands narrow (consistent) or wide (volatile)?
  3. Compare Final Balance Distribution — is the median (p50) close to your single backtest result?
  4. Examine Sharpe/Sortino distributions — does the median stay above 1.0/1.5?

If results look good across all metrics, your strategy has statistical evidence of robustness. If the bands are wide or risk of ruin is high, consider adjusting your strategy parameters before deploying live.

Next Steps