Dispersion Trading Backtest: QQQ vs SPY and Why the Signal Was Not Symmetric

Daniel Ratke
Research & Engineering

Term map
Backtesting vocabulary for this article
Treat signal timestamp, point-in-time universe, quote-aware fill, reject reason, replay artifact, walk-forward test, and cache key as first-class terms. They separate reproducible research from a backtest that only preserves the final performance table.
Follow the linked definitions for Point-in-time contracts, Quote-aware fills, Reject reasons, Replay artifact, Cache key, Signal timestamp, Look-ahead leakage, Walk-forward test, Slippage model, Same-bar fill, Promotion gate, and Options data API.
Repository reference: cutebacktests
Abstract
Dispersion sounds like one theme, but in practice the edge can be concentrated in one sleeve and absent in another. This repository's recent work on relative-value and dispersion-style intraday breakouts makes that unusually clear. The strongest tactical insight from the dispersion branch was not "dispersion works." It was "QQQ carried much more of the signal than SPY."
The key evidence appears in Episode 9 and Toward The One Piece Of Sharpe. The strict-causal reruns showed QQQ single +20.81% on 5 trades and QQQ vertical +10.85% on 8 trades, while the best positive SPY paths remained weak or extremely sparse. Later Stage B replays reported qqq_single_base with 9 trades and +44537.92, and qqq_single_volume15_v1 with 10 trades and +32998.35. Those are strong-looking numbers, but the repo still kept the QQQ sleeve as research_only because the sample remained thin.
For a cleaner data read, pair this post with Dispersion and Relative-Strength Backtests: Proxy Series and Data Limits, Stock Aggregates and Indicators, and Backtesting Data Model.
Question
The practical question is not whether dispersion is a good idea in the abstract. The real question is where the signal actually lived once the branch was decomposed by index sleeve, overlay, and parity quality.
Combined dispersion results can hide a very uneven picture. If one sleeve is carrying the economic value and the other is weak or negative, the combined result can be harder to interpret than either component on its own. This repo learned that symbol decomposition was not a side exercise. It was the main way to understand the branch.
Method: How the Dispersion Trading Backtest Was Decomposed
As Episode 9 explains, the QQQ sleeve is not a totally separate family. It is a specialized descendant of the c4 dispersion-relative breakout logic. At the stock level, it uses QQQ-specific variants of the dispersion breakout seed, adjusting relative-volume floors, beta-shock tolerance, and entry thresholds. At the option level, the repo later moved away from fixed overlays and derived the option overlay from the actual stock winner selected upstream.
This decomposition separated three different questions:
- whether the stock-level relative-value logic was better in QQQ than SPY
- whether quote and loader issues were hiding the true branch quality
- whether the preferred option overlay should be the default single-leg structure or a higher-liquidity variant like
qqq_single_volume15_v1
Once the branch was broken apart that way, the asymmetric signal became much easier to see.
Evidence / Results
The core evidence from the dispersion backtest now looks like this:
- strict-causal rerun:
QQQsingle+20.81%on5trades, vertical+10.85%on8trades - patched combined rerun: single
+5369.05on7trades, vertical+8150.18on11trades - direct Stage B QQQ replay:
qqq_single_base9trades,+44537.92 - direct Stage B QQQ replay:
qqq_single_volume15_v110trades,+32998.35 - positive-unlock replay:
qqq_single_base9trades,+9079.91 - positive-unlock replay:
qqq_single_volume15_v117trades,+326.53
The symbol-level interpretation from those results is clear. QQQ carried more of the dispersion signal. SPY remained weak, sparse, or negative often enough that the combined view was less informative than the decomposed one.
What Worked
What worked was the symbol decomposition and the later dynamic-overlay repair. The repo learned that dispersion strength was not evenly distributed across sleeves, and it stopped pretending otherwise. It also learned that fixed overlays could create stock-to-option drift once the upstream winner changed. When overlays were generated dynamically from the selected stock seed, the branch became cleaner and the preferred winner changed from qqq_single_volume15_v1 to qqq_single_base.
This is exactly the kind of result a scientific process should produce. It identified a winner and clarified why the earlier combined branch was noisier than it should have been.
What Failed
What failed was symmetry. SPY did not cooperate in the same way QQQ did. That is an important negative result because it prevents a family-level victory claim that the evidence does not support.
Sample size also failed to clear the promotion bar. The repo was disciplined enough not to promote the QQQ sleeve despite large-looking totals like +44537.92 on 9 trades. That restraint matters. Large totals on thin samples are hypotheses, not admissions tickets.
Takeaway
The main lesson from this dispersion trading backtest is that the signal was not symmetric across QQQ and SPY. QQQ carried the economic value, SPY did not, and the combined view only made sense once the branch was decomposed and the overlay path was repaired.
If you want the strategy-logic side of this family, Relative Strength Breakout Strategy: Testing Proxy-Based Intraday Breakouts With QQQ and DIA explains the proxy-relative design. If you want the near-miss that still failed admission, Why c4 Was Parked: A Dispersion Strategy That Improved But Still Failed the Portfolio Gate is the next step. Join the research log to get the next backtest and failure report.
How the terminology applies
For Dispersion Trading Backtest: QQQ vs SPY and Why the Signal Was Not Symmetric, the backtesting workflow should treat Point-in-time contracts, Quote-aware fills, Reject reasons, Replay artifact, Cache key, and Signal timestamp as operational state rather than glossary decoration. That framing keeps the research claim causal: the strategy can only select instruments, prices, and labels that existed at the decision time.
A developer implementing this Case Study idea should persist Look-ahead leakage, Walk-forward test, Slippage model, Same-bar fill, Promotion gate, and Options data API beside the result, instead of leaving those words in a term card. It also turns attractive performance into an auditable record where fills, skips, thresholds, and replay inputs can be challenged independently.
The review artifact for Dispersion Trading Backtest: QQQ vs SPY and Why the Signal Was Not Symmetric becomes more useful when OPRA-originating data, OCC option symbol, Bid/ask spread, Midpoint, Quote/trade condition, and Quote vs trade semantics appear in the same body of evidence as the selected rows. When a result is promoted, these fields should appear in the run manifest, rather than a prose summary or final equity curve.
In production notes for this backtesting workflow, REST snapshot, WebSocket stream, Entitlement gate, Quote freshness, Timestamp semantics, and Pagination cursor define the checks that decide whether the workflow is reproducible. The result is a backtest that can be rerun, compared across threshold families, and rejected when the evidence is not strong enough.
For Dispersion Trading Backtest: QQQ vs SPY and Why the Signal Was Not Symmetric, the practical acceptance test is simple: another developer should be able to read the body, identify the exact inputs, reproduce the request sequence, and explain the accepted and rejected rows without relying on the bottom terminology grid. If a phrase appears in the page vocabulary, it should correspond to a stored field, a validation check, a replay step, or an implementation decision in the backtesting workflow.
This is also the reason the article should not measure success only by the final chart, table, or headline metric. The better standard is whether the data path, timing model, entitlement state, and evidence trail survive review. When those pieces are written directly into the body, the terminology becomes part of the workflow readers can implement.
Terminology
Market-data terms used in this article
These terms keep the article connected to the CuteMarkets knowledge base and to the exact API workflow behind the research.
Point-in-time contracts
Contract discovery anchored to the research date so a backtest does not use future listings.
Quote-aware fills
Entry and exit assumptions based on bid/ask quotes, quote age, spread width, and side-specific fill rules.
Reject reasons
Logged explanations for skipped contracts or fills, including stale quote, wide spread, no bid, or missing data.
Replay artifact
The saved request, selection, fill, reject, and metric record that lets another developer audit the backtest.
Cache key
The structured identifier that keeps provider, endpoint, ticker, timestamp, plan, and schema state from being mixed.
Signal timestamp
The exact time a strategy made a decision, used to reconstruct the visible universe and quote window causally.
Look-ahead leakage
A research error where a fill, contract, indicator, or label uses information unavailable at decision time.
Walk-forward test
A validation method that repeatedly trains and evaluates across separated time windows instead of trusting one optimized sample.
Slippage model
A fill-cost assumption based on bid/ask side, midpoint, spread percent, quote age, and liquidity policy.
Same-bar fill
An intraday backtest assumption that can become invalid when signal, entry, stop, and target ordering is ambiguous.
Promotion gate
The written threshold that decides whether a research candidate can move into paper trading or production monitoring.
Options data API
The product surface for chains, contracts, quotes, trades, aggregates, Greeks, IV, open interest, and expirations.
OPRA-originating data
The U.S. listed-options source context behind quotes, trades, exchange participation, and consolidated option-market records.
OCC option symbol
The exact option contract identifier that preserves root, expiration, call or put side, and strike.
Bid/ask spread
The execution interval between bid and ask that determines whether a contract is realistically tradable.
Midpoint
The computed center between bid and ask, useful as a reference price but not proof that an order would fill.
Quote/trade condition
The condition-code, exchange, correction, sequence, and timestamp context that explains how a quote or trade row can be used.
Quote vs trade semantics
The distinction between executable bid/ask markets, printed transactions, and bar-level summaries.
REST snapshot
A reproducible request for current or historical market state, used for initialization, backfills, and audit logs.
WebSocket stream
A persistent live connection that needs subscription topics, reconnect tracking, freshness labels, and REST repair paths.
Entitlement gate
The product, plan, quote, live, delayed, historical, or commercial-use boundary checked before data is shown.
Quote freshness
The age, timestamp, and live or delayed state of a bid/ask record before it is used in a scanner, backtest, or UI.
Timestamp semantics
The exchange, provider, ingestion, session, and application time context attached to a market-data record.
Pagination cursor
The continuation token or next URL that keeps large chains, trades, quotes, and historical windows complete.

Written by
Daniel Ratke
Research & Engineering
Daniel covers the deeper research notes: options backtesting, execution realism, robustness testing, data engineering, and strategy validation.
Product links
Build the workflow with CuteMarkets
This article is part of the broader CuteMarkets product and research stack. Use the landing pages below to move from the blog into the specific API workflow you want to evaluate.
Beginner options path
Send newcomers to the beginner path for calls, puts, chains, Greeks, IV, and risk.
Options Data API
See the main options overview for real-time and historical options data.
Historical Options Data API
Inspect the historical contracts, quotes, trades, and aggregates workflow.
Options Chain API
Go straight to chain snapshots, expirations, and strike discovery.
Pricing
Review plans before you move from free evaluation into production usage.