STRASMORE/EXPLORE 2,170 QUERIES 22Y EQUITIES · 12Y OPTIONS

2,170 answered market questions

every one with its exact SQL, its result and the date it was computed · free, no signup

Is a High Put/Call Ratio Bullish?
Put/call volume ratio percentiles: single-stock basket vs index ETFs, 2022 to July 2026ranking · 2026-08-03 · 8×3Preview: 8 ranked values, smallest first. S&P 500 tracker moves after each fifth of the equity put/call ratio, 2022 to July 2026table · 2026-08-03 · 5×7 Put/call volume ratio by underlying: January 1 to July 31, 2026ranking · 2026-08-03 · 13×4Preview: 13 ranked values, largest first. Top-decile put/call readings per month, grouped by how the S&P 500 tracker movedranking · 2026-08-03 · 4×4Preview: 4 ranked values, smallest first.
AM vs PM Settled Index Options Explained
The same hypothetical on every session: expiration mornings against the rest of the tapetable · 2026-08-03 · 3×5 The prices behind the arithmetic: Thursday's close, the strike, Friday's open and closeseries · 2026-08-03 · 29×6Preview: a 16-point series, ending higher. One at-the-money call settled two ways: the ten widest splits since January 2024table · 2026-08-03 · 10×5 Every monthly expiration since January 2024: the overnight gap, then the session that followedseries · 2026-08-03 · 29×4Preview: a 16-point series, ending lower.
Put/call volume ratio percentiles: single-stock basket vs index ETFs, 2022 to July 2026

Put/call volume ratio percentiles: single-stock basket vs index ETFs, 2022 to July 2026

most recentas of ranking 8×3read in context →
Put/call volume ratio percentiles: single-stock basket vs index ETFs, 2022 to July 2026 — 8 rows by 3 columns, computed from US exchange, SIP and OPRA data.
percentileequity_pcrindex_etf_pcr
p050.481.13
p100.511.19
p250.571.31
p500.671.45
p750.781.6
p900.891.77
p950.981.9
p991.342.1
the exact SQL behind every number
WITH book_days AS (
    SELECT date AS day,
           if(underlying_symbol IN ('SPY', 'QQQ', 'IWM'), 'index_etf', 'equity') AS book,
           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 ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'AMZN',
                                'META', 'TSLA', 'GOOGL', 'JPM', 'KO', 'XOM')
    GROUP BY day, book
    HAVING call_volume > 0
),
paired AS (
    SELECT day,
           toFloat64(sumIf(put_volume, book = 'equity'))
             / toFloat64(sumIf(call_volume, book = 'equity')) AS equity_pcr,
           toFloat64(sumIf(put_volume, book = 'index_etf'))
             / toFloat64(sumIf(call_volume, book = 'index_etf')) AS index_pcr
    FROM book_days
    GROUP BY day
    HAVING sumIf(call_volume, book = 'equity') > 0
       AND sumIf(call_volume, book = 'index_etf') > 0
),
curves AS (
    SELECT arrayMap(v -> round(v, 2),
                    quantilesDeterministic(0.05, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95, 0.99)
                                          (equity_pcr, cityHash64(day))) AS eq,
           arrayMap(v -> round(v, 2),
                    quantilesDeterministic(0.05, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95, 0.99)
                                          (index_pcr, cityHash64(day))) AS idx
    FROM paired
)
SELECT z.1 AS percentile,
       z.2 AS equity_pcr,
       z.3 AS index_etf_pcr
FROM (
    SELECT arrayJoin(arrayZip(['p05', 'p10', 'p25', 'p50', 'p75', 'p90', 'p95', 'p99'], eq, idx)) AS z
    FROM curves
)
$