Equity vs Index Put/Call Ratio: Wetin be high?
Equity and index put/call ratios get different normal ranges. See how dem dey build each one, why index numbers dey higher, and wetin you need for fair comparison.
High put/call ratio no be just one number. At least three different ones dey come out from the same options tape. One dey count only single-stock options. Another one dey count only index products. The third one dey mix both of dem together. Each one get im own normal range, na why 1.20 fit be outlier for one series but just normal session for another one. If the measure itself still dey new for you, wetin the put/call ratio dey measure don explain the basics.
Why the index put/call ratio dey higher pass the equity ratio?
Make we look who dey buy. Index put na the cheapest single instrument wey fit cover full diversified book. Fund wey hold four hundred positions no dey buy four hundred separate puts. Dem dey buy puts on the index, roll dem on top calendar, and record the premium as insurance cost. That volume na protection for shares wey the fund already get, and e dey show whether the manager dey optimistic or not.
Single-stock options get different mix. Plenty of the volume na call buying on individual names, and covered-call writing add more call volume for the other side. Put buying on single names dey real, and e dey sit near much larger call flow.
The formula no fit separate those flows. If you divide hedging-heavy put flow by thin call flow, the quotient go land near or pass 1.00. If you divide modest put flow by thick call flow, e go land near 0.50. One formula, two normal ranges.
The panel wey dey down so count contract volume over the trailing sixty sessions for eight household stocks and four broad-market ETFs, then e divide put volume by call volume for each underlying.
The exact SQL behind every number
SELECT
underlying_symbol AS symbol,
if(underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'DIA'),
'broad-market ETF',
'single stock') AS bucket,
round(sumIf(volume, startsWith(lower(option_type), 'p'))
/ sumIf(volume, startsWith(lower(option_type), 'c')), 2) AS put_call_ratio,
round(sumIf(volume, startsWith(lower(option_type), 'c')) / 1e6, 1) AS call_volume_millions,
round(sumIf(volume, startsWith(lower(option_type), 'p')) / 1e6, 1) AS put_volume_millions
FROM global_markets.options_greeks
WHERE date >= (SELECT toDate(max(date))
FROM global_markets.options_greeks
WHERE volume > 0) - 60
AND volume > 0
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'TSLA', 'JPM', 'KO', 'JNJ',
'SPY', 'QQQ', 'IWM', 'DIA')
GROUP BY symbol
HAVING sumIf(volume, startsWith(lower(option_type), 'c')) > 0
ORDER BY put_call_ratio ASCThe spread across the sample wide well-well. The lowest reading na 0.43 on MSFT, and the highest na 2.86 on IWM, wey trade 9.6 million call contracts over the window. The bucket column mark which rows na single stocks and which ones na broad-market ETFs. Read the ratio column against am.
One warning before we go further. Published index ratio dey use options on the index level itself, cash settled at expiration instead of delivering shares. Mini index options na the smaller-notional version of that contract. The panels here dey use broad-market ETF options as the stand-in for the same hedging flow for each underlying, and na this exact point vendors no dey agree.
Wetin each ratio wey dem publish dey count?
- Equity-only: options on top shares of individual companies, the single-name flow, wey dey heavy for call side for most sessions.
- Index-only: options on top index level, wey dem dey settle with cash, and na there most of the portfolio-hedging volume dey.
- Total: every contract for both buckets, put volume pass call volume.
All the three dey count volume, wey mean say na contracts wey change hand during the session, no be positions wey still dey open after the session don close. Volume versus open interest dey separate those two ideas.
Total put/call ratio na average of the other two?
No. The total na weighted blend, and the weight na call volume. Make we use w represent the share of call volume wey the index bucket get across the two buckets. The total equal the equity ratio plus w multiply by the distance between the two ratios. When the index bucket na small part of the call volume, the total dey near the equity ratio. When the index bucket dominate, the total dey climb go reach the index ratio.
The next panel freeze the two components for their measured sixty-session levels and sweep w from zero go reach one hundred percent.
The exact SQL behind every number
WITH components AS
(
SELECT
round(sumIf(volume, startsWith(lower(option_type), 'p') AND underlying_symbol NOT IN ('SPY', 'QQQ', 'IWM', 'DIA'))
/ sumIf(volume, startsWith(lower(option_type), 'c') AND underlying_symbol NOT IN ('SPY', 'QQQ', 'IWM', 'DIA')), 3) AS equity_ratio,
round(sumIf(volume, startsWith(lower(option_type), 'p') AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'DIA'))
/ sumIf(volume, startsWith(lower(option_type), 'c') AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'DIA')), 3) AS index_ratio
FROM global_markets.options_greeks
WHERE date >= (SELECT toDate(max(date))
FROM global_markets.options_greeks
WHERE volume > 0) - 60
AND volume > 0
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'TSLA', 'JPM', 'KO', 'JNJ',
'SPY', 'QQQ', 'IWM', 'DIA')
HAVING sumIf(volume, startsWith(lower(option_type), 'c') AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'DIA')) > 0
AND sumIf(volume, startsWith(lower(option_type), 'c') AND underlying_symbol NOT IN ('SPY', 'QQQ', 'IWM', 'DIA')) > 0
)
SELECT
concat(toString(step * 10), '%') AS index_share_of_call_volume,
equity_ratio,
index_ratio,
round(equity_ratio + (index_ratio - equity_ratio) * (step / 10), 3) AS blended_total_ratio
FROM
(
SELECT
equity_ratio,
index_ratio,
arrayJoin(range(11)) AS step
FROM components
)
ORDER BY stepWith the components fixed at 0.562 and 1.396, the blend read 0.562 when the index bucket no contribute any call volume and 1.396 when e contribute everything. For even split, wey be 50% of call volume for the index bucket, the total print 0.979. None of the components change across those eleven rows. Na only the mix change.
The total ratio fit rise even if both parts dey fall?
E fit, and na that one be the trap inside single headline number. See hypothetical pair of sessions with round numbers, wey we pick for the sake of calculation.
Day one: the equity bucket trade 1,000,000 calls and 600,000 puts, wey give ratio of 0.60. The index bucket trade 200,000 calls and 280,000 puts, wey give ratio of 1.40. The total na 880,000 puts over 1,200,000 calls, or 0.73.
Day two: both ratios fall. Equity print 0.55 on 600,000 calls and 330,000 puts. Index print 1.30 on 800,000 calls and 1,040,000 puts. The total na 1,370,000 over 1,400,000, or 0.98.
Both components fall. The total rise by one-quarter of a point. The only other thing wey move na the share of call volume wey dey inside the higher-ratio bucket, wey move from seventeen percent go fifty-seven percent. Person wey dey watch the total alone go record jump for put activity wey no happen for any of the two buckets.
That share no be constant for live data. The panel wey dey down so dey track both bucket ratios and the ETF bucket share of call volume, session by session.
The exact SQL behind every number
SELECT
toString(date) AS session_date,
formatDateTime(date, '%b %e') AS session_label,
round(sumIf(volume, startsWith(lower(option_type), 'p') AND underlying_symbol NOT IN ('SPY', 'QQQ', 'IWM', 'DIA'))
/ sumIf(volume, startsWith(lower(option_type), 'c') AND underlying_symbol NOT IN ('SPY', 'QQQ', 'IWM', 'DIA')), 2) AS equity_ratio,
round(sumIf(volume, startsWith(lower(option_type), 'p') AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'DIA'))
/ sumIf(volume, startsWith(lower(option_type), 'c') AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'DIA')), 2) AS index_style_ratio,
round(index_style_ratio - equity_ratio, 2) AS ratio_gap,
round(100 * sumIf(volume, startsWith(lower(option_type), 'c') AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'DIA'))
/ sumIf(volume, startsWith(lower(option_type), 'c')), 1) AS etf_share_of_calls_pct
FROM global_markets.options_greeks
WHERE date >= (SELECT toDate(max(date))
FROM global_markets.options_greeks
WHERE volume > 0) - 45
AND volume > 0
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'TSLA', 'JPM', 'KO', 'JNJ',
'SPY', 'QQQ', 'IWM', 'DIA')
GROUP BY date
HAVING sumIf(volume, startsWith(lower(option_type), 'c') AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'DIA')) > 0
AND sumIf(volume, startsWith(lower(option_type), 'c') AND underlying_symbol NOT IN ('SPY', 'QQQ', 'IWM', 'DIA')) > 0
ORDER BY dateOn Jun 29, the earliest session wey we see, the single-stock bucket print 0.5 against 1.55 for the ETF bucket, a gap of 1.05, with 45.2 percent of call volume inside the ETF bucket. On Aug 12 those columns read 0.55, 1.34 and a gap of 0.79, with the ETF share at 49.5 percent. The gap column dey positive for both ends of the 32 sessions wey dey display, and the share column dey move underneath am.
Why two different sources dey print different put/call ratios for the same day?
Bucketing, and ETF options na the case wey dey cause confusion. ETF na listed security, wey mean say e fit enter equity bucket. E still dey track index, wey mean say e fit enter index bucket too. Publishers dey resolve this matter differently: some dey put ETF options inside equity ratio, some dey report exchange traded products as separate series, and some dey group dem join index products. The label for the chart dey look the same for every case.
The size of that choice dey measurable. The panel wey dey down so dey compute one bucket ratio two times for the same sessions, one time wey dem comot ETF options and one time wey dem count dem join.
The exact SQL behind every number
SELECT
toString(date) AS session_date,
formatDateTime(date, '%b %e') AS session_label,
round(sumIf(volume, startsWith(lower(option_type), 'p') AND underlying_symbol NOT IN ('SPY', 'QQQ', 'IWM', 'DIA'))
/ sumIf(volume, startsWith(lower(option_type), 'c') AND underlying_symbol NOT IN ('SPY', 'QQQ', 'IWM', 'DIA')), 2) AS equity_ratio_etfs_excluded,
round(sumIf(volume, startsWith(lower(option_type), 'p'))
/ sumIf(volume, startsWith(lower(option_type), 'c')), 2) AS equity_ratio_etfs_included
FROM global_markets.options_greeks
WHERE date >= (SELECT toDate(max(date))
FROM global_markets.options_greeks
WHERE volume > 0) - 30
AND volume > 0
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'TSLA', 'JPM', 'KO', 'JNJ',
'SPY', 'QQQ', 'IWM', 'DIA')
GROUP BY date
HAVING sumIf(volume, startsWith(lower(option_type), 'c') AND underlying_symbol NOT IN ('SPY', 'QQQ', 'IWM', 'DIA')) > 0
ORDER BY dateOn Aug 12, the last session for the panel, the figure for single-stock-only na 0.55 and the version wey dem fold ETF options join na 0.94. Same day, same tape, same words for the axis. The threshold wey person learn from one publisher series no dey work for another one.
Wetin we fit call high put/call ratio, come be dat?
The rule wey dey work no wide. Make you compare ratio only wit im own history, from the same source and the same construction. Percentile dey answer dat question: where today reading dey inside the last one year of dat exact series? One fixed line for 1.00 no dey work, because 1.00 na extreme print for equity series but na normal tin for index series.
Two habits dey keep the comparison honest. Read the construction note before you quote any level, especially how dem handle ETF. And read the components join the total, because the total fit move based on mix alone. Whether a high put/call ratio is bullish dey take the interpretation go further, and how the put/call ratio is calculated dey explain the arithmetic step by step.
Data notes and bucket definitions
The ETF bucket na SPY, QQQ, IWM and DIA. The single-stock bucket na AAPL, MSFT, NVDA, AMZN, TSLA, JPM, KO and JNJ. Both na samples of their category, no be the whole market, so the levels here dey show the split without reproducing any publisher headline number.
Every panel dey sum contract volume for the session, calls and puts separately, then e divide. No dollar or premium weighting dey.
Each window dey anchored to the most recent session wey get recorded volume, no be the calendar day, and the put and call sides dey matched based on the first letter of the contract type so any feed wey write P and C instead of put and call go still bucket correctly.
One contract dey count anytime the session record volume for am, even deep out-of-the-money strikes. Far strikes dey carry big share of hedging put volume, and if you commot dem, e go make the ETF bucket look small pass wetin e be.
Options on an index level, cash settled and European exercise, na different product from ETF options. The per-underlying panels dey use ETF options as stand-in for index hedging flow, wey be the bucketing question wey we raise up so.
The most recent session or two fit no dey for the front edge while the day records still dey land.
FAQ
Wetin be normal put/call ratio for equity options?
Single-stock options usually print below 1.00, as call volume dey higher pass for most sessions. Across the twelve names wey dey the trailing-sixty-session panel wey dey up so, the lowest reading na 0.43. Wetin be normal for any one series depend on that series own history, no be say e get one fixed threshold wey everybody dey use.
Why index put/call ratio usually dey above 1?
Index puts na the standard way wey managers dey hedge portfolio, and that buying dey happen on schedule from managers wey already hold the shares. The hedging volume dey land for the put side of the same fraction wey directional trade go use, and the series dey stay for higher level across its whole record.
Which put/call ratio sentiment charts usually show?
Most published charts dey show either the total or the equity-only series, and the axis label rarely dey talk which one. Check the construction note before you compare chart with any threshold wey you see for another place, because the series dey run for different levels.
I fit compare put/call ratios from two different providers?
Levels no dey transfer. Providers dey different for how dem dey handle ETF and which exchanges' volume dem dey count. Direction and percentile rank inside one provider own series na the only parts wey you fit compare well.
Every panel wey dey here dey come with the SQL wey produce am, so you fit rebuild any of these splits with different universe or window. Ask the same question for plain English for the Strasmore terminal.