OptionSpace.ai
OptionSpace / Why OptionSpace / Quality control Why OptionSpace

Every fit, checked against every quote.

We compare every fitted price with the market it came from, attach a plain reason when a fit may be less reliable, and hold back the few that fail. You see the result on every fit.

113 millionoption quotes checked against our fits on a typical recent trading day
every quote inside99% to 99.9%97% to 99%95% to 97%below 95%

Real data from a typical recent trading day. One row per symbol (137, busiest at the top), one column per minute from 09:32 to 15:57 ET. Each cell is the share of that minute's checked quotes whose fitted price lies between the bid and the ask. Hover any cell.

Every fit over 20 trading days in October 2026, by share of its quotes inside

A typical recent trading day: averages over 20 trading days in October 2026. "Inside" means the fitted price lies between the bid minus half a cent and the ask plus half a cent. Quotes checked: every option with a real two-sided market, in and out of the money, inside the fitted strike range.
* Not counting the borrow flag (borrow_at_limit), which marks a stock price that may be out of step with the options rather than a problem with the fit.

Why check a fit against every quote at all? What a fit does that a midprice can't →

By symbol

The names you trade, across the whole history.

Since January 2017, the share of each name's quotes with the fit inside them, every option in and out of the money. The dot is a typical day (the median); the bar runs out to a bad day (the 95th percentile).

typical day (median)out to a bad day (95th percentile)

Every minute of every trading day: 140 billion quotes since January 2017, 99.41% of them inside. The last row pools every name we cover. META's history starts in June 2022 and NDX's in May 2026. Hover a row for its numbers.

What we check

Five steps, every fit.

The counts are for a typical recent trading day: averages over 20 trading days in October 2026.

  1. 1

    Screen the quotes

    Before fitting, quotes too wide to say anything about value are set aside, so one bad print can't bend a smile.

    every minute
  2. 2

    Fit one smooth smile

    One smooth smile per expiry, fitted to every quote that passed the screen.

  3. 3

    Check every quote

    Every fit goes through a whole slew of quality checks. Each smile is also mapped against every quote, region by region, puts and calls, from the money out to the far wings, so we see where a fit misses, not only how often, and whether calls and puts agree at the same strike.

  4. 4

    Explain the doubtful ones

    When a fit may be less reliable, it carries reason codes in plain English, so you can decide whether to use it.

  5. 5

    Hold back the failures

    A fit that fails our checks (a jump that reverts a minute later, a forward the quotes don't support, a smile that can't cover its strikes) is not served. The API says it was withheld, rather than handing you a bad number.

Reason codes

Every flag has a reason you can read.

Each code names one reason a fit may be less reliable, and a fit can carry more than one. Select a code to read what it means.

A flag doing its job

One minute apart. One to trust, one to question.

SPX options, one December expiry, on a recent afternoon. At 15:56 the fit lands inside all 942 checked quotes, calls and puts. At 15:57, in the last minutes before the close, some quotes jumped: one put's bid moved above both its neighbours' asks. The code tells you which minute to use.

A fit is only as good as the quotes it is given. When markets are under stress, the quotes that reach us from upstream can be unstable, or briefly out of step with each other. Our checks spot this. They flag the fit, or in the worst cases hold that minute back entirely.

SPX · 18 Dec expiry · 15:56 ET942 of 942 inside

No reason codes. Out-of-the-money quotes are drawn. In the lower panel every bar crosses the line: the fit is inside every quote. Scale: plus or minus 0.1 vol points.

SPX · 18 Dec expiry · 15:57 ET763 of 942 inside

quotes_not_convex A smile that stays free of arbitrage cannot pass through quotes that contain one, so near the money it misses 179 quotes, calls and puts. The out-of-the-money misses are brown. Scale: plus or minus 0.5 vol points, five times wider.

The bad data has a butterfly arbitrage:

// what the API returns with the 15:57 fit
"quality": {
  "status": "checked",
  "share_inside": 0.8100,
  "miss_spreads": 3.2,
  "miss_usd": 2.354,
  "n_checked": 942,
  "codes": ["quotes_not_convex"]
}
Ten years, same checks

The history is checked too.

Every fit back to January 2017 has been checked the same way as yesterday's: 1.73 billion fits and 85.8 billion quotes. In the worst year, 41 quotes in 10,000 fell outside. A back-test runs on checked data, with the same codes, not on raw quotes.

Quotes whose fitted price fell outside the bid and ask, per 10,000 checked, each year. The scale starts at zero. 2026 so far.

Do you publish what's wrong?

Yes. In the data, and in public.

Quality you can't see is quality you have to take on trust. We'd rather show you.

On every fit

Share of quotes inside, the size of any misses, and reason codes come with every expiry in the API, the Python package and the AI tools.

The quality fields →

Known issues, listed

What is wrong or missing right now, which symbols and dates it touches, and what we are doing about it.

Known issues →

When history changes

When a better method re-fits the past, we say which data changed, when, and why.

Data upgrades →