Strasmore Research
學習 Matt Connor作者: Matt Connor

選擇權最大痛苦價位 計算方式

最大痛苦價位是到期時選擇權持有人損失最大的履約價。本文以SPY選擇權鏈為例,逐步說明計算步驟,並檢視實際結算價與該價格的接近程度。

最大痛苦價位(Max pain)是指未平倉選擇權中,總金額最大的部位將在到期時歸零的那個履約價。這個價格屬於單一標的與單一到期日,並透過搜尋未平倉量得出:將每個掛牌履約價當作假設結算價,計算所有未平倉買權與賣權在該價格下會支付給持有人的總金額,然後選出總金額最小的價格。這個名稱描述的是選擇權持有人的帳面狀況。本文將以實際的SPY選擇權鏈為例,逐步說明計算方式,並衡量2026年標準月到期日中,實際結算價與該價格的接近程度。

最大痛苦價位如何計算?

最大痛苦價位是一種搜尋過程,而非單一公式。共分五個步驟:

  1. 收集每個履約價在該到期日的未平倉量(即仍流通在外的合約數量),並將買權與賣權分開計算。
  2. 選定一個候選結算價。通常以掛牌履約價本身作為候選集合。
  3. 計算每個買權的價值為「候選價格減去履約價」,下限為零;每個賣權的價值為「履約價減去候選價格」,下限為零。
  4. 將每個價值乘以該履約價的未平倉量,再乘以100股的合約乘數,最後將整個選擇權鏈的數字加總為一個美元金額。
  5. 對每個候選價格重複步驟2至4,並保留總金額最小的那個。該候選價格即為最大痛苦履約價。

用一個假設案例來說明機制。假設在履約價95美元處有1,000口買權未平倉,而結算價落在100美元。每口合約支付持有人每股5美元,因此這批1,000口合計100,000股的部位,總支付金額為500,000美元。若將結算價降至95美元,這批買權的支付金額變為零,而所有履約價高於95美元的賣權則開始支付。將候選價格沿著履約價階梯上下移動,會畫出一條帶有最低點的曲線,而這個最低點就是人們常引用的數字。

從定義可直接得出兩個特性。最低點出現在買權價值與賣權價值在美元金額上大致平衡的位置,這使得它通常落在未平倉量最重的履約價附近。此外,這個數字描述的是某一特定時間點的選擇權鏈:經過另一個交易日後重新計算,答案就會改變。

合約在履約價階梯上的分布

未平倉量在每個交易日收盤後,根據結算數據發布一次。此處的圖表使用單一到期日整個生命週期內的交易合約成交量,作為該數據的可見替代指標,其分布形狀相同:合約堆疊在標的價格附近幾美元的範圍內。以下是2026年7月17日(星期五)到期的SPY選擇權鏈中,按履約價分組的所有合約:

查詢SPY 各履約價合約交易量,2026年7月17日到期
每個數據背後的精確 SQL 語法
SELECT toString(strike_usd) AS strike,
       round(sumIf(contracts, opt_type = 'C') / 1e3, 1) AS call_contracts_k,
       round(sumIf(contracts, opt_type = 'P') / 1e3, 1) AS put_contracts_k
FROM (
    SELECT intDiv(toUInt32OrZero(substring(ticker, length(ticker) - 7, 8)), 1000) AS strike_usd,
           substring(ticker, length(ticker) - 8, 1)                              AS opt_type,
           sum(toFloat64(volume))                                                AS contracts
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime('2026-06-18 08:00:00')
      AND window_start <  toDateTime('2026-07-18 04:00:00')
      AND startsWith(ticker, 'O:SPY260717')
      AND intDiv(toUInt32OrZero(substring(ticker, length(ticker) - 7, 8)), 1000) BETWEEN 736 AND 757
    GROUP BY strike_usd, opt_type
)
GROUP BY strike_usd, strike
ORDER BY strike_usd
Run this yourself

履約價階梯在越過價平點時會出現傾斜。在履約價736美元處,賣權數量為113.2千口,買權為8千口。在履約價757美元處,傾斜方向相反,買權為131.7千口,賣權為8.1千口。賣權堆疊在標的價格之下,買權堆疊在標的價格之上,兩者在某個中間點交叉。這個交叉區域,就是在進行任何計算之前,最大痛苦價位可能落定的位置,這也是關於這個統計數字首先值得了解的事。已交易合約與未平倉合約是兩種不同的計數,選擇權成交量與未平倉量的差異說明了兩者的區別。

