DeskTested

Trading tools, tested on a real desk.

Updated Aug 29, 2026Desk NotesClaims verified ✓Anthony M.

How to Validate a Trading Strategy Before It Trades a Dollar

How to validate a trading strategy: the seven checks our desk runs before a rule goes live, and why every one of them can only ever remove a strategy.

To validate a trading strategy, you run it through a sequence of tests each of which can only remove it: check the price series for defects before checking the rule, name the fill assumption and run the test under both a generous and a pessimistic one, hold out data the tuning loop never saw, recompute the whole thing against an independent data source, pre-commit the metric and the date it lands, require a second session before believing any finding, then paper-run it under guardrails written down in advance. A strategy that survives all seven is not proven — it is merely still standing.

That distinction is the whole subject. A backtest can tell you a rule was arithmetically consistent with history under a stated set of assumptions; it cannot tell you those assumptions hold, that the history is clean, or that the future rhymes. So “validated” here means something narrow and checkable — every assumption the result depends on has been named, and the result re-run with the least flattering version of each one. Every step below is a filter, and the only information a filter carries is what it eliminates.

1. Validate the data before you validate the rule

Price series lie in ways that generate no error message — this is the first of six data defects that survived our code reviews. Our own data-migration acceptance work turned up a market-data source that back-pads history for instruments that did not yet exist. Verbatim from the record:

hood back-pads pre-inception history with a flat constant (QLD had 117 fake rows at [REDACTED] before its 2006-06-21 inception). Trimmed in the cache build; QQQ/SPY unaffected.

A leveraged ETF that started trading on 21 June 2006 was served 117 sessions of history before it existed, every one the same repeated number — no flag, no null, no exception. A backtest ingesting those rows sees 117 consecutive sessions of exactly zero volatility at the front of the series, and any risk-adjusted metric over that window is overstated by construction.

The adjacent check is adjustment basis. Our records note that a split-only daily series and a split-plus-dividend series agreed to three decimals on low-yield instruments and diverged on high-yield ones. “Which adjustment does my source apply?” is not a technicality on a dividend-paying name — it is a different price series with a different answer.

The practical form: before the first backtest, check the first bar against the instrument’s actual inception date and find out which adjustment your vendor applies. Ten minutes, and it catches a class of defect no downstream rigor can recover from.

2. Name the fill assumption, then run both sides

Most backtesting tools quietly pick a fill price for you, and that single unstated choice can be worth more than the edge you are testing.

The figures in this section are historical backtest simulations from our own research runs — not live results, not a prediction, not advice. On six years of real ThetaData NBBO option quotes covering 2020 through 2026, one QQQ put-credit-spread configuration (30–45 days to expiry, 0.16 short-leg delta, roughly weekly entries) returned a profit factor of 1.18 priced at the mid and 0.80 priced as a taker at the bid or ask. Same entries, same exits, same 167-odd trades, same six years. Profitable becomes unprofitable on a configuration line.

The follow-up is what makes this a validation step rather than a footnote. The identical comparison on SPY moved profit factor only from 0.76 to 0.79 — small enough to be noise, and pointing the other way. So “subtract a slippage haircut and move on” is not a fix: the size of the haircut is itself the variable under test, and it is a property of the instrument. Full working in our options backtest fill assumptions piece.

The practical form: run every backtest twice, once optimistically and once pessimistically, and report both. If the verdict flips between them, you have not measured a strategy — you have measured a fill convention.

3. Hold out data the tuning loop never saw

Any loop of the form “look at the result, adjust the parameter, look again” is fitting to the test set, whether the adjusting is done by a person, a solver or a language model. The loop optimises for the data it can see, and given enough passes it will find a good-looking curve in noise. The viral “build a trading bot with Claude” playbook makes that loop its fourth step, which is why its equity curve is not a measurement.

The only defence is arithmetic: reserve a slice of history the tuning never touches, and treat every result as provisional until it survives there. Walk-forward testing is the formal version, rolling the fit window forward so each evaluation happens on data that was future to the fit.

The neighbouring check is a parameter sweep: a setting that works at one value and collapses either side of it is a fitted artifact, while one that holds across a band is at least a candidate for an effect. Our own acceptance runs sweep several neighbouring lookbacks for that reason — the plateau’s shape is the finding, not its peak. Our leveraged ETF volatility filter backtest shows a threshold sweep run on two halves of history side by side.

4. Recompute the whole pipeline against an independent source

When we migrated our research stack to a new market-data source, the switch was gated on an acceptance step: every headline metric of the existing pipeline was recomputed on the new source and compared side by side — compound growth rate, Sharpe ratio, maximum drawdown, trade count, the lookback sweep and a buy-and-hold benchmark — and the migration was accepted only once they agreed.

