Strasmore Research
Learn am Matt ConnorBy Matt Connor · Updated 2026-08-12

Wetin be Put-Call Ratio and how e dey work

Put-call ratio na put volume divide by call volume. See how e dey move for US options market by expiration and index versus equity with ten years of data history.

Put-call ratio wetin e mean

Put-call ratio na the put volume for one day divide by the call volume: e show how many bearish-side contracts trade for every bullish-side one. If the reading pass 1.0, e mean say more puts pass calls change hand; if e dey well below 1.0, e mean say calls dominate the market. Plenty explanation just stop for definition and common rule of thumb. This page calculate the real thing, for every listed US option contract, day by day, then e split am the way professionals dey do: index versus equity, expiration by expiration, and compare am with ten years of history.

How dem dey calculate put-call ratio?

Take every option trade wey happen for one session, add all the contract volume for puts, add all the volume for calls, then divide am. Put dey gain value as the underlying price fall; call dey gain as the price rise, so the ratio dey show how market dey look downside position versus upside position.

The math simple well-well. Make we say one stock trade forty thousand put contracts and sixty thousand call contracts for one session: forty thousand ÷ sixty thousand = 0.67, wey be two puts for every three calls. If you keep calls for sixty thousand and increase puts to ninety thousand, the ratio go become 1.5. Na the whole formula be that; the hard part no be the division, na how you take interpret the result.

Two things dey hide inside the word "volume":

  • Volume, no be open interest. The standard ratio dey count contracts wey dem trade for that day. One other type dey use open interest, wey be contracts wey still dey active, and that one dey move slow pass. Make you know which one the chart dey show you.
  • Every trade get two sides. If person buy put to open, sell put to close one hedge, or write put for income, all of dem dey count as the same volume. The ratio dey count activity, e no dey count wetin the person get for mind.

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

We calculate am across every US equity, ETF, and index option wey dey listed, day by day, from June one reach the last session wey complete for our tape:

QueryMarket-wide put-call ratio per day: all US options wey dey listed, June 1 reach July 10, 2026
28 rows (showing 20)
dayday labelput call ratiocontracts mm
2026-06-01June 10.58970.8
2026-06-02June 20.661.7
2026-06-03June 30.65163.6
2026-06-04June 40.67966.7
2026-06-05June 50.866103.1
2026-06-08June 80.76566
2026-06-09June 90.86182.4
2026-06-10June 100.86467.8
2026-06-11June 110.80870
2026-06-12June 120.65476.3
2026-06-15June 150.71473.3
2026-06-16June 160.7966
2026-06-17June 170.85372.3
2026-06-18June 180.79379.2
2026-06-22June 220.75565.3
2026-06-23June 230.88460.4
2026-06-24June 240.86768.4
2026-06-25June 250.92365.9
2026-06-26June 260.89571.9
2026-06-29June 290.79465.7
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
Run am yourself

The series start the window for 0.589 on June 1, e close for 0.686 on July 10, and e no ever cross one point zero for between, calls trade pass puts for all 28 sessions. That one na the first practical lesson: one point zero no be the neutral midpoint wey beginner dey think. The information dey inside how the ratio dey move within im own range. See the range for the month of June wey don finish:

QueryThe June 2026 put-call range: median, high and low of the daily market-wide ratio
june medianjune highjune high dayjune lowjune low day
0.7930.923June 250.589June 1
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
Run am yourself

June median dey for 0.793, inside one band from 0.589 (on June 1) reach 0.923 (on June 25). Now, the session wey everybody remember from the month, the June five selloff, wey dem document for the June 2026 recap. Options trade 103.1 million contracts, the busiest session of 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 show the surge of downside positioning as e dey happen.

Two practical notes. The level dey drift base on the mix of products wey dey trade that week, so small-small wiggles inside the band no get much meaning by itself. And total volume na essential context, the same ratio on double the contracts na much stronger statement, na why the panel show contract counts join the ratio.

CBOE, ISEE and the other named put-call benchmarks

