Strasmore Research
Learn am Matt ConnorBy Matt Connor · Updated 2026-07-25

Wetin be put-call ratio? Data guide

Put-call ratio na puts traded divide by calls traded. See im real range for full US options tape: by expiration, index vs equity, and against ten years of history.

Di put-call ratio na di day put volume wey dem divide by im call volume: e show how many bearish-side contracts trade for every bullish-side one. If di reading pass 1.0, e mean say more puts dan calls change hand; if e well below 1.0, e mean say calls dominate. Plenty explanation just stop for di definition and one common rule of thumb. Dis page dey compute di real thing — every listed US option contract, day by day — den e split am di way wey professionals dey do: index versus equity, expiration by expiration, and against ten years of history.

How dem dey calculate put-call ratio?

Collect every option trade wey happen for one session, add all di contract volume for puts, add all for calls, divide am. Put dey gain value as di underlying dey fall; call dey gain as e rise — so dem dey read di ratio as rough temperature of downside positioning against upside positioning.

Di arithmetic na deliberately simple. Make we talk say one stock trade 40,000 put contracts and 60,000 call contracts for one session: 40,000 ÷ 60,000 = 0.67, two puts for every three calls. Keep calls at 60,000 and push puts go 90,000 and di ratio go turn 1.5. Na im be di whole formula; every hard thing here dey inside di interpretation, no be di division.

Two details dey hide inside di word "volume":

  • Volume, no be open interest. Di standard ratio dey count contracts wey dem trade dat day. One variant dey use open interest — contracts wey still dey outstanding — wey dey move well-well slower. Make you know which one chart dey show you.
  • Every trade get two sides. Put wey dem buy to open, put wey dem sell to close hedge, and put wey dem write for income, all of dem dey print di same volume. Di ratio dey count activity, no be intent.

How the market-wide put-call ratio dey look?

We compute am across every listed US equity, ETF and index option, day by day, from June 1 through the last complete session for our tape:

QueryMarket-wide put-call ratio by day — every listed US option, June 1 through July 10, 2026
The exact SQL behind every number
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
       concat(monthName(day), ' ', toString(toDayOfMonth(day))) AS day_label,
       round(sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'P')
             / sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'C'), 3) AS put_call_ratio,
       round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm
FROM global_markets.options_minute_aggs
WHERE window_start >= '2026-06-01 04:00:00'
  AND window_start < '2026-07-11 04:00:00'
GROUP BY day
ORDER BY day

The series open the window for 0.589 on June 1, close am for 0.686 on July 10, and e no ever cross 1.0 for inside — calls out-trade puts for all 28 sessions. Na the first practical lesson be that: 1.0 no be the neutral midpoint wey beginner dey assume. The information dey inside how the ratio dey move for im own range. Na the range for the full month of June be this:

QueryDi June 2026 put-call range — median, high and low of di daily market-wide ratio
The exact SQL behind every number
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'P')
           / sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'C') AS ratio
    FROM global_markets.options_minute_aggs
    WHERE window_start >= '2026-06-01 04:00:00'
      AND window_start < '2026-07-01 04:00:00'
    GROUP BY day
)
SELECT round(quantileDeterministic(0.5)(ratio, cityHash64(toString(day))), 3) AS june_median,
       round(max(ratio), 3) AS june_high,
       concat(monthName(argMax(day, ratio)), ' ', toString(toDayOfMonth(argMax(day, ratio)))) AS june_high_day,
       round(min(ratio), 3) AS june_low,
       concat(monthName(argMin(day, ratio)), ' ', toString(toDayOfMonth(argMin(day, ratio)))) AS june_low_day
FROM daily

June median siddon for 0.793, inside one band from 0.589 (on June 1) go reach 0.923 (on June 25). Now, the session wey everybody remember from the month — the June 5 selloff, wey dem document for the June 2026 recap. Options trade 103.1 million contracts, na im be the busiest session for the window, and the ratio jump go 0.866 from 0.679 the day before. The selloff and the put-heavy, record-volume session na the same session: the ratio register the surge of downside positioning as e dey happen.

Two practical notes. The level dey drift with the mix of products wey dey trade that week, so small day-to-day wiggles inside the band no carry plenty meaning by imself. And total volume na essential context — the same ratio on top double contracts na much louder statement, na why the panel carry contract counts side-by-side with the ratio.

CBOE, ISEE and di oda put-call benchmarks wey dem name

If your broker or one financial-news chart quote "di" put-call ratio, e almost certainly dey quote one of di few wey dem name and publish — and dem dey measure different populations:

  • $CPC — di CBOE total put/call ratio: every option wey dem trade for CBOE exchanges, puts over calls.
  • $CPCE — di equity-only ratio: options for individual stocks. Physically-settled ETF options like SPY dey sit for di equity side of dis line, even though traders dey use dem like index products.
  • $CPCI — di index-only ratio: cash-settled index options (SPX, NDX, RUT, VIX and friends).
  • ISEE — di ISE Sentiment Index, wey dem build di oda way round: calls divide by puts, times 100, dem count am only from opening long customer purchases. High ISEE mean say call-heavy; high $CPC mean say put-heavy. Read one as if e be di oda one and di message go invert.