支付曲線及其最低點

對從730美元到765美元的候選結算價執行步驟3至5,即可畫出計算過程所搜尋的曲線形狀:

查詢各候選結算價下選擇權持有人總支付金額,SPY 2026年7月17日
每個數據背後的精確 SQL 語法
WITH chain AS (
    SELECT intDiv(toUInt32OrZero(substring(ticker, length(ticker) - 7, 8)), 1000) AS strike,
           substring(ticker, length(ticker) - 8, 1)                              AS opt_type,
           sum(toFloat64(volume))                                                AS contracts
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime('2026-06-18 08:00:00')
      AND window_start <  toDateTime('2026-07-18 04:00:00')
      AND startsWith(ticker, 'O:SPY260717')
    GROUP BY strike, opt_type
),
candidates AS (
    SELECT DISTINCT strike AS settle FROM chain WHERE strike BETWEEN 730 AND 765
)
SELECT candidates.settle AS settle_price,
       round(sum(multiIf(chain.opt_type = 'C' AND chain.strike < candidates.settle,
                         chain.contracts * (candidates.settle - chain.strike),
                         chain.opt_type = 'P' AND chain.strike > candidates.settle,
                         chain.contracts * (chain.strike - candidates.settle),
                         0)) * 100 / 1e6, 1) AS holder_payout_usd_mm
FROM candidates CROSS JOIN chain
GROUP BY settle_price
ORDER BY settle_price
Run this yourself

若結算價為730美元,此選擇權鏈將支付持有人11149.2百萬美元,其中絕大部分支付給賣權持有人。若結算價為765美元,則支付11083.9百萬美元,其中絕大部分支付給買權持有人。在這兩個端點之間,曲線下降到一個淺盆狀區域。將這些總金額從最小到最大排序,即可找出該履約價:

查詢支付金額最低的六個候選履約價,SPY 2026年7月17日到期
每個數據背後的精確 SQL 語法
WITH chain AS (
    SELECT intDiv(toUInt32OrZero(substring(ticker, length(ticker) - 7, 8)), 1000) AS strike,
           substring(ticker, length(ticker) - 8, 1)                              AS opt_type,
           sum(toFloat64(volume))                                                AS contracts
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime('2026-06-18 08:00:00')
      AND window_start <  toDateTime('2026-07-18 04:00:00')
      AND startsWith(ticker, 'O:SPY260717')
    GROUP BY strike, opt_type
),
candidates AS (
    SELECT DISTINCT strike AS settle FROM chain WHERE strike BETWEEN 730 AND 765
)
SELECT concat('$', toString(candidates.settle)) AS candidate_strike,
       round(sum(multiIf(chain.opt_type = 'C' AND chain.strike < candidates.settle,
                         chain.contracts * (candidates.settle - chain.strike),
                         chain.opt_type = 'P' AND chain.strike > candidates.settle,
                         chain.contracts * (chain.strike - candidates.settle),
                         0)) * 100 / 1e6, 1) AS holder_payout_usd_mm
FROM candidates CROSS JOIN chain
GROUP BY candidate_strike
ORDER BY holder_payout_usd_mm ASC
LIMIT 6
Run this yourself

最低點位於$746,金額為1898.2百萬美元。與其只關注最低點的位置,不如觀察這個盆狀區域有多平坦。次低的候選價格$7471940.2百萬美元,排名第六的候選價格$749則為2272.8百萬美元。在一個價格超過700美元的標的上,六個候選價格僅相差幾美元,彼此非常接近。因此,選擇權鏈的微小變動就可能導致公布的履約價改變,但市場本身並無實質變化。

理論的主張

流行的說法是,標的物價格在到期前會向其最大痛苦履約價靠攏,而選擇權賣方是推動的力量。這句話包含了兩個不同的主張。第一個是統計性的:結算價會聚集在最大痛苦履約價附近。第二個是機制性的:確實有某個參與者在推動價格。

