● Learn

How to verify a trading bot's backtest yourself

A backtest is a claim about the past. The only way to know it is true is to run it again yourself, on the same data, with the same code, and get the same numbers. If a seller cannot let you do that, their chart is a picture, not evidence.

1. Get the code, not a screenshot

You need the exact code that produced the figures, not a description of it or a separate “demo” version. If the strategy is sold as a black box, you cannot verify it at all. You can only watch it.

2. Get the data from a source you trust

The data should come from somewhere neither you nor the seller controls, such as an exchange’s public archive, and it should be pinned: a published hash of the files, so you know you are testing on exactly what the seller tested on. A backtest run on “our cleaned data” can be run on anything.

3. Run it and compare every number

Run the backtest and compare its output to the published figures, one by one. Matching the headline is not enough. The drawdown, the trade count and the yearly returns should match too. A good harness does this for you and fails loudly if a single number drifts.

4. Check the costs are in it

Most backtests look good because they are free to trade. Look for exchange fees on every entry and exit, slippage, and for perpetual futures, funding. Then ask what happens when an order waits in the queue: a limit order that fills is often one the market was about to move through. Our position size calculator shows the same fee in isolation: on a tight stop it can take a surprising share of the risk you budgeted, before the trade has done anything.

5. Check when the rules were fixed

A strategy tuned on the same data it is tested on will always look good. Look for a dated pre-registration of the rules, and for results on a period the rules were never tuned on.

Doing it with APEX and CARRY

Both packages ship the harness that made their published figures.

  • APEX: fetch Binance’s public market data once (about 150 MB, checked against a pinned hash), then run python3 -m apex.cli verify. In about fifteen seconds it regenerates the headline figures and all 560 cells of the settings table from the raw one-minute data and prints VERDICT: REPRODUCED — 33 checks passed. The fees, the real funding and the measured queue cost are all inside it.
  • CARRY: run python3 -m carry.cli verify. It needs no network and takes about a second. It regenerates the published figures from the raw settlement data, including the funding join audit, the net APR by a second independent code path and the sizing arithmetic, and prints REPRODUCED — 71 checks passed.
  • Pre-registrations: the research line’s pre-registrations are anchored in the Bitcoin blockchain by OpenTimestamps, so anyone can check they have not changed since 11 September 2026. (The stamp shows they have not changed since then. It does not show they predate the research.)

If any number drifts, the command exits with an error and tells you which one. That is the whole point: you should never have to take a figure on trust.