If your broker or a financial-news chart quotes "the" put-call ratio, e almost certainly dey quote one of small group of named, published series, and dem dey measure different populations:

  • $CPC, the CBOE total put/call ratio: every option wey dem trade for CBOE exchanges, puts over calls.
  • $CPCE, the equity-only ratio: options on individual stocks. Physically-settled ETF options like SPY dey for the equity side of this line, even though traders dey use dem like index products.
  • $CPCI, the index-only ratio: cash-settled index options (SPX, NDX, RUT, VIX and friends).
  • ISEE, the ISE Sentiment Index, wey dem build the other way round: calls divided by puts, times one hundred, wey dem count only from opening long customer purchases. A high ISEE mean say call plenty; a high $CPC mean say put plenty. If you read one like the other, the message go turn upside down.

CBOE own equity/index line put ETF options like SPY for the equity side. The panel below draw the boundary differently, e separate broad-market ETFs from single stocks: the two no dey trade the same way at all. Every June 2026 contract, wey dem sort into three populations:

QueryIndex-linked vs single-stock options: put-call ratio by population, June 2026
populationput call ratiocontracts mm% of volume
Broad-market ETFs (SPY, QQQ, IWM, DIA)1.175476.332.2
Index options (SPX, VIX, NDX)1.096115.77.8
Single stocks and other ETFs0.588885.859.9
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
Run am yourself

The two index-linked populations both run put-heavy, broad-market ETFs at 1.175 and cash-settled index options at 1.096, each one pass 1.0, while single stocks and everything else print 0.588, wey no even reach one put per two calls. The mechanism na structural: index products na the standard vehicles for portfolio hedging, and hedging na wetin dem dey use puts do; single stocks dey attract speculative call buying. The volume shares sef matter, single stocks and other ETFs carry 59.9% of June contracts, so a "total" ratio na mostly equity ratio wey wear index hat.

The ratio depend on wetin you point am go

Zoom go one level again. The same measurement, June 2026, wey you point go five of the most active names:

QueryPut-call ratio by underlying: five of the most active names, June 2026
underlyingput call ratiocontracts mm
SPY1.16263.2
QQQ1.11165.9
TSLA0.7358
AAPL0.6427
NVDA0.5664.6
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
Run am yourself

SPY run the most put-heavy of the five at 1.16; NVDA sit down for just 0.56. To compare one ticker ratio with another one no get much sense, the comparison wey dey useful na to compare one ticker against im own history.

Put-call ratio dey change as expiration dey near?

Volume for one day no be just one heap: some contract dey expire for hours, some dey take years. If you sort June volume by days to expiration, check wetin DTE mean, you go fit separate hedge from wetin be like lottery ticket:

QueryPut-call ratio by days to expiration: all US options wey dey listed, June 2026
expiry bucketput call ratiocontracts mm% of volume
0DTE (expires today)0.957506.334.3
1-7 days0.75640627.5
8-30 days0.717261.217.7
31-90 days0.634164.311.1
91+ days0.5641409.5
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)
Run am yourself

The ratio dey fall as you move go front for calendar. Contract wey dey expire the same day, 0DTE options, print 0.957, na the bucket wey get most put for the five, and dem alone carry 34.3% of the total volume for June. For one to seven days, 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 91-days-and-out bucket, the LEAPS side of the curve, e reach bottom for 0.564, the side of the market wey get most call.

That table dey change how people dey think about the matter. Market-wide ratio na mix of different expiration wey dey change every week: one heavy expiration Friday fit shift the weight go the short side and make the headline number move, even if nobody dey panic. Make you compare wetin dey equal. Expiration dey work another way too: where the ratio dey add all the flow for one day enter one number, max pain dey read the open interest wey dey for each strike for that same Friday, so the two dey explain different side of the same expiry.

How extreme the reading dey, historically?

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

QueryTen years of SPY put-call ratios: median, low and high of the daily reading by year
yearsessionsmedian ratiolowhigh
20152521.7540.9872.96
20162521.5080.5032.508
20172511.5970.5813.541
20182501.4380.6112.362
20192521.5240.6932.351
20202531.4310.592.282
20212521.3140.6562.167
20222511.3610.9831.927
20232501.2420.6931.716
20242521.1750.8291.897
20252501.1680.5871.793
20261501.2340.7291.751
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
Run am yourself

