{"slug":"how-the-put-call-ratio-is-calculated","qid":"pcr_range","label":"Where the daily ratio actually sits, twelve months of sessions","post_title":"How the Put/Call Ratio Is Calculated","post_url":"/blog/how-the-put-call-ratio-is-calculated#q-pcr_range","columns":["category","p10_ratio","median_ratio","p90_ratio"],"rows":[{"category":"Broad market ETFs","p10_ratio":1.25,"median_ratio":1.54,"p90_ratio":1.86},{"category":"Single stocks","p10_ratio":0.45,"median_ratio":0.58,"p90_ratio":0.76},{"category":"All eight names","p10_ratio":0.83,"median_ratio":1.02,"p90_ratio":1.24}],"shape":"ranking","sql":"WITH\n    daily AS\n    (\n        SELECT\n            d,\n            toFloat64(sumIf(volume, right_letter = 'P' AND sym IN ('SPY', 'QQQ', 'IWM')))\n                / toFloat64(sumIf(volume, right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM')))     AS etf_ratio,\n            toFloat64(sumIf(volume, right_letter = 'P' AND sym NOT IN ('SPY', 'QQQ', 'IWM')))\n                / toFloat64(sumIf(volume, right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM'))) AS stock_ratio,\n            toFloat64(sumIf(volume, right_letter = 'P'))\n                / toFloat64(sumIf(volume, right_letter = 'C'))                                      AS all_ratio\n        FROM\n        (\n            SELECT\n                date                                     AS d,\n                underlying_symbol                        AS sym,\n                volume,\n                substring(ticker, length(ticker) - 8, 1) AS right_letter\n            FROM global_markets.options_greeks\n            WHERE date >= '2025-08-01'\n              AND date <  '2026-08-01'\n              AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')\n              AND volume > 0\n        )\n        GROUP BY d\n        HAVING countIf(right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM')) > 0\n           AND countIf(right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM')) > 0\n    )\nSELECT\n    p.2                                  AS category,\n    round(quantileExact(0.1)(p.3), 2)    AS p10_ratio,\n    round(quantileExact(0.5)(p.3), 2)    AS median_ratio,\n    round(quantileExact(0.9)(p.3), 2)    AS p90_ratio\nFROM\n(\n    SELECT arrayJoin([\n        tuple(1, 'Broad market ETFs', etf_ratio),\n        tuple(2, 'Single stocks',     stock_ratio),\n        tuple(3, 'All eight names',   all_ratio)\n    ]) AS p\n    FROM daily\n)\nGROUP BY p.1, p.2\nORDER BY p.1","computed_at":"2026-08-06T14:39:03.782408+00:00","elapsed":5.07102221}