Quote-Aware Options Backtests Need Bid, Ask, and Rejects
CuteMarkets Team
Research
Quote-Aware Options Backtests Need Bid, Ask, and Rejects
Quote-aware backtests price entries and exits from observable bid/ask markets and reject trades when quotes are stale, missing, or too wide.

Quote-Aware Options Backtests Need Bid, Ask, and Rejects
Abstract
An options backtest that cannot reject trades is usually too optimistic. Realistic replay needs bid and ask quotes, quote age checks, spread limits, and a clear policy for what happens when the market is not tradable.
The important shift for developers is to treat a missing or wide quote as information, not as an inconvenience to smooth over.
Why Midpoint Is Not A Free Fill
The midpoint is useful for analysis, but it is not automatically executable. A strategy that assumes every entry fills at mid can look strong while depending on liquidity that never appears in live routing.
A stricter model can use ask for long entries and bid for exits, or a marketable limit model that crosses a controlled part of the spread. The exact policy depends on the strategy, but it should be explicit and tested under stress.
Version The Fill Policy
The fill model should be treated as a versioned part of the experiment. A run that enters at midpoint is not the same run as one that enters at ask, or one that uses a marketable limit at 60 percent of the spread. Those policies create different economics and different reject behavior.
A good fill-policy record includes entry side, exit side, quote age limit, maximum spread, minimum price, fallback behavior, and whether partial fills are modeled. If the policy changes, the manifest should change. That keeps research comparisons honest. Otherwise a branch can appear to improve when the signal did not improve at all; only the execution assumptions changed.
Developers should also avoid hiding fill policy inside strategy code. The signal layer should not decide that an entry receives midpoint pricing. It should request an expression. The execution layer should apply the same pricing rules across strategies unless a strategy-specific exception is intentionally documented.
Rejection Reasons Matter
A quote-aware backtest should record why a trade did not happen. Common reasons include stale quote, spread too wide, missing bid, missing ask, contract pool empty, DTE window unavailable, and price outside guardrails.
These reasons change research decisions. A weak strategy with many bad signals is different from a potentially useful strategy blocked by a narrow data coverage issue. Without reject reasons, both look like "no trades."
Quote Age Is A First-Class Variable
Quote age is easy to overlook because a quote row often looks authoritative in a table. In sparse options, a quote can be present but not current enough to support a simulated decision. The backtest should compare the signal or route timestamp with the quote timestamp and reject the trade when the age exceeds the policy.
The acceptable age depends on the strategy horizon. A multi-day options study may tolerate a different quote window than a five-minute intraday strategy. The important part is not one universal threshold. The important part is that the threshold is explicit, applied consistently, and reported.
Quote age also helps explain drift between backtest and paper trading. A paper bot can fail closed when quotes are stale, while a loose backtest may have accepted them. If the research artifact already tracks age rejects, that drift becomes diagnosable instead of surprising.
The Developer Workflow
Build the fill model as a separate layer from signal generation. The signal says "this setup exists." The execution layer says "this option expression was or was not tradable under the policy." That separation keeps strategy logic from hiding execution assumptions.
When results change, compare both layers. Did the signal become better, or did the fill model become easier? Did the number of trades increase because more valid quotes appeared, or because stale quotes were accepted?
Stress The Execution Assumption
A useful quote-aware report should include at least a small execution stress table. Compare the retained strategy under a strict policy and a slightly looser policy. For example, test ask-to-bid fills, half-spread slippage, a wider quote-age threshold, and a tighter spread limit. The point is not to choose the easiest policy. The point is to see whether the conclusion depends on a fragile execution assumption.
If a branch only works at midpoint and fails under modest spread crossing, the research conclusion should say so. If it remains acceptable under stricter assumptions, the evidence is stronger. If most trades are rejected under realistic spread limits, the strategy may need a different DTE bucket, different underlying set, or a rule that avoids illiquid parts of the chain.
Stress tests should preserve the same signal stream. Changing the signal and the fill model at the same time makes attribution unclear. A controlled execution stress keeps the scientific question narrow: how much of the result survives a harsher but plausible trading surface?
Analyze Accepted Trades And Rejects Together
Do not review only the winners. Accepted trades and rejected opportunities come from the same signal process. If the accepted set is profitable but most signals were rejected for wide spreads, the strategy may be selecting moments when the option market is difficult to trade. If rejects cluster by time of day, the signal may be firing in a poor liquidity window.
This joint view is useful even when the final PnL is negative. A weak result with clean quote coverage is a different failure from a weak result with constant execution rejects. One suggests the signal needs work. The other suggests the market expression is the bottleneck.
Takeaway
Bid, ask, quote age, spread, and rejects are not optional details in options research. They are the difference between a backtest that studies market behavior and one that studies a convenient price series.
FAQ
Related questions
Why are reject reasons important?
Reject reasons show whether a strategy failed because of signal quality, missing data, liquidity, DTE availability, or execution policy.
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.
Learn Options From Zero
Send newcomers to the beginner path for calls, puts, chains, Greeks, IV, and risk.
Options Data API
See the canonical product page 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.