Strasmore Research
学习 Matt Connor作者: Matt Connor

最大痛点 期权 计算 方法

最大痛点是期权持有者损失最大的行权价。本文以真实SPY期权链演示计算,并检验2026年到期日结算价与最大痛点的接近程度。

最大痛点是指未平仓期权总美元价值归零时对应的行权价。它属于某一标的资产和某一到期日,通过对未平仓合约的搜索得出:将每个挂牌行权价作为假设结算价进行测试,计算在该价格下所有未平仓看涨期权和看跌期权需向持有者支付的金额,并保留总金额最小的那个价格。这个名称描述的是期权持有者一方的账目。本文将以真实的SPY期权链为例演示计算过程,然后衡量在2026年标准月度到期日中,实际结算价与最大痛点价格的接近程度。

最大痛点如何计算?

最大痛点是一种搜索过程而非公式。共五个步骤:

  1. 收集该到期日每个行权价的未平仓合约数量(即仍存续的合约数),并将看涨期权和看跌期权分开统计。
  2. 选取一个候选结算价。通常候选集就是挂牌的行权价本身。
  3. 计算每个看涨期权的价值为候选价减去其行权价(下限为零),每个看跌期权的价值为其行权价减去候选价(下限为零)。
  4. 将每个价值乘以该行权价的未平仓合约数,再乘以100股的合约乘数,然后将整个期权链的金额加总为一个美元数值。
  5. 对每个候选价重复上述步骤,保留总金额最小的那个候选价。该候选价即为最大痛点行权价。

用一个假设案例来固定计算机制。假设在95美元行权价上有1000张看涨期权未平仓,结算价为100美元。每张合约向持有者支付每股5美元,因此这1000张合约(每张100股)总计支付50万美元。若将结算价降至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百万美元。不仅要看最低点在哪里,还要观察谷底有多平坦。次低点$747的金额为1940.2百万美元,排名第六的候选价$7492272.8百万美元。在价格超过700美元的标的资产上,六个候选价仅相差几美元且数值非常接近,因此对期权链进行小幅修正就会改变最终打印的行权价,而市场本身并未发生变化。

理论主张

流行的说法认为,标的资产在到期前会向其最大痛点行权价靠拢,这是由期权卖方推动的。这句话中包含了两个独立的论断。第一个是统计性的:结算价聚集在最大痛点行权价附近。第二个是机制性的:有人在主动推动。

第二个论断较为薄弱。最大痛点数值汇总了未平仓合约,但并未提供任何行权价上哪个对手方是多头、哪个是空头的信息,因此故事中的卖方只是一种假设而非观察结果。能够将广泛市场ETF推至特定行权价的参与者,其规模需要超过整个期权链所产生的对冲流量。当真实的对冲机制被描述出来时,通常是指伽马对冲:持有正伽马值的做市商账簿通过在高位卖出、低位买入来调整对冲规模,从业者称这种规则为"阻尼"或"钉住"交易量大的行权价附近。我们的伽马敞口解释阐述了该估算方法及其背后的假设。

第一个论断更为可靠,但下一节将讨论一个重要的限定条件。关于到期钉住现象的学术研究,在期权未平仓合约相对于可交易股份数量较大的个股中效果最为明显,并且其衡量单位是美分而非美元。

行权价实际有多接近?

2026年2月至7月期间,SPY经历了六个标准月度到期日。对于每个到期日,图表计算了该到期周合约的最小化行权价,打印了到期交易时段的实际收盘价,并附上一个简单的对照基准:SPY一周前的收盘价,与同一结算价进行比较。

查询最小化行权价 vs 结算收盘价: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

最小化行权价与收盘价之间的差距,从Jun 18到期的0.07%到Mar 20到期的0.53%不等,每个月的差距均保持在0.6%以内。单独看这个数据,命中率似乎很高。但测量的两个特征削弱了这一结论。

首先,候选阶梯本身就以标的资产价格为中心构建。行权价围绕平值状态挂牌,而参与加总的合约也集中在此,因此计算从一开始就限定在现货价格附近的一个狭窄区间内,不可能得出远离该区间的答案。第二个特征是时间因素:每行数据所依据的合约交易时间涵盖至到期交易时段本身,而与之比较的收盘价也来自同一时段。从与测量对象相同的时间窗口计算出的数值,描述的是该窗口本身,而非提前预测。

最后一列是值得关注的对照基准。SPY在Apr 17前一周的收盘价与结算价的偏差为4.32%,而最小化行权价的偏差为0.42%。在May 15中,两者相差无几,分别为0.21%和0.12%。在到期日当天计算的统计量,理应大幅优于一周前的价格。诚实的测试(本图表未进行)是将期权链冻结在一周前,然后询问该行权价预测收盘价的效果是否优于当天屏幕上的价格。

如何解读已发布的最大痛点数值

  • 询问该数值包含了哪些合约。不同发布方对周度与月度系列、以及追踪同一基准的指数期权链与ETF期权链的处理方式不同。
  • 询问未平仓合约数据是何时提取的。清算文件每个交易时段更新一次,因此日内变动的数值必然是基于其他数据重新计算的。
  • 询问整条曲线的形状,而不仅仅是最低点的位置。平坦的谷底意味着打印出的行权价只是几个数值相近的答案之一。
  • 在将接近程度解读为技巧之前,先与一个简单的替代基准进行比较。

到期机制决定了在任何特定日期哪些合约仍包含在加总中,期权何时到期涵盖了相关日历。对于基于同一期权链构建的第二个持仓统计量,看跌看涨比率直接衡量了看涨与看跌期权的混合比例。

最大痛点常见问题

期权交易中的最大痛点是什么意思?

最大痛点是指单一到期日未平仓期权持有者获得的总支付金额最小时对应的行权价。它通过将每个挂牌行权价作为假设结算价进行测试,并保留成本最低的那个,从未平仓合约数据计算得出。该数值描述了期权链的形态,不包含任何预测。

股票是否总是在最大痛点行权价收盘?

不是。在上述测量的六个SPY月度到期日中,最小化行权价与收盘价的最大偏差在0.53%以内,这听起来很接近,但需要与一个简单的基准进行比较,并且考虑到候选行权价已经围绕当前价格聚集。在以现货为中心的阶梯上衡量接近程度,是一个较弱的测试。

最大痛点数值多久变化一次?

未平仓合约数据在每个交易时段结束后由清算数据发布一次,因此大多数已发布的最大痛点数值每天最多变动一次。如果某个数据面板的数值在交易时段内变动,则说明它是基于已交易成交量或日内期权链快照重新计算的,而非基于已结算的未平仓合约。

最大痛点与伽马敞口相同吗?

不同。两者都读取同一期权链,但回答不同问题。最大痛点仅使用未平仓合约数据,无需定价模型,即可确定一个价格。伽马敞口以每变动1%对应的美元金额来衡量对冲流量,需要隐含波动率曲面,并且需要假设每个合约的做市商持有哪些头寸。

最大痛点适用于个股吗?

该计算适用于任何挂牌期权链。在未平仓合约集中在少数几个行权价的薄期权链上,输出结果会变得嘈杂,而支持该理论任何部分的钉住研究,主要集中在期权未平仓合约相对于可交易股份数量较大的股票上。


以上每个图表都是一个存储查询,其SQL代码一键可查。在Strasmore终端上,可对任何期权链逐行权价运行相同的计算。