Strasmore Research
Enquêtes Matt ConnorPar Matt Connor

Un put/call ratio élevé est-il haussier ?

Découvrez les bandes de percentiles des options sur actions et indices, puis mesurez ce qui a réellement suivi les lectures extrêmes pour éviter une conclusion trompeuse.

Un put/call ratio élevé correspond à l’interprétation haussière contrariante classique : des achats de puts exceptionnellement importants sont considérés comme le signe que le consensus s’est déjà préparé à une baisse. Mais cette lecture pose un problème. La notion de ratio « élevé » n’a pas de seuil fixe. Un ratio de 1,15 affiché sur votre écran peut être extrême pour les options sur une action donnée et banal lors d’une séance sur des produits indiciels.

Pour répondre à cette question, il faut une distribution de référence. Cette page en fournit une pour les deux ensembles, puis mesure ce qui s’est produit après les ratios élevés. L’explication du put/call ratio détaille le calcul du ratio. Tout ce qui suit repose sur cette définition.

Deux précisions concernant la mesure. Chaque ratio comptabilise les contrats négociés ce jour-là. Il s’agit donc d’un ratio de volume. L’open interest comptabilise les positions encore ouvertes et correspond à une autre notion (volume et open interest distingue les deux). Les chiffres proviennent également d’un panier fixe : dix grandes valeurs connues du grand public et trois ETF représentatifs de l’ensemble du marché, plutôt que de l’ensemble des échanges du marché. Il faut donc surtout observer la forme de la distribution, et non le dernier chiffre décimal.

Qu’est-ce qu’un put/call ratio élevé ?

Un percentile répond à une question à laquelle un niveau ne peut pas répondre. La courbe ci-dessous couvre chaque séance de janvier 2022 à juillet 2026, avec un ratio par séance pour chaque portefeuille.

RequêtePercentiles du ratio put/call en volume : panier d’actions individuelles vs ETF indiciels, de 2022 à juillet 2026
Le SQL exact derrière chaque chiffre
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

Sur le panier d’actions individuelles, le ratio médian s’est établi à 0.67 puts par call. Le décile supérieur des séances commençait à 0.89, tandis que le centile le plus extrême dépassait 1.34. La partie basse de la distribution est tout aussi utile pour le calibrage : une séance sur vingt s’est terminée à 0.48 ou moins.

La distribution de la colonne ETF est différente à chaque niveau de la courbe. Son ratio médian s’est établi à 1.45, au-dessus de la ligne one-to-one nettement inférieure au ratio médian des actions individuelles. Son propre décile supérieur commençait à 1.77. Un ratio cité sans préciser le portefeuille concerné est presque dépourvu de sens. Ce print à 1,15 n’a pas la même signification selon la colonne dont il provient.

Pourquoi un ratio supérieur à un est normal pour un indice, mais pas pour une action

Répartissez le même volume par sous-jacent : les niveaux se distinguent nettement.

RequêteRatio put/call en volume par sous-jacent : du 1er janvier au 31 juillet 2026
Le SQL exact derrière chaque chiffre
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

Au cours des sept premiers mois de 2026, IWM occupait la première place du classement, avec 2.73 puts par call. Le ratio dépassait un sur 98.6% de ses 144 séances. En bas du classement, XOM affichait 0.38, avec un ratio supérieur à un sur 2.8% des séances.

L’écart est structurel. Les options sur les ETF indiciels larges servent à couvrir les portefeuilles. Un gérant détenant two hundred positions achète des puts sur l’indice plutôt que des puts sur chaque ligne. Ces achats ne s’accompagnent pas nécessairement de ventes de calls. Le volume des options sur actions individuelles penche dans l’autre sens : les investisseurs achètent des calls pour profiter d’une hausse et vendent des calls sur des actions qu’ils détiennent déjà. Un ratio « total » combine les deux livres. Il se situe donc entre les deux et évolue en fonction de la composition des produits traités dans la journée autant que du sentiment de marché.

Un autre changement de niveau mérite d’être souligné. Le volume des indices et des ETF comprend désormais une part importante d’échéances le jour même (options 0DTE). Cette catégorie ne se négociait pas à une échelle comparable lorsque les seuils de référence ont été établis. Les anciens niveaux ne sont pas transposables à un marché dont la composition a changé.

