옵션 최대 고통 계산법
최대 고통(max pain)은 옵션 보유자가 만기 시 가장 손해를 보는 행사가입니다. 실제 SPY 체인에서 계산 과정과 결제 근접도를 확인합니다.
131.7 최대 고통(Max pain)은 미결제 약정이 가장 큰 달러 가치로 만기 무효가 되는 행사가격을 말한다. 이는 하나의 기초자산과 하나의 만기일에 속하며, 미결제 약정 검색을 통해 도출된다: 상장된 모든 행사가격을 가상 결제가격으로 테스트하고, 해당 가격에서 모든 미결제 콜옵션과 풋옵션이 보유자에게 지급할 금액을 합산한 뒤, 총액이 가장 작은 가격을 유지한다. 이 명칭은 옵션 보유자 측 원장을 설명한다. 이 페이지는 실제 SPY 체인에 대해 산술 과정을 살펴본 후, 표준 2026년 월물 만기에서 결제가 실제로 얼마나 근접했는지 측정한다.
최대 고통(max pain)은 어떻게 계산되나요?
최대 고통은 공식이라기보다는 탐색 과정입니다. 다섯 단계로 이루어집니다.
- 만기일의 모든 행사가에서 아직 청산되지 않은 계약 수인 미결제약정(open interest)을 수집하며, 콜옵션과 풋옵션은 분리하여 기록합니다.
- 후보 정산 가격을 하나 선정합니다. 일반적으로 상장된 행사가 자체가 후보 집합이 됩니다.
- 각 콜옵션은 후보 가격에서 행사가를 뺀 값(0 미만이면 0)으로 평가하고, 각 풋옵션은 행사가에서 후보 가격을 뺀 값(0 미만이면 0)으로 평가합니다.
- 각 값을 해당 행사가의 미결제약정과 100주 계약 승수(contract multiplier)로 곱한 뒤, 전체 체인을 합산하여 하나의 달러 금액으로 만듭니다.
- 각 후보에 대해 이 과정을 반복하고 가장 작은 총액을 유지합니다. 그 후보가 최대 고통 행사가입니다.
가상의 예시로 메커니즘을 설명합니다. $95 행사가에 1,000개의 콜옵션 미결제약정이 있고 정산이 $100에 이루어진다고 가정합니다. 각 계약은 보유자에게 주당 $5를 지급하므로, 1,000개 계약(100주씩)에 걸쳐 총 $500,000을 지급합니다. 정산을 $95로 낮추면 해당 블록은 아무것도 지급하지 않는 반면, $95 위에 있는 모든 풋옵션이 대신 지급을 시작합니다. 후보 가격을 사다리 위아래로 움직이면 바닥이 있는 곡선이 그려지며, 그 바닥이 사람들이 인용하는 숫자입니다.
정의에서 바로 도출되는 두 가지 특성이 있습니다. 최솟값은 콜옵션 가치와 풋옵션 가치가 달러 기준으로 대략 균형을 이루는 지점에 위치하므로, 이는 미결제약정이 가장 많이 집중된 행사가 근처에 자리 잡습니다. 또한 이 수치는 특정 시점의 체인을 설명합니다. 추가 거래 세션이 끝난 후 다시 계산하면 값이 변동합니다.
계약이 행사가 사다리에서 위치하는 곳
미결제약정은 장 마감 후 청산 데이터를 바탕으로 세션당 한 번 발표됩니다. 여기 패널은 특정 만기 기간 동안 거래된 계약 물량을 해당 파일의 가시적 대용치로 사용하며, 그 대상은 동일한 형태를 가집니다: 기초자산 가격에서 수 달러 이내에 쌓인 계약 더미입니다. 2026년 7월 17일 금요일에 만료되는 SPY 체인의 모든 계약을 행사가별로 그룹화한 것입니다:
모든 수치 뒤에 숨겨진 정확한 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에 걸쳐 실행하면 계산이 탐색하는 형태가 나타난다:
모든 수치 뒤에 숨겨진 정확한 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백만 달러가 지급되며, 거의 전액이 콜 보유자에게 돌아간다. 양 끝 사이에서 곡선은 얕은 분지로 떨어진다. 동일한 총액을 가장 작은 것부터 순위 매기면 행사가가 결정된다:
모든 수치 뒤에 숨겨진 정확한 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백만 달러이며, 6위 후보 $749는 $2272.8백만 달러이다. $700이 넘는 상품에서 수 달러 차이로 여섯 개의 후보 가격이 밀집해 있으므로, 체인에 대한 약간의 수정만으로도 시장에 아무런 변화가 없음에도 공시 행사가가 이동한다.
이론의 주장
널리 알려진 설명에 따르면, 기초자산은 만기일에 최대 고통(max pain) 행사가로 끌려가는 경향이 있으며, 옵션 매도자가 이를 유도한다. 이 문장에는 두 가지 별개의 주장이 포함되어 있다. 첫째는 통계적 주장으로, 결제 가격이 최대 고통 행사가 근처에 모인다는 것이다. 둘째는 기계적 주장으로, 누군가가 실제로 가격을 밀어붙이고 있다는 것이다.
두 번째 주장은 더 약하다. 최대 고통 수치는 미결제약정을 집계할 뿐, 각 행사가에서 어느 거래상대방이 매수 포지션이고 어느 쪽이 매도 포지션인지에 대한 정보는 포함하지 않는다. 따라서 이야기 속의 매도자는 관찰이 아닌 가정에 불과하다. 광범위한 시장 ETF를 특정 행사가로 움직일 수 있는 참여자는, 전체 체인이 생성하는 헤징 흐름을 넘어서는 규모를 필요로 한다. 실제 헤징 메커니즘이 설명된 사례는 감마(gamma) 메커니즘이다. 양의 감마를 보유한 딜러 포지션은 강세장에서 매도하고 약세장에서 매수하여 헤지를 재조정하는데, 실무자들은 이를 거래량이 많은 행사가 근처에서의 감쇠(dampening) 또는 고정(pinning) 효과라고 부른다. 당사의 감마 노출 설명은 해당 추정치와 그 기반이 되는 가정을 상세히 다루고 있다.
첫 번째 주장은 더 설득력이 있으며, 다음 섹션에서 다룰 큰 단서가 붙는다. 만기일 고정 현상에 대한 학술 연구는, 옵션 미결제약정이 거래 가능 주식 수에 비해 큰 개별 종목에서 가장 뚜렷하게 나타나며, 그 효과는 달러 단위가 아닌 센트 단위로 측정된다.
실제 행사가는 목표에 얼마나 근접할까?
2026년 2월부터 7월까지 SPY에서 6개의 표준 월간 만기가 실행되었다. 각 만기별로 패널은 해당 만기 주의 계약에서 최소화 행사가를 산출하고, 만기 세션의 실제 종가를 출력하며, 그 옆에 단순한 대조군을 배치한다: 1주일 전 SPY 자체 종가를 동일한 결제 가격과 비교한 값이다.
모든 수치 뒤에 숨겨진 정확한 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까지 범위를 보였으며, 모든 월에서 0.6% 미만을 유지했다. 단독으로 보면 이는 강력한 적중률로 보인다. 그러나 측정의 두 가지 특징이 이를 깎아내린다.
후보 행사가 사다리는 구성상 기초자산 가격을 중심으로 설정된다. 행사가는 등가격 주변에 나열되며, 합계에 기여하는 계약도 그곳에 집중되므로, 계산은 현물가 주변의 좁은 대역 내에서 시작되며 그 범위를 크게 벗어난 답을 반환할 수 없다. 두 번째 특징은 시점이다: 여기 각 행에 투입된 계약은 만기 세션까지(비교 대상인 종가와 함께) 거래되었다. 측정 대상과 동일한 기간에서 산출된 수치는 그 기간을 설명할 뿐, 사전에 예측하는 것이 아니다.
마지막 열은 읽을 가치가 있는 대조군이다. Apr 17 1주일 전 SPY 종가는 결제 가격을 4.32%만큼 빗나간 반면, 최소화 행사가는 0.42%였다. May 15에서는 두 값이 0.21% 대 0.12%로 미세한 차이에 근접했다. 만기일에 계산된 통계치는 1주일 전 가격을 큰 폭으로 이겨야 한다. 이 패널이 시도하지 않는 정직한 테스트는 체인을 1주일 전에 고정한 후, 해당 행사가가 같은 날 화면에 표시된 가격보다 종가를 더 잘 예측하는지 묻는 것이다.
공개된 최대 고통 수치 읽는 법
- 어떤 계약이 포함되었는지 질문하십시오. 발행 기관마다 주간 시리즈와 월간 시리즈, 그리고 동일한 벤치마크를 추적하는 지수 체인과 ETF 체인을 두고 방식이 다릅니다.
- 미결제약정이 언제 추출되었는지 질문하십시오. 청산 파일은 세션당 한 번만 업데이트되므로, 장중 변동하는 수치는 다른 데이터로부터 재계산된 것입니다.
- 바닥이 어디인지뿐만 아니라 전체 곡선이 어떻게 생겼는지 질문하십시오. 평평한 분지(basin)는 표시된 행사가가 거의 동등한 여러 답 중 하나임을 의미합니다.
- 정확성을 근접성으로 읽기 전에 단순한 대안과 비교하십시오.
만기 메커니즘은 특정일에 어떤 계약이 여전히 합계에 포함되는지를 결정하며, 옵션 만기 시점이 해당 달력을 다룹니다. 동일한 체인에서 구축된 두 번째 포지셔닝 통계로, 풋-콜 비율은 콜과 풋의 혼합을 직접 측정합니다.
맥스페인 FAQ
옵션 거래에서 맥스페인이란 무엇인가?
맥스페인은 단일 만기일에 미결제 옵션 보유자에게 지급되는 총액이 최소가 되는 행사가격이다. 미결제약정을 기반으로, 상장된 모든 행사가격을 가상 결제가격으로 테스트하여 가장 비용이 적게 드는 가격을 선정하는 방식으로 계산된다. 이 수치는 옵션 체인의 형태를 설명할 뿐이며, 어떠한 예측도 포함하지 않는다.
주식이 항상 맥스페인 행사가격에 마감되는가?
아니다. 위에서 측정한 6개의 SPY 월간 만기일에서, 최소 비용 행사가격은 가장 넓은 경우에도 종가의 0.53% 이내에 위치했다. 이는 수치를 단순한 기준선 및 후보 행사가격이 이미 현재가 주변에 밀집되어 있다는 사실과 비교할 때까지는 근접해 보인다. 현재가를 중심으로 한 사다리에서의 근접성은 약한 테스트에 불과하다.
맥스페인 수치는 얼마나 자주 변경되는가?
미결제약정은 장 마감 후 청산 데이터를 바탕으로 거래 세션당 한 번 게시되므로, 대부분의 공개된 맥스페인 수치는 하루에 최대 한 번만 변동한다. 세션 중에 수치가 변동하는 대시보드는 확정된 미결제약정 대신 거래량이나 장중 체인 스냅샷을 기반으로 재계산하는 것이다.
맥스페인과 감마 익스포저는 같은 것인가?
아니다. 둘 다 동일한 옵션 체인을 읽지만 다른 질문에 답한다. 맥스페인은 가격 모델 없이 미결제약정만을 사용하여 가격을 명명한다. 감마 익스포저는 1% 변동당 달러로 헤징 흐름의 규모를 측정하며, 내재변동성 표면과 각 계약의 어느 쪽을 딜러가 보유하고 있는지에 대한 가정이 필요하다.
맥스페인은 개별 주식에도 적용되는가?
계산 방식은 상장된 모든 체인에서 실행된다. 소수의 행사가격에 거의 모든 미결제약정이 집중된 얇은 체인에서는 결과값의 신뢰도가 낮아지며, 이 이론의 일부를 뒷받침하는 고정(pinning) 연구는 옵션 미결제약정이 거래 가능한 주식 수에 비해 많은 종목에 집중되어 있다.
위의 모든 패널은 저장된 쿼리이며, SQL은 한 번의 클릭으로 확인할 수 있다. 스트라스모어 터미널에서 모든 체인에 대해 동일한 행사가격별 분석을 실행할 수 있다.