Concept Specification
option-strategy2026-08-21

Option Liquidity Scoring

How SOPHIE's per-contract liquidity score works: why spread gates the score multiplicatively rather than being outvoted by open interest, the log-scaled volume/OI components, and how a contract with a wide unfillable quote can never be rescued by size.

Overview

Implementation spec for the per-contract liquidity score in SOPHIE's options chain (OptionsMatrixTable, lib/options/liquidity.ts). The score answers one practical question: if I send this order, will it fill at a price close to the mid?

It is calibrated specifically to SPX microstructure, where ATM spreads trade extremely tight (under 0.3%) and widen rapidly out-of-the-money. A generic equity-options model mis-scores SPX badly in both directions.

Mid Price and Spread

Mid Price=Bid+Ask2,Spread %=AskBidMid Price\text{Mid Price} = \frac{\text{Bid} + \text{Ask}}{2}, \qquad \text{Spread \%} = \frac{\text{Ask} - \text{Bid}}{\text{Mid Price}}

Design Principle: Spread Gates the Score

The central modelling decision. A contract with enormous open interest but an unfillable quote — say 0.00bidagainsta0.00 bid against a 5.00 ask — is not liquid, however much size rests there.

So spread acts as a strict multiplicative gate, not as one arithmetic component that heavy open interest can outvote. A naive weighted average of spread, volume and OI would rank that contract as tradeable. This model cannot: if the spread score is zero, the composite is zero regardless of activity.

Component Scores

Spread score — a piecewise-linear curve whose breakpoints reflect where SPX quotes actually sit:

Scorespread={100Spread %0.3%10030×Spread %0.0030.0100.0030.3%<Spread %1.0%7040×Spread %0.0100.0300.0101.0%<Spread %3.0%3030×Spread %0.0300.0800.0303.0%<Spread %8.0%0Spread %>8.0%\text{Score}_{\text{spread}} = \begin{cases} 100 & \text{Spread \%} \le 0.3\% \\ 100 - 30 \times \frac{\text{Spread \%} - 0.003}{0.010 - 0.003} & 0.3\% < \text{Spread \%} \le 1.0\% \\ 70 - 40 \times \frac{\text{Spread \%} - 0.010}{0.030 - 0.010} & 1.0\% < \text{Spread \%} \le 3.0\% \\ 30 - 30 \times \frac{\text{Spread \%} - 0.030}{0.080 - 0.030} & 3.0\% < \text{Spread \%} \le 8.0\% \\ 0 & \text{Spread \%} > 8.0\% \end{cases}

Volume and open interest scores — both log-scaled, because activity is roughly log-distributed across a chain and a linear scale would let a handful of ATM strikes dominate everything:

Scorevol=min(100,log10(Volume+1)log10(1001)×100)\text{Score}_{\text{vol}} = \min\left(100, \frac{\log_{10}(\text{Volume} + 1)}{\log_{10}(1001)} \times 100\right) ScoreOI=min(100,log10(OI+1)log10(5001)×100)\text{Score}_{\text{OI}} = \min\left(100, \frac{\log_{10}(\text{OI} + 1)}{\log_{10}(5001)} \times 100\right)

The different denominators set the saturation points: volume saturates at ~1,000 contracts traded, open interest at ~5,000 resting.

Activity score — volume weighted above open interest, since today's trading is a better signal of a live market than resting size that may be stale:

Scoreactivity=0.65×Scorevol+0.35×ScoreOI\text{Score}_{\text{activity}} = 0.65 \times \text{Score}_{\text{vol}} + 0.35 \times \text{Score}_{\text{OI}}

Composite Score

Scorecomposite=round(Scorespread×(0.55+0.45×Scoreactivity100))\text{Score}_{\text{composite}} = \text{round}\left( \text{Score}_{\text{spread}} \times \left(0.55 + 0.45 \times \frac{\text{Score}_{\text{activity}}}{100}\right) \right)

The 0.55+0.45()0.55 + 0.45(\cdot) envelope is what makes spread a gate rather than a veto. A tight-spread contract with no activity still scores 55% of its spread score — genuinely tradeable, just quiet. A wide-spread contract cannot be rescued by activity, because the multiplier only ever scales down from the spread ceiling.

TierScoreBadge
Excellent75\ge 75Emerald
Good50–74Blue
Fair25–49Amber
Poor<25< 25Rose

How This Kind of Score Is Used in Practice

A composite liquidity score of this shape is a standard building block on professional execution desks, not a SOPHIE-specific idea — it's the same logic behind smart-order-routing and pre-trade "tradability" checks that route flow away from contracts likely to produce poor fills. In practice traders use a score like this three ways:

  • Screening. Filtering a chain down to strikes actually worth quoting, before looking at price at all — useful on wide chains like SPX where hundreds of strikes are listed but liquidity concentrates near the money.
  • Sizing. A thin contract that would move on a 1-lot can still be fine for size 1, but the same score should discourage size 50 — spread and depth both matter to how much size a quote can actually absorb, which a pure spread-percentage number doesn't capture.
  • Execution timing. Spread and volume both vary through the trading day — tightest near the open/close and around major index rebalances, widest in quiet midday stretches — so desks that watch a rolling liquidity score rather than a static one avoid trading into temporarily bad conditions.

Limitations

  • Quotes are a snapshot. A tight spread at the moment of capture says nothing about depth behind it, or whether the quote survives an order of size.
  • Volume is same-day, open interest is prior-day. They are measured over different windows, so the activity blend mixes two clocks.
  • Calibrated to SPX. The breakpoints assume index-option microstructure and would need recalibration for single-name equity options, where 1% spreads can be normal rather than mediocre.

Key Takeaways

  • Spread gates the score multiplicatively — size never rescues an unfillable quote.
  • Volume and OI are log-scaled, saturating at ~1,000 and ~5,000 contracts.
  • Volume is weighted 0.65 against OI's 0.35: live trading beats resting size.
  • A quiet but tight contract floors at 55% of its spread score rather than collapsing.

Related Reading

Comments

Disclaimer: This application is a personal proof of concept created for study and research purposes only. All analysis, suggestions, and content are generated by AI models using publicly available data and tools, and should not be considered as financial advice. Past performance is not indicative of future results. Always conduct your own research and consult with qualified financial professionals before making investment decisions. The app's AI models may have limitations and may not account for all market factors or recent developments. Users are solely responsible for their investment decisions and should understand that all investments involve risk.