選擇權最大痛點怎麼算?SPY 真實案例解析
最大痛點是選擇權持有人在到期時收到最少支付的履約價。本文以真實 SPY 選擇權鏈說明計算方式,並比較 2026 年標準月到期的實際結算價。
最大痛點(max pain)是指未平倉選擇權中,以美元計算、到期時將有最大價值歸零的履約價。它只適用於一個標的與一個到期日,並透過搜尋未平倉量計算:將每個掛牌履約價設為假設結算價,計算所有未平倉買權與賣權在該價格下應支付給持有人的金額總和,再找出總額最小的價格。這個名稱描述的是選擇權持有人的損益表。本文以真實 SPY 選擇權鏈逐步說明計算方式,再衡量 2026 年標準月選擇權到期時,實際結算價與最大痛點有多接近。
最大痛點如何計算?
最大痛點是搜尋結果,而不是一條公式。計算分為五個步驟:
- 蒐集該到期日每個履約價的未平倉量,也就是仍未結清的合約數,並將買權與賣權分開。
- 選定一個候選結算價。通常會以掛牌履約價作為候選集合。
- 以候選價格減去履約價計算每一張買權的價值,最低為零;再以履約價減去候選價格計算每一張賣權的價值,最低同樣為零。
- 將每個價值乘以該履約價的未平倉量,再乘以每份合約 100 股的合約乘數,最後把整條選擇權鏈加總為一個美元金額。
- 對每個候選價格重複計算,並保留總額最小者。該候選價格就是最大痛點履約價。
以下假設有助於理解計算方式。假設 $95 履約價有 1,000 張買權未平倉,而結算價為 $100。每份合約讓其持有人取得每股 $5,因此 1,000 份、每份 100 股的合約合計支付 $500,000。若將結算價下移至 $95,這批買權便不產生任何支付;另一方面,所有高於 $95 履約價的賣權開始產生支付。沿著履約價梯度上下移動候選價格,就會描繪出一條有最低點的曲線,而該最低點就是市場通常引用的數字。
這個定義直接帶出兩項特性。最低點出現在買權價值與賣權價值大致以美元金額取得平衡的位置,因此通常接近未平倉量最集中的履約價。其次,這個數字描述的是某一時點的選擇權鏈。再經過一個交易日重新計算後,答案就可能改變。
合約分布在履約價梯度上的位置
未平倉量是收市後根據結算資料,每個交易日公布一次。本文圖表以一個到期日存續期間的成交合約量,作為該資料檔案的可見替代指標;其形狀相同,都是合約集中堆疊在標的價格上下幾美元的範圍內。以下為週五、2026年7月17日到期的 SPY 選擇權鏈,按履約價分組:
| 履約價 | 買權合約數(千) | 賣權合約數(千) |
|---|---|---|
| 736 | 8 | 113.2 |
| 737 | 8.3 | 168.9 |
| 738 | 9.5 | 222.8 |
| 739 | 10.8 | 235.1 |
| 740 | 99.8 | 843.7 |
| 741 | 45.6 | 430.9 |
| 742 | 114.8 | 606.3 |
| 743 | 235.4 | 728.4 |
| 744 | 401.6 | 762.7 |
| 745 | 649.6 | 800.4 |
| 746 | 549.4 | 488.7 |
| 747 | 626.6 | 263.8 |
| 748 | 467.1 | 238.5 |
| 749 | 323.4 | 162.1 |
| 750 | 598 | 493.5 |
| 751 | 305.7 | 151.3 |
| 752 | 331.9 | 154.6 |
| 753 | 257 | 131.5 |
| 754 | 210.8 | 86.2 |
| 755 | 361.8 | 94.4 |
每個數據背後的精確 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履約價梯度穿越價平附近時,分布方向會改變。在 $736 履約價,賣權數量以 113.2 千張對上買權的 8 千張。在 $757,方向相反,買權為 131.7 千張,賣權為 8.1 千張。賣權集中在標的價格下方,買權集中在標的價格上方,兩者在中間某處交會。這個交會區域,就是最大痛點在進行任何算術計算前可能落入的位置;這是理解該統計數字時首先應掌握的重點。成交合約量與未平倉合約量是不同的統計,選擇權成交量與未平倉量說明兩者差異。
支付曲線及其最低點
將步驟 3 至 5 套用於 $730 至 $765 的候選結算價,就會畫出計算所搜尋的形狀:
| 結算價 | 持有人收益(百萬美元) |
|---|---|
| 730 | 11149.2 |
| 731 | 10358 |
| 732 | 9578.6 |
| 733 | 8819.9 |
| 734 | 8067.7 |
| 735 | 7325.2 |
| 736 | 6613.8 |
| 737 | 5914.5 |
| 738 | 5233 |
| 739 | 4574.6 |
| 740 | 3940.9 |
| 741 | 3401.5 |
| 742 | 2909.8 |
| 743 | 2490.1 |
| 744 | 2166.9 |
| 745 | 1960 |
| 746 | 1898.2 |
| 747 | 1940.2 |
| 748 | 2071.2 |
| 749 | 2272.8 |
每個數據背後的精確 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若結算價為 $730,這條選擇權鏈將向持有人支付 $11149.2 百萬美元,幾乎全部支付給賣權持有人。若結算價為 $765,則支付 $11083.9 百萬美元,幾乎全部支付給買權持有人。曲線在兩端之間下降,形成一個平緩的盆地。將相同的總額由小到大排序後,便可找出履約價:
| 候選履約價 | 持有人收益(百萬美元) |
|---|---|
| $746 | 1898.2 |
| $747 | 1940.2 |
| $745 | 1960 |
| $748 | 2071.2 |
| $744 | 2166.9 |
| $749 | 2272.8 |
每個數據背後的精確 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最低點位於 $746,金額為 $1898.2 百萬美元。不要只看最低點所在位置,也要觀察盆地有多平坦。排名第二的 $747,金額為 $1940.2 百萬美元;排名第六的候選價格 $749,金額為 $2272.8 百萬美元。在一個超過 $700 的標的上,六個候選價格只跨越幾美元,且彼此的總額相近。因此,只要選擇權鏈略有變動,報告中的履約價就可能改變,即使市場本身沒有任何變化。
理論主張的是什麼
常見說法是,標的價格在到期前會向最大痛點履約價靠攏,並由選擇權賣方推動價格朝該位置移動。這句話其實包含兩項不同主張。第一項是統計主張:結算價會聚集在最大痛點履約價附近。第二項是機械主張:有人正在推動價格。
第二項主張較為薄弱。最大痛點將未平倉量加總,但沒有任何資訊顯示各履約價上的交易對手中,誰持有多方部位、誰持有空方部位。因此,這套說法中的賣方是推論,而非觀察結果。若某參與者能將 broad-market ETF 推向選定履約價,所需部位規模必須超過整條選擇權鏈所產生的避險流量。若要描述實際存在的避險機制,應採用 gamma 機制:持有正 gamma 的交易商部位,會透過在上漲時賣出、下跌時買進來調整避險部位。市場實務上將這種規則稱為在大量交易的履約價附近抑制波動或形成價格釘住。我們的gamma exposure 說明整理了該估算方式及其背後假設。
第一項主張較能獲得支持,但下一節會說明一項重要限制。關於到期價格釘住效應的學術研究,最清楚的證據來自個別股票:其選擇權未平倉量相對於可交易股數很大,而且效應通常以美分而非美元衡量。
實際結算價有多接近該履約價?
2026年2月至7月期間,SPY 有六個標準月選擇權到期日。對每個到期日,圖表根據該到期週的合約計算使總額最小的履約價,列出到期交易日的實際收盤價,並加入一個簡單基準:SPY 一週前的收盤價,兩者都相對於同一結算價衡量。
| 到期日標籤 | 最低收益履約價 | 結算收盤價 | 最大痛點偏離率(%) | 一週前偏離率(%) |
|---|---|---|---|---|
| Feb 20 | 687 | 689.36 | 0.34 | 1.12 |
| Mar 20 | 652 | 648.54 | 0.53 | 2.12 |
| Apr 17 | 707 | 710.04 | 0.42 | 4.32 |
| May 15 | 740 | 739.09 | 0.12 | 0.21 |
| Jun 18 | 746 | 746.56 | 0.07 | 1.19 |
| Jul 17 | 746 | 743.2 | 0.37 | 1.57 |
每個數據背後的精確 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使總額最小的履約價與收盤價之間的差距,從 0.07% 到期日的 Jun 18,至 0.53% 到期日的 Mar 20;每個月都低於百分之六的十點。單獨來看,這似乎代表很高的命中率。但有兩項測量特性會削弱這項結論。
候選履約價梯度本來就以標的價格為中心。履約價會在價平附近掛牌,而用於加總的合約也集中在該區域,因此算式一開始就位於現貨價格附近的狹窄區間內,不可能回傳遠離該區間的答案。第二項特性是時間點:這裡每一列所使用的合約,成交資料涵蓋至到期交易日當天,包括拿來比較的收盤價。用與測量期間相同的資料窗口計算出的數字,描述的是該窗口,而不是事前預測該窗口。
最後一欄才是值得閱讀的基準。Apr 17前一週 SPY 的收盤價,與結算價相差 4.32%;使總額最小的履約價則相差 0.42%。在 May 15,兩者幾乎一樣接近,分別為 0.21% 與 0.12%。若某項統計是在到期日計算,理論上應大幅勝過一週前的價格。更嚴謹的測試方式,是在到期前一週固定選擇權鏈,然後檢驗該履約價預測收盤價的能力,是否優於同日螢幕上顯示的價格;本文圖表未進行這項測試。
如何解讀已公布的最大痛點數字
- 先確認哪些合約被納入計算。不同發布者可能採用週選或月選系列,也可能使用指數選擇權鏈,或追蹤同一基準的 ETF 選擇權鏈。
- 確認未平倉量的擷取時間。結算資料每個交易日更新一次,因此盤中會變動的數字,通常是根據其他資料重新計算。
- 觀察完整曲線,而不只是最低點所在位置。平坦的盆地表示報告中的履約價只是多個近似相同答案之一。
- 在將接近程度解讀為預測能力前,先與簡單基準比較。
到期機制會決定特定日期仍有哪些合約納入加總,選擇權何時到期說明相關日程。若要查看根據同一選擇權鏈計算的另一項部位統計,put call ratio可直接衡量買權與賣權的組成。
最大痛點常見問答
選擇權交易中的最大痛點是什麼意思?
最大痛點是指,在單一到期日中,未平倉選擇權持有人可獲得的總支付金額最小的履約價。計算方式是利用未平倉量,將每個掛牌履約價設為假設結算價進行測試,並保留支付總額最低者。這個數字描述的是選擇權鏈的形狀,不包含任何預測。
股票是否總會收在最大痛點履約價?
不會。在上述六個 SPY 月選到期日中,使總額最小的履約價,最寬幅時也只在收盤價 0.53% 以內。這聽起來很接近,但若與簡單基準比較,並考量候選履約價本來就集中在現貨價格附近,結論就不同了。以現貨價格為中心的履約價梯度上觀察接近程度,並不是嚴格的檢驗。
最大痛點數字多久會改變一次?
未平倉量是收市後根據結算資料,每個交易日公布一次,因此多數已公布的最大痛點數字每天最多變動一次。若儀表板上的數字在盤中變動,通常代表它是根據成交量或盤中選擇權鏈快照重新計算,而非使用已結算的未平倉量。
最大痛點與 gamma exposure 相同嗎?
不相同。兩者都讀取同一條選擇權鏈,但回答不同問題。最大痛點只使用未平倉量、且不採用定價模型,結果是一個價格。Gamma exposure 則衡量標的每變動百分之一時,以美元計算的避險流量,需要搭配隱含波動率曲面,並假設交易商持有每份合約的哪一方部位。
最大痛點適用於個別股票嗎?
任何掛牌選擇權鏈都可以進行計算。但在交易稀疏的選擇權鏈上,若幾個履約價幾乎承載全部未平倉量,結果會變得不穩定。支持該理論任何部分的價格釘住研究,主要集中在選擇權未平倉量相對於可交易股數很大的個股。
以上每個圖表都是一項已儲存的查詢,點選一次即可查看 SQL。在 Strasmore terminal 上,對任何選擇權鏈執行相同的逐履約價計算。