Un ratio put/call élevé est-il haussier ? Ce qui a suivi les extrêmes

L’hypothèse contrariante peut être testée. Classez chaque séance en cinq groupes selon le ratio actions du jour, puis mesurez l’évolution du tracker du S&P 500 au cours des cinq et des vingt séances suivantes.

RequêteÉvolution du tracker du S&P 500 après chaque cinquième du ratio put/call sur actions, de 2022 à juillet 2026
Le SQL exact derrière chaque chiffre
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

Le cinquième de séances le plus calme commence à 0.34 et le cinquième le plus actif à 0.81. La bande supérieure regroupe donc toutes les lectures qu’un investisseur contrariant qualifierait d’extrêmes. Sur ces 226 séances, la variation médiane à vingt séances a été de 3%, contre 0.91% après le cinquième le plus calme. À cinq séances, les deux mêmes bandes affichent respectivement 0.82% et 0.3%.

Les médianes masquent l’élément important. Dans le cinquième supérieur, la moitié centrale des résultats à vingt séances s’étendait de -1.82% à 5.71%. Dans le cinquième le plus calme, elle allait de -0.83% à 2.67%. Ces deux fourchettes se recouvrent largement. La bande dans laquelle se situe une séance déplace le centre de la distribution, mais resserre à peine la fourchette autour de ce centre. C’est précisément ce que laisse de côté une règle empirique.

Une réserve concerne la pondération de l’échantillon. La période allant de janvier 2022 à juillet 2026 comprend un bear market et la reprise qui a suivi, soit environ 226 séances par bande. Il s’agit d’un échantillon réel, mais aussi d’une seule séquence de l’histoire des marchés.

Les valeurs extrêmes se concentrent-elles sur les points bas du marché ?

Elles se concentrent pendant les mois de baisse, ce qui est une affirmation différente. Regroupez chaque mois depuis 2022 selon l’évolution du tracker au cours du mois, puis comptez le nombre de lectures du put/call dans le décile supérieur pour chaque groupe.

RequêteLectures du put/call dans le décile supérieur par mois, regroupées selon l’évolution du tracker du S&P 500
Le SQL exact derrière chaque chiffre
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

Les mois où le tracker a terminé en baisse d’au moins 3 % ont enregistré en moyenne 4.2 lectures dans le décile supérieur, contre 1.9 pendant les mois où il a progressé d’au moins 3 %. La médiane des lectures quotidiennes de chaque groupe figure dans la dernière colonne : 0.75 pour le groupe le plus défavorable et 0.62 pour le plus favorable. Les deux extrémités du tableau regroupent respectivement 12 et 22 mois.

Les lectures extrêmes du put/call et la baisse des cours apparaissent ensemble. Il s’agit d’une cooccurrence, et les chiffres prospectifs de la section précédente indiquent la valeur qu’il faut lui attribuer. Le ratio mesure la configuration du marché le jour même ; ses pics apparaissent donc pendant les baisses, et non avant elles. Un point bas est une étiquette attribuée après coup.

Interpréter un niveau par rapport à une distribution

Deux principes ressortent des chiffres ci-dessus.

Premièrement, comparez ce qui est comparable. Un niveau n’a de sens que par rapport à l’historique du même indicateur sur une période comparable. C’est précisément ce qu’offre un tableau de percentiles, contrairement à un seuil retenu de mémoire.

Deuxièmement, surveillez le dénominateur. Le ratio baisse lorsque le volume de calls augmente, même si les achats de puts restent inchangés. Une baisse du ratio comme une hausse peuvent chacune résulter du seul mouvement d’un côté de la fraction. Lire séparément les volumes de puts et de calls permet donc de garder l’arithmétique visible.

La même discipline s’applique à tout indicateur de sentiment exprimé par un simple chiffre. Le VIX et un niveau de volatilité implicite de 30 % sont impossibles à interpréter sans leurs propres distributions. De même, les règles de sentiment contrariennes ne résistent à l’analyse des données que lorsque le niveau de référence est mesuré et non supposé.

FAQ

