<- DualQuant The agent API contract ->

What Verification Means Here

A backtest is a claim about something that already happened. This paper is about how we decide whether to believe one -- what is checked, in what order, what each answer is allowed to mean, and the places where we cannot yet answer at all.

White paper · Version 1 · 3 November 2026

1. The problem is measurement, not ideas

Finding an edge over a chosen horizon is not impossible, and this paper does not claim it is. The difficulty is narrower and more awkward: over any stretch of history short enough to be interesting, a genuine edge and a well-fitted accident draw the same equity curve. Both go up. Both have a Sharpe ratio. Both can be screenshotted.

What separates them is not the curve but the measurement that produced it -- and that is where almost every failure we have seen actually lives. Not in the idea. In a fill at a price nobody could have traded at, a signal computed from a bar that had not closed, a benchmark chosen because it loses, a sample too small to carry the conclusion drawn from it, or a parameter arrived at on the fortieth attempt and presented as the first.

We know this shape well because we built it ourselves. Before offering this service to anyone, we ran it over our own live strategies in crypto, gold, equity indices and currencies. Every headline number moved down. Two of them moved down by more than threefold, because the backtest omitted exits and entry filters that the live trader actually had. One fell from +50% to +4.9% once the backtest took profits the way the live code did. None of those were bad ideas. They were idealised measurements, and they looked convincing right up to the moment something independent recomputed them.

So the question this service answers is not is this strategy good. It is: would your measurement have told you if it wasn't?

2. Pre-registration: the plan is fixed before the data

You describe a strategy in plain English, or your agent submits a structured condition tree. We read it back to you as an exact plan: the instrument, the dataset, the bar interval, the venue and its session, the test period, the entry and exit rules, and what happens to a position still open at the end.

Everything in that plan which you did not state is listed separately and marked as ours. If you said "short and long moving averages" without saying how short, we do not pick for you and quietly proceed -- we ask, because 10/30 and 50/200 are different strategies with different results. If you decline to answer, the value we used is recorded as our choice rather than yours, and it stays visible in the report.

When you confirm, the plan is hashed. That hash is taken before a single price bar is read. From then on the configuration cannot be edited: a change is a new run with a new hash, recorded as such. This is the single most important property of the system, and it is the one that makes everything downstream mean anything. A result is only evidence if the question was asked before the answer was known.

3. The ladder: five checks, climbed in order

Verification is a sequence, not a score. Each rung asks one question, and the climb stops at the first failure. This is deliberate and it costs us the thing most platforms sell: there is no composite number at the end, because a return computed on data that failed the first check is not a weak result. It is not a result.

RungQuestionKind
01 DataAre the price bars the exact bars the plan named, internally consistent, inside the venue's real trading session, and covering the agreed period?Proof
02 ReproductionDoes an externally stored run recompute identically from the same raw bars?Not built
03 ExecutableCould every single trade have happened in real time, at a price that bar actually held?Proof
04 ConsistentDoes the result hold across the history, or does it come from one lucky stretch?Context
05 ValueDid it earn more than a passive blend carrying the same worst loss?Context

Proof rungs are disqualifying. Failing rung 1 or rung 3 means the backtest result is invalid -- not disappointing, invalid. Context rungs measure quality, and their answers are reported with the reasoning rather than as a grade.

A rung can also decline to answer, and the ways it declines are kept strictly apart, because collapsing them is how a non-answer gets read as a pass. Not applicable means the question is wrong for this strategy: a five-minute intraday system makes no claim about agreement between calendar years, so asking is misleading rather than informative. Insufficient means the question is right and this data cannot answer it -- itself a finding, and the report says what would be needed. Blocked means an earlier rung failed. Not run means we have not built it, which is an admission about us and never about your strategy.

4. Four verdicts, and only one is a pass

VerdictWhat it means
CHECKEDEvery rung that ran passed. It states what was done and claims nothing about whether the strategy is good. Deliberately not the word VERIFIED, which reads as an endorsement.
REJECTEDA rung returned a failure, so the result is disproved. The report names the check and, where it applies, the exact trade.
BLOCKEDA check could not run because something before it failed. Never reported as a pass, never silently omitted.
UNCHECKABLEThe data could not be shown to be the data the plan named. This is a real verdict about our evidence, not an error message.

There is no fifth state, no score out of ten and no star rating, and there will not be one. A verification badge is only worth something if it can say no.

5. The comparison: a passive blend at your own risk

Beating zero is not a bar. Beating buy-and-hold while taking twice its drawdown is not alpha either -- it is leverage, which anyone can buy.

So rung 5 compares your strategy against a passive mix of the same asset and cash, sized so the mix would have suffered the same worst peak-to-trough loss your strategy actually suffered. Not more, not less. If your strategy drew down 18.0%, the comparison is against whatever fraction of the asset would also have drawn down 18.0%, with the remainder in cash.

