Strasmore Research
Deep Dives Matt ConnorBy Matt Connor

IV Term Structure: What the Curve Tells You

The IV term structure is implied volatility plotted by expiration. See what upward sloping and inverted curves mean, with real option data on the shape.

The IV term structure is implied volatility plotted against expiration, one reading per expiry, using options struck near the current share price. Two shapes cover almost everything you will meet: an upward slope in quiet conditions, where distant expirations carry the higher number, and an inverted curve when a dated event sits in the front month. Both shapes below are built from per contract option data rather than a textbook diagram.

What the IV term structure measures

Implied volatility is the annualized size of the move an option's price implies for the underlying stock. It is quoted per contract, so a single stock carries hundreds of readings at any moment, one for every strike and expiration on the board. Fix the strike near the current price, let expiration vary, and those readings line up into a curve. That curve is the term structure.

Sampling matters more than most explanations admit. Every panel here takes contracts whose absolute delta sits between 0.35 and 0.65, which is the standard way of saying near the money without pinning a strike, then takes the median implied volatility inside each maturity band. Median rather than average: one stale quote on a barely traded contract can print an implausible number, and an average carries it into the result.

Here is the curve for six liquid names across the June 2026 sessions.

QueryIV term structure, six liquid names: median near-the-money implied volatility by expiry band, June 2026
The exact SQL behind every number
WITH (
    SELECT quantileDeterministic(0.5)(toFloat64(implied_volatility), cityHash64(ticker))
    FROM global_markets.options_greeks
    WHERE underlying_symbol IN ('SPY', 'AAPL', 'MSFT', 'KO', 'JNJ', 'PG')
      AND date >= toDate('2026-06-01')
      AND date < toDate('2026-07-01')
      AND iv_converged = 1
      AND volume > 0
      AND implied_volatility BETWEEN 0.03 AND 3
      AND abs(toFloat64(delta)) BETWEEN 0.35 AND 0.65
      AND days_to_expiry BETWEEN 5 AND 20
) AS front_band_iv
SELECT multiIf(days_to_expiry <= 20, '5-20 days',
               days_to_expiry <= 45, '21-45 days',
               days_to_expiry <= 90, '46-90 days',
               days_to_expiry <= 180, '91-180 days',
               '181-365 days') AS expiry_band,
       round(100 * quantileDeterministic(0.5)(toFloat64(implied_volatility), cityHash64(ticker)), 1) AS median_iv_pct,
       round(100 * (quantileDeterministic(0.5)(toFloat64(implied_volatility), cityHash64(ticker)) - front_band_iv), 1) AS pts_vs_front_band,
       count() AS contract_count
FROM global_markets.options_greeks
WHERE underlying_symbol IN ('SPY', 'AAPL', 'MSFT', 'KO', 'JNJ', 'PG')
  AND date >= toDate('2026-06-01')
  AND date < toDate('2026-07-01')
  AND iv_converged = 1
  AND volume > 0
  AND implied_volatility BETWEEN 0.03 AND 3
  AND abs(toFloat64(delta)) BETWEEN 0.35 AND 0.65
  AND days_to_expiry BETWEEN 5 AND 365
GROUP BY expiry_band
ORDER BY min(days_to_expiry)
Run this yourself

Median implied volatility measured 19.6% in the 5-20 days band and 21.5% in the 181-365 days band, 1.9 points above the front. The shape has a name borrowed from futures markets: contango, where later delivery carries the higher price. An inverted curve is backwardation.

Why the curve usually slopes upward

Two mechanics hold the normal shape in place.

The first is event density. A contract expiring in nine days covers nine days of calendar risk, and on a large cap with nothing scheduled inside that window, those are mostly ordinary trading days. A contract expiring in a year covers four quarterly reports, several central bank meetings, and every unscheduled headline in between. More known unknowns per contract lifts the annualized number the market will pay.

The second is the behaviour of volatility itself. Realized volatility clusters: quiet weeks follow quiet weeks, violent weeks follow violent weeks. While the market is quiet, near dated options price close to today's quiet reading, and options expiring a year out price nearer the long run average, which sits higher. The same arithmetic runs in reverse after a shock. In the sessions following a crash the front expiry prints the highest implied volatility on the board and the curve inverts along its whole length, with the far months anchored near their usual level.

What flips the curve: a dated event

A scheduled earnings report is the cleanest inversion you can watch. The report lands after the close on a known date. Every expiration settling after that date contains the move, and every expiration settling before it does not. The nearest expiry covering the event has the fewest ordinary days to average it against, and its annualized reading climbs furthest. A six month option spreads the same event across roughly 125 trading days and barely registers it.

