Is een hoge put/call-ratio bullish?
Een hoge put/call-ratio geldt vaak als bullish contrarian-signaal. Bekijk percentielbanden voor equity- en indexopties en wat na extreme standen volgde.
Een hoge put/call-ratio geldt klassiek als een bullish contrarian-signaal: ongewoon veel put-aankopen worden opgevat als een teken dat de markt zich al op een daling heeft voorbereid. Wie op die interpretatie handelt, loopt tegen één probleem aan. ‘Hoog’ heeft geen vaste waarde. Een stand van 1,15 op uw scherm kan extreem zijn bij opties op één aandeel en normaal voor een handelssessie in indexproducten.
Daarvoor is een referentieverdeling nodig. Deze pagina geeft die voor beide groepen en meet vervolgens wat er na de hoge standen gebeurde. De uitleg over de put/call-ratio behandelt hoe de ratio wordt berekend. Alles hieronder gaat uit van die definitie.
Twee opmerkingen over de meting. Elke ratio telt de contracten die die dag zijn verhandeld. Het gaat dus om een volume ratio. Open interest telt posities die nog openstaan en bevindt zich op een ander niveau (volume versus open interest zet beide naast elkaar). De cijfers komen bovendien uit een vaste mand van tien bekende individuele aandelen tegenover drie brede-market-ETF’s, en niet uit de markt als geheel. Beoordeel daarom vooral de vorm van de verdeling en niet het laatste decimaal.
Wat geldt als een hoge put/call-ratio?
Een percentiel beantwoordt de vraag die één niveau niet kan beantwoorden. De onderstaande curve omvat elke sessie van januari 2022 tot en met juli 2026, met één ratio per sessie voor elk boek.
De exacte SQL achter elk getal
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
)In de mand met individuele aandelen kwam de mediane sessie uit op 0.67 puts per call. Het hoogste deciel van de sessies begon bij 0.89, en de meest extreme één procent kwam boven 1.34 uit. Ook het rustige uiteinde is nuttig voor de kalibratie: één op de twintig sessies eindigde op of onder 0.48.
De ETF-kolom laat op elk punt van de curve een andere verdeling zien. De mediane sessie kwam uit op 1.45, boven de one-to-one-lijn waar de mediaan van de individuele aandelen ruim onder blijft. Het eigen hoogste deciel begon bij 1.77. Een ratio zonder vermelding van het onderliggende boek zegt vrijwel niets. Die print van 1,15 betekent iets anders afhankelijk van de kolom waarin deze voorkwam.
Waarom een indexratio boven 1 normaal is en een aandelenratio boven 1 niet
Splits hetzelfde volume uit naar onderliggende waarde en de niveaus komen duidelijk uit elkaar te liggen.
De exacte SQL achter elk getal
WITH symbol_days AS (
SELECT underlying_symbol AS symbol,
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('2026-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 symbol, day
HAVING call_volume > 0
)
SELECT symbol,
round(toFloat64(sum(put_volume)) / toFloat64(sum(call_volume)), 2) AS put_call_ratio,
round(100 * countIf(put_volume > call_volume) / count(), 1) AS above_one_pct,
count() AS observations
FROM symbol_days
GROUP BY symbol
ORDER BY put_call_ratio DESCIn de eerste zeven maanden van 2026 stond IWM bovenaan met 2.73 puts per call. De ratio lag in 98.6% van de 144 handelssessies boven één. Onderaan stond XOM met 0.38. Daar lag de ratio in 2.8% van de sessies boven één.
Het verschil is structureel. Bij opties op brede markt-ETF's vindt de portefeuillehedge plaats. Een beheerder met two hundred posities koopt indexputs in plaats van puts op elke afzonderlijke positie. Tegenover die order flow staat geen vergelijkbare calltransactie. Het volume in opties op individuele aandelen helt de andere kant op. Daar worden calls gekocht voor opwaarts potentieel en calls geschreven tegen aandelen die al in bezit zijn. Een "total"-ratio combineert beide boeken. Daardoor ligt deze ratio tussen de twee andere ratio's in. Ook beweegt de ratio mee met de productmix van de dag, en niet alleen met het sentiment.
Er is nog een verschuiving in het niveau die u moet kennen. Een groot deel van het index- en ETF-volume betreft inmiddels expiries op dezelfde dag (0DTE-opties). Deze categorie werd niet op een vergelijkbare schaal verhandeld toen de bekende drempelwaarden werden vastgelegd. Oude niveaus zijn niet rechtstreeks toepasbaar op een markt met een andere samenstelling.
Is een hoge put/call-ratio bullish? Wat volgde op de extremen
De contrarian-case is toetsbaar. Deel elke sessie op basis van de equity-ratio van die dag in vijf gelijke groepen en meet vervolgens hoe de S&P 500-tracker in de daaropvolgende vijf en twintig sessies bewoog.
De exacte SQL achter elk getal
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 ASCDe rustigste vijfde van de sessies begint bij 0.34 en de drukste vijfde bij 0.81. De hoogste band bevat daarmee alle waarden die een contrarian als extreem zou aanmerken. Over die 226 sessies bedroeg de mediaan van de beweging over twintig sessies 3%, tegenover 0.91% na de rustigste vijfde. Na vijf sessies kwamen dezelfde twee banden uit op 0.82% en 0.3%.
Medianen verbergen het relevante deel. Binnen de hoogste vijfde liep de middelste helft van de uitkomsten over twintig sessies van -1.82% tot 5.71%. Binnen de rustigste vijfde liep die middelste helft van -0.83% tot 2.67%. Die twee bandbreedtes overlappen grotendeels. De band waarin een sessie valt verschuift het centrum van de verdeling, maar verkleint de bandbreedte rond dat centrum nauwelijks. Juist dat deel ontbreekt bij een vuistregel.
Een kanttekening bij de weging. De periode van januari 2022 tot en met juli 2026 omvat één bear market en het daaropvolgende herstel, met ongeveer 226 sessies per band. Dat is een reële steekproef, maar wel uit één specifieke periode van de marktgeschiedenis.
Clusteren extreme uitslagen zich rond markt-bodems?
Ze clusteren in maanden waarin de markt daalt. Dat is een andere bewering. Deel elke maand vanaf 2022 in op basis van de beweging van de tracker binnen die maand. Tel vervolgens hoeveel readings in het hoogste deciel in elke groep vielen.
De exacte SQL achter elk getal
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
),
cut AS (
SELECT quantileDeterministic(0.90)(pcr, cityHash64(day)) AS p90
FROM equity_pcr
),
by_month AS (
SELECT toStartOfMonth(day) AS month_start,
countIf(pcr >= cut.p90) AS extreme_reads,
quantileDeterministic(0.5)(pcr, cityHash64(day)) AS median_pcr
FROM equity_pcr CROSS JOIN cut
GROUP BY month_start
),
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-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY day
),
spy_month AS (
SELECT toStartOfMonth(day) AS month_start,
100 * (argMax(close, day) / argMin(close, day) - 1) AS move_pct
FROM spy_daily
GROUP BY month_start
)
SELECT multiIf(s.move_pct <= -3, 'index down 3% or more',
s.move_pct < 0, 'index down under 3%',
s.move_pct < 3, 'index up under 3%',
'index up 3% or more') AS index_move_bucket,
count() AS observations,
round(avg(m.extreme_reads), 1) AS top_decile_reads_avg,
round(quantileDeterministic(0.5)(m.median_pcr, cityHash64(m.month_start)), 2) AS typical_pcr_ratio
FROM by_month AS m
INNER JOIN spy_month AS s ON m.month_start = s.month_start
GROUP BY index_move_bucket
ORDER BY min(s.move_pct) ASCIn maanden waarin de tracker 3% of meer lager eindigde, waren er gemiddeld 4.2 readings in het hoogste deciel. In maanden waarin de tracker 3% of meer steeg, waren dat er 1.9. De mediaan van de dagelijkse reading per groep staat in de laatste kolom: 0.75 voor de slechtste groep en 0.62 voor de beste. De twee uiteinden van de tabel omvatten respectievelijk 12 en 22 maanden.
Extreme put/call-readings en dalende koersen komen samen voor. Dat is co-occurrence. De forward cijfers in de vorige sectie laten zien welke waarde daaraan kan worden toegekend. De ratio meet de markt op dezelfde dag als waarop de beweging plaatsvindt. De pieken vallen daarom binnen koersdalingen en niet ervoor. Een bodem is een label dat pas achteraf wordt toegekend.
Een niveau afzetten tegen een verdeling
Uit de bovenstaande cijfers volgen twee gewoonten.
Ten eerste: vergelijk vergelijkbare zaken met elkaar. Een meting zegt alleen iets in relatie tot de eigen historische reeks van hetzelfde boek over een vergelijkbare periode. Dat is precies wat een percentieltabel laat zien, en niet wat een onthouden drempelwaarde doet.
Ten tweede: let op de noemer. De ratio daalt wanneer het callvolume sterk toeneemt, ook als het kopen van puts niet verandert. Zowel een daling als een piek in de ratio kan ontstaan doordat slechts één kant van de breuk beweegt. Door putvolume en callvolume afzonderlijk te bekijken, blijft de rekenkundige basis zichtbaar.
Dezelfde discipline geldt voor elke sentimentindicator die als een los getal wordt genoemd. De VIX en een print van 30% implied volatility zijn niet te interpreteren zonder hun eigen verdelingen. Ook contrarian sentimentregels houden alleen stand tegenover de data wanneer het referentieniveau wordt gemeten in plaats van verondersteld.
Veelgestelde vragen
Is een hoge put/call-ratio bullish?
De contrarian-interpretatie gaat ervan uit dat veel putopties kopen betekent dat de markt al breed is gepositioneerd op een daling. Afgezet tegen de single-stock-basket hierboven volgden op sessies in het hoogste vijfde deel van de metingen een mediane beweging over twintig sessies van 3% in de S&P 500-tracker, tegenover 0.91% na het rustigste vijfde deel. De middelste helft van de uitkomsten in het hoogste vijfde deel liep van -1.82% tot 5.71%.
Wat is een normale put/call-ratio?
Dat hangt volledig af van de opties die worden meegeteld. In een basket van tien bekende single-stock-namen kwam de mediane sessie van 2022 tot en met juli 2026 uit op 0.67 puts per call. Bij drie brede markt-ETF’s over dezelfde sessies was de mediaan 1.45.
Waarom is de put/call-ratio voor de index hoger dan de put/call-ratio voor aandelen?
Brede index- en ETF-opties zijn het standaardinstrument voor portfolio-hedging. Een hedger die indexputs koopt, heeft daar geen bijbehorende calltrade naast staan. Het volume in single stocks verschuift richting gekochte calls voor opwaarts potentieel en geschreven calls op reeds aangehouden aandelen. Daardoor ligt de ratio in die portefeuille lager.
Werkt de put/call-ratio voor market timing?
De bovenstaande meting toont de verdeling van wat volgde op elk vijfde deel van de metingen. De spreiding binnen elke band is veel groter dan het verschil tussen de medianen van de banden. Metingen in het hoogste deciel komen ook vaker voor in maanden waarin de index lager eindigde. In de slechtste groep bedroeg dat 4.2 per maand.
Wat is het verschil tussen een put/call-ratio op basis van volume en een ratio op basis van open interest?
Een volumeverhouding telt de contracten die tijdens een sessie zijn verhandeld. Zij wordt dus elke dag opnieuw vastgesteld en reageert snel. Een ratio op basis van open interest telt de nog uitstaande posities. Die verandert geleidelijk en heeft een eigen niveau. De twee ratio’s zijn niet onderling uitwisselbaar. Een drempelwaarde die voor de ene ratio is ontwikkeld, kan de andere verkeerd interpreteren.
Hoe deze cijfers zijn opgebouwd
- Bron: één rij per optiecontract per sessie, met het verhandelde volume van die sessie. Puts en calls worden gescheiden op basis van de OCC-contractcode. De laatste acht tekens vormen de strike en het teken daarvoor is C voor een call en P voor een put. Open de SQL onder een paneel voor de exacte tabel en filters.
- Elke ratio op deze pagina is een volumeverhouding. Open interest maakt geen deel uit van de berekening. Geen enkele ratio hier is dus gebaseerd op open interest.
- Er wordt geen kwaliteitsfilter voor implied volatility toegepast. Contracten worden uitsluitend op basis van verhandeld volume opgenomen, omdat deze panelen handelsactiviteit tellen en niet de volatiliteit meten.
- De basket bestaat uit AAPL, MSFT, NVDA, AMZN, META, TSLA, GOOGL, JPM, KO en XOM voor de single-stock-portefeuille, plus SPY, QQQ en IWM voor de index-ETF-portefeuille. Door beurzen gepubliceerde ratio’s bestrijken de gehele markt en omvatten indexproducten zoals SPX. Hun niveaus liggen daarom elders.
- Indexprijzen zijn de laatste reguliere-session print van elke dag voor de S&P 500-tracker. De forward returns sluiten de laatste twintig sessies van de steekproef uit, omdat daarvoor nog geen toekomstige periode van twintig sessies beschikbaar is. Maandbewegingen lopen van de slotkoers van de eerste sessie tot de slotkoers van de laatste sessie binnen elke maand.
Elk paneel hierboven kan worden uitgeklapt om de onderliggende SQL te bekijken. Dezelfde percentielqueries kunnen worden uitgevoerd voor elke underlying die u op de Strasmore-terminal volgt.