Disclosure: this article was drafted with AI assistance from our archived backtest results. The charts and numerical examples are calculated from data, not generated illustrations.
October 10, 2025 looks like the obvious date to investigate a crypto trading system. A market-wide liquidation event is difficult to miss. Yet the lowest point in one of our stress tests occurred on July 20, while the market benchmark was above its level at the start of the test.
The useful engineering question was not "Did the bot survive the crash?" It was: which account series are we measuring, and what happens between closed trades?
We develop several automated strategies. Here, Mars and Neptune are labels for two selected versions, not coins. Everything below is a historical simulation, not a live account record.
A date is not a risk metric
Both stress tests began with 2,500 USDT on June 25 and ended on October 24, 2025. In Mars, the recorded account value fell as low as 842.96 USDT. Its maximum marked-to-market drawdown was 70.00% from the preceding peak, not 70% of the initial deposit.
Now take one specific interval: October 10 at 00:00 UTC to October 11 at 00:00 UTC.
| Series | Change during that interval |
|---|---|
| Market benchmark | −10.1% |
| Mars account value | +2.8% |
| Neptune account value | −22.6% |
But over the whole stress window, Mars finished at −4.08%, while Neptune finished at +20.74%. Those final returns include the model's end-of-test closure of remaining positions. The plotted account series includes positions still open at each observation; it is not the same output.
The benchmark is a capitalization-weighted basket reconstructed from Open Crypto Pricing's daily market factor. It is not total crypto market capitalization. None of these comparisons isolates the cause of the strategy's losses.
A closed-balance curve can hide an open loss
Consider a deliberately small, fictional account. There are no deposits or withdrawals. "Settled balance" means account cash after realized results and already-booked charges; "open P&L" is the unrealized result of positions that remain open.
| Observation | Settled balance | Open P&L | Account equity |
|---|---|---|---|
| 0 | 2,500 | 0 | 2,500 |
| 1 | 2,800 | 0 | 2,800 |
| 2 | 2,800 | −200 | 2,600 |
| 3 | 2,800 | −1,000 | 1,800 |
| 4 | 2,900 | −700 | 2,200 |
| 5 | 2,900 | −100 | 2,800 |
The settled balance never decreases. Its drawdown is zero. Equity falls from 2,800 to 1,800: a 35.71% drawdown.
This is not evidence that our particular closed-balance curve hid exactly these losses. It is a minimal example of why a closed-trades-only metric cannot answer the same question as marked-to-market account equity.
Here is the complete calculation for ordered, nonnegative observations with positive initial equity:
from math import isfinite def max_drawdown(values): values = list(values) if not values: raise ValueError("empty series") if any(not isfinite(x) or x < 0 for x in values): raise ValueError("non-finite or negative account value") if values[0] <= 0: raise ValueError("initial value must be positive") peak = values[0] worst = 0.0 for value in values: peak = max(peak, value) worst = max(worst, (peak - value) / peak) return worst balance = [2500, 2800, 2800, 2800, 2900, 2900] equity = [2500, 2800, 2600, 1800, 2200, 2800] assert max_drawdown(balance) == 0 assert abs(max_drawdown(equity) - 1000 / 2800) < 1e-12 print(f"{max_drawdown(equity):.2%}") # 35.71% This function does not infer missing observations, account for external cash flows, or support negative-equity accounts. Those need explicit treatment, not a silent patch to the denominator.
What our archives establish, and what they do not
The runs use fixed historical Bybit candles and one-minute execution detail. Fees and recorded funding payments are part of the simulation. Account-value observations are recorded at fixed intervals.
That last distinction matters: one-minute execution detail does not turn a periodically sampled account series into a continuous risk measurement. A deeper move between observations can be missed.
We read the account series from the archived result, calculate the running high-water mark, and keep the peak and trough timestamps with the drawdown. We keep the final backtest return separate, because end-of-window closures can change the reported result.
Fixed inputs make a replay more reproducible. They do not prove absence of overfitting, establish that an interval was held out, or simulate exchange order queues and crash-day liquidity.
We also run annual and uninterrupted multi-year windows. In a separate Mars run from January 1, 2024 to September 25, 2026, final return was +711.28% and sampled marked-to-market drawdown was 22.71%. It used different capital-accounting settings from the stress run. It is not a curve we can splice onto the stress test.
A crash-day result tells you what happened on crash day. A drawdown calculation tells you how far the account fell from its own prior peak. Neither should be substituted for the other.
For developers building similar reports: does your displayed drawdown come from closed trades, settled balance, or account equity? And is its sampling interval visible beside the number?
Sources
Strategy figures come from our archived result reports and sampled account-value series. The toy example is fictional. No strategy entry rules or parameters are required to reproduce the toy calculation.
Market benchmark: Sebastian Stoeckl and Moritz Pukrop (2026), Open Crypto Pricing, CC BY 4.0. We add RF back to CMKT, compound the daily returns, and normalize to 100 at the window's start. End-of-day dates are aligned to the following midnight UTC.