第二個主張較為薄弱。最大痛苦價位僅彙總未平倉量,並未提供任何關於哪個交易對手在任何履約價上持有多頭或空頭部位的資訊,因此故事中的「賣方」只是一種假設,而非觀察結果。一個能夠將廣泛市場ETF價格推向特定履約價的參與者,其規模必須超越整個選擇權鏈所產生的避險流量。在已描述過的實際避險機制中,最相關的是伽瑪避險:持有正伽瑪的造市商帳簿,會透過在價格上漲時賣出、下跌時買入的方式來調整避險部位,從業者稱此為在交易量大的履約價附近產生「阻尼」或「釘住」效果。我們的伽瑪曝險說明詳細介紹了這個估算及其背後的假設。

第一個主張則較為穩固,但有一個重要的前提條件將在下一節說明。關於到期日釘住效應的學術研究,最明確的證據來自於那些選擇權未平倉量相對於其可交易股票數量較大的個股,並且是以美分而非美元來衡量。

實際結算價與該價格的接近程度為何?

2026年2月至7月期間,SPY共有六個標準的月到期日。對於每個到期日,圖表計算出該到期週合約的最小化履約價,列出到期日交易時段的實際收盤價,並附上一個簡單的對照組:SPY在一週前的收盤價,並與同一個結算價進行比較。

查詢最小化履約價與結算收盤價比較:SPY 月度到期,2026年2月至7月
每個數據背後的精確 SQL 語法
WITH expiries AS (
    SELECT arrayJoin([toDate('2026-02-20'), toDate('2026-03-20'), toDate('2026-04-17'),
                      toDate('2026-05-15'), toDate('2026-06-18'), toDate('2026-07-17')]) AS expiry
),
chain AS (
    SELECT toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6)))  AS expiry,
           intDiv(toUInt32OrZero(substring(ticker, length(ticker) - 7, 8)), 1000) AS strike,
           substring(ticker, length(ticker) - 8, 1)                              AS opt_type,
           sum(toFloat64(volume))                                                AS contracts
    FROM global_markets.options_minute_aggs
    WHERE ((window_start >= toDateTime('2026-02-16 08:00:00') AND window_start < toDateTime('2026-02-21 04:00:00'))
        OR (window_start >= toDateTime('2026-03-16 08:00:00') AND window_start < toDateTime('2026-03-21 04:00:00'))
        OR (window_start >= toDateTime('2026-04-13 08:00:00') AND window_start < toDateTime('2026-04-18 04:00:00'))
        OR (window_start >= toDateTime('2026-05-11 08:00:00') AND window_start < toDateTime('2026-05-16 04:00:00'))
        OR (window_start >= toDateTime('2026-06-15 08:00:00') AND window_start < toDateTime('2026-06-19 04:00:00'))
        OR (window_start >= toDateTime('2026-07-13 08:00:00') AND window_start < toDateTime('2026-07-18 04:00:00')))
      AND startsWith(ticker, 'O:SPY26')
      AND toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) IN (SELECT expiry FROM expiries)
    GROUP BY expiry, strike, opt_type
),
curve AS (
    SELECT c1.expiry AS expiry,
           c1.strike AS settle,
           sum(multiIf(c2.opt_type = 'C' AND c2.strike < c1.strike, c2.contracts * (c1.strike - c2.strike),
                       c2.opt_type = 'P' AND c2.strike > c1.strike, c2.contracts * (c2.strike - c1.strike),
                       0)) AS payout
    FROM chain AS c1 INNER JOIN chain AS c2 ON c1.expiry = c2.expiry
    GROUP BY c1.expiry, c1.strike
),
pain AS (
    SELECT expiry, argMin(settle, payout) AS pain_strike FROM curve GROUP BY expiry
),
px AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMax(close, window_start)                          AS close_px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-02-05')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-17')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY d
),
prior AS (
    SELECT expiries.expiry AS expiry, argMax(px.close_px, px.d) AS week_earlier_px
    FROM expiries CROSS JOIN px
    WHERE px.d <= expiries.expiry - 7
    GROUP BY expiries.expiry
)
SELECT formatDateTime(pain.expiry, '%b %e')                                   AS expiry_label,
       pain.pain_strike                                                       AS min_payout_strike,
       round(px.close_px, 2)                                                  AS settlement_close,
       round(abs(px.close_px - pain.pain_strike) / px.close_px * 100, 2)      AS max_pain_miss_pct,
       round(abs(px.close_px - prior.week_earlier_px) / px.close_px * 100, 2) AS week_earlier_miss_pct
FROM pain
INNER JOIN px ON pain.expiry = px.d
INNER JOIN prior ON pain.expiry = prior.expiry
ORDER BY pain.expiry
Run this yourself

