Uma razão put/call alta é altista?
A leitura contrária vê uma razão put/call alta como altista. Veja faixas de percentil para opções de ações e índices e o que ocorreu após extremos.
Uma razão put/call alta é a leitura altista contrária clássica: a compra excepcionalmente intensa de puts é interpretada como sinal de que o mercado já se preparou para uma queda. Agir com base nessa leitura esbarra em um problema. “Alta” não tem um valor fixo, e uma leitura de 1,15 na sua tela pode ser extrema nas opções de uma única ação e normal em uma sessão de produtos de índice.
O que a pergunta exige é uma distribuição de referência. Esta página apresenta uma para os dois conjuntos de dados e, em seguida, mede o que aconteceu depois das leituras elevadas. O explicador da razão put/call mostra como a razão é calculada, e tudo abaixo parte dessa definição.
Duas observações sobre a medição. Toda razão aqui conta os contratos negociados naquele dia, o que a torna uma razão de volume; o open interest conta as posições ainda abertas e está em um nível diferente (volume versus open interest explica a diferença). Os números também vêm de uma cesta fixa, com dez ações conhecidas individualmente e três ETFs amplos de mercado, e não de todo o fluxo de negócios do mercado. Portanto, interprete o formato da distribuição, e não a última casa decimal.
O que é uma relação put/call elevada?
Um percentil responde a uma pergunta que um nível isolado não consegue responder. A curva abaixo cobre todas as sessões de janeiro de 2022 a julho de 2026, com uma relação por sessão para cada carteira.
O SQL exato por trás de cada número
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
)Na cesta de ações individuais, a sessão mediana registou 0.67 puts por call. O decil superior das sessões começou em 0.89, e o um por cento mais extremo superou 1.34. A ponta mais tranquila da distribuição também é útil para a calibração: uma em cada vinte sessões terminou em 0.48 ou menos.
A coluna dos ETFs representa uma distribuição diferente em todos os pontos da curva. A sessão mediana registou 1.45, acima da linha de equilíbrio de one-to-one, que a mediana das ações individuais fica bem abaixo, e o decil superior dessa coluna começou em 1.77. Uma relação apresentada sem identificar a carteira tem pouco significado. Esse print de 1,15 representa duas coisas diferentes, dependendo da coluna em que aparece.
Por que um índice acima de um é normal e um índice de ações acima de um não é
Dividir o mesmo volume por ativo subjacente separa claramente os níveis.
O SQL exato por trás de cada número
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 DESCNos primeiros sete meses de 2026, IWM ficou no topo da tabela, com 2.73 puts por call, encerrando acima de um em 98.6% das suas 144 sessões. Na parte inferior, XOM registrou 0.38, acima de um em 2.8% das sessões.
A diferença é estrutural. As opções sobre ETFs de mercado amplo são usadas para proteção de carteiras: um gestor com duas centenas de posições compra puts sobre o índice, em vez de puts sobre cada ativo, e esse fluxo não tem uma operação correspondente de calls ao lado. O volume de opções sobre ações individuais pende para o outro lado: calls compradas em busca de valorização e calls vendidas contra ações que o investidor já detém. Um índice “total” combina os dois livros. Por isso, fica entre eles e varia com a composição dos produtos negociados no dia tanto quanto com o sentimento do mercado.
Também é importante considerar outra mudança de nível. O volume de índices e ETFs agora inclui uma parcela elevada de vencimentos no mesmo dia (opções 0DTE), uma categoria que não era negociada em escala comparável quando os limiares conhecidos foram definidos. Níveis antigos não se aplicam a um fluxo de negócios com composição diferente.
Uma relação put/call elevada é altista? O que veio depois dos extremos
A tese contrária pode ser testada. Divida cada sessão em quintos com base na relação de ações daquele dia. Em seguida, meça o desempenho do ETF que acompanha o S&P 500 nas cinco e nas vinte sessões seguintes.
O SQL exato por trás de cada número
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 ASCO quinto mais calmo de sessões começa em 0.34, e o quinto mais movimentado começa em 0.81. Portanto, a faixa superior reúne todas as leituras que um investidor contrário classificaria como esticadas. Nessas 226 sessões, o movimento mediano em vinte sessões foi de 3%, contra 0.91% após o quinto mais calmo. Cinco sessões depois, as mesmas duas faixas registraram 0.82% e 0.3%.
As medianas ocultam o que importa. Dentro do quinto superior, a metade central dos resultados em vinte sessões variou de -1.82% a 5.71%. No quinto mais calmo, a metade central variou de -0.83% a 2.67%. As duas faixas cobrem boa parte do mesmo intervalo. A faixa em que uma sessão se encontra desloca o centro da distribuição, mas quase não reduz a amplitude em torno desse centro. Essa é a parte que uma regra prática deixa de fora.
Há uma ressalva quanto ao peso da amostra. O período de janeiro de 2022 a julho de 2026 inclui um mercado de baixa e a recuperação posterior, com aproximadamente 226 sessões por faixa. É uma amostra real, mas corresponde a apenas um período da história do mercado.
As leituras extremas se concentram nas mínimas do mercado?
Elas se concentram nos meses de queda, o que é uma afirmação diferente. Agrupámos todos os meses desde 2022 pela variação do tracker dentro de cada mês e, em seguida, contamos quantas leituras de put/call no decil superior ocorreram em cada grupo.
O SQL exato por trás de cada número
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) ASCOs meses em que o tracker terminou 3% ou mais baixo registaram, em média, 4.2 leituras no decil superior cada, contra 1.9 nos meses em que subiu 3% ou mais. A mediana da leitura diária de cada grupo aparece na última coluna: 0.75 no pior grupo e 0.62 no melhor. Nas duas extremidades da tabela estão 12 e 22 meses.
Leituras extremas de put/call e preços em queda aparecem juntas. Isso é coocorrência, e os números a prazo da secção anterior mostram o seu valor. O rácio mede o tape do mesmo dia, portanto os seus picos ocorrem dentro das quedas, não antes delas. Uma mínima é um rótulo atribuído posteriormente.
Comparar um nível com uma distribuição
Duas práticas resultam dos números acima.
Primeiro, compare bases equivalentes. Uma leitura só faz sentido quando comparada com o histórico do próprio indicador em uma janela semelhante. É exatamente isso que uma tabela de percentis mostra. Um limite guardado de memória não mostra.
Segundo, observe o denominador. O índice cai quando o volume de calls aumenta, mesmo que as compras de puts não mudem. Tanto uma queda quanto um salto no índice podem resultar do movimento isolado de um dos lados da fração. Ler separadamente os volumes de puts e calls mantém a aritmética visível.
A mesma disciplina se aplica a qualquer indicador de sentimento apresentado como um número isolado. O VIX e uma leitura de volatilidade implícita de 30% não podem ser interpretados sem suas próprias distribuições. Além disso, as regras de sentimento contrarian só se sustentam nos dados quando o nível de referência é medido, e não presumido.
Perguntas frequentes
Um put/call ratio alto é um sinal de alta?
A leitura contrária considera que uma forte compra de puts indica que o mercado já está posicionado para uma queda. Em comparação com a cesta de ações individuais acima, as sessões no quinto superior das leituras foram seguidas por uma variação mediana de 20 sessões de 3% no ETF que acompanha o S&P 500, contra 0.91% após o quinto mais calmo. A metade central dos resultados do quinto superior ficou entre -1.82% e 5.71%.
O que é um put/call ratio normal?
Depende inteiramente das opções contabilizadas. Em uma cesta de dez ações individuais conhecidas do público, a sessão mediana entre 2022 e julho de 2026 registrou 0.67 puts por call. Nos três ETFs de mercado amplo nas mesmas sessões, a mediana foi 1.45.
Por que o put/call ratio do índice é maior que o put/call ratio das ações?
Opções sobre índices amplos e ETFs são o instrumento padrão para proteção de carteiras, e o gestor que compra puts de índice não tem uma operação correspondente com calls ao lado. O volume de ações individuais tende a incluir calls compradas para capturar uma alta e calls vendidas contra ações já detidas, o que mantém o ratio desse conjunto mais baixo.
O put/call ratio funciona para fazer market timing?
A medição acima mostra a distribuição dos resultados após cada quinto das leituras. O spread dentro de qualquer faixa é muito maior que a distância entre as medianas das faixas. As leituras no décimo superior também se concentram nos meses em que o índice terminou em queda, a 4.2 por mês no grupo de pior desempenho.
Qual é a diferença entre um put/call ratio baseado em volume e um baseado em open interest?
Um ratio de volume contabiliza os contratos negociados durante uma sessão. Por isso, é reiniciado todos os dias e reage rapidamente. Um ratio de open interest contabiliza as posições ainda em aberto. Ele muda mais lentamente e permanece em seu próprio nível. Os dois não são intercambiáveis, e um limite importado de um deles produzirá uma leitura incorreta do outro.
Como estes números são calculados
- Fonte: uma linha por contrato de opção em cada sessão, contendo o volume negociado naquela sessão. Puts e calls são separados a partir do código do contrato da OCC. Os últimos oito caracteres correspondem ao strike, e o caractere anterior é C para call e P para put. Abra o SQL abaixo de qualquer painel para consultar a tabela e os filtros exatos.
- Todos os ratios desta página são ratios de volume. O open interest não faz parte do cálculo. Portanto, nenhum dos dados aqui é um ratio de open interest.
- Não é aplicado nenhum filtro de qualidade para volatilidade implícita. Os contratos entram apenas com base no volume negociado, pois estes painéis contabilizam a atividade de negociação, e não medem a volatilidade.
- A cesta inclui AAPL, MSFT, NVDA, AMZN, META, TSLA, GOOGL, JPM, KO e XOM no conjunto de ações individuais, além de SPY, QQQ e IWM no conjunto de ETFs de índice. Os ratios publicados pelas bolsas abrangem todo o mercado e incluem produtos de índice como SPX. Por isso, seus níveis são diferentes.
- Os preços do índice correspondem ao último print da sessão regular de cada dia para o ETF que acompanha o S&P 500. Os retornos futuros excluem as últimas 20 sessões da amostra, que ainda não têm um período futuro de 20 sessões. As variações mensais vão do fechamento da primeira sessão ao fechamento da última sessão de cada mês.
Cada painel acima se expande para mostrar o SQL correspondente, e as mesmas consultas de percentis podem ser executadas para qualquer ativo que você acompanhe no terminal da Strasmore.