Strasmore Research

Un put/call ratio elevato è rialzista?

I contrarian considerano rialzista un put/call ratio elevato. Scopri le fasce percentile per opzioni su azioni e indici e cosa è seguito ai valori estremi.

Un put/call ratio elevato è il classico segnale rialzista in ottica contrarian: acquisti insolitamente consistenti di put vengono interpretati come un segnale del fatto che il mercato si sia già preparato a un ribasso. Applicare questa interpretazione presenta però un problema. Il valore di «elevato» non è fisso: una lettura di 1,15 sullo schermo può essere estrema per le opzioni su un singolo titolo e rappresentare una seduta ordinaria per i prodotti su indici.

Per rispondere alla domanda serve una distribuzione di riferimento. Questa pagina ne propone una per entrambi i mercati e misura poi cosa è seguito alle letture elevate. La guida al put/call ratio spiega come viene calcolato il rapporto; tutto ciò che segue parte da quella definizione.

Due precisazioni sulla misurazione. Ogni rapporto considera i contratti scambiati nella giornata, quindi è un volume ratio; l’open interest conta le posizioni ancora aperte e si colloca su un piano diverso (volume rispetto all’open interest distingue i due concetti). I numeri provengono inoltre da un paniere fisso, composto da dieci singoli titoli molto seguiti e da tre ETF azionari sul mercato ampio, non dall’intero flusso degli scambi di mercato. È quindi preferibile concentrarsi sulla forma della distribuzione, non sull’ultima cifra decimale.

Che cosa si considera un put/call ratio elevato?

Un percentile risponde a una domanda a cui un livello non può rispondere. La curva seguente copre tutte le sedute da gennaio 2022 a luglio 2026, con un ratio per seduta per ciascun book.

QueryPercentili del rapporto volume put/call: paniere di singoli titoli vs ETF sull’indice, dal 2022 a luglio 2026
L'esatto SQL dietro ogni numero
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
)
Run this yourself

Sul paniere di singole azioni, il ratio mediano della seduta è stato di 0.67 put per ogni call. Il decile superiore delle sedute è iniziato da 0.89, mentre l’uno per cento dei casi più estremi ha superato 1.34. Anche la fascia più tranquilla è utile per la calibrazione: una seduta su venti si è chiusa a 0.48 o meno.

La distribuzione della colonna degli ETF è diversa in ogni punto della curva. Il valore mediano delle sedute è stato 1.45, sopra la linea two-to-one rispetto alla quale il valore mediano delle singole azioni si colloca nettamente al di sotto; il decile superiore della distribuzione degli ETF è invece iniziato da 1.77. Un ratio citato senza specificare il book è quasi privo di significato. Quel print a 1,15 indica due cose diverse a seconda della colonna da cui proviene.

Perché un put/call ratio sull’indice superiore a uno è normale, mentre non lo è per le singole azioni

Separando lo stesso volume per sottostante, i livelli si distinguono nettamente.

QueryRapporto volume put/call per sottostante: dal 1° gennaio al 31 luglio 2026
L'esatto SQL dietro ogni numero
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 DESC
Run this yourself

Nei primi sette mesi del 2026, IWM era in cima alla classifica con 2.73 put per call, chiudendo sopra uno in 98.6% delle sue 144 sedute. In fondo alla classifica, XOM ha scambiato 0.38, sopra uno in 2.8% delle sedute.

Il divario è strutturale. Le opzioni sugli ETF broad market sono lo strumento con cui si effettua la copertura di portafoglio: un gestore che detiene duecento posizioni acquista put sull’indice invece di comprare put su ogni singola posizione, e questo flusso non ha un’operazione call corrispondente dall’altra parte. I volumi delle opzioni sulle singole azioni tendono nella direzione opposta, verso le call acquistate per beneficiare del rialzo e le call vendute contro azioni già detenute. Un ratio “totale” combina entrambi i book, collocandosi tra i due valori e variando in funzione della composizione dei prodotti scambiati nella giornata tanto quanto del sentiment.

