Strasmore Research
深度解析 Matt Connor作者: Matt Connor

高 put/call ratio 是多頭訊號嗎?

逆向投資人看多高 put/call ratio,但高的標準因商品而異。比較個股與指數選擇權的百分位區間,並查看極端讀數後市場實際如何表現。

高 put/call ratio 是經典的逆向多頭訊號:買進賣權的交易量異常龐大,通常被解讀為市場參與者已經普遍為下跌做好準備。然而,根據這項訊號行動會遇到一個問題。「高」沒有固定標準。螢幕上顯示的 1.15,對個股選擇權而言可能是極端值,對指數商品而言卻可能只是一般交易日的水準。

這個問題需要一個參考分布。本頁分別為兩類商品提供參考分布,並衡量高 ratio 出現後的市場表現。put/call ratio 說明頁介紹 ratio 的計算方式;以下內容均以該定義為基礎。

測量方式有兩點需要注意。本文的每個 ratio 都計算當日成交的契約數,因此屬於成交量 ratio;未平倉量則計算仍然未結清的部位,所處的層次不同(成交量與未平倉量 會區分兩者)。此外,數據來自固定標的籃子:十檔投資人熟悉的個股,以及三檔大盤 ETF,而非涵蓋整個市場的交易資料。因此,應著重觀察分布的形狀,而不是最後一位小數。

什麼樣的 put/call ratio 才算高?

百分位數能回答單一水準無法回答的問題。下圖涵蓋2022年1月至2026年7月的每個交易日,並針對每個交易簿列出每個交易日的一個比率。

查詢Put/call 成交量比率百分位:個股籃子相較於指數 ETF,2022年至2026年7月
每個數據背後的精確 SQL 語法
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

在單一股票籃子中,交易日中位數為每一買權對應 0.67 口 put。交易日分布的最高十分位始於 0.89,最極端的百分之一則高於 1.34。低檔區間同樣有助於校準:每二十個交易日中,就有一個交易日收在 0.48 或更低。

ETF 欄位在曲線的每個位置都呈現不同的分布。其交易日中位數為 1.45,高於 one-to-one 線;單一股票的中位數則明顯低於該線。ETF 自身的最高十分位始於 1.77。若未說明比率所屬的交易簿,單獨報出的比率幾乎沒有意義。同樣是1.15的成交數據,取自哪一欄,代表的含義就不同。

為何指數比率高於 1 屬正常,而個股比率高於 1 則不然

按標的拆分相同的成交量後,兩者的水準便清楚分開。

查詢按標的區分的 Put/call 成交量比率:2026年1月1日至7月31日
每個數據背後的精確 SQL 語法
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

2026年前七個月,IWM 以每張買權對應 2.73 張賣權位居首位;在 144 個交易日中,有 98.6% 個交易日高於 1。排名墊底的 XOM 成交比率為 0.38,其中有 2.8% 的交易日高於 1。

這個差距具有結構性。廣泛市場 ETF 選擇權是投資組合避險的主要工具:持有 two hundred 個部位的經理人,會買進指數賣權,而不是為每一個持股分別買進賣權。這類交易流沒有相對應的買權交易與之配對。個股選擇權成交量則傾向相反,主要來自為參與上漲行情而買進的買權,以及針對既有持股賣出的買權。「總體」比率會混合這兩類交易,因此數值介於兩者之間;其變動幅度受到當日產品組合的影響,與市場情緒同樣相關。

還有一個水準差異值得注意。指數與 ETF 成交量目前有很大一部分來自當日到期選擇權(0DTE 選擇權)。在過去人們制定常見門檻時,這類交易的規模遠未達到目前的程度。當市場組成已經不同,舊有水準便不能直接套用。

高 put/call ratio 看漲嗎?極端值之後的市場走勢

反向操作的論點可以透過數據驗證。依每日股票市場 ratio 將每個交易日分為五等分,再衡量 S&P 500 追蹤 ETF 在接下來5個交易日與20個交易日的變動。

查詢股票 Put/call 比率每五分位後的 S&P 500 追蹤 ETF 走勢,2022年至2026年7月
每個數據背後的精確 SQL 語法
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

最平靜的五分位區間始於 0.34,最活躍的五分位區間則始於 0.81,因此最高區間涵蓋了反向投資人會稱為過度偏離的所有讀值。在這 226 個交易日中,20個交易日後的變動中位數為 3%;最平靜五分位區間之後則為 0.91%。觀察5個交易日後的結果,這兩個區間分別為 0.82% 與 0.3%。

中位數會掩蓋真正重要的部分。在最高五分位區間內,20個交易日後結果的中間50%介於 -1.82% 至 5.71%。在最平靜的五分位區間內,中間50%則介於 -0.83% 至 2.67%。這兩個區間有很大部分重疊。交易日所屬的區間會改變分布的中心位置,但幾乎不會縮小中心周圍的結果範圍,而這正是經驗法則所忽略的部分。

關於樣本權重,仍有一項需要注意。2022年1月至2026年7月涵蓋一次熊市及其後的復甦,每個區間約有 226 個交易日。這是具有參考價值的樣本,但也只是市場歷史中的一段期間。

