STRASMORE/EXPLORE 2,170 QUERIES

S&P 500 tracker moves after each fifth of the equity put/call ratio, 2022 to July 2026

Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-08-03, from Is a High Put/Call Ratio Bullish?.

as of table 5×7read in context →
S&P 500 tracker moves after each fifth of the equity put/call ratio, 2022 to July 2026 — 5 rows by 7 columns, computed from US exchange, SIP and OPRA data.
pcr_bandobservationsband_floor_ratiofwd_5d_median_pctfwd_20d_median_pctfwd_20d_p25_pctfwd_20d_p75_pct
lowest fifth2260.340.30.91-0.832.67
second fifth2250.560.71.87-0.273.35
middle fifth2260.630.141.31-3.473.9
fourth fifth2250.710.170.83-2.584.16
highest fifth2260.810.823-1.825.71
Rows × columns
5 × 7
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for S&P 500 tracker moves after each fifth of the equity put/call ratio, 2022 to July 2026, derived from the stored result.
ColumnTypeRangeNotes
pcr_band text 5 distinct values
observations number 225 to 226
band_floor_ratio number 0.34 to 0.81 ratio or rate
fwd_5d_median_pct number 0.14 to 0.82 percent
fwd_20d_median_pct number 0.83 to 3 percent
fwd_20d_p25_pct number -3.47 to -0.27 percent
fwd_20d_p75_pct number 2.67 to 5.71 percent

Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.

the exact SQL behind every number
WITH raw AS (
    SELECT date AS day,
           sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'P') AS put_volume,
           sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'C') AS call_volume
    FROM global_markets.options_greeks
    WHERE date >= toDate('2022-01-01')
      AND date <= toDate('2026-07-31')
      AND volume > 0
      AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'META',
                                'TSLA', 'GOOGL', 'JPM', 'KO', 'XOM')
    GROUP BY day
    HAVING call_volume > 0
),
equity_pcr AS (
    SELECT day, toFloat64(put_volume) / toFloat64(call_volume) AS pcr
    FROM raw
),
spy_daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           toFloat64(argMax(close, window_start)) AS close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2022-01-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-08-01')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY day
),
forward AS (
    SELECT day,
           close,
           any(close) OVER (ORDER BY day ASC ROWS BETWEEN 5 FOLLOWING AND 5 FOLLOWING) AS close_5,
           any(close) OVER (ORDER BY day ASC ROWS BETWEEN 20 FOLLOWING AND 20 FOLLOWING) AS close_20
    FROM spy_daily
),
joined AS (
    SELECT p.day AS day,
           p.pcr AS pcr,
           100 * (f.close_5 / f.close - 1) AS fwd_5d_pct,
           100 * (f.close_20 / f.close - 1) AS fwd_20d_pct
    FROM equity_pcr AS p
    INNER JOIN forward AS f ON p.day = f.day
    WHERE f.close_5 > 0 AND f.close_20 > 0
),
cuts AS (
    SELECT quantilesDeterministic(0.2, 0.4, 0.6, 0.8)(pcr, cityHash64(day)) AS q
    FROM joined
)
SELECT multiIf(pcr < q[1], 'lowest fifth',
               pcr < q[2], 'second fifth',
               pcr < q[3], 'middle fifth',
               pcr < q[4], 'fourth fifth',
               'highest fifth') AS pcr_band,
       count() AS observations,
       round(min(pcr), 2) AS band_floor_ratio,
       round(quantileDeterministic(0.5)(fwd_5d_pct, cityHash64(day)), 2) AS fwd_5d_median_pct,
       round(quantileDeterministic(0.5)(fwd_20d_pct, cityHash64(day)), 2) AS fwd_20d_median_pct,
       round(quantileDeterministic(0.25)(fwd_20d_pct, cityHash64(day)), 2) AS fwd_20d_p25_pct,
       round(quantileDeterministic(0.75)(fwd_20d_pct, cityHash64(day)), 2) AS fwd_20d_p75_pct
FROM joined CROSS JOIN cuts
GROUP BY pcr_band
ORDER BY band_floor_ratio ASC

Run your own version of this

The same 22 years of US equities and 12 years of options data are queryable in SQL or plain English. A free account runs 100 queries a day and takes no card.

More from this analysisIs a High Put/Call Ratio Bullish?
Put/call volume ratio by underlying: January 1 to July 31, 2026 ranking 13×4 Put/call volume ratio percentiles: single-stock basket vs index ETFs, 2022 to July 2026 ranking 8×3 Top-decile put/call readings per month, grouped by how the S&P 500 tracker moved ranking 4×4 Put/call volume ratio by underlying, trailing 60 sessions table 12×5 Single-stock bucket vs ETF bucket, session by session series 33×6 The same equity ratio, computed with and without ETF options series 23×4 See all 2,170 queries →