Put/Call Ratio 如何計算
了解 put/call ratio 如何以 put 與 call 的成交量或未平倉量計算,並掌握指數讀數較高的原因與 2026 年正常範圍。
Put/call ratio 的計算方式,是將同一期間內成交的 put 合約數量除以 call 合約數量。若某交易時段成交 250,000 口 put 與 500,000 口 call,該比率就是 0.50。市場對這項指標的所有討論,包括成交量與未平倉量、個股與指數之間的差異,最終都取決於除法兩側各自計入了哪些合約。若要先了解基本定義,請參閱put/call ratio 是什麼。本頁將說明計算方式。
Put/call ratio 的計算公式:逐步說明
這項公式包含兩個輸入值與一個運算:計算成交的 put 數量、計算成交的 call 數量,再以前者除以後者。Put 是一種契約,賦予持有人在到期日當天或之前,以固定 exercise price 賣出 100 股標的資產的權利。Call 則賦予持有人以固定 exercise price 買進的權利。成交量計算該交易時段內轉手的契約數,並在下一個開盤時歸零。
計算數量時不進行加權。深度價外週選的一口,與盤面上成交最活躍 exercise price 的一口,權重完全相同;兩者也都不會按所承擔的資金風險進行調整。這項 ratio 計算的是契約數量。
真正會改變結果的選擇,在於哪些契約會納入計算。下方面板以相同算式,計算八檔高流動性標的在完整一個月內的數據。
每個數據背後的精確 SQL 語法
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 DESC2026年7月期間,IWM 的 ratio 為八檔標的中最高,每一口 call 對應 3.11 口 put;MSFT 最低,為每一口 call 對應 0.38 口 put。同一個公式、同一個月,最高與最低標的之間的差距,遠大於市場評論經常提及的日間波動。若未標明分類,單獨引用一個 ratio 幾乎不具備資訊價值。
以成交量或未平倉量為基礎
分子與分母可以採用兩種不同的統計口徑。
成交量版本計算觀察區間內成交的合約數。這是流量指標,每個交易時段都從零開始,反映投資人當天的行為。市場報導中的各種標題比率,都是採用這一版本。
未平倉量版本則以未平倉買權合約數除以未平倉賣權合約數。未平倉量是指已建立、但尚未平倉、履約或到期的合約數。這是存量指標,反映累積部位,而非當日交易活動,因此變動較慢。若一個交易時段內有 30,000 張賣權在兩名既有持有人之間轉手,成交量會增加 30,000 張,但未平倉量維持不變。Options volume versus open interest說明了相關的記錄方式。
假設某標的在週二收盤時有 40,000 張未平倉賣權與 50,000 張未平倉買權,未平倉量比率為 0.80。週三有 30,000 張賣權與 10,000 張買權成交,成交量比率為 3.00。同一天的同一個選擇權鏈可以同時得到這兩個數字。兩者相差近四倍,但都正確。未平倉量比率也是最大痛點計算的基礎;該計算是依未平倉合約數,而非成交合約數,為各履約價加權。
流量指標容易大幅波動。以下是同一個月內,一檔 ETF 與一檔個股的每日成交量比率。
每個數據背後的精確 SQL 語法
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 d在 Jul 1,SPY 的成交量比率為 1.1,AAPL 則為 0.49。到了 Jul 31,兩者分別為 2 與 0.55。在 22 個交易時段內,每日成交數據上下波動,兩條序列在圖表上的水準也不同。兩者之中,水準差距更值得關注。
股票、指數、ETP 與總體:Cboe 的四種比率
所謂「put/call ratio」的數值,來自 Cboe 每日市場統計資料。Cboe 會公布數種 put/call ratio。分類如下:
- 股票 put/call ratio:個別股票的選擇權。
- 指數 put/call ratio:指數選擇權,包括 SPX 與 VIX。
- 交易所交易產品 put/call ratio:ETF 的選擇權,SPY、QQQ 與 IWM 均屬於此類。
- 總體 put/call ratio:將所有類別加總。
每一種比率的計算方式都相同,都是該類別中 put 的總量除以 call 的總量。因此,讀數的差異只來自各類別所包含的標的不同。這些類別不能互換。
指數選擇權是以一筆交易避險整體投資組合的標準工具。持有廣泛股票部位的基金,會買進指數 put 進行避險,卻沒有相應理由買進指數 call。這類需求具有單向性,會全部計入指數類別的分子。個股交易流則呈現相反傾向,個別股票的 call 買進量占成交量的比重通常很高,而且長期如此。這兩個類別因結構不同而處於不同水準。將其中一類的讀數與另一類的基準比較,是使用這項指標時最常見的錯誤。
廣泛型市場 ETF 具有與指數選擇權相同的避險功能,但會被計入交易所交易產品類別。下圖追蹤這兩類的月度中位數。
每個數據背後的精確 SQL 語法
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 month圖表涵蓋 Aug 2025 至 Jul 2026。在兩個端點,ETF 籃子每日比率的中位數都接近或高於 1.0;第一個月為 1.52,最後一個月為 1.49。個股籃子在兩個端點都低於 1.0,分別為 0.6 與 0.56,且在圖表涵蓋的全部 12 個月中皆如此。這項持續存在的差距,正是基準值必須標明所屬類別的原因;否則該基準沒有實質意義。
正常的 put/call ratio 是多少
「正常」是一個區間,而這個區間取決於分類,不是指標本身。下方面板涵蓋過去十二個月的每個交易日,列出各籃子每日 ratio 的中位數,並以第10與第90百分位數標示其範圍邊界。
每個數據背後的精確 SQL 語法
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.1單一股票籃子的交易日中位數為 0.58;第10百分位數為 0.45,第90百分位數為 0.76。廣泛市場 ETF 籃子在整個分布中的數值較高:中位數為 1.54,介於 1.25 與 1.86 兩個邊界之間。
那麼,1.20 算高嗎?相較於單一股票籃子,1.20 這筆成交高於 0.76 的第90百分位數,因此並不常見。相較於 ETF 籃子,這個數值則接近日常水準。至於指數類別,前文所述的避險交易流集中於此,則必須再以另一組水準來判斷。同一個數字,最終屬於哪個類別,會在開始解讀前先決定結論。
這些區間也會隨時間變動。以過去十二個月計算的百分位數,只能描述過去十二個月;而沿用十年前文章中的基準區間,描述的是合約組成不同、幾乎沒有 零日到期交易 的市場。要判斷某個讀數偏高或偏低,唯一符合實際的方法,是以近期期間重新計算百分位數。
解讀與計算是兩項不同的工作。有些人將偏高的讀數解讀為偏空部位;反向投資者則視其為過度擁擠的避險交易。偏高的 put/call ratio 是否看多,應完整拆解這項爭論。
為何採用21日移動平均
單一交易日的比率只是雜訊序列中的小樣本,因此發布的數值通常會經過平滑處理。常見做法是採用21日移動平均,約相當於一個交易月:加總最近21個交易日的每日比率,再除以21,然後將視窗向前移動一個交易日。市場上也有10日與50日版本;所選期間長度會決定單日尖峰有多少能保留下來。
有兩點值得注意。將21個每日比率取平均,和用一個月的 put 成交量除以一個月的 call 成交量,並不是同一種算術。前者讓每個交易日的權重相同,後者則讓成交較活躍的交易日占更大權重。其次,處於極端值的平滑讀數,是由一個月內多個交易日的資料組成,因此離開該極端值的速度也較慢。
每個數據背後的精確 SQL 語法
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 d鋸齒狀線是單一股票籃子的每日比率,平滑線則是其21日平均值。在圖表顯示的第一個交易日 Apr 1,每日成交數據為 1.04,平滑值為 0.81。在 Jul 31,兩者分別為 0.56 與 0.58。在 84 個交易日內,平均值移動的距離只有原始序列的一部分,這正是引用平滑數值的全部目的。
這些圖表如何計算
契約類型直接取自選擇權代號:位於八位數履約價代碼前的字母,C 代表 call,P 代表 put。只有當日有申報成交量的契約才會納入計算,因此從未成交的履約價不會增加任何一方的數量。第一個圖表針對每一檔標的,以當月 put 總成交量除以當月 call 總成交量。其餘圖表則先為每個交易日計算一個比率,再彙總這些交易日,這符合發布移動平均值的建構方式。籃子包括代表大盤的 SPY、QQQ 與 IWM,以及代表個股的 AAPL、MSFT、NVDA、TSLA 與 KO。每個圖表都附有產生該結果的完整 SQL。
常見問題
如何計算 put/call ratio?
將同一期間內的 put contracts 數量除以 call contracts 數量。多數公開版本採用該交易時段的成交量,因此 0.65 代表每成交 100 張 calls,就有 65 張 puts 成交。open interest 版本則使用未平倉合約數,而非成交合約數,回答的是不同問題。
put/call ratio 高於 1,代表數值偏高嗎?
這取決於分類。就上方圖表中的單一股票籃子而言,每日讀數的第90百分位為 0.76,因此高於該水準的 prints 並不常見。對廣泛市場 ETF 與指數選擇權而言,由於投資組合避險集中在 put 端,接近或高於 1 的讀數很常見。
volume put/call ratio 與 open interest put/call ratio 有何不同?
Volume 計算該交易時段內成交的合約數,並在每天早上重新開始。Open interest 計算仍然未平倉的合約數,並會從一天延續至下一天。Volume 版本在單一交易時段內可能翻倍,但 open interest 版本可能只變動幾個百分點,因此兩者在同一天常會指向不同方向。
財經媒體引用哪一種 put/call ratio?
通常是 Cboe equity put/call ratio 或 total put/call ratio,而且多半採用 21個交易時段的移動平均,而非原始的每日 print。Cboe 的四個分類處於不同水準,因此沒有標示分類的引用數值,無法與任何基準比較。
本頁的每個圖表都附有產生該圖表的 SQL,因此每一項計數都能逐行核對。若要對其他標的或更長期間進行相同計算,請在 Strasmore terminal 以一般英文提出要求。