CBOE own equity/index line put ETF options like SPY for di equity side. Di panel below draw di boundary differently, e carve broad-market ETFs comot from single stocks: di two no trade alike at all. Every June 2026 contract, dem sort am into three populations:

QueryIndex-linked vs single-stock options — put-call ratio by population, June 2026
The exact SQL behind every number
WITH substring(ticker, 3, length(ticker) - 17) AS root
SELECT multiIf(root IN ('SPX', 'SPXW', 'XSP', 'NDX', 'NDXP', 'RUT', 'RUTW', 'VIX', 'VIXW', 'DJX', 'OEX', 'XEO'), 'Index options (SPX, VIX, NDX)',
               root IN ('SPY', 'QQQ', 'IWM', 'DIA'), 'Broad-market ETFs (SPY, QQQ, IWM, DIA)',
               'Single stocks and other ETFs') AS population,
       round(sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'P')
             / sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'C'), 3) AS put_call_ratio,
       round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100 * sum(toFloat64(volume)) / sum(sum(toFloat64(volume))) OVER (), 1) AS pct_of_volume
FROM global_markets.options_minute_aggs
WHERE window_start >= '2026-06-01 04:00:00'
  AND window_start < '2026-07-01 04:00:00'
GROUP BY population
ORDER BY put_call_ratio DESC

Di two index-linked populations both run put-heavy — broad-market ETFs at 1.175 and cash-settled index options at 1.096, each one above 1.0 — while single stocks and everi oda tin print 0.588, e barely pass one put for every two calls. Di mechanism na structural: index products na di standard vehicles for portfolio hedging, and dem dey do hedging with puts; single stocks dey attract di speculative call buying. Di volume shares matter too — single stocks and oda ETFs carry 59.9% of June contracts, so one "total" ratio na mostly equity ratio wey wear index hat.

Di ratio depend on wetin you point am to

Zoom go inside one more level. Di same measurement, June 2026, point to five of di names wey dey move pass:

QueryPut-call ratio by underlying — five of di most active names, June 2026
The exact SQL behind every number
SELECT multiIf(ticker LIKE 'O:SPY2%', 'SPY',
               ticker LIKE 'O:QQQ2%', 'QQQ',
               ticker LIKE 'O:NVDA2%', 'NVDA',
               ticker LIKE 'O:TSLA2%', 'TSLA',
               'AAPL') AS underlying,
       round(sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'P')
             / sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'C'), 2) AS put_call_ratio,
       round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm
FROM global_markets.options_minute_aggs
WHERE window_start >= '2026-06-01 04:00:00'
  AND window_start < '2026-07-01 04:00:00'
  AND (ticker LIKE 'O:SPY2%' OR ticker LIKE 'O:QQQ2%' OR ticker LIKE 'O:NVDA2%'
       OR ticker LIKE 'O:TSLA2%' OR ticker LIKE 'O:AAPL2%')
GROUP BY underlying
ORDER BY put_call_ratio DESC

SPY na im get di highest put-heavy among di five for 1.16; NVDA just dey for 0.56. To compare one ticker ratio with anoda one no really get meaning — di comparison wey dey useful na to check one ticker against im own history.

Put-call ratio dey change as expiration dey near?

Volume for one day no be just one kind thing: some contracts go expire for hours, some go last for years. If you sort June volume by days to expiration — check wetin DTE mean — e go separate the hedges from the lottery tickets:

QueryPut-call ratio by days to expiration — every listed US option, June 2026
The exact SQL behind every number
WITH toDate(toTimeZone(window_start, 'America/New_York')) AS trade_day,
     toDate(concat('20', substring(ticker, length(ticker) - 14, 2), '-',
                   substring(ticker, length(ticker) - 12, 2), '-',
                   substring(ticker, length(ticker) - 10, 2))) AS expiry,
     dateDiff('day', trade_day, expiry) AS dte
SELECT multiIf(dte <= 0, '0DTE (expires today)', dte <= 7, '1-7 days', dte <= 30, '8-30 days',
               dte <= 90, '31-90 days', '91+ days') AS expiry_bucket,
       round(sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'P')
             / sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'C'), 3) AS put_call_ratio,
       round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100 * sum(toFloat64(volume)) / sum(sum(toFloat64(volume))) OVER (), 1) AS pct_of_volume
FROM global_markets.options_minute_aggs
WHERE window_start >= '2026-06-01 04:00:00'
  AND window_start < '2026-07-01 04:00:00'
GROUP BY expiry_bucket
ORDER BY min(dte)

The ratio dey drop for every step wey you move along the calendar. Contracts wey dey expire the same day — 0DTE options — print 0.957, na im be the bucket wey get the heaviest put among the five, and dem alone carry 34.3% of June total volume. From one to seven days out, the ratio drop go 0.756; for 8–30 days e be 0.717; for 31–90 days e be 0.634; and for the bucket wey be 91 days and beyond, the LEAPS end of the curve, e bottom for 0.564 — na the corner of the market wey get the most call-heavy.