最小化履約價與收盤價之間的差距,範圍從0.07%(Jun 18到期日)到0.53%(Mar 20到期日),每個月的差距都低於千分之六。單獨來看,這似乎是相當高的命中率。但有兩個測量特性會降低這個結果的意義。

首先,候選履約價階梯本質上就是以標的價格為中心。履約價圍繞著價平點掛牌,而構成總和的合約也集中在這個區域,因此計算過程從一開始就限定在現貨價格附近的一個狹窄區間內,不可能得出一個遠離該區間的答案。第二個特性是時間點:此處每一行所使用的合約,其交易時間涵蓋至到期日交易時段為止,而與之比較的收盤價也來自同一時段。因此,從與測量目標相同的時間區間內計算出的數字,只是在描述該區間本身,而非提前預測。

最後一欄是值得參考的對照組。SPY在Apr 17前一週的收盤價,與結算價的差距為4.32%,而最小化履約價的差距則為0.42%。在May 15到期日,兩者差距非常接近,分別為0.21%與0.12%。在到期日當天計算出的統計數字,理應大幅優於一週前的價格。更嚴謹的測試(此處圖表並未進行)是將選擇權鏈凍結在一週前,然後檢驗該履約價預測收盤價的能力,是否優於同一天螢幕上顯示的價格。

如何解讀已發布的最大痛苦價位數字

  • 詢問該數字包含了哪些合約。發布者對於週到期與月到期系列,以及追蹤相同基準的指數選擇權鏈與ETF選擇權鏈,處理方式可能不同。
  • 詢問未平倉量是在何時取得的。結算數據每個交易日更新一次,因此盤中變動的數字必定是根據其他資料重新計算的。
  • 不僅要看最低點的位置,還要觀察整條曲線的形狀。一個平坦的盆狀區域意味著公布的履約價只是幾個數值相近的答案之一。
  • 在將接近程度解讀為預測能力之前,應先與一個簡單的替代方案進行比較。

到期機制的運作決定了在任何特定日期,哪些合約仍會被納入總和計算中,選擇權到期時間涵蓋了相關的日曆。對於另一個基於相同選擇權鏈建立的持倉統計數字,賣權買權比率則直接衡量了買權與賣權的混合比例。

最大痛苦價位常見問題

在選擇權交易中,最大痛苦價位是什麼意思?

最大痛苦價位是指在單一到期日中,所有未平倉選擇權持有人所能獲得的總支付金額最小的那個履約價。它是透過將每個掛牌履約價作為假設結算價進行測試,並選出總金額最低的那個價格,從未平倉量計算得出。這個數字描述的是選擇權鏈的形狀,本身不包含任何預測。

股票是否總是收在最大痛苦履約價?

不是。在上述六個SPY月到期日中,最小化履約價與收盤價的最大差距為0.53%。這聽起來差距很小,但與一個簡單的基準相比,並考慮到候選履約價本身就集中在當前價格附近時,這個接近程度其實是一個較弱的測試。在一個以現貨價格為中心的階梯上,接近是很容易達成的。

最大痛苦價位數字多久變動一次?

未平倉量在每個交易日收盤後,根據結算數據發布一次,因此大多數已發布的最大痛苦價位數字每天最多變動一次。如果某個儀表板上的數字在盤中變動,那很可能是根據交易量或盤中的選擇權鏈快照重新計算,而非使用已結算的未平倉量。

最大痛苦價位與伽瑪曝險相同嗎?

不同。兩者都讀取相同的選擇權鏈,但回答不同的問題。最大痛苦價位僅使用未平倉量,無需定價模型,即可找出一個價格。伽瑪曝險則是以每變動一個百分點對應多少美元來衡量避險流量的大小,它需要隱含波動率曲面,以及對造市商在每口合約上持有多頭或空頭部位的假設。

最大痛苦價位適用於個股嗎?

計算方法適用於任何掛牌的選擇權鏈。但在選擇權鏈較薄、少數幾個履約價就承擔了絕大部分未平倉量的情況下,其輸出結果會變得雜訊較多。而支持該理論任何部分的釘住效應研究,主要集中在那些選擇權未平倉量相對於其可交易股票數量較大的股票上。


以上每個圖表都是一個已儲存的查詢,其SQL程式碼只需點擊一下即可查看。您可以在Strasmore終端機上,對任何選擇權鏈逐個履約價執行相同的分析。