Idle cash earns a stated annual rate, applied symmetrically to both sides -- your strategy's time out of the market and the benchmark's cash leg are credited identically. The rate is currently 2.0% a year, it is fixed rather than tracked, and it is printed in every report. It is an assumption the verdict leans on, and an assumption you can see is a different thing from one you cannot.

Multi-condition exits are attributed leg by leg, so you can see which rule actually produced the return rather than inferring it. Marginal results are flagged as marginal rather than rounded into a pass.

6. Searching is allowed. It is also counted.

Trying many variations is not cheating; it is what research is. What makes it misleading is reporting the survivor without the search. Twenty variations tried, one that worked, presented as though it were the first idea -- that is the mechanism behind most of the backtests that fail live, and it is almost never dishonest. It is just unrecorded.

Every run against a dataset is appended to a tamper-evident ledger, and the count of distinct plans you have tested travels with your report. The statistical hurdle a result must clear rises with that count. The same result that stands on attempt one does not necessarily stand on attempt forty-one, and nothing about the strategy has changed between them -- only the evidence about how it was found.

Buying more attempts raises your balance. It does not lower your bar. These are deliberately separate systems: one is a wallet, the other is evidence.

7. Why the auditor shares no code with the simulator

After the simulation produces a trade list, a separate audit module reconstructs every trade from the raw price bars. It shares no code and no state with the engine that produced them. This is not redundancy for its own sake: an auditor that reused the simulator's calculations could only ever confirm that the code agreed with itself, which is the one thing that was never in doubt.

The auditor checks, per trade, that the entry and exit conditions really did fire on the bar they are attributed to; that each fill happened where a live trader could actually have acted, on the next bar's open rather than at a close nobody knew yet; that every fill price lies inside the traded range of its own bar; and that the return, holding period and spacing agree with the timestamps and prices recorded.

A final arbiter then cross-checks every number in the report you receive against the raw run record, so a sentence in plain English can never drift from the figure behind it.

8. The data a verdict is bound to

Every run reads our own reference store across equities, ETFs, crypto, commodities and FX. We take no data files from submitters. The exact slice that was read is fingerprinted, and the fingerprint travels with the verdict -- so a result is permanently tied to the bytes that produced it rather than to a dataset name that may since have moved.

Series are held at one-minute resolution where the source provides it, and coarser intervals are derived from that base exactly: first open, highest high, lowest low, last close, summed volume. Asking for an interval finer than the stored base is refused by name rather than approximated, because an approximation here is indistinguishable from data.

Before any rule runs, the series must pass structural checks: ordered timestamps, every open and close contained within its own bar's range, bars matching the agreed interval and falling inside the declared session and timezone of the venue, bar density consistent with that venue, and coverage of the full agreed period. Which venue the bars were checked against is stated in the report, because a check that reports "bars fall in the declared session" without naming the session is a check nobody can read.

9. What a verdict does not claim

Every report carries an explicit list of what it is not claiming. In general terms:

We also never suggest a parameter, an indicator or a fix. Doing so would make us a co-author of the strategy we are auditing, and would add a step to your search that nobody counted.

10. Driving it: web, or an agent over HTTPS

The service is built to be driven by a program as readily as by a person. The contract is public and needs no key to read: an agent handed nothing but the base URL can fetch the manifest, read the full handbook, learn that it needs a key and what the verbs are, and proceed from there.

A session is a conversation: submit an idea, read back what we understood and what we still need, answer questions by their id, accept or reject each assumption we proposed, confirm the plan, queue the run, and poll for the report. A pre-flight check tells you whether the rules are supported and whether the data is held before anything is read, and a refusal at that stage is never charged.

The full contract, with runnable examples, is at https://api.dualquant.ai/docs.

11. What is not built

This section exists because a method described only by its strengths is marketing. Three things are missing, and the reports say so themselves rather than leaving you to notice.

Rung 2, Reproduction, does not exist yet. Recomputing a previously stored external trade log from the same raw bars is designed and not implemented. Every verdict names this rung and reports it as not run, because a check that is quietly skipped is easily mistaken for one that passed.

Forward verification is planned, not available. Evaluating a frozen plan against live market data that did not exist when the plan was registered is the only test immune to historical overfitting by construction. It is the right end point for this service and it is not here yet. Nothing in a historical verdict should be read as forward evidence.

No strategy from outside our own research has been verified yet. The method was built and proven against our own live strategies. That is a real track record and it is also a narrow one, and we would rather say so than let the absence be discovered.

A verification badge that could not say no would be worthless, and so would a method that could not say "we have not built that". Both of those cost something to maintain. We think they are the only reason the rest of the document is worth reading.

Questions about anything in this paper: support@dualquant.ai. See also the Terms of Service and the Privacy notice.

This service is offered by DualQuant. Verification is performed by DualQuant alone; no broker, exchange, data vendor or fund has any stake in a verdict.