{"slug":"put-call-parity-explained","qid":"iv_pairs","label":"Call and put implied volatility at matched AAPL strikes, Sep 18 2026 expiry","post_title":"Put-Call Parity Explained, With Real Numbers","post_url":"/blog/put-call-parity-explained#q-iv_pairs","columns":["strike","call_iv_pct","put_iv_pct","iv_gap_pct"],"rows":[{"strike":255,"call_iv_pct":30.5,"put_iv_pct":29.3,"iv_gap_pct":1.2},{"strike":260,"call_iv_pct":28.2,"put_iv_pct":28.8,"iv_gap_pct":-0.6},{"strike":265,"call_iv_pct":28.7,"put_iv_pct":28.3,"iv_gap_pct":0.3},{"strike":270,"call_iv_pct":28.4,"put_iv_pct":27.4,"iv_gap_pct":0.9},{"strike":275,"call_iv_pct":27.8,"put_iv_pct":26.6,"iv_gap_pct":1.2},{"strike":280,"call_iv_pct":26.5,"put_iv_pct":26.3,"iv_gap_pct":0.3},{"strike":285,"call_iv_pct":26,"put_iv_pct":25.7,"iv_gap_pct":0.3},{"strike":290,"call_iv_pct":25.2,"put_iv_pct":25.1,"iv_gap_pct":0.1},{"strike":295,"call_iv_pct":24.8,"put_iv_pct":24.9,"iv_gap_pct":-0.1},{"strike":300,"call_iv_pct":25.2,"put_iv_pct":24.5,"iv_gap_pct":0.7},{"strike":305,"call_iv_pct":24.9,"put_iv_pct":23.6,"iv_gap_pct":1.3},{"strike":310,"call_iv_pct":24.8,"put_iv_pct":23.9,"iv_gap_pct":0.9},{"strike":315,"call_iv_pct":24.3,"put_iv_pct":24.2,"iv_gap_pct":0.2},{"strike":320,"call_iv_pct":24.4,"put_iv_pct":23.5,"iv_gap_pct":1},{"strike":335,"call_iv_pct":24.2,"put_iv_pct":23.8,"iv_gap_pct":0.4}],"shape":"ranking","sql":"SELECT\n    strike,\n    round(100 * call_iv, 1)             AS call_iv_pct,\n    round(100 * put_iv, 1)              AS put_iv_pct,\n    round(100 * (call_iv - put_iv), 1)  AS iv_gap_pct\nFROM\n(\n    SELECT\n        round(toFloat64(strike_price), 2)                AS strike,\n        maxIf(toFloat64(implied_volatility), leg = 'C')  AS call_iv,\n        maxIf(toFloat64(implied_volatility), leg = 'P')  AS put_iv\n    FROM\n    (\n        SELECT\n            strike_price,\n            implied_volatility,\n            upper(substring(ticker, length(ticker) - 8, 1)) AS leg\n        FROM global_markets.options_greeks\n        WHERE underlying_symbol = 'AAPL'\n          AND date = '2026-06-16'\n          AND expiration_date = '2026-09-18'\n          AND iv_converged = 1\n          AND volume > 0\n          AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.15\n          AND toUInt32(toFloat64(strike_price)) % 5 = 0\n    )\n    GROUP BY strike\n    HAVING countIf(leg = 'C') > 0\n       AND countIf(leg = 'P') > 0\n)\nORDER BY strike","computed_at":"2026-08-05T14:24:23.426043+00:00","elapsed":0.003541274}