什么是期权最大痛点?真实计算方法
最大痛点是期权持有人到期时获得金额最少的行权价。本文用真实 SPY 期权链演示计算,并比较 2026 年实际结算价与最大痛点的距离。
最大痛点是这样一个行权价:在该价格上,未平仓期权中最大美元价值的部分将到期失效。它对应一个标的和一个到期日,结果来自对未平仓量的逐项搜索:把每个挂牌行权价都作为假设结算价,计算所有未平仓看涨期权和看跌期权在该价格下应向持有人支付的金额,再保留总支付额最小的价格。这个名称描述的是期权持有人的账面。本文以真实的 SPY 期权链演示计算过程,然后衡量在 2026 年标准月度到期日中,实际结算价与最大痛点的接近程度。
最大痛点如何计算?
最大痛点是搜索结果,而不是一个公式。计算分为五步:
- 收集该到期日每个行权价的未平仓量,即仍未平仓的合约数量,并将看涨期权与看跌期权分开。
- 选定一个候选结算价。通常使用挂牌行权价作为候选集合。
- 将每份看涨期权按候选价格减去行权价计算价值,最低按零计;将每份看跌期权按行权价减去候选价格计算价值,最低按零计。
- 将每个价值乘以该行权价的未平仓量,再乘以每份合约的 100 股合约乘数,然后把整条期权链相加,得到一个美元金额。
- 对每个候选价格重复计算,并保留总额最小的价格。该候选价格就是最大痛点行权价。
一个假设例子可以说明计算机制。假设 $95 行权价上有 1,000 份未平仓看涨期权,而结算价为 $100。每份合约的持有人可获得每股 $5,因此 1,000 份、每份 100 股的合约合计支付 $500,000。若将结算价下移至 $95,这部分期权将不产生支付,而所有行权价高于 $95 的看跌期权则开始产生支付。让候选价格沿行权价阶梯上下移动,就能绘出一条有最低点的曲线,而最低点就是市场通常引用的数字。
该定义直接带来两个特征。最低点通常位于看涨期权价值与看跌期权价值大致以美元计相抵的位置,因此接近未平仓量最大的行权价。其次,这个数字描述的是某一时点的期权链:再经过一个交易日后重新计算,结果就可能变化。
合约在行权价阶梯上的分布
未平仓量由结算机构根据收盘后的清算数据每个交易日发布一次。这里的图表使用某一到期日整个存续期间的合约成交量,作为该文件的可见替代指标;两者形态相同:合约集中堆积在标的价格上下几美元的范围内。以下是 2026 年 7 月 17 日星期五到期的 SPY 期权链,按行权价分组:
| 行权价 | 看涨合约数 k | 看跌合约数 k |
|---|---|---|
| 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 的候选结算价,就能绘出该计算所搜索的形状:
| 结算价 | 持有人收益 USD mm |
|---|---|
| 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 百万美元,其中几乎全部支付给看涨期权持有人。曲线在两端之间下落并形成一个浅盆地。将相同的总额从小到大排序后,最低行权价为:
| 候选行权价 | 持有人收益 USD mm |
|---|---|
| $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 的工具上,六个候选价格只相差几美元,但支付总额却十分接近。因此,期权链稍有变化,显示的行权价就可能改变,而市场本身并未发生实质变化。
理论主张是什么?
流行说法认为,标的价格在到期前会向最大痛点行权价靠拢,并由期权卖方推动价格达到该位置。这句话包含两个不同主张。第一个是统计主张:结算价会聚集在最大痛点附近。第二个是机制主张:有人在推动价格。
第二个主张较弱。最大痛点将未平仓量汇总起来,但并不包含任何信息来说明某个行权价上的交易对手哪一方持有多头、哪一方持有空头。因此,故事中的卖方只是一个假设,而非观测结果。若某一参与者能够将一只广泛交易的 ETF 推向指定行权价,其所需资金规模将超过整条期权链产生的对冲资金流。对于已经有实际机制描述的情况,相关机制是 gamma:持有正 gamma 头寸的交易商会通过逢强卖出、逢弱买入来调整对冲头寸。业内通常将这种在成交活跃的行权价附近抑制波动或形成价格钉住的机制称为 dampening 或 pinning。我们的gamma 敞口解析介绍了这一估算方法及其基本假设。
第一个主张更有依据,但下一节会说明一个重要限定。关于到期日价格钉住效应的学术研究,在单只股票中记录得最为清楚,尤其是那些期权未平仓量相对于可交易股票数量较大的股票;而且该效应通常以美分而非美元衡量。
实际结算价与行权价有多接近?
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使总额最小的行权价与收盘价之间的差距,从 Jun 18 到期日的 0.07%,扩大至 Mar 20 的 0.53%;每个月都低于六成个百分点。单独看,这似乎代表很高的命中率。但有两个测量特征会削弱这一结论。
候选行权价阶梯在构造上就围绕标的价格展开。行权价通常围绕平值挂牌,参与计算的合约也集中在这一带,因此计算一开始就在现货价格附近的狭窄区间内,不可能返回远离该区间的结果。第二个特征是时间窗口:这里每一行所使用的合约成交数据覆盖至到期日当天,包括用于比较的收盘价所在交易时段。使用与测量对象相同时间窗口计算出的指标,描述的是该窗口,而不是提前预测该窗口。
最后一列才是值得关注的基准。Apr 17 前一周 SPY 的收盘价与结算价相差 4.32%,而使总额最小的行权价与结算价相差 0.42%。在 May 15,两者几乎相同,差距分别为 0.21% 和 0.12%。根据到期日数据计算出的指标,应当明显优于一周前的价格。更严谨的测试是:冻结提前一周时的期权链,然后检验该行权价对收盘价的预测效果是否优于同日屏幕上显示的价格;本文的图表并未进行这一测试。
如何解读已发布的最大痛点数字
- 询问哪些合约被纳入计算。不同发布方对周度与月度系列的选择不同,对跟踪同一基准的指数期权链与 ETF 期权链的选择也不同。
- 询问未平仓量提取的时间。结算文件每个交易日更新一次,因此盘中不断变化的数字通常是在根据其他数据重新计算。
- 观察整条曲线,而不只是最低点所在位置。盆地平坦意味着显示的行权价只是多个近似相同答案中的一个。
- 在将接近程度解读为能力之前,先与一个简单基准进行比较。
到期机制决定某一天哪些合约仍计入总额,期权何时到期介绍了相关日历。若要了解同一条期权链上的另一项仓位指标,看跌看涨比率会直接衡量看涨期权与看跌期权的构成。
最大痛点常见问题
最大痛点在期权交易中是什么意思?
最大痛点是这样一个行权价:在单个到期日上,未平仓期权持有人获得的总支付额在该价格下最小。计算方法是利用未平仓量,将每个挂牌行权价作为假设结算价进行测试,并保留成本最低的价格。这个数字描述的是期权链的结构,并不包含预测。
股票总会在最大痛点行权价收盘吗?
不会。在上述六个 SPY 月度到期日中,使总额最小的行权价与收盘价的最大差距为 0.53%。如果只看这个数字,差距似乎很小;但还必须与简单基准比较,并考虑候选行权价本身就集中在现货价格附近这一事实。在围绕现货价格构建的阶梯上测量接近程度,检验力度较弱。
最大痛点数字多久会变化一次?
结算机构根据收盘后的清算数据每个交易日发布一次未平仓量,因此多数已发布的最大痛点数字每天最多变化一次。如果仪表盘中的数字在盘中变化,通常说明它使用的是成交量或盘中期权链快照,而不是结算后的未平仓量。
最大痛点与 gamma 敞口相同吗?
不相同。两者都读取同一条期权链,但回答的问题不同。最大痛点仅使用未平仓量,不采用定价模型,用于确定一个价格。gamma 敞口则衡量标的每变动百分之一时对冲资金流的美元规模,并需要隐含波动率曲面以及关于交易商持有每份合约哪一方头寸的假设。
最大痛点适用于个股吗?
任何挂牌期权链都可以进行这项计算。但在交易清淡的期权链上,结果会更嘈杂,因为少数行权价可能承载几乎全部未平仓量。支持相关理论任何部分的价格钉住研究,主要集中于期权未平仓量相对于可交易股票数量较大的股票。
上文每个图表都是一个存储查询,SQL 可一键查看。在 Strasmore 终端上,对任何期权链执行同样的逐行权价计算。