È importante considerare anche un altro cambiamento di livello. Oggi i volumi sugli indici e sugli ETF comprendono una quota rilevante di scadenze nella stessa giornata (opzioni 0DTE), una categoria che non veniva scambiata su una scala paragonabile quando furono fissate le soglie più note. I vecchi livelli non sono trasferibili a un tape con una composizione diversa.

Un put/call ratio elevato è rialzista? Cosa è seguito agli estremi

L’ipotesi contrarian è verificabile. Ogni seduta viene assegnata a uno dei cinque gruppi in base all’equity ratio della giornata, quindi si misura l’andamento del tracker dell’S&P 500 nelle cinque e nelle venti sedute successive.

QueryMovimenti del tracker S&P 500 dopo ciascun quinto del rapporto put/call azionario, dal 2022 a luglio 2026
L'esatto SQL dietro ogni numero
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 ASC
Run this yourself

Il quinto più tranquillo delle sedute parte da 0.34, mentre il quinto più movimentato inizia da 0.81. La fascia superiore comprende quindi tutte le letture che un contrarian definirebbe estreme. Nelle 226 sedute di questa fascia, la variazione mediana a venti sedute è stata pari a 3%, contro 0.91% dopo il quinto più tranquillo. A cinque sedute di distanza, le stesse due fasce hanno registrato rispettivamente 0.82% e 0.3%.

Le mediane nascondono l’aspetto più importante. Nel quinto superiore, la metà centrale degli esiti a venti sedute è compresa tra -1.82% e 5.71%. Nel quinto più tranquillo, la metà centrale è compresa tra -0.83% e 2.67%. I due intervalli si sovrappongono in larga misura. La fascia in cui rientra una seduta sposta il centro della distribuzione, ma restringe solo marginalmente l’intervallo attorno a quel centro. È proprio questo l’elemento che una regola empirica tende a omettere.

Una precisazione sull’ampiezza del campione. Il periodo da gennaio 2022 a luglio 2026 comprende un bear market e la successiva ripresa, con circa 226 sedute per fascia. È un campione reale, ma rappresenta un solo tratto della storia di mercato.

I valori estremi si concentrano sui minimi di mercato?

Si concentrano nei mesi di ribasso, che è un’affermazione diversa. Raggruppiamo ogni mese dal 2022 in base all’andamento del tracker al suo interno, quindi contiamo quanti valori put/call nel decile superiore ricadono in ciascun gruppo.

QueryLetture put/call nel decile superiore per mese, raggruppate in base al movimento del tracker S&P 500
L'esatto SQL dietro ogni numero
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) ASC
Run this yourself

Nei mesi in cui il tracker ha chiuso in calo del 3% o più, si sono registrati in media 4.2 valori nel decile superiore per mese, contro 1.9 nei mesi in cui è salito del 3% o più. La mediana della lettura giornaliera di ciascun gruppo è riportata nell’ultima colonna: 0.75 per il gruppo peggiore e 0.62 per quello migliore. Le due estremità della tabella comprendono 12 e 22 mesi.

I valori put/call estremi e i prezzi in calo compaiono insieme. Si tratta di una co-occorrenza, e sono i dati forward della sezione precedente a indicarne il valore. Il ratio misura il mercato della stessa giornata, quindi i suoi picchi si collocano all’interno dei ribassi, non prima. Un minimo è un’etichetta che viene assegnata a posteriori.

Lettura di un livello rispetto a una distribuzione

Dai numeri sopra emergono due abitudini.

La prima è confrontare dati omogenei. Un valore ha senso solo se rapportato alla storia dello stesso indicatore su una finestra temporale comparabile. È esattamente ciò che offre una tabella dei percentili, a differenza di una soglia ricordata a memoria.

La seconda è osservare il denominatore. Il rapporto diminuisce quando il volume delle call aumenta, anche se gli acquisti di put restano invariati. Un calo del rapporto e un suo picco possono dipendere dal movimento di una sola componente della frazione. Leggere separatamente il volume delle put e quello delle call mantiene visibile l’aritmetica.

La stessa disciplina vale per ogni indicatore del sentiment espresso come numero isolato. Il VIX e un valore di volatilità implicita del 30% non sono interpretabili senza le rispettive distribuzioni, e le regole di sentiment contrarian sono confermate dai dati solo quando il livello di riferimento viene misurato anziché dato per scontato.