極端讀數是否集中在市場低點?

它們集中出現在下跌月份,但這是不同的主張。將2022年起的每個月份,依追蹤指標在當月的走勢分組,再計算每組出現多少次位於前十位數的 put/call 讀數。

查詢每月最高十分位 Put/call 讀數,依 S&P 500 追蹤 ETF 走勢分組
每個數據背後的精確 SQL 語法
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

追蹤指標收低3%或以上的月份,每月平均出現 4.2 次前十位數讀數;相較之下,上漲3%或以上的月份為 1.9 次。各組的每日讀數中位數列於最後一欄;最差組為 0.75,最佳組為 0.62。表格兩端分別包含 12 個月與 22 個月。

極端 put/call 讀數與價格下跌會同時出現。這是共同發生,不代表前者能預測後者;其價值應看前一節的遠期數據。該比率是對同一交易日行情的衡量,因此讀數飆升會出現在下跌之中,而非下跌之前。市場低點是事後才附加的標籤。

將數值放在分布中解讀

上述數據帶出兩個習慣。

第一,必須比較同類數值。只有放在同一個指標自身、可比期間的歷史中,某個讀值才有意義。這正是百分位數表能提供的資訊,而憑記憶套用某個門檻值則無法做到。

第二,必須留意分母。即使 put buying 沒有變化,只要 call volume 激增,這個比率就會下滑。比率下跌或飆升,都可能只是分數的一側單獨變動所致。因此,分開觀察 put volume 與 call volume,才能清楚看見計算基礎。

同樣的原則也適用於所有以單一數字呈現的市場情緒指標。VIX30% implied volatility 的成交讀值,若沒有各自的分布資料,就無從解讀;逆向情緒規則只有在參考水準經過量化,而非憑假設設定時,才經得起數據檢驗。

常見問答

高 put/call ratio 是否代表看多?

逆向解讀認為,大量買進 put 的市場參與者已經預期下跌,並提前建立相關部位。以前述個股籃子為基準,讀數位於最高五分位的交易日之後,S&P 500 tracker 的20個交易日後移動中位數為 3%;相比之下,讀數位於最低五分位的交易日之後為 0.91%。最高五分位結果的中間半數介於 -1.82% 至 5.71%。

正常的 put/call ratio 是多少?

這完全取決於計入哪些 options。以十檔大型知名個股組成的籃子來看,2022年至2026年7月期間,各交易日的中位數為每一張 call 對應 0.67 張 put。同期三檔大盤 ETF 的中位數為 1.45

為什麼指數 put/call ratio 高於股票 put/call ratio?

廣泛指數與 ETF options 是投資組合避險的標準工具。避險者買進指數 put 時,通常沒有相對應的 call 交易與之配對。個股交易量則較偏向買進 call 以參與上漲,或針對既有持股賣出 call,因此使該類部位的 ratio 維持較低。

put/call ratio 能否用於市場擇時?

上述衡量結果顯示,各五分位讀數之後的結果分布十分分散。同一區間內的結果差距,遠大於各區間中位數之間的差距。讀數位於最高十分位時,指數收低的月份也較集中;最差一組每月下跌幅度為 4.2

成交量 put/call ratio 與未平倉量 put/call ratio 有何不同?

成交量 ratio 計算單一交易日內成交的合約,因此每天重設,反應速度也較快。未平倉量 ratio 計算仍在市場上的未結部位,變動較慢,且維持在自身的水準。兩者不可互換;若將適用於其中一者的門檻套用至另一者,將導致錯誤解讀。

這些數字的計算方式
  • 資料來源:每個選擇權合約每個交易日各有一列資料,列示該交易日的成交量。系統根據 OCC 合約代碼區分 put 與 call;代碼最後八個字元為履約價,其前一個字元為 C 代表 call,P 代表 put。點開任何面板下方的 SQL,即可查看確切的資料表與篩選條件。
  • 本頁所有 ratio 都是成交量 ratio。計算未納入未平倉量,因此本頁沒有任何未平倉量 ratio。
  • 未套用隱含波動率品質篩選。合約僅依成交量納入,因為這些面板計算的是交易活動,而非衡量波動率。
  • 籃子內容:個股組合包括 AAPL、MSFT、NVDA、AMZN、META、TSLA、GOOGL、JPM、KO 與 XOM;指數 ETF 組合則包括 SPY、QQQ 與 IWM。交易所公布的 ratio 涵蓋整體市場,並包含 SPX 等指數產品,因此其水準會有所不同。
  • 指數價格採用 S&P 500 tracker 每日正常交易時段的最後一筆成交價。由於樣本最後20個交易日尚未形成完整的20個交易日未來期間,遠期報酬計算會排除這些交易日。月度變動則計算每個月第一個交易日收盤價至最後一個交易日收盤價的變化。

上方每個面板都能展開查看背後的 SQL;同一組百分位數查詢也能套用至 Strasmore terminal 上你所追蹤的任何標的。

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