Liquidity Filters in Options Backtests

Daniel Ratke
Research & Engineering
Liquidity Filters in Options Backtests
Options liquidity filters should enforce quote freshness, max spread, minimum size or activity, DTE availability, and price guards consistently across research and paper.

Term map
Execution-realism vocabulary for this article
Keep bid, ask, midpoint, quote age, spread percent, last-price risk, no-bid exit, and rejected fill separate. Options execution language is where many attractive research results become fragile.
Follow the linked definitions for Quote window, Last price risk, Spread percent, No-bid exit, Side-specific fill, Stale quote, Liquidity filter, Trade print validation, Condition-aware fill, Options data API, OPRA-originating data, and OCC option symbol.
Abstract
Liquidity filters are not there to make a backtest look conservative. They define whether the strategy could plausibly trade the contract. For options, that means spreads, quote age, size, open interest, volume, DTE, and price guards.
Developers should treat liquidity as part of the strategy contract, not a cleanup step after results are known.
Why Liquidity Is Part Of The Model
An options backtest has two decisions. First, the model decides that an underlying setup is worth trading. Second, the system decides whether an option contract can express that setup. Liquidity filters live in the second decision.
If the strategy buys a short-dated call with a wide spread, the signal may still be correct while the execution is not. If the trade is filled from midpoint in research but would have crossed the ask in practice, the PnL curve is making a stronger claim than the market evidence supports.
That is why liquidity should be logged beside the trade, not hidden in a later data-cleaning pass.
Filters That Matter
The basic filters are quote freshness, max spread percentage, minimum bid or ask, open interest, volume, and contract price. More advanced filters can include delta range, expected move, intrinsic value, and minimum number of valid quote observations.
| Filter | What it protects against | Example policy |
|---|---|---|
| Quote freshness | Filling from stale bid/ask data. | Reject quotes older than the configured entry window. |
| Spread width | Paying more spread than the expected edge can absorb. | Reject spread above a percent of premium or absolute max. |
| Minimum premium | Trading contracts too cheap to model cleanly. | Reject asks below a floor such as 0.05 or 0.10. |
| Open interest | Selecting structurally inactive contracts. | Require a minimum OI before ranking candidates. |
| Volume or trades | Choosing contracts with no activity near the event. | Use printed trades as support, not the sole fill source. |
| DTE window | Mixing different decay and gamma regimes. | Keep min, target, and max DTE explicit. |
| Quote size | Ignoring the displayed market depth. | Record bid and ask size even when not hard-gated. |
The key is consistency. If the filter is part of research, it should also exist in paper trading.
Liquidity Can Change The Winner
A strategy family may produce a strong stock-signal winner that fails once option liquidity is enforced. Another branch may have lower raw return but better quote quality and fewer rejects.
That second branch is often the better paper candidate. The market does not pay for untradable theoretical edge. A clean research report should show both versions: before liquidity and after liquidity. The difference explains whether the strategy idea is weak or whether the option expression is the bottleneck.
For example, a 0DTE breakout rule might find many attractive underlying moves. Once the selector requires a same-day expiration, fresh bid/ask, a reasonable spread, and enough open interest, the number of tradable entries may fall sharply. That is not a bug. It is evidence about whether the strategy can be expressed through the listed options market.
Avoid Post-Hoc Filter Mining
Liquidity filters can be overfit too. If a threshold is chosen only because it rescues the winner, it should be treated with suspicion. Prefer round, explainable thresholds and then test robustness around them.
A practical approach is to define a base policy and two nearby variants before reading the full result:
| Policy | Intended use |
|---|---|
| Strict | Tests whether the idea survives only very clean markets. |
| Base | Represents the default research and paper-trading policy. |
| Loose | Shows opportunity size when liquidity limits are relaxed. |
If the result only works in the loose policy and collapses in base, the strategy should not be promoted without a clear reason. If the strict policy keeps fewer trades but similar shape, the idea may be more credible than the raw count suggests.
What To Log
Every selected or rejected contract should preserve the fields that drove the decision:
- selected OCC ticker
- expiration date and DTE
- strike and call/put side
- bid, ask, midpoint, and spread
- quote timestamp and quote age
- bid size and ask size when available
- open interest and volume
- reject reason or pass reason
- fill model used at entry and exit
These fields make review possible. Without them, a future developer has to guess whether a backtest failed because the signal was poor, the chain was sparse, or the fill model was too optimistic.
Carry Filters Into Paper
The paper bot should not silently loosen liquidity. If the research profile required fresh quotes, max spread, and DTE validation, the paper route should enforce the same rules or label the change as intentional. Otherwise paper trading is no longer validating the backtest. It is testing a different system.
This is also where rejection statistics become useful. A paper run with many spread_above_max rejects tells the team something different from a run with many no_listed_expiry rejects. The first suggests market quality problems. The second suggests calendar or universe selection problems.
Takeaway
Liquidity filters are part of the evidence standard for options backtesting. They should be explicit, stable, logged, and carried forward into paper validation. Start from contract selection, use quotes for executable context, and treat every reject as a measurement of the market surface.
Related workflow
For the Liquidity Filters in Options Backtests workflow, continue through Quotes, Backtesting Execution Realism, Option Quote and Trade Conditions, Options Slippage Modeling, Why Option Quotes Matter More Than Last Price, and Quote-Aware Options Backtests.
How the terminology applies
For Liquidity Filters in Options Backtests, the execution-realism workflow should treat Quote window, Last price risk, Spread percent, No-bid exit, Side-specific fill, and Stale quote as operational state rather than glossary decoration. That framing keeps the fill model honest because options execution is controlled by displayed markets, timing, liquidity, and side-specific assumptions.
A developer implementing this Backtesting idea should persist Liquidity filter, Trade print validation, Condition-aware fill, Options data API, OPRA-originating data, and OCC option symbol beside the result, instead of leaving those words in a term card. It also prevents the page from treating last price, midpoint, or a bar close as interchangeable evidence for a fill.
The review artifact for Liquidity Filters in Options Backtests becomes more useful when Bid/ask spread, Midpoint, Quote/trade condition, Quote vs trade semantics, REST snapshot, and WebSocket stream appear in the same body of evidence as the selected rows. When a modeled order is accepted, these fields should explain why the fill was plausible; when it is skipped, they should explain why.
In production notes for this execution-realism workflow, Entitlement gate, Quote freshness, Timestamp semantics, Pagination cursor, Response envelope, and Rate-limit budget define the checks that decide whether the workflow is reproducible. The result is an execution model that can be tightened without rewriting the strategy narrative.
For Liquidity Filters in Options Backtests, 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 execution-realism 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.
Quote window
A bounded timestamp range used to inspect executable bid/ask markets around a modeled decision.
Last price risk
The danger of filling a strategy at a stale or isolated trade print rather than the available market.
Spread percent
Bid/ask width divided by midpoint, used as a liquidity and execution-quality filter.
No-bid exit
A contract state where the exit side has no usable bid and the backtest should reject or heavily penalize the fill.
Side-specific fill
A policy that treats buys, sells, entries, exits, stops, and profit targets differently instead of using one price rule.
Stale quote
A bid/ask record too old for the modeled decision time, especially around halts, events, reconnects, or illiquid contracts.
Liquidity filter
A pre-trade rule based on bid, ask, spread percent, volume, OI, quote age, and minimum premium.
Trade print validation
The check that a last sale supports context without replacing the executable bid/ask market.
Condition-aware fill
A fill rule that preserves quote and trade conditions before accepting, rejecting, or labeling a market-data row.
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.
Response envelope
The shared status, request id, results, pagination, and error shape that keeps API wrappers and logs consistent.
Rate-limit budget
The request capacity that shapes polling cadence, scanner breadth, retries, backfills, and degraded-mode behavior.
FAQ
Related questions
Can liquidity filters be overfit?
Yes. Prefer stable, explainable thresholds and test nearby values instead of choosing filters only because they rescue a winner.

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.
Backtesting Execution Realism
Use the docs standard for quote-aware fills, spread checks, and rejects.
Options Liquidity Scanner
Inspect spreads, volume, open interest, IV, and delta in an interactive workflow.
Options Backtesting API
Build historical contract, quote, trade, and aggregate workflows with liquidity gates.
Quotes Docs
Use bid/ask history as the evidence layer behind fill assumptions.