Strasmore Research
Learn am Matt ConnorBy Matt Connor

Where to Find Historical Implied Volatility Data

Find historical implied volatility data, understand why two 30-day IV series fit disagree, compare free and paid sources, and run the query yourself.

Historical implied volatility data na derived data, no be data wey dem record direct. Na this fact make am harder to source pass price history. IV na the number wey you get when you run option market price backwards through pricing model until the model value match the price wey dey show for screen. No exchange dey print am for tape. So, every published IV history carry choices about model, quote, contract selection and interpolation. Na these choices dey create the full difference between two series wey claim say dem dey measure the same thing.

If you want the definition first, wetin implied volatility be and how dem dey calculate implied volatility explain the mechanics. The next part show where the history dey and how you fit tell two versions apart.

Why historical implied volatility data hard pass price data to get?

Daily close dey observed: e print, and every vendor dey report the same number. But dem dey calculate IV level, and the four inputs for that calculation fit differ from one source to another.

  • The model: European Black-Scholes solve, American binomial tree with discrete dividends, or vendor variant wey get its own rate and borrow assumptions.
  • The price wey dem use: bid, ask, mid, last trade, or exchange settlement price.
  • Which contracts dey count: one at-the-money strike, moneyness band, or volume/open-interest filter.
  • How the number reach fixed maturity: interpolation between the two expiries wey dey bracket 30 days, or average of everything inside a days-to-expiry window.

Change one input and the level go shift. Change all four and two careful sources fit end up several volatility points apart for the same session, even though none of dem dey wrong.

The difference start inside one name. The panel below use AAPL across June 2026, keep only contracts wey get strike within 5% of spot price, then split dem by time left to expiry.

QueryOne name, one month: implied volatility by time wey remain to expiry (AAPL, June 2026)
The exact SQL behind every number
SELECT
    dte_band,
    round(100 * quantileDeterministic(0.25)(iv, contract_hash), 1) AS iv_p25_pct,
    round(100 * quantileDeterministic(0.50)(iv, contract_hash), 1) AS iv_median_pct,
    round(100 * quantileDeterministic(0.75)(iv, contract_hash), 1) AS iv_p75_pct,
    count()                                                        AS contract_day_count
FROM
(
    SELECT
        multiIf(days_to_expiry <=   7, '01-07d',
                days_to_expiry <=  21, '08-21d',
                days_to_expiry <=  45, '22-45d',
                days_to_expiry <=  90, '46-90d',
                days_to_expiry <= 180, '91-180d',
                                       '181d+')  AS dte_band,
        toFloat64(implied_volatility)             AS iv,
        cityHash64(ticker)                        AS contract_hash,
        days_to_expiry                            AS dte
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'AAPL'
      AND date >= '2026-06-01'
      AND date <  '2026-07-01'
      AND iv_converged = 1
      AND volume > 0
      AND days_to_expiry > 0
      AND underlying_close > 0
      AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
)
GROUP BY dte_band
ORDER BY min(dte)
Run this yourself

Na the same underlying, same month, and only near-the-money strikes. The shortest band for this view, 01-07d, get median IV of 29.6%. The longest, 181d+, dey at 28.1%. Inside that first band alone, the 25th and 75th percentiles be 24.9% and 35.8%. The shape across expiries na the term structure, while the related shape across strikes na volatility skew. No be one single IV dey here. Na surface dey here, and any published AAPL IV figure na just one summary of am. Na wetin our AAPL implied volatility page dey track.

Why two 30-day IV charts dey show different numbers?

Take one liquid underlying, one year of sessions, then build 30-day IV three ways from the same rows. The first column keep strikes wey dey within 1% of spot and expiries of 25 to 35 days. Na the tightest reading wey dey available. The second one widen the range to 5% of spot and 20 to 45 days. Na the practical default when every session need get value. The third one weight that wider set by contract volume, so the average move closer to strikes wey traders actually trade.