Three things come out from inside. First, SPY median daily ratio finish above 1.0 for every year wey dey the table; the put-heavy tilt of index hedging no be 2026 mood, na the resting state of the product. Second, the level don drift down over the decade: the median na 1.754 for 2015 and 1.168 for 2025, as short-dated call trading dey grow. Third, the annual ranges dey wide, 2026 so far span 0.729 to 1.751 across 150 sessions. Dat one na the honest answer to "today reading extreme?": judge am against the distribution of the product itself, no be against 1.0.

How to watch the put-call ratio for one stock

The panels wey dey up so na recipes, e no be fixed reports. To build the ratio for one ticker wey you get:

  1. Choose the population. Use one ticker options, no be "the market", because the mix effects wey we talk about up so dey make blended numbers hard to read.
  2. Sum the day's put volume and call volume across every strike and expiration of that ticker, then divide am. Inside the option symbol, the letter wey dey nine characters from the end na P or C, that one character na the full classification.
  3. Build the history before you judge the level. One day 0.9 no mean anything until you know that ticker own median and range, and wetin the SPY panel dey do year by year.
  4. Read volume join am. A spike on ordinary volume na noise; the same spike on the busiest tape for six weeks na the June 5 session wey dey up so.
  5. Fix your expiration scope. All expirations, or short-dated only? Both dey okay; but make you no mix dem across days.

How traders dey read am, and the truth about wetin e fit do

No be law, na just how pipo dey interpret am: if the ratio dey rise, e mean say hedging demand dey grow, and if e spike well-well, contrarians dey see am as capitulation—the crowd don finally buy their insurance. The June 5 session show how the mechanism dey work: the ratio spike during the selloff, e no happen before the selloff. For this period, e behave like thermometer wey dey show wetin dey happen for that moment, e no be forecast. Make you test any rule of thumb against the real data, and remember say 0DTE volume dey always change wetin be "normal".

FAQ

Wetin be normal put-call ratio?

E depend well-well on the market wey you dey look. Across every US option wey dem list for June 2026, the daily market-wide median na 0.793, e dey range from 0.589 go reach 0.923, and e no ever pass 1.0. Broad-market ETF options run 1.175 for the same month, while single stocks and other ETFs run 0.588. Wetin be "normal" for SPY no be the same thing as normal for one single stock.

High put-call ratio mean say market go go up or down?

Both side fit happen, and no be say one rule dey for am. If you look am straight, heavy put volume mean say pipo dey position for downside; but contrarians dey see extreme spikes as sign say the crowd wey dey sell don finish their position. For the June 2026 data, the spike happen on the same day wey market selloff, so e happen at the same time, e no predict wetin go happen.

Put-call ratio and VIX or implied volatility, dem be the same thing?

No, and this one na the most common mistake. Put-call ratio come from volume, wey be how many contracts change hand. VIX and implied volatility come from option prices: how expensive those contracts be, wey dem dey express as annualized volatility. Implied-volatility skew dey compare the price of downside puts with upside calls. Heavy put volume fit trade for calm prices, and thin volume fit trade for panicked prices; the two gauges fit disagree, and both fit still dey correct.

Wetin be $CPC, $CPCE and $CPCI?

Dem be the put-call ratios wey CBOE dey publish: $CPC for total volume, $CPCE for equity options (SPY and other ETFs dey count as equity for there), and $CPCI for cash-settled index options. The difference matter. Our own three-way version, wey dey separate broad-market ETFs from index options and single stocks instead of following CBOE two-way line, measure June 2026 at 1.175 for broad-market ETFs and 1.096 for index options, both pass 1.0, against 0.588 for single stocks and other ETFs. ISE ISEE na different, inverted index: e dey look at calls over puts, and e dey open only for customer buys.

Put-call ratio dey use volume or open interest?

The standard ratio dey use the volume wey trade for that day. One open-interest variant dey, but e dey move very slow, and the two fit point to different direction for the same day; volume vs open interest explain the difference.


Every value wey dey here na stored query from the full options tape; you fit expand any panel SQL, or calculate the ratio for your own watchlist for the Strasmore terminal.

#options#put-call ratio#hedging#market structure