That table quietly rewrite the way people dey interpret am. One market-wide ratio na blend across different expirations, and the mix dey change week to week: one heavy expiration Friday dey shift weight toward the short end, and the headline number go move, even if nobody anxiety level change. Make you compare like with like.

How extreme be di reading, historically?

Six weeks no fit tell you whether one reading dey rare. For dat one you need years — so na di longest-running, most-traded option family for di market, SPY, with di median, low and high of im daily put-call ratio for every full year for our options tape:

QueryTen years of SPY put-call ratios — median, low and high of di daily reading by year
The exact SQL behind every number
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'P')
           / sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'C') AS ratio
    FROM global_markets.options_minute_aggs
    WHERE ticker LIKE 'O:SPY%'
    GROUP BY day
    HAVING sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'C') > 0
)
SELECT toYear(day) AS year,
       count() AS sessions,
       round(quantileDeterministic(0.5)(ratio, cityHash64(toString(day))), 3) AS median_ratio,
       round(min(ratio), 3) AS low,
       round(max(ratio), 3) AS high
FROM daily
WHERE toYear(day) >= 2015
GROUP BY year
ORDER BY year

Three things dey show from am. First, SPY im median daily ratio finish above 1.0 for every year for di table — di put-heavy tilt of index hedging no be 2026 mood, na im be di resting state of di product. Second, di level don drift down over di decade: di median na 1.754 for 2015 and 1.168 for 2025, alongside di growth of short-dated call trading. Third, di annual ranges wide — 2026 so far span from 0.848 to 1.751 across 130 sessions. Dat na di honest answer to "di reading of today extreme?": judge am against im own product im distribution, never against 1.0.

How to watch di put-call ratio for one stock

Di panels wey dey up na recipes, no be fixed reports. To build di ratio for one name wey you hold:

  1. Pick di population. Na one ticker im options, no be "di market" — di mix effects wey dey up dey make blended numbers hard to read.
  2. Add di day put volume and im call volume across every strike and expiration of dat ticker, den divide. Inside di option symbol, di letter wey dey nine characters from di end na P or C — dat one character na di whole classification.
  3. Build di history before you judge di level. One single day 0.9 no mean anything until you know dat ticker own median and range — wetin di SPY panel dey do year by year.
  4. Read volume alongside am. One spike on ordinary volume na noise; di same spike on di busiest tape in six weeks na di June 5 session wey dey up.
  5. Fix your expiration scope. All expirations, or short-dated only? Both dey defensible; to dey mix dem across days no dey.

How traders dey read am — and the honest limits

Dem talk am as interpretation, no be law: when the ratio dey rise, dem dey read am as hedging demand wey dey grow, and when e spike well-well, contrarians dey read am as capitulation — the crowd don finally buy their insurance. The June 5 session show the mechanism for honest: the ratio spike during the selloff, no be before am. Over this window, e behave like coincident thermometer, no be forecast. Test any rule of thumb against the actual series — and remember say 0DTE volume dey always change wetin "normal" be.

FAQ

Wetin be normal put-call ratio?

E depend entirely on di population. Across every listed US option for June 2026, di daily market-wide median na 0.793, e dey range from 0.589 to 0.923 — e no ever pass 1.0. Broad-market ETF options run 1.175 for dat same month, while single stocks and oda ETFs run 0.588. "Normal" for SPY no be normal for single stock.

High put-call ratio na bullish or bearish?

Both readings dey, and none of dem be law. If you look am as e be, heavy put volume na downside positioning; contrarians dey read extreme spikes as sign say di selling crowd don fully position. For di June 2026 data, di spike show for di selloff day itself — e happen di same time, no be prediction.

Put-call ratio and VIX or implied volatility na di same tin?

No, and dis na di most common mix-up. Put-call ratio dey built from volume — how many contracts change hand. VIX and implied volatility come from option prices: how expensive dose contracts be, dem express am as annualized volatility. Implied-volatility skew dey compare di price of downside puts with upside calls. Heavy put volume fit trade for calm prices, and thin volume fit trade for panicked prices — di two gauges fit disagree, and both fit dey correct.

Wetin be $CPC, $CPCE and $CPCI?

Dem be CBOE published put-call ratios: $CPC for total volume, $CPCE for equity options (SPY and oda ETFs count as equity for dat one) and $CPCI for cash-settled index options. Di split matter well-well. Our own three-way version, wey carve broad-market ETFs comot from both index options and single stocks instead of follow CBOE two-way line, measure June 2026 at 1.175 for broad-market ETFs and 1.096 for index options, both above 1.0, against 0.588 for single stocks and oda ETFs. ISE own ISEE na separate, inverted index: calls over puts, only opening customer buys.

Put-call ratio dey use volume or open interest?

Di standard ratio dey use di day traded volume. One open-interest variant dey and e dey move far more slowly, and di two fit point for different directions for di same day — volume versus open interest cover di difference.


Every value here na stored query over di full options tape — expand any panel SQL, or compute di ratio for your own watchlist for Strasmore terminal.