NVIDIA reported after the close on Wednesday, February 26, 2025. The panel reads the whole curve twice: on the last session before the print, February 25, and on the first session after it, February 27.

QueryNVDA term structure either side of the February 26, 2025 report: median near-the-money IV by expiry band
The exact SQL behind every number
SELECT multiIf(days_to_expiry <= 20, '5-20 days',
               days_to_expiry <= 45, '21-45 days',
               days_to_expiry <= 90, '46-90 days',
               days_to_expiry <= 180, '91-180 days',
               '181-365 days') AS expiry_band,
       round(100 * quantileDeterministicIf(0.5)(toFloat64(implied_volatility), cityHash64(ticker),
                                                toDate(date) = toDate('2025-02-25')), 1) AS iv_before_print_pct,
       round(100 * quantileDeterministicIf(0.5)(toFloat64(implied_volatility), cityHash64(ticker),
                                                toDate(date) = toDate('2025-02-27')), 1) AS iv_after_print_pct,
       round(100 * (quantileDeterministicIf(0.5)(toFloat64(implied_volatility), cityHash64(ticker),
                                                 toDate(date) = toDate('2025-02-25'))
                  - quantileDeterministicIf(0.5)(toFloat64(implied_volatility), cityHash64(ticker),
                                                 toDate(date) = toDate('2025-02-27'))), 1) AS iv_drop_pts
FROM global_markets.options_greeks
WHERE underlying_symbol = 'NVDA'
  AND date >= toDate('2025-02-25')
  AND date < toDate('2025-02-28')
  AND iv_converged = 1
  AND volume > 0
  AND implied_volatility BETWEEN 0.05 AND 5
  AND abs(toFloat64(delta)) BETWEEN 0.35 AND 0.65
  AND days_to_expiry BETWEEN 5 AND 365
GROUP BY expiry_band
HAVING countIf(toDate(date) = toDate('2025-02-25')) >= 3
   AND countIf(toDate(date) = toDate('2025-02-27')) >= 3
ORDER BY min(days_to_expiry)
Run this yourself

The 5-20 days band read 84.9% on the session before the print and 66.4% on the session after, a change of 18.5 points. The 181-365 days band moved 1 points across the same two closes, a fraction of the front band's move. One underlying, one event, opposite experience at the two ends of the curve. That front end collapse is IV crush, and the term structure is where it is visible in advance.

Watching the curve build and collapse

One session either side of a report is a snapshot. The build takes weeks, and it shows up as a widening gap between the two ends of the curve.

QueryNVDA front band vs 91-180 day band: median near-the-money IV per session, Feb 10 to Mar 14, 2025
The exact SQL behind every number
SELECT toDate(date) AS session_date,
       round(100 * quantileDeterministicIf(0.5)(toFloat64(implied_volatility), cityHash64(ticker),
                                                days_to_expiry BETWEEN 5 AND 20), 1) AS front_iv_pct,
       round(100 * quantileDeterministicIf(0.5)(toFloat64(implied_volatility), cityHash64(ticker),
                                                days_to_expiry BETWEEN 91 AND 180), 1) AS back_iv_pct,
       round(100 * (quantileDeterministicIf(0.5)(toFloat64(implied_volatility), cityHash64(ticker),
                                                 days_to_expiry BETWEEN 5 AND 20)
                  - quantileDeterministicIf(0.5)(toFloat64(implied_volatility), cityHash64(ticker),
                                                 days_to_expiry BETWEEN 91 AND 180)), 1) AS front_minus_back_pts
FROM global_markets.options_greeks
WHERE underlying_symbol = 'NVDA'
  AND date >= toDate('2025-02-10')
  AND date < toDate('2025-03-15')
  AND iv_converged = 1
  AND volume > 0
  AND implied_volatility BETWEEN 0.05 AND 5
  AND abs(toFloat64(delta)) BETWEEN 0.35 AND 0.65
  AND ((days_to_expiry BETWEEN 5 AND 20) OR (days_to_expiry BETWEEN 91 AND 180))
GROUP BY session_date
HAVING countIf(days_to_expiry BETWEEN 5 AND 20) >= 3
   AND countIf(days_to_expiry BETWEEN 91 AND 180) >= 3
ORDER BY session_date
Run this yourself

The gap between the bands ran 12.4 points on the first session of the window and 3.3 points on the last, across 24 sessions. Watch the shape of the front line rather than its level: it climbs as the report approaches, tops out on the sessions around it, and drops back inside one session afterwards. The back line does almost nothing throughout. Earnings and the option greeks covers what the same event does to vega and theta on the individual contracts.