Un ratio put/call élevé est-il haussier ?

L’interprétation contrariante considère qu’un volume élevé d’achats de puts signifie que le marché est déjà largement positionné à la baisse. Par rapport au panier de valeurs individuelles présenté plus haut, les séances situées dans le cinquième supérieur des observations ont été suivies d’une variation médiane sur 20 séances de 3% pour l’ETF répliquant le S&P 500, contre 0.91% après le cinquième le plus calme. Les 50 % centraux des résultats du cinquième supérieur s’étendaient de -1.82% à 5.71%.

Quel est un ratio put/call normal ?

Cela dépend entièrement des options prises en compte. Sur un panier de dix grandes valeurs individuelles connues du grand public, le ratio médian par séance entre 2022 et juillet 2026 s’établissait à 0.67 puts par call. Sur trois ETF répliquant les grands indices de marché au cours des mêmes séances, il s’établissait à 1.45.

Pourquoi le ratio put/call des indices est-il supérieur à celui des actions ?

Les options sur indices larges et sur ETF constituent l’instrument standard de couverture des portefeuilles. Un investisseur qui achète des puts sur indice n’a pas nécessairement une opération d’achat de calls correspondante en face. Sur les valeurs individuelles, les volumes sont davantage orientés vers l’achat de calls pour profiter d’une hausse et la vente de calls contre des actions déjà détenues, ce qui maintient le ratio de ce compartiment à un niveau inférieur.

Le ratio put/call est-il utile pour anticiper le marché ?

La mesure présentée ci-dessus montre la distribution des évolutions qui ont suivi chaque cinquième des observations. L’écart à l’intérieur d’une même tranche est bien plus large que la distance entre les médianes des tranches. Les observations situées dans le décile supérieur se concentrent également sur les mois où l’indice a terminé en baisse, à 4.2 par mois dans le groupe le plus défavorable.

Quelle est la différence entre un ratio put/call fondé sur les volumes et un ratio fondé sur l’open interest ?

Un ratio fondé sur les volumes compte les contrats négociés au cours d’une séance. Il est donc réinitialisé chaque jour et réagit rapidement. Un ratio fondé sur l’open interest compte les positions encore ouvertes. Il évolue lentement et se situe à son propre niveau. Ces deux mesures ne sont pas interchangeables. Un seuil emprunté à l’une d’elles donnera une lecture erronée de l’autre.

Méthode de construction de ces chiffres
  • Source : une ligne par contrat d’option et par séance, avec le volume négocié au cours de cette séance. Les puts et les calls sont séparés à partir du code de contrat OCC : les huit derniers caractères correspondent au strike et le caractère qui les précède indique C pour un call et P pour un put. Ouvrez la requête SQL sous chaque panneau pour consulter la table et les filtres exacts.
  • Tous les ratios présentés sur cette page sont fondés sur les volumes. L’open interest n’entre pas dans le calcul. Il ne s’agit donc jamais d’un ratio fondé sur l’open interest.
  • Aucun filtre de qualité de la volatilité implicite n’est appliqué. Les contrats sont pris en compte uniquement selon leur volume négocié, car ces panneaux mesurent l’activité de trading et non la volatilité.
  • Le panier comprend AAPL, MSFT, NVDA, AMZN, META, TSLA, GOOGL, JPM, KO et XOM pour le compartiment des valeurs individuelles, ainsi que SPY, QQQ et IWM pour le compartiment des ETF indiciels. Les ratios publiés par les places de marché couvrent l’ensemble du marché et incluent des produits indiciels tels que SPX. Leurs niveaux sont donc différents.
  • Les cours des indices correspondent au dernier print de la séance régulière pour l’ETF répliquant le S&P 500. Les rendements à terme excluent les 20 dernières séances de l’échantillon, pour lesquelles aucun horizon futur de 20 séances n’est encore disponible. Les variations mensuelles vont de la clôture de la première séance à celle de la dernière séance de chaque mois.

Chaque panneau ci-dessus s’ouvre sur la requête SQL correspondante. Les mêmes requêtes de percentiles peuvent être exécutées sur tout sous-jacent que vous suivez dans le terminal Strasmore.

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