比特币期权的最大痛点(max pain),是某个到期日上的这样一个价格:假如交割价正好落在这里,所有还没平掉的看涨和看跌期权加在一起,买方到期能拿走的钱最少。反过来看,卖方在这个价位要付出去的也最少,「痛点」说的是买方那一侧。它是从持仓分布里求出来的一个数,本身不带任何对行情的预测。
每个到期日各有一个最大痛点,持仓一变它就可能挪位置。最后决定赔付的是交割价,币安和 Deribit 取的都是半小时平均:币安取到期前 0.5 小时现货指数的算术平均,Deribit 取 07:30 到 08:00 UTC 指数的 30 分钟时间加权平均。交割价既然取半小时平均,要把价格钉在最大痛点,就得让指数在整个窗口里一直停在那儿;第 4 节拿数字算一遍。
1. 最大痛点怎么算?看到期时期权买方一共能拿走多少。
设到期价为 S。某个行权价 K 上有看涨持仓 C 张、看跌持仓 P 张,到期时这一档的买方一共拿到:
C × max(0, S − K) + P × max(0, K − S)
max(0, …) 的作用是把不在价内的那一侧记成 0。把所有行权价的这一项加起来,得到的是「交割价为 S 时买方总共拿走多少」。换不同的 S 各求一次合计,合计最小的那个 S 就是最大痛点。候选价取各个行权价就够了:合计随 S 变化是一段段直线,拐点都在行权价上,最低点总能在某个行权价上找到。
下面用四档行权价举个例子,假设每张合约对应 1 BTC:
| 行权价 K | 看涨持仓 C(张) | 看跌持仓 P(张) |
|---|---|---|
| 90,000 | 100 | 400 |
| 95,000 | 200 | 300 |
| 100,000 | 500 | 200 |
| 105,000 | 300 | 50 |
示意数据,非真实持仓。数量和行权价都是为了演示算法编的,和任何一个真实到期日无关。
把四个行权价分别当成交割价代入,结果如下(单位 USDT):
| 假设交割价 S | 看涨买方拿走 | 看跌买方拿走 | 合计 |
|---|---|---|---|
| 90,000 | 0 | 4,250,000 | 4,250,000 |
| 95,000 | 500,000 | 1,500,000 | 2,000,000 |
| 100,000 | 2,000,000 | 250,000 | 2,250,000 |
| 105,000 | 6,000,000 | 0 | 6,000,000 |
拿 S = 95,000 这一行拆开:看涨那边只有 90,000 这档在价内,每张 5,000,乘 100 张是 500,000;看跌那边 100,000 这档每张 5,000、200 张,是 1,000,000,105,000 这档每张 10,000、50 张,是 500,000,两项相加 1,500,000。合计 2,000,000,是四行里最小的,所以这张示意表的最大痛点是 95,000。
再看 100,000 那一行,合计 2,250,000,只比最低点多 250,000,也就是 12.5%。最低点附近很平,持仓稍有变化,答案就容易换。把 100,000 这档的看跌持仓从 200 张改成 300 张,S = 95,000 时看跌买方多拿 5,000 × 100 = 500,000,合计变成 2,500,000;S = 100,000 时这档看跌不在价内,合计还是 2,250,000。最低点于是跳到 100,000。一百张持仓的变化,让最大痛点挪了 5,000。
这个公式只数到期那一刻的内在价值。买方当初付的权利金、卖方收的权利金、任何一方手上的对冲仓位,都不在式子里。
2. 去哪拿比特币期权每个行权价的持仓量?
要的是一张分布表:某个到期日下,每个行权价的看涨、看跌各有多少持仓。币安期权的公开行情接口里有现成的一个:
GET https://eapi.binance.com/eapi/v1/openInterest
| 参数 | 必填 | 文档里的示例值 |
|---|---|---|
underlyingAsset(标的) | 是 | ETH/BTC |
expiration(到期日) | 是 | 221225 |
文档对它的说明是:取某个标的在某个到期日上的持仓量。返回一个数组,每一项对应一张合约,有四个字段:symbol、sumOpenInterest、sumOpenInterestUsd、timestamp。返回示例里的合约名是 ETH-221119-1175-P。同一份文档里 exchangeInfo 接口的示例把 BTC-220815-50000-C 对应到 strikePrice 50000、side CALL,合约名因此可以这样拆:标的、六位到期日、行权价、C(看涨)或 P(看跌)。
把接口返回整理成上一节那张表,步骤是:
- 先请求
GET /eapi/v1/exchangeInfo,在optionSymbols里看现在挂着哪些比特币合约,每个合约带expiryDate(毫秒时间戳)、strikePrice、side、unit,从中定下你要看的到期日。 - 请求 openInterest,
underlyingAsset填 BTC,expiration照示例 221225 的六位写法填那个到期日,和合约名中间那段日期是同一种写法。 - 返回的每一行按 symbol 末尾的 C / P 分到看涨、看跌两列,按中间的行权价归到对应行,把 sumOpenInterest 填进去。
- 对每个行权价代入第 1 节的公式,求合计,取最小的那一个。
整理出来的行数比 exchangeInfo 里同一到期日的合约少,先回到第 1 步,核对填进去的日期是否对应一个现有的 expiryDate。至于要不要乘合约单位 unit(单张合约代表的标的数量):同一到期日下各合约的 unit 相同的话,每个 S 的合计被放大同一个倍数,最低点落在哪个行权价不受影响。记下返回里的 timestamp,它告诉你这组持仓是哪个时刻的。
这张表只覆盖币安;Deribit 的持仓要去它自己的公开数据里取,两家各算各的,求出的最大痛点不必相同。两家的持仓能不能加进同一张表,要看交割价是不是同一个数。
3. 期权交割价怎么定?币安和 Deribit 都取半小时平均。
前面公式里的 S,在平台上就是交割价(币安叫结算价),它不取到期那一秒的成交价。
币安帮助中心《期權交易一覽》给的定义是:「結算價是計算到期時間前0.5小時內的幣安現貨指數價格的算術平均值」。页面举的例子是 ETH-211230-2000-C,这张合约在 21-12-30 8:00:00 结算,结算价取 ETH 现货指数从 7:30:00 到 8:00:00 的算术平均,公式写成 1/1800 × (Price_t1 + Price_t2 + … + Price_t1800),也就是 1,800 个价格相加再除以 1,800。同一页给的收益公式,看涨买方是 MAX(结算价 − 行权价, 0) × 单位 × 持仓规模,看跌买方是 MAX(行权价 − 结算价, 0) × 单位 × 持仓规模,和前面求合计用的是同一个结构。
想在到期前看这个平均价大概落在哪,币安期权 24 小时行情接口(GET /eapi/v1/ticker)有一个 exercisePrice 字段,文档的说明是:行权前一小时返回预估结算价,其余时间返回指数价。
Deribit 的规则写在它帮助中心的 Settlement 一页。在 08:00 UTC 到期的合约,交割价是相关 Deribit 指数在 07:30 到 08:00 UTC 之间的 30 分钟时间加权平均价(TWAP),期间每 4 秒取一次快照,30 分钟算下来是 450 个点。期权是欧式、现金结算,到期在价内的自动行权,盈利以现金支付,不交割币本身;按合约类型,用 BTC、ETH 或 USDC 结算。
| 项目 | 币安期权 | Deribit |
|---|---|---|
| 交割价取法 | 到期前 0.5 小时币安现货指数价格的算术平均 | 07:30–08:00 UTC 相关 Deribit 指数的 30 分钟 TWAP,每 4 秒一个快照 |
| 期权类型 | 欧式,按每日、每周、每月或每季度结算 | 欧式,现金结算,价内自动行权 |
| 结算资产 | 接口示例里 BTCUSDT 的 settleAsset 是 USDT | 按合约类型为 BTC、ETH 或 USDC |
两家用的指数不同,平均方式也不同,同一个到期日产生的是两个各自独立的交割价。两家持仓不宜直接相加,原因就在这里:它们对应的 S 本来就是两个数。
4. 交割日价格真的会被拉到最大痛点吗?
这个说法背后的想象是:期权卖方在最大痛点赔得最少,所以有动机在交割前把价格往那里推。这个说法讲的是卖方的动机;动机能不能变成结算价,要看交割价怎么取。
Deribit 在 Settlement 页里说明,用 30 分钟 TWAP 加上多个独立的指数成分来源,目的就是降低交割时价格被操纵的风险。币安那边是 1,800 个价格的算术平均,同样把半小时摊平。假设 30 分钟里其余时间指数都停在 100,000,有 3 分钟被推高 1% 到 101,000,平均价是 (27 × 100,000 + 3 × 101,000) ÷ 30 = 100,100,只抬高了 0.1%。
结算价既然是半小时的平均,想把它挪到某个行权价附近,就得在整段窗口里持续把指数压在那个位置,单靠最后一分钟的急拉急砸,效果会被其余 29 分钟稀释掉;持续推价要的资金和承担的风险,也跟着摊满整段时间。
示意表里一档多出一百张看跌持仓,最大痛点就挪了 5,000。事后有人说「又被拉到最大痛点了」,要先问清用的是哪一家、哪个时刻的持仓;换一个时刻取数,拿来对照的目标价可能已经不是同一个。
想自己检验,可以攒记录:每逢一个到期日,在到期前一小时内用 ticker 的 exercisePrice 记下预估结算价,同一时刻用 openInterest 求一次最大痛点,连同 timestamp 一起记进表里。攒够一段时间,再看两者的距离有没有规律。
不管最后记下来是什么结果,最大痛点都不宜单独看:它把一整张持仓表压成一个价格,中间丢掉了很多信息。
同一张示意表还能求出 PCR:看跌持仓合计 400 + 300 + 200 + 50 = 950 张,看涨合计 100 + 200 + 500 + 300 = 1,100 张,持仓 PCR = 950 ÷ 1,100 ≈ 0.86。最大痛点告诉你「在哪个价位买方拿走最少」,PCR 告诉你「看跌和看涨的持仓谁多」,两者答的是不同的问题。PCR 按成交量、按持仓、按名义价值加权有好几种算法,怎么读、为什么高 PCR 不等于看跌,站内《期权 PCR 入门:Put/Call Ratio 实战》有拆解。
示意表里看涨持仓最重的一档在 100,000(500 张),看跌最重的一档在 90,000(400 张),最大痛点 95,000 落在两者之间。只报一个 95,000,这两堆仓位在哪就看不出来了,所以取数时把每档持仓一起留着。
今天和昨天各取一次同一到期日的持仓,哪一档在增加、哪一档在减少,比最大痛点这一个数挪了多少更有信息量:某一档持仓大幅增加,说明有新仓位在那里建立。持仓量增减各自对应什么盘面,可以对照《持仓量 Open Interest 入门到实战:比成交量更值得盯》来读。
5. 最大痛点常见问题。
期权最大痛点多久更新一次?
它没有固定的发布时刻,每次都是拿某一时刻的持仓现求出来的,你什么时候取数,它就是什么时候的结果。币安 openInterest 接口的返回里带 timestamp,记下它就知道这组持仓属于哪个时刻。看到别人报的最大痛点,也要问清是哪一家、哪个时刻的持仓求的,离交割越近,这个时刻越要紧。
比特币期权每个到期日的最大痛点都不一样吗?
每个到期日要分开求。币安 openInterest 接口本身就要求传 expiration,一次只返回一个到期日的持仓。几个到期日的持仓混在一张表里求出来的价格,找不到对应的交割时刻,因为这些合约在不同的日子、按各自那半小时的平均价结算,日度、周度、月度、季度要分别看。
以太坊期权的最大痛点也能这样算吗?
算法完全一样,公式里没有任何和标的有关的参数。币安 openInterest 文档的返回示例本来就是 ETH 合约 ETH-221119-1175-P,帮助中心解释结算价的例子也是 ETH-211230-2000-C。换成以太坊,变的只是持仓表里的行权价和数量,结算价同样取到期前半小时现货指数的算术平均。