That step is where the pre-inception padding above was caught, and it is worth noticing why: nothing about the padded rows looked wrong in isolation. They were visible only as a discrepancy between two sources computing the same thing — a mechanism no single-source pipeline has, and neither does a workflow that never leaves one vendor’s strategy tester.

The same mechanism works on claims, not just data. Checking the widely-repeated figure for one prop firm’s profit target against the firm’s own terms page is what surfaced the disagreement; a number repeated across a dozen review sites has still only been read once.

5. Pre-commit the metric and the date it lands

A metric chosen after the results are visible is chosen to flatter them. Our tool-trial protocol fixes the metric, the method and the end date before the first observation, and an open trial shows why. It is the same mechanism that gives a trade journal its evidential value: the entry is worth something only because it was written before the outcome was known.

Its headline metric is the five-day forward return of a screen’s top five names. One basket printed −2.11%, then +3.02%, then +0.41%, then +0.12% after one, two, three and four of its five sessions. Four readings, four different stories, one basket — and none is the metric, which is defined only at session five. No positions were taken in any of it; it is a paper measurement of a screen’s output, and the interim columns exist in the log precisely to show that partial reads are worthless.

Had the window not been fixed in advance, every one of those four readings would have been available as a stopping point.

6. Require a second session before you believe anything

Most findings do not survive their second look. Two examples from a single week of our own instrumentation logs:

A finding that died. One session’s API latency samples showed the first call slowest on all three endpoints tested — a tidy connection-setup story, written down explicitly as an observation to watch rather than an established effect. The next session it inverted: the slowest sample was the second one on two of three endpoints. One session for, one against, so the finding was struck and recorded as struck, so nobody downstream would pick up the earlier version.

A finding held in suspension. Order submissions ran meaningfully slower than plain reads on one session and were indistinguishable from them the session before. Two sessions, opposite readings, no pattern claimed — logged as a quantity to watch.

A single pass through a strategy tester has exactly the evidential weight of one of those sessions.

7. Paper-run it under guardrails written in advance

The last stage finds the failures that have nothing to do with the strategy: malformed responses, scheduling faults, fields that populate on one run and not the next, delivery delays. They appear identically in paper and live, and finding them in paper is free. Every one of those we have actually hit is catalogued in the operational reality of running an autonomous agent.

Our own Alpaca probe rig runs against the paper endpoint only, and that constraint was written into the trial method before any code ran rather than added after something went wrong. The ordering is the point — a guardrail added after an incident is a patch, while one specified before the first run survives the evening you are tired and want to see the thing work. Same logic for credential scope (separate read and trade keys, no withdrawal permission) and for kill conditions, which have to be thresholds a machine can check rather than an intention to keep an eye on things.

Where the regime read fits — and where it doesn’t

A regime filter is often proposed as validation — “the strategy only trades in the right regime” — but that is a component added to the strategy, not a test of it, so it clears the same seven steps rather than being exempted from them.

Our desk runs two regime rules side by side, documented in our regime read method. In one recent stretch the Markov model moved SPY from Sideways to Bull on a session where the index closed +0.02%, then back to Sideways one session later; the flip came from an old bar rolling out of the trailing 20-session window, not from anything that happened that day, and the moving-average rule never moved at all. A classifier whose label can change on a flat day needs a stated tolerance before anything is gated on it.

The checklist

  • Check the first bars against the instrument’s inception date; find out which adjustment your source applies.
  • Run every test under both an optimistic and a pessimistic fill assumption; publish both.
  • Reserve a slice of history the tuning never sees; report the plateau, not the peak.
  • Recompute the pipeline on a second, independent source and require agreement.
  • Fix the metric and the evaluation date before the first observation.
  • Never promote a finding on one session’s evidence; write the falsification condition down first.
  • Paper-run with least-privilege credentials and automatically checkable kill conditions.

Frequently asked questions

What is the single most-skipped step?

The fill assumption — tools supply a default silently, so there is no moment at which you are asked to choose. The data check is a close second: a defective series returns rows rather than errors.

Does surviving all seven steps mean the strategy will work?

No. It means the result is not explained by the seven failure modes those steps test for — strictly less than “this works.” Every one of these checks can remove a strategy; none can confirm one.

Is walk-forward testing enough on its own?

No. Walk-forward addresses the tuning-loop problem in step 3 and nothing else. It will happily walk forward through a series with padded rows, priced at a fill you never interrogated, on a metric you picked after seeing the answer.


This is educational content about research method, not financial advice. No positions, live signals, account values or trading results appear on this page. The backtest figures cited are historical simulations from our own research over the stated period — not live results, not predictions, not a recommendation.