The proof

A two-year simulation, shown in full — drawdowns included.

This is the exact configuration Mercurio runs today, replayed over 2024-06-01 to 2026-06-01 on $25,000 of paper capital, with realistic execution costs. No cherry-picking, no hidden assumptions.

Paper / simulatedSingle strategy · trend following102 symbols
+53.1%
Total return
$25,000 → $38,278
1.03
Sharpe ratio
risk-adjusted
1.01
Sortino ratio
downside-adjusted
1.38
Profit factor
gross win ÷ loss
55.9%
Win rate
213W / 168L
-29.3%
Max drawdown
147 days underwater

Equity curve

$25,000 starting capital · 381 trades

+53.1%
$25,000 start$38,278
2024-06-012025-06-032026-05-31

The drawdown we don't hide

The curve falls before it rises. Through late 2024, equity sank to about $18,175 — roughly 27% below its $25,000 starting capital, and a 29.3% drop from its peak — then spent months underwater before recovering. Watching nearly a third of the account evaporate is the part of trading that actually tests you, and the part most backtests quietly crop out.

How it's measured

Three assumptions that separate a backtest from a fantasy

01

Realistic execution costs

Every entry and exit pays 0.15% slippage per side — roughly 0.3% round-trip. Stop-losses are modeled with gap-through fills: when price gaps past the stop across an overnight or weekend break, the fill happens at the open, not the stop price. That single assumption costs about 32 percentage points versus a fantasy of perfect stop fills. We keep it on.

02

A regime filter that mirrors live

Longs are permitted only when the S&P 500 closes above its 50- and 200-day moving averages for ten consecutive sessions. The backtest computes those averages from genuine daily bars — the same way the live engine does — after we found and fixed a bug that had been computing them from 1-hour bars and inflating multi-year returns.

03

Walk-forward, not curve-fitting

Parameters are optimized on an in-sample period and then tested untouched on a later out-of-sample period. Changes that only shine on one window are rejected as overfit. Only the long-only configuration with 10-day bull confirmation generalized across both.

Out-of-sample

Tested on data the optimizer never saw

The validated configuration was optimized on 2021–2024 (which includes the 2022 bear market) and then tested, untouched, on 2024–2026. Both windows held up — the mark of an edge that is real rather than curve-fit.

In-sample 21–24
+52.9%
Sharpe1.13
Max drawdown17.6%
Out-of-sample 24–26
+24.1%
Sharpe0.58
Max drawdown29.3%

The out-of-sample Sharpe of 0.58 sits below the project's 1.0 go-live bar. That gap is one reason Mercurio remains in paper validation rather than trading live capital.

The breakdown

Where the return came from

Return by calendar period

2024 (from June) and 2026 (through May) are partial years.

202420252026
2024
-17.5%
2025
+28.3%
2026
+44.7%
55.9%WIN RATE
213 wins 168 losses
$229
avg win
$211
avg loss

Top contributors

  • MU+$2,470
  • CRWD+$2,195
  • PANW+$1,956
  • ASML+$1,737
  • ARM+$1,680

Biggest detractors

  • GE$-671
  • XOM$-687
  • PYPL$-836
  • ZS$-964

Losers are an expected cost of trend following. The edge comes from winners being larger than losers, not from avoiding losses.

The whole story

Over a full five-year cycle, this strategy was net negative

The two-year window above is strong, but it is not the whole picture. Tested over 2021–2026 — including the 2022 bear market — the same strategy returned roughly -23%, with a negative Sharpe and a drawdown above 50%. Trend following on this universe works in sustained bull markets and struggles everywhere else. That is precisely why Mercurio is long-only, regime-gated, and sits in cash for long stretches — and why it is still being validated on paper, not trading live.

~-23%
5yr total return
-0.14
5yr Sharpe
~52%
5yr max drawdown
996
5yr trades
Verify it yourself

The backtest is deterministic and open

Same configuration, same window, same numbers. The entire engine — strategy, risk manager, and regime logic — is on GitHub. Change a realism assumption and watch the numbers move.

# the backtest engine
backend/engine/portfolio_backtest.py
# realism knobs (env vars)
  • BT_GAP_THROUGH = session
  • BT_SLIPPAGE_PCT = 0.0015
  • BT_REGIME_SMA = daily
  • BT_BULL_CONFIRM_DAYS = 10
# risk limits (enforced in code)
backend/engine/risk_manager.py

All figures on this page come from a historical simulation using $25,000 of paper capital. They are not live trading results, not a forecast, and not financial advice. Past performance does not guarantee future results. Trading involves substantial risk of loss. Read the full methodology in Inside the Mercurio Backtest.