QueryThree ways to build 30-day IV for SPY, from one set of rows
The exact SQL behind every number
WITH
    near_money AS
    (
        SELECT
            toMonday(date)                                                 AS week_start,
            toFloat64(implied_volatility)                                  AS iv,
            days_to_expiry                                                 AS dte,
            volume                                                         AS vol,
            abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) AS moneyness
        FROM global_markets.options_greeks
        WHERE underlying_symbol = 'SPY'
          AND date >= '2025-08-01'
          AND date <  '2026-08-01'
          AND iv_converged = 1
          AND volume > 0
          AND underlying_close > 0
          AND days_to_expiry BETWEEN 20 AND 45
          AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
    ),
    weekly AS
    (
        SELECT
            week_start,
            avgIf(iv, dte BETWEEN 25 AND 35 AND moneyness < 0.01) AS tight_atm,
            avg(iv)                                               AS wide_atm,
            sum(iv * vol) / sum(vol)                              AS volume_weighted
        FROM near_money
        GROUP BY week_start
        HAVING countIf(dte BETWEEN 25 AND 35 AND moneyness < 0.01) > 0
    )
SELECT
    toString(week_start) AS week,
    concat(monthName(week_start), ' ', toString(toDayOfMonth(week_start)), ', ', toString(toYear(week_start))) AS week_label,
    round(100 * tight_atm, 1)       AS tight_atm_pct,
    round(100 * wide_atm, 1)        AS wide_atm_pct,
    round(100 * volume_weighted, 1) AS volume_weighted_pct,
    round(100 * (greatest(tight_atm, wide_atm, volume_weighted)
               - least(tight_atm, wide_atm, volume_weighted)), 1) AS spread_pp
FROM weekly
ORDER BY week_start
Run this yourself

For the first week wey dey show, July 28, 2025, the three methods print 16.6%, 16.4% and 16.7%. The gap between the highest and lowest one na 0.2 percentage points. The spread column follow that gap across all 53 weeks. None of the three na the fund’s true 30-day IV. Each one answer slightly different question. Vendor chart na one of them, but the label no show which method dem use.

How far back per-contract implied volatility history dey go?

The data behind these panels na global_markets.options_greeks: one row for each contract and trading day. E dey keep implied volatility alongside delta, gamma, vega, theta and rho. E also include strike, expiration, days to expiry, underlying symbol and underlying close. Na end-of-day data, no be live chain snapshot. The panel below dey count how many different underlying names get at least one converged IV row for each quarter.

QueryUnderlying names wey get converged daily IV, by quarter
The exact SQL behind every number
SELECT
    concat(toString(toYear(date)), '-Q', toString(toQuarter(date))) AS quarter,
    uniqExact(underlying_symbol)                                    AS underlyings_covered
FROM global_markets.options_greeks
WHERE iv_converged = 1
  AND volume > 0
  AND underlying_symbol NOT IN ('SPCX')
  AND date < '2026-07-01'
GROUP BY quarter
ORDER BY min(date)
Run this yourself

Coverage dey run from 2014-Q2 reach 2026-Q2, making 49 quarters altogether. For the last full quarter wey show, 5799 underlying names get converged daily IV.

Four filters dey do most of the work when you query data set like this.

  • Keep iv_converged = 1. The solver no always dey converge. An unconverged row na failed fit, no be low reading.
  • Keep volume > 0. Contract wey never trade fit carry IV wey come from stale quote.
  • Group by underlying_symbol. The ticker column hold the OCC contract code. So, if you group with am, you get one row for each strike and expiry instead of one row for each company.
  • Select contracts deliberately, near the money and within a days-to-expiry window. If you skip this step, you go average the skew and term structure into one figure.

Free implied volatility API dey?

Free sources dey, but each one get specific limitation.

  • Broker platforms dey calculate IV on their own chains and show am live. Downloadable history short or no dey at all, and the number na that broker’s model, no be standard.
  • Exchange-published volatility indices fit go back decades and dem no cost anything. Each one na single blended figure for one basket, so e answer market-wide question, no be question about one particular name.
  • General market data APIs mostly stop for prices. Per-contract greeks na separate product almost everywhere, and free tiers wey include am usually return live snapshot without archive. Our free stock market data API rundown explain wetin the open tiers actually dey provide.
  • Vendor-priced per-contract history na where long single-name archives dey. Dem dey sell am as end-of-day files by month or year, while realtime chains cost much more than the historical set. Wetin real time market data cost show how those price lists dey arranged.

