{"slug":"is-a-high-put-call-ratio-bullish","qid":"pcr_percentiles","label":"Put/call volume ratio percentiles: single-stock basket vs index ETFs, 2022 to July 2026","post_title":"Is a High Put/Call Ratio Bullish?","post_url":"/blog/is-a-high-put-call-ratio-bullish#q-pcr_percentiles","columns":["percentile","equity_pcr","index_etf_pcr"],"rows":[{"percentile":"p05","equity_pcr":0.48,"index_etf_pcr":1.13},{"percentile":"p10","equity_pcr":0.51,"index_etf_pcr":1.19},{"percentile":"p25","equity_pcr":0.57,"index_etf_pcr":1.31},{"percentile":"p50","equity_pcr":0.67,"index_etf_pcr":1.45},{"percentile":"p75","equity_pcr":0.78,"index_etf_pcr":1.6},{"percentile":"p90","equity_pcr":0.89,"index_etf_pcr":1.77},{"percentile":"p95","equity_pcr":0.98,"index_etf_pcr":1.9},{"percentile":"p99","equity_pcr":1.34,"index_etf_pcr":2.1}],"shape":"ranking","sql":"WITH book_days AS (\n    SELECT date AS day,\n           if(underlying_symbol IN ('SPY', 'QQQ', 'IWM'), 'index_etf', 'equity') AS book,\n           sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'P') AS put_volume,\n           sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'C') AS call_volume\n    FROM global_markets.options_greeks\n    WHERE date >= toDate('2022-01-01')\n      AND date <= toDate('2026-07-31')\n      AND volume > 0\n      AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'AMZN',\n                                'META', 'TSLA', 'GOOGL', 'JPM', 'KO', 'XOM')\n    GROUP BY day, book\n    HAVING call_volume > 0\n),\npaired AS (\n    SELECT day,\n           toFloat64(sumIf(put_volume, book = 'equity'))\n             / toFloat64(sumIf(call_volume, book = 'equity')) AS equity_pcr,\n           toFloat64(sumIf(put_volume, book = 'index_etf'))\n             / toFloat64(sumIf(call_volume, book = 'index_etf')) AS index_pcr\n    FROM book_days\n    GROUP BY day\n    HAVING sumIf(call_volume, book = 'equity') > 0\n       AND sumIf(call_volume, book = 'index_etf') > 0\n),\ncurves AS (\n    SELECT arrayMap(v -> round(v, 2),\n                    quantilesDeterministic(0.05, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95, 0.99)\n                                          (equity_pcr, cityHash64(day))) AS eq,\n           arrayMap(v -> round(v, 2),\n                    quantilesDeterministic(0.05, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95, 0.99)\n                                          (index_pcr, cityHash64(day))) AS idx\n    FROM paired\n)\nSELECT z.1 AS percentile,\n       z.2 AS equity_pcr,\n       z.3 AS index_etf_pcr\nFROM (\n    SELECT arrayJoin(arrayZip(['p05', 'p10', 'p25', 'p50', 'p75', 'p90', 'p95', 'p99'], eq, idx)) AS z\n    FROM curves\n)","computed_at":"2026-08-03T08:05:36.219076+00:00","elapsed":29.547137882}