Domande frequenti

Un rapporto put/call elevato è rialzista?

La lettura contrarian considera gli acquisti massicci di put come il segnale che il mercato è già posizionato per un ribasso. Rispetto al paniere di singole azioni indicato sopra, le sedute nel quinto superiore dei valori sono state seguite da un movimento mediano a 20 sedute dello 3% sul tracker dell’S&P 500, contro 0.91% dopo il quinto più calmo. Il 50% centrale degli esiti del quinto superiore si collocava tra -1.82% e 5.71%.

Qual è un rapporto put/call normale?

Dipende interamente dalle opzioni incluse nel calcolo. Su un paniere di dieci singoli titoli molto seguiti, la mediana delle sedute dal 2022 a luglio 2026 era pari a 0.67 put per ogni call. Sui tre ETF broad-market nelle stesse sedute, la mediana era pari a 1.45.

Perché il rapporto put/call dell’indice è più alto di quello azionario?

Le opzioni su indici ampi ed ETF sono lo strumento standard per la copertura di portafoglio. Chi acquista put sull’indice per coprirsi non effettua necessariamente un’operazione call corrispondente. I volumi sui singoli titoli sono invece orientati verso l’acquisto di call per partecipare al rialzo e la vendita di call su azioni già detenute. Questo mantiene più basso il rapporto di quel paniere.

Il rapporto put/call è utile per il market timing?

La misurazione riportata sopra mostra la distribuzione dei risultati successivi a ciascun quinto dei valori. Lo spread all’interno di una singola fascia è molto più ampio della distanza tra le mediane delle fasce. I valori nel decile superiore si concentrano inoltre nei mesi in cui l’indice ha chiuso in ribasso: 4.2 al mese nel gruppo peggiore.

Qual è la differenza tra un rapporto put/call basato sui volumi e uno basato sull’open interest?

Il rapporto basato sui volumi conta i contratti negoziati durante una seduta. Si azzera quindi ogni giorno e reagisce rapidamente. Il rapporto basato sull’open interest conta le posizioni ancora aperte, che cambiano più lentamente e si collocano su un proprio livello. I due rapporti non sono intercambiabili. Una soglia ricavata da uno dei due può quindi generare una lettura errata dell’altro.

Come vengono costruiti questi numeri
  • Fonte: una riga per ogni contratto di opzione e per ogni seduta, con il volume negoziato in quella seduta. Put e call vengono separate dal codice del contratto OCC: gli ultimi otto caratteri indicano lo strike, mentre il carattere precedente è C per una call e P per una put. Apri la query SQL sotto ogni pannello per vedere la tabella e i filtri esatti.
  • Ogni rapporto di questa pagina è basato sui volumi. L’open interest non rientra nel calcolo. Nessun valore riportato qui è quindi un rapporto basato sull’open interest.
  • Non viene applicato alcun filtro sulla qualità della volatilità implicita. I contratti entrano nel calcolo in base al solo volume negoziato, perché questi pannelli misurano l’attività di trading e non la volatilità.
  • Il paniere comprende AAPL, MSFT, NVDA, AMZN, META, TSLA, GOOGL, JPM, KO e XOM per il comparto dei singoli titoli, oltre a SPY, QQQ e IWM per il comparto degli ETF su indici. I rapporti pubblicati dalle borse coprono l’intero mercato e includono prodotti su indici come SPX. I relativi livelli sono quindi diversi.
  • I prezzi dell’indice corrispondono all’ultimo print della seduta regolare di ogni giorno per il tracker dell’S&P 500. I rendimenti forward escludono le ultime 20 sedute del campione, che non hanno ancora un periodo futuro di 20 sedute. I movimenti mensili vanno dalla chiusura della prima seduta alla chiusura dell’ultima seduta di ciascun mese.

Ogni pannello sopra si espande per mostrare la query SQL sottostante. Le stesse query sui percentili possono essere eseguite su qualsiasi sottostante segui sul terminale Strasmore.

#put-call ratio#sentiment#options structure#contrarian#reference levels