The difference between snapshot and end-of-day matter as much as the price. Snapshot wey dem take for 4:00 p.m. ET use quotes wey dey stand for that exact moment. File wey dem build from settlement prices use completely different input, and the two fit differ most on the fastest market days.

Blended index volatility and single-name volatility no be the same thing. Index option dey price the move of a basket, where offsetting moves among members reduce the total effect. Single-name option dey price one company’s own path. The panel below put familiar names side by side across one month, using identical filters.

QueryMedian near-the-money IV, 20 to 45 days wey remain to expiry (June 2026)
The exact SQL behind every number
SELECT
    underlying_symbol                                              AS symbol,
    round(100 * quantileDeterministic(0.50)(iv, contract_hash), 1) AS median_iv_pct,
    count()                                                        AS contract_day_count
FROM
(
    SELECT
        underlying_symbol,
        toFloat64(implied_volatility) AS iv,
        cityHash64(ticker)            AS contract_hash
    FROM global_markets.options_greeks
    WHERE underlying_symbol IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'AMZN', 'KO', 'XOM', 'TLT')
      AND date >= '2026-06-01'
      AND date <  '2026-07-01'
      AND iv_converged = 1
      AND volume > 0
      AND underlying_close > 0
      AND days_to_expiry BETWEEN 20 AND 45
      AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
)
GROUP BY symbol
ORDER BY median_iv_pct DESC
Run this yourself

For June 2026, median near-the-money IV for the 20 to 45 day window range from 38.5% for NVDA go down to 10.4% for TLT, across 8 names. Same window, same filters, same solve. Ranking like that go hold only as long as the recipe remain fixed for every name inside am.

Source matter for IV rank and IV percentile?

Na source dey decide the answer. IV rank dey measure today’s IV against the highest and lowest values for a lookback period, usually one year. IV percentile dey count the share of days for that lookback wey stay below today’s level. Both calculations dey read one series from beginning to end. So, if the series change, the score fit move even when market no change at all. If you splice broker’s mid-quote IV onto vendor’s settlement-based archive, you create permanent step for the middle of the lookback. Every rank wey you calculate across that point go carry that step. IV rank vs IV percentile explain both calculations. The same rule apply when you compare implied movement with realized movement: historical volatility vs implied volatility cover that comparison.

The working standard na provenance rule. Pick one source, one model, one contract-selection recipe and one maturity convention. Then keep all four fixed for the full lookback. Series wey consistent inside itself, even if e differ small from other sources, better pass stitched series wey agree with each vendor only for certain parts.

FAQ

Where I fit get historical implied volatility data?

Options data vendors wey dey sell per-contract end-of-day greeks usually get long single-name histories as monthly or annual files. Exchanges dey publish free index-level volatility histories. Broker platforms dey show live IV for their chains, but downloadable history dey small. The panels above dey use per-contract daily set wey cover every listed contract with a converged fit.

Free implied volatility API dey?

Free tiers wey include per-contract greeks dey rare. The ones wey dey available usually return live snapshot, no be archive. Index volatility history na the main genuinely free long series. Deep single-name history normally na paid product.

Why two sources dey show different implied volatility for the same stock?

Na different pricing models, different input quotes, different contract selection and different maturity interpolation fit cause am. The panel above build three 30-day series from one set of rows, and dem dey 0.2 percentage points apart for the first week alone. So gap between two vendors dey expected; e no automatically mean error.

How far back implied volatility data dey go?

E depend on the source. Everywhere, per-contract archives dey shorter than price archives. The set behind this page start from 2014-Q2 and get daily rows for every converged contract since then.


Every panel for here come with the SQL wey produce am. Expand one to see exactly which contracts enter the number. If you wan build the same series for another name, another window or another recipe, ask for am in plain English for the Strasmore terminal.