{"slug":"iv-term-structure-explained","qid":"inversion_frequency","label":"Share of sessions with an inverted curve: front band above the 91-180 day band, twelve months to July 31, 2026","post_title":"IV Term Structure: What the Curve Tells You","post_url":"/blog/iv-term-structure-explained#q-inversion_frequency","columns":["ticker","sessions","inverted_pct","median_spread_pts"],"rows":[{"ticker":"XOM","sessions":251,"inverted_pct":68.5,"median_spread_pts":1.4},{"ticker":"JNJ","sessions":250,"inverted_pct":56.8,"median_spread_pts":0.5},{"ticker":"PG","sessions":251,"inverted_pct":54.6,"median_spread_pts":0.3},{"ticker":"KO","sessions":251,"inverted_pct":51.8,"median_spread_pts":0.1},{"ticker":"AAPL","sessions":251,"inverted_pct":39.4,"median_spread_pts":-0.7},{"ticker":"NVDA","sessions":251,"inverted_pct":32.3,"median_spread_pts":-2.6},{"ticker":"WMT","sessions":251,"inverted_pct":31.1,"median_spread_pts":-2.1},{"ticker":"MSFT","sessions":251,"inverted_pct":28.7,"median_spread_pts":-2.4},{"ticker":"AMZN","sessions":250,"inverted_pct":26.4,"median_spread_pts":-3.1},{"ticker":"SPY","sessions":251,"inverted_pct":19.5,"median_spread_pts":-2.1}],"shape":"ranking","sql":"WITH daily AS (\n    SELECT underlying_symbol,\n           toDate(date) AS session_date,\n           quantileDeterministicIf(0.5)(toFloat64(implied_volatility), cityHash64(ticker),\n                                        days_to_expiry BETWEEN 5 AND 30) AS front_iv,\n           quantileDeterministicIf(0.5)(toFloat64(implied_volatility), cityHash64(ticker),\n                                        days_to_expiry BETWEEN 91 AND 180) AS back_iv\n    FROM global_markets.options_greeks\n    WHERE underlying_symbol IN ('NVDA', 'AAPL', 'MSFT', 'AMZN', 'KO', 'JNJ', 'PG', 'SPY', 'XOM', 'WMT')\n      AND date >= toDate('2025-08-01')\n      AND date < toDate('2026-08-01')\n      AND iv_converged = 1\n      AND volume > 0\n      AND implied_volatility BETWEEN 0.03 AND 5\n      AND abs(toFloat64(delta)) BETWEEN 0.35 AND 0.65\n      AND ((days_to_expiry BETWEEN 5 AND 30) OR (days_to_expiry BETWEEN 91 AND 180))\n    GROUP BY underlying_symbol, session_date\n    HAVING countIf(days_to_expiry BETWEEN 5 AND 30) >= 3\n       AND countIf(days_to_expiry BETWEEN 91 AND 180) >= 3\n)\nSELECT underlying_symbol AS ticker,\n       count() AS sessions,\n       round(100 * countIf(front_iv > back_iv) / count(), 1) AS inverted_pct,\n       round(100 * quantileDeterministic(0.5)(front_iv - back_iv,\n                                              cityHash64(concat(underlying_symbol, toString(session_date)))), 1) AS median_spread_pts\nFROM daily\nGROUP BY underlying_symbol\nORDER BY inverted_pct DESC","computed_at":"2026-08-04T13:34:08.445458+00:00","elapsed":0.004011742}