How often is the curve inverted?

Inversion is not rare, and how much of the year a name spends there differs enormously between tickers.

QueryShare of sessions with an inverted curve: front band above the 91-180 day band, twelve months to July 31, 2026
The exact SQL behind every number
WITH daily AS (
    SELECT underlying_symbol,
           toDate(date) AS session_date,
           quantileDeterministicIf(0.5)(toFloat64(implied_volatility), cityHash64(ticker),
                                        days_to_expiry BETWEEN 5 AND 30) AS front_iv,
           quantileDeterministicIf(0.5)(toFloat64(implied_volatility), cityHash64(ticker),
                                        days_to_expiry BETWEEN 91 AND 180) AS back_iv
    FROM global_markets.options_greeks
    WHERE underlying_symbol IN ('NVDA', 'AAPL', 'MSFT', 'AMZN', 'KO', 'JNJ', 'PG', 'SPY', 'XOM', 'WMT')
      AND date >= toDate('2025-08-01')
      AND date < toDate('2026-08-01')
      AND iv_converged = 1
      AND volume > 0
      AND implied_volatility BETWEEN 0.03 AND 5
      AND abs(toFloat64(delta)) BETWEEN 0.35 AND 0.65
      AND ((days_to_expiry BETWEEN 5 AND 30) OR (days_to_expiry BETWEEN 91 AND 180))
    GROUP BY underlying_symbol, session_date
    HAVING countIf(days_to_expiry BETWEEN 5 AND 30) >= 3
       AND countIf(days_to_expiry BETWEEN 91 AND 180) >= 3
)
SELECT underlying_symbol AS ticker,
       count() AS sessions,
       round(100 * countIf(front_iv > back_iv) / count(), 1) AS inverted_pct,
       round(100 * quantileDeterministic(0.5)(front_iv - back_iv,
                                              cityHash64(concat(underlying_symbol, toString(session_date)))), 1) AS median_spread_pts
FROM daily
GROUP BY underlying_symbol
ORDER BY inverted_pct DESC
Run this yourself

Over 251 sessions in the twelve months to July 31, 2026, XOM printed the front band above the 91 to 180 day band on 68.5% of them, against 19.5% for SPY. Their median gaps sat 1.4 points and -2.1 points apart. Names with dated events on a regular calendar spend more of the year inverted, and a broad index fund spends most of its time in contango with inversions clustered around selloffs. IV rank measures something different: where today's level sits inside its own past year, not how the curve is shaped across expirations.

What a flat or inverted curve does to a calendar spread

A calendar spread sells a near dated option and buys a longer dated option at the same strike. A diagonal does the same across two different strikes. Either way the position is long the back expiry's implied volatility and short the front expiry's, which makes the term structure its main input rather than a background detail.

When the curve slopes upward, the near leg is sold at a lower implied volatility than the far leg is bought. When the front month is inverted ahead of an event, that relationship reverses, and the position is opened into a curve that has somewhere to converge. Afterwards the front collapses toward the back, the back moves little, and the spread between the two readings returns to its ordinary shape. Where the position actually lands also depends on how far the stock travels, which the curve says nothing about. The expected move page covers that half of the problem.

A flat curve is the awkward case. There is no slope to work with in either direction, and the outcome rests almost entirely on the stock's path and the passage of time.

IV term structure FAQ

What is the IV term structure in options?

It is implied volatility plotted by expiration date for options near the money. Across six liquid names in June 2026 the median reading measured 19.6% in the 5-20 days band and 21.5% in the 181-365 days band.

What does an inverted IV term structure mean?

An inverted curve prints its highest implied volatility in the nearest expirations. It appears when a dated event sits inside the front month, and in the sessions following a sharp selloff, when near dated contracts price off recent large moves while distant ones sit closer to a long run average.

Why is front month implied volatility so high before earnings?

A near dated contract has very few ordinary trading days to average one large expected overnight move against, and the annualized figure climbs to account for it. NVIDIA's 5-20 days band read 84.9% the session before its February 26, 2025 report and 66.4% the session after.

Is the term structure the same thing as volatility skew?

No. Skew compares implied volatility across strikes within one expiration. The term structure holds moneyness roughly fixed and compares across expirations. Volatility skew covers the strike dimension of the same surface.


Every figure above is a stored query over per contract implied volatility, with the SQL expandable under each panel. Plot the same curve for any ticker on the Strasmore terminal.