Come si calcola il put/call ratio
Formula del put/call ratio: differenze tra volume e open interest, perché gli indici hanno valori più alti e quali letture sono normali nel 2026.
Il put/call ratio si calcola dividendo il numero di contratti put scambiati per il numero di contratti call scambiati nella stessa finestra temporale. Se in una seduta passano di mano 250.000 put e 500.000 call, il rapporto è pari a 0,50. Ogni discussione sull’indicatore, sul confronto tra volume e open interest e tra opzioni su azioni e opzioni su indici, dipende da ciò che è stato conteggiato in ciascun lato della divisione. Per la definizione di base, inizia da che cos’è il put/call ratio. Questa pagina mostra il calcolo.
La formula del put/call ratio, passo dopo passo
La formula ha due input e un’operazione: si contano le put scambiate, si contano le call scambiate e si divide il primo dato per il secondo. Una put è un contratto che attribuisce al titolare il diritto di vendere 100 azioni del sottostante a uno strike price prefissato, entro la scadenza o alla scadenza stessa. Una call attribuisce il diritto di acquistare a uno strike prefissato. Il volume conta i contratti scambiati durante la seduta e si azzera alla successiva apertura.
Nel conteggio non viene applicato alcun peso. Un lotto su una weekly deep out of the money vale quanto un lotto sullo strike più liquido del book. Nessuno dei due viene rapportato al capitale a rischio. Il ratio è un conteggio di contratti.
La scelta che modifica il risultato riguarda i contratti inclusi nel conteggio. Il pannello sotto applica lo stesso calcolo a otto titoli liquidi nell’arco di un mese intero.
L'esatto SQL dietro ogni numero
SELECT
underlying_symbol AS symbol,
sumIf(volume, right_letter = 'P') AS put_volume,
sumIf(volume, right_letter = 'C') AS call_volume,
round(toFloat64(sumIf(volume, right_letter = 'P'))
/ toFloat64(sumIf(volume, right_letter = 'C')), 2) AS put_call_ratio
FROM
(
SELECT
underlying_symbol,
volume,
substring(ticker, length(ticker) - 8, 1) AS right_letter
FROM global_markets.options_greeks
WHERE date >= '2026-07-01'
AND date < '2026-08-01'
AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
AND volume > 0
)
GROUP BY symbol
HAVING call_volume > 0 AND put_volume > 0
ORDER BY put_call_ratio DESCA luglio 2026, IWM ha registrato il ratio più alto degli otto, pari a 3.11 put per call, mentre MSFT ha segnato il più basso, a 0.38. Una formula, un mese e una distanza tra il titolo in cima e quello in fondo molto più ampia della variabilità giornaliera di cui si parla di solito. Un ratio citato senza indicarne la categoria associata contiene quasi nessuna informazione.
Basato sui volumi o sull’open interest
Il numeratore e il denominatore possono derivare da due conteggi diversi.
La versione basata sui volumi conta i contratti scambiati nell’intervallo considerato. È una misura di flusso che riparte da zero a ogni seduta e descrive l’attività della giornata. È il rapporto riportato in tutti i titoli della stampa finanziaria.
La versione basata sull’open interest divide le put ancora aperte per le call ancora aperte. L’open interest è il numero di contratti aperti e non ancora chiusi, esercitati o scaduti. È quindi una misura di stock: rappresenta la posizione cumulata, non l’attività della giornata, e varia lentamente. Una seduta in cui 30.000 put passano di mano tra due detentori già esistenti aggiunge 30.000 al volume e lascia invariato l’open interest. Volume delle opzioni e open interest illustra la contabilizzazione.
Consideriamo un titolo ipotetico che chiude martedì con 40.000 put e 50.000 call ancora aperte, per un rapporto di open interest pari a 0,80. Mercoledì vengono scambiate 30.000 put e 10.000 call: il rapporto di volume è 3,00. I due valori descrivono la stessa catena di opzioni nella stessa giornata, differiscono di quasi quattro volte e sono entrambi corretti. I rapporti basati sull’open interest sono anche alla base del calcolo del max pain, che pondera gli strike in base ai contratti ancora aperti, non a quelli scambiati.
Le misure di flusso sono instabili. Di seguito è riportato il rapporto giornaliero tra i volumi di un ETF e di un singolo titolo nello stesso mese.
L'esatto SQL dietro ogni numero
SELECT
toString(d) AS session_date,
concat(formatDateTime(d, '%b '), toString(toDayOfMonth(d))) AS day_label,
round(toFloat64(sumIf(volume, sym = 'SPY' AND right_letter = 'P'))
/ toFloat64(sumIf(volume, sym = 'SPY' AND right_letter = 'C')), 2) AS spy_put_call_ratio,
round(toFloat64(sumIf(volume, sym = 'AAPL' AND right_letter = 'P'))
/ toFloat64(sumIf(volume, sym = 'AAPL' AND right_letter = 'C')), 2) AS aapl_put_call_ratio
FROM
(
SELECT
date AS d,
underlying_symbol AS sym,
volume,
substring(ticker, length(ticker) - 8, 1) AS right_letter
FROM global_markets.options_greeks
WHERE date >= '2026-07-01'
AND date < '2026-08-01'
AND underlying_symbol IN ('SPY', 'AAPL')
AND volume > 0
)
GROUP BY d
HAVING countIf(sym = 'SPY' AND right_letter = 'C') > 0
AND countIf(sym = 'AAPL' AND right_letter = 'C') > 0
ORDER BY dIl Jul 1, SPY ha registrato 1.1 rispetto a 0.49 per AAPL. Al Jul 31, la coppia si attestava a 2 e 0.55. Nell’arco di 22 sedute, i valori giornalieri oscillano e le due serie si collocano su livelli diversi nel grafico. La differenza tra i livelli è il più utile dei due elementi.
Azionario, indice, ETP e totale: i quattro rapporti di Cboe
Il dato indicato come «put/call ratio» proviene dalle statistiche giornaliere di mercato di Cboe, che ne pubblica diverse versioni. Le categorie, secondo la denominazione di Cboe, sono:
- Equity put/call ratio: opzioni su singole azioni.
- Index put/call ratio: opzioni su indici, inclusi SPX e VIX.
- Exchange traded products put/call ratio: opzioni su ETF, tra cui SPY, QQQ e IWM.
- Total put/call ratio: la somma di tutte le categorie.
Il calcolo è identico in ogni caso: put totali divise per call totali all’interno della categoria. I valori differiscono quindi solo per i contratti inclusi nel relativo paniere. Le categorie non sono intercambiabili.
Le opzioni su indici sono lo strumento standard per coprire un intero portafoglio con una sola operazione. Un fondo che detiene un portafoglio azionario diversificato acquista put sull’indice a copertura e non ha un motivo analogo per acquistare call sull’indice. Questa domanda è unidirezionale e confluisce interamente al numeratore della categoria index. I flussi sulle singole azioni presentano l’inclinazione opposta: gli acquisti di call sui singoli titoli rappresentano una quota ampia e persistente dei volumi. Le due categorie si collocano quindi su livelli strutturalmente diversi. Confrontare il dato di una categoria con il benchmark dell’altra è l’errore più comune nell’uso di questo indicatore.
Gli ETF sul mercato ampio svolgono la stessa funzione di copertura delle opzioni su indici, ma sono conteggiati nella categoria exchange traded products. Il pannello seguente mostra la mediana mensile per entrambi i lati di questa distinzione.
L'esatto SQL dietro ogni numero
WITH
daily AS
(
SELECT
d,
toFloat64(sumIf(volume, right_letter = 'P' AND sym IN ('SPY', 'QQQ', 'IWM')))
/ toFloat64(sumIf(volume, right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM'))) AS etf_ratio,
toFloat64(sumIf(volume, right_letter = 'P' AND sym NOT IN ('SPY', 'QQQ', 'IWM')))
/ toFloat64(sumIf(volume, right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM'))) AS stock_ratio
FROM
(
SELECT
date AS d,
underlying_symbol AS sym,
volume,
substring(ticker, length(ticker) - 8, 1) AS right_letter
FROM global_markets.options_greeks
WHERE date >= '2025-08-01'
AND date < '2026-08-01'
AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
AND volume > 0
)
GROUP BY d
HAVING countIf(right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM')) > 0
AND countIf(right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM')) > 0
)
SELECT
toString(toStartOfMonth(d)) AS month,
formatDateTime(toStartOfMonth(d), '%b %Y') AS month_label,
round(quantileExact(0.5)(etf_ratio), 2) AS etf_median_ratio,
round(quantileExact(0.5)(stock_ratio), 2) AS stock_median_ratio
FROM daily
GROUP BY month, month_label
ORDER BY monthIl pannello copre il periodo da Aug 2025 a Jul 2026. Agli estremi dell’intervallo, la mediana giornaliera del paniere di ETF era prossima o superiore a 1,0: 1.52 nel primo mese e 1.49 nell’ultimo. Il paniere delle singole azioni è rimasto sotto 1,0 a entrambe le estremità, 0.6 e 0.56, per tutti i 12 mesi mostrati nel grafico. Questo divario strutturale spiega perché un benchmark debba indicare la propria categoria prima di poter essere interpretato.
Cosa si considera un normale rapporto put/call
La normalità è un intervallo, e l’intervallo appartiene a una categoria, non all’indicatore. Il riquadro seguente considera ogni seduta degli ultimi dodici mesi e riporta il rapporto mediano giornaliero per ciascun paniere, con i valori del 10° e del 90° percentile ai due estremi.
L'esatto SQL dietro ogni numero
WITH
daily AS
(
SELECT
d,
toFloat64(sumIf(volume, right_letter = 'P' AND sym IN ('SPY', 'QQQ', 'IWM')))
/ toFloat64(sumIf(volume, right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM'))) AS etf_ratio,
toFloat64(sumIf(volume, right_letter = 'P' AND sym NOT IN ('SPY', 'QQQ', 'IWM')))
/ toFloat64(sumIf(volume, right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM'))) AS stock_ratio,
toFloat64(sumIf(volume, right_letter = 'P'))
/ toFloat64(sumIf(volume, right_letter = 'C')) AS all_ratio
FROM
(
SELECT
date AS d,
underlying_symbol AS sym,
volume,
substring(ticker, length(ticker) - 8, 1) AS right_letter
FROM global_markets.options_greeks
WHERE date >= '2025-08-01'
AND date < '2026-08-01'
AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
AND volume > 0
)
GROUP BY d
HAVING countIf(right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM')) > 0
AND countIf(right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM')) > 0
)
SELECT
p.2 AS category,
round(quantileExact(0.1)(p.3), 2) AS p10_ratio,
round(quantileExact(0.5)(p.3), 2) AS median_ratio,
round(quantileExact(0.9)(p.3), 2) AS p90_ratio
FROM
(
SELECT arrayJoin([
tuple(1, 'Broad market ETFs', etf_ratio),
tuple(2, 'Single stocks', stock_ratio),
tuple(3, 'All eight names', all_ratio)
]) AS p
FROM daily
)
GROUP BY p.1, p.2
ORDER BY p.1Per il paniere dei singoli titoli, il rapporto mediano è stato pari a 0.58, con 0.45 al 10° percentile e 0.76 al 90°. Il paniere degli ETF sul mercato ampio si è collocato più in alto lungo tutta la distribuzione: una mediana di 1.54, compresa tra 1.25 e 1.86.
Quindi, 1,20 è un valore elevato? Rispetto al paniere dei singoli titoli, un print di 1,20 supera il 90° percentile di 0.76, quindi è insolito. Rispetto al paniere degli ETF, è vicino alla norma. Rispetto alla categoria degli indici, dove si concentra il flusso di hedging descritto sopra, lo stesso valore deve essere confrontato con livelli ancora diversi. C’è un solo numero, ma è la categoria a determinare il giudizio prima ancora che inizi l’interpretazione.
Anche questi intervalli cambiano nel tempo. I percentili calcolati sugli ultimi dodici mesi descrivono gli ultimi dodici mesi; un intervallo di riferimento copiato da un articolo scritto dieci anni fa descrive invece un mercato con una composizione dei contratti diversa e quasi privo di trading con scadenza a zero giorni. Ricalcolare i percentili su una finestra recente è l’unico modo corretto per definire una lettura alta o bassa.
L’interpretazione è un’attività distinta dal calcolo. Alcuni interpretano una lettura elevata come posizionamento ribassista, mentre i contrarian la considerano un hedge affollato; se un rapporto put/call elevato sia rialzista esamina correttamente questa tesi.
Perché la media mobile a 21 sedute
Il rapporto di una sola seduta è un campione ridotto di una serie rumorosa, quindi il dato pubblicato viene di norma smussato. La convenzione più comune è una media mobile a 21 sedute, all’incirca un mese di borsa: si sommano gli ultimi 21 rapporti giornalieri, si divide il risultato per 21 e poi si fa avanzare la finestra di una seduta. Esistono anche versioni a dieci e cinquanta sedute; la durata scelta determina quanta parte di un picco giornaliero rimane visibile.
È utile conoscere due aspetti. Calcolare la media di 21 rapporti giornalieri non equivale a dividere il volume mensile delle put per quello mensile delle call: nel primo caso ogni seduta pesa allo stesso modo, nel secondo le sedute più attive hanno un peso maggiore. Inoltre, una lettura smussata su un livello estremo è stata costruita nell’arco di un mese di sedute, quindi abbandona quell’estremo gradualmente.
L'esatto SQL dietro ogni numero
WITH
daily AS
(
SELECT
d,
toFloat64(sumIf(volume, right_letter = 'P'))
/ toFloat64(sumIf(volume, right_letter = 'C')) AS raw_ratio
FROM
(
SELECT
date AS d,
volume,
substring(ticker, length(ticker) - 8, 1) AS right_letter
FROM global_markets.options_greeks
WHERE date >= '2026-01-02'
AND date < '2026-08-01'
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
AND volume > 0
)
GROUP BY d
HAVING countIf(right_letter = 'C') > 0
)
SELECT
session_date,
day_label,
daily_ratio,
ma21_ratio
FROM
(
SELECT
d,
toString(d) AS session_date,
concat(formatDateTime(d, '%b '), toString(toDayOfMonth(d))) AS day_label,
round(raw_ratio, 2) AS daily_ratio,
round(avg(raw_ratio) OVER (ORDER BY d ROWS BETWEEN 20 PRECEDING AND CURRENT ROW), 2) AS ma21_ratio
FROM daily
)
WHERE d >= '2026-04-01'
ORDER BY dLa linea frastagliata rappresenta il rapporto giornaliero del paniere di singoli titoli; quella più uniforme è la relativa media a 21 sedute. Nella prima seduta mostrata, Apr 1, il dato giornaliero era 1.04, contro un valore smussato di 0.81. In Jul 31 i due valori erano rispettivamente 0.56 e 0.58. Nell’arco di 84 sedute, la media copre una frazione della distanza percorsa dalla serie grezza: è precisamente questo il motivo per cui si pubblica il dato smussato.
Come vengono conteggiati questi pannelli
Il tipo di contratto è ricavato direttamente dal simbolo dell’opzione: la lettera davanti al codice strike di otto cifre è C per una call e P per una put. Nel conteggio entrano soltanto i contratti con un volume segnalato per la seduta; quindi uno strike che non ha registrato scambi non incrementa nessuno dei due lati. Il primo pannello divide, per ciascun titolo, il volume totale mensile delle put per il volume totale mensile delle call. I pannelli rimanenti calcolano prima un rapporto per ogni seduta e poi sintetizzano tali sedute, in linea con il metodo con cui viene costruita una media mobile pubblicata. Panieri: SPY, QQQ e IWM per il mercato ampio, con AAPL, MSFT, NVDA, TSLA e KO per i singoli titoli. Ogni pannello riporta l’SQL esatto che lo ha prodotto.
FAQ
Come si calcola il put/call ratio?
Si divide il numero di contratti put per il numero di contratti call nello stesso intervallo. Le versioni più pubblicate utilizzano i volumi della seduta: una lettura di 0,65 significa che sono state scambiate 65 put ogni 100 call. La versione basata sull’open interest utilizza i contratti ancora aperti invece di quelli scambiati e risponde a una domanda diversa.
Un put/call ratio superiore a 1 è elevato?
Dipende dalla categoria. Per il paniere di singoli titoli mostrato nei pannelli precedenti, il 90° percentile delle letture giornaliere è pari a 0.76, quindi i prints superiori a quel livello sono poco comuni. Per gli ETF sul mercato ampio e le opzioni su indici, dove l’hedging di portafoglio si concentra sul lato put, letture intorno a 1 o superiori sono normali.
Qual è la differenza tra il put/call ratio basato sui volumi e quello basato sull’open interest?
I volumi contano i contratti scambiati durante la seduta e si azzerano ogni mattina. L’open interest conta i contratti che restano aperti e si trasferisce da un giorno all’altro. La versione basata sui volumi può raddoppiare nell’arco di una sola seduta, mentre quella basata sull’open interest può variare di pochi punti percentuali. Per questo, nello stesso giorno, i due indicatori spesso segnalano direzioni diverse.
Quale put/call ratio cita la stampa finanziaria?
Di solito il put/call ratio azionario del Cboe oppure il put/call ratio totale, nella maggior parte dei casi come media mobile su 21 sedute anziché come print giornaliero non elaborato. Le quattro categorie del Cboe si muovono su livelli diversi. Di conseguenza, un dato citato senza indicazione della categoria non può essere confrontato con alcun benchmark.
Ogni pannello di questa pagina include il codice SQL che lo ha prodotto, quindi ogni conteggio può essere verificato riga per riga. Per applicare lo stesso calcolo a un altro titolo o a un intervallo più lungo, basta richiederlo in linguaggio naturale sul terminale Strasmore.