풋/콜 비율 계산 방법과 산출 공식
풋/콜 비율(put/call ratio)의 거래량과 미결제약정(open interest) 산출 공식을 설명합니다. 지수 옵션 수치가 높게 나타나는 이유와 이천이십육 년 기준의 정상 범위 해석 방법을 상세히 다룹니다.
풋/콜 비율의 정의와 산출 방식
풋/콜 비율(put/call ratio)은 특정 기간 동안 거래된 풋옵션(put option) 계약 수를 콜옵션(call option) 계약 수로 나누어 산출합니다. 예를 들어, 한 세션 동안 25만 건의 풋옵션과 50만 건의 콜옵션이 거래되었다면 해당 비율은 0.50이 됩니다. 이 지표에 관한 모든 논쟁, 즉 거래량(volume) 대비 미결제약정(open interest)의 비교나 주식(equity) 대비 지수(index)의 비교 등은 결국 나눗셈의 양쪽에 무엇을 포함할 것인가라는 문제로 귀결됩니다. 이 지표에 대한 기본적인 정의는 풋/콜 비율이란 무엇인가에서 확인할 수 있습니다. 이 페이지에서는 해당 산술 과정을 다룹니다.
풋/콜 비율(put/call ratio) 산출 공식, 단계별 설명
이 공식은 두 가지 입력값과 하나의 연산으로 구성됩니다. 거래된 풋옵션(put option) 수를 집계하고, 거래된 콜옵션(call option) 수를 집계한 뒤, 전자를 후자로 나눕니다. 풋옵션은 보유자에게 기초자산을 만기일 또는 그 이전에 정해진 행사가격(strike price)으로 매도할 권리를 부여하는 계약입니다. 콜옵션은 정해진 가격으로 매수할 권리를 부여합니다. 거래량(volume)은 해당 세션 동안 손바뀜이 일어난 계약 수를 의미하며, 다음 장이 열리면 영(0)으로 초기화됩니다.
집계 과정에서 가중치는 적용되지 않습니다. 외가격(out of the money) 주간 옵션의 1계약은 시장에서 가장 거래가 활발한 행사가격의 1계약과 동일하게 취급되며, 위험 노출 금액에 따른 규모 조정도 이루어지지 않습니다. 이 비율은 단순히 계약 수를 계산한 값입니다.
결과값을 결정짓는 핵심 선택은 어떤 계약을 집계 대상에 포함할지 여부입니다. 아래 표는 유동성이 높은 여덟 개 종목을 대상으로 한 달 동안 동일한 산술 방식을 적용한 결과입니다.
모든 수치 뒤에 숨겨진 정확한 SQL
SELECT
underlying_symbol AS symbol,
sumIf(volume, right_letter = 'P') AS put_volume,
sumIf(volume, right_letter = 'C') AS call_volume,
round(toFloat64(sumIf(volume, right_letter = 'P'))
/ toFloat64(sumIf(volume, right_letter = 'C')), 2) AS put_call_ratio
FROM
(
SELECT
underlying_symbol,
volume,
substring(ticker, length(ticker) - 8, 1) AS right_letter
FROM global_markets.options_greeks
WHERE date >= '2026-07-01'
AND date < '2026-08-01'
AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
AND volume > 0
)
GROUP BY symbol
HAVING call_volume > 0 AND put_volume > 0
ORDER BY put_call_ratio DESC2026년 7월 한 달간, IWM는 풋/콜 비율 3.11을 기록하며 여덟 개 종목 중 가장 높은 수치를 보였고, MSFT는 0.38로 가장 낮았습니다. 동일한 공식과 동일한 기간을 적용했음에도, 상위 종목과 하위 종목 간의 스프레드(spread)는 흔히 언급되는 일일 변동 폭보다 훨씬 컸습니다. 분류 기준이 명시되지 않은 비율 수치는 정보로서의 가치가 거의 없습니다.
거래량 기준 또는 미결제약정 기준
분자와 분모에는 두 가지 서로 다른 수치가 사용될 수 있습니다.
거래량 기준 방식은 해당 기간 동안 거래된 계약 수를 집계합니다. 이는 매 세션마다 0에서 시작하여 당일 시장 참여자들의 활동을 나타내는 유량(flow) 지표입니다. 시장 뉴스에서 다루는 모든 헤드라인 비율은 이 방식을 따릅니다.
미결제약정(open interest) 기준 방식은 풋옵션 미결제약정을 콜옵션 미결제약정으로 나눕니다. 여기서 미결제약정이란 개설된 후 아직 청산, 행사, 만기되지 않은 계약의 수를 의미합니다. 이는 당일의 활동이 아닌 누적된 포지션을 나타내는 저량(stock) 지표이며, 변화 속도가 완만합니다. 기존 보유자 간에 3만 개의 풋옵션이 거래되는 세션이 발생하면 거래량은 3만 개 증가하지만, 미결제약정은 변동이 없습니다. 옵션 거래량과 미결제약정에서 관련 회계 처리를 다룹니다.
화요일 종가 기준으로 풋옵션 미결제약정이 4만 개, 콜옵션 미결제약정이 5만 개라면 미결제약정 비율은 0.80입니다. 수요일에 풋옵션 3만 개와 콜옵션 1만 개가 거래되었다면 거래량 비율은 3.00이 됩니다. 두 수치 모두 같은 날 같은 옵션 체인을 설명하지만, 거의 네 배에 가까운 차이를 보이며 둘 다 정확한 수치입니다. 미결제약정 비율은 맥스 페인(max pain) 계산의 기초가 되기도 하는데, 이는 거래된 계약 수가 아닌 미결제 계약 수를 기준으로 행사가격에 가중치를 부여합니다.
유량 지표는 변동성이 큽니다. 아래는 동일한 한 달 동안 특정 ETF와 개별 주식 한 종목의 일일 거래량 비율을 나타낸 것입니다.
모든 수치 뒤에 숨겨진 정확한 SQL
SELECT
toString(d) AS session_date,
concat(formatDateTime(d, '%b '), toString(toDayOfMonth(d))) AS day_label,
round(toFloat64(sumIf(volume, sym = 'SPY' AND right_letter = 'P'))
/ toFloat64(sumIf(volume, sym = 'SPY' AND right_letter = 'C')), 2) AS spy_put_call_ratio,
round(toFloat64(sumIf(volume, sym = 'AAPL' AND right_letter = 'P'))
/ toFloat64(sumIf(volume, sym = 'AAPL' AND right_letter = 'C')), 2) AS aapl_put_call_ratio
FROM
(
SELECT
date AS d,
underlying_symbol AS sym,
volume,
substring(ticker, length(ticker) - 8, 1) AS right_letter
FROM global_markets.options_greeks
WHERE date >= '2026-07-01'
AND date < '2026-08-01'
AND underlying_symbol IN ('SPY', 'AAPL')
AND volume > 0
)
GROUP BY d
HAVING countIf(sym = 'SPY' AND right_letter = 'C') > 0
AND countIf(sym = 'AAPL' AND right_letter = 'C') > 0
ORDER BY dJul 1에 SPY는 1.1를 기록했고 AAPL은 0.49를 기록했습니다. Jul 31에는 두 종목이 각각 2와 0.55를 나타냈습니다. 22 세션 동안 일일 수치는 등락을 거듭하며, 두 데이터 계열은 차트상에서 서로 다른 수준에 위치합니다. 이 수준의 격차야말로 두 사실 중 더 유용한 정보입니다.
주식, 지수, ETP 및 전체: 네 가지 Cboe 비율
흔히 "풋/콜 비율(put/call ratio)"로 인용되는 수치는 Cboe 일일 시장 통계에서 산출되며, Cboe는 여러 종류의 비율을 발표합니다. Cboe가 명명한 분류는 다음과 같습니다.
- 주식 풋/콜 비율: 개별 주식에 대한 옵션.
- 지수 풋/콜 비율: SPX 및 VIX를 포함한 지수 옵션.
- 상장지수상품(ETP) 풋/콜 비율: SPY, QQQ, IWM 등이 포함된 ETF 옵션.
- 전체 풋/콜 비율: 모든 범주를 합산한 수치.
각 비율은 해당 범주 내의 총 풋옵션 거래량을 총 콜옵션 거래량으로 나누어 동일한 방식으로 계산되므로, 수치는 오직 어떤 항목이 포함되었는지에 따라 달라집니다. 각 범주는 서로 대체할 수 없습니다.
지수 옵션은 단일 거래로 전체 포트폴리오를 헤지(hedging)하기 위한 표준 수단입니다. 광범위한 주식 포트폴리오를 보유한 펀드는 이를 방어하기 위해 지수 풋옵션을 매수하며, 그에 상응하는 지수 콜옵션을 매수할 이유는 없습니다. 이러한 수요는 일방향으로 발생하며, 전적으로 지수 범주의 분자에 반영됩니다. 개별 주식 흐름은 이와 반대되는 경향을 보이는데, 개별 종목에 대한 콜옵션 매수가 거래량에서 크고 지속적인 비중을 차지하기 때문입니다. 두 범주는 구조적인 이유로 서로 다른 수준에서 형성되며, 한 범주의 수치를 다른 범주의 벤치마크와 비교하는 것은 이 지표를 사용할 때 가장 흔히 발생하는 오류입니다.
광범위한 시장 ETF는 지수 옵션과 동일한 헤지 역할을 수행하지만, 상장지수상품 범주로 집계됩니다. 아래 패널은 해당 분류의 양측에 대한 월간 중앙값을 추적합니다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH
daily AS
(
SELECT
d,
toFloat64(sumIf(volume, right_letter = 'P' AND sym IN ('SPY', 'QQQ', 'IWM')))
/ toFloat64(sumIf(volume, right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM'))) AS etf_ratio,
toFloat64(sumIf(volume, right_letter = 'P' AND sym NOT IN ('SPY', 'QQQ', 'IWM')))
/ toFloat64(sumIf(volume, right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM'))) AS stock_ratio
FROM
(
SELECT
date AS d,
underlying_symbol AS sym,
volume,
substring(ticker, length(ticker) - 8, 1) AS right_letter
FROM global_markets.options_greeks
WHERE date >= '2025-08-01'
AND date < '2026-08-01'
AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
AND volume > 0
)
GROUP BY d
HAVING countIf(right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM')) > 0
AND countIf(right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM')) > 0
)
SELECT
toString(toStartOfMonth(d)) AS month,
formatDateTime(toStartOfMonth(d), '%b %Y') AS month_label,
round(quantileExact(0.5)(etf_ratio), 2) AS etf_median_ratio,
round(quantileExact(0.5)(stock_ratio), 2) AS stock_median_ratio
FROM daily
GROUP BY month, month_label
ORDER BY month이 패널은 Aug 2025부터 Jul 2026까지의 기간을 다룹니다. 양쪽 끝 시점에서 ETF 바스켓의 일일 중앙값 비율은 1.0 근처 또는 그 이상이었으며, 첫 달에는 1.52, 마지막 달에는 1.49를 기록했습니다. 단일 주식 바스켓은 차트에 표시된 모든 12개월 동안 양쪽 끝 시점에서 1.0 미만을 유지했으며, 각각 0.6와 0.56이었습니다. 이러한 고정된 격차 때문에 벤치마크는 의미를 갖기 전에 반드시 해당 범주를 명시해야 합니다.
정상적인 풋/콜 비율(put/call ratio)의 기준
정상 범위는 단일 수치가 아닌 구간으로 정의되며, 이 구간은 지표 자체가 아닌 해당 자산군(category)에 따라 달라집니다. 아래 패널은 지난 12개월간의 모든 세션을 대상으로 각 바스켓별 일일 중앙값과 10퍼센타일 및 90퍼센타일 경계값을 산출한 결과입니다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH
daily AS
(
SELECT
d,
toFloat64(sumIf(volume, right_letter = 'P' AND sym IN ('SPY', 'QQQ', 'IWM')))
/ toFloat64(sumIf(volume, right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM'))) AS etf_ratio,
toFloat64(sumIf(volume, right_letter = 'P' AND sym NOT IN ('SPY', 'QQQ', 'IWM')))
/ toFloat64(sumIf(volume, right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM'))) AS stock_ratio,
toFloat64(sumIf(volume, right_letter = 'P'))
/ toFloat64(sumIf(volume, right_letter = 'C')) AS all_ratio
FROM
(
SELECT
date AS d,
underlying_symbol AS sym,
volume,
substring(ticker, length(ticker) - 8, 1) AS right_letter
FROM global_markets.options_greeks
WHERE date >= '2025-08-01'
AND date < '2026-08-01'
AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
AND volume > 0
)
GROUP BY d
HAVING countIf(right_letter = 'C' AND sym IN ('SPY', 'QQQ', 'IWM')) > 0
AND countIf(right_letter = 'C' AND sym NOT IN ('SPY', 'QQQ', 'IWM')) > 0
)
SELECT
p.2 AS category,
round(quantileExact(0.1)(p.3), 2) AS p10_ratio,
round(quantileExact(0.5)(p.3), 2) AS median_ratio,
round(quantileExact(0.9)(p.3), 2) AS p90_ratio
FROM
(
SELECT arrayJoin([
tuple(1, 'Broad market ETFs', etf_ratio),
tuple(2, 'Single stocks', stock_ratio),
tuple(3, 'All eight names', all_ratio)
]) AS p
FROM daily
)
GROUP BY p.1, p.2
ORDER BY p.1개별 주식 바스켓의 경우 중앙값은 0.58이었으며, 10퍼센타일은 0.45, 90퍼센타일은 0.76으로 나타났습니다. 광범위한 시장 ETF 바스켓은 분포 전반에서 더 높은 수치를 보였는데, 중앙값은 1.54이었고 경계값은 1.25와 1.86 사이였습니다.
그렇다면 1.20은 높은 수치일까요? 개별 주식 바스켓을 기준으로 보면 1.20이라는 수치는 90퍼센타일인 0.76를 상회하므로 이례적인 수준입니다. 반면 ETF 바스켓을 기준으로 하면 일상적인 수준에 가깝습니다. 앞서 언급한 헤지 물량이 집중되는 지수 카테고리에서는 동일한 수치라도 또 다른 기준점에 따라 평가해야 합니다. 하나의 숫자라도 어떤 카테고리에 속하느냐에 따라 해석이 시작되기도 전에 결론이 달라집니다.
이러한 범위는 시간이 지나며 변동합니다. 지난 12개월간 산출된 퍼센타일은 해당 기간의 특성만을 반영할 뿐입니다. 10년 전 작성된 기사의 벤치마크 범위를 그대로 사용하는 것은, 계약 구성이 완전히 다르고 당일 만기 옵션 거래(zero day expiry trading)가 거의 없었던 과거 시장의 기준을 적용하는 것과 같습니다. 최근 기간을 기준으로 퍼센타일을 재산출하는 것만이 특정 수치를 높다거나 낮다고 판단할 수 있는 유일한 객관적 방법입니다.
해석은 계산과는 별개의 작업입니다. 높은 수치를 약세 포지션으로 읽는 이들도 있지만, 역발상 투자자들은 이를 헤지 물량이 과도하게 몰린 상태로 해석하기도 합니다. 높은 풋/콜 비율이 강세 신호인지 여부에 관한 논의는 이러한 관점의 차이를 상세히 다루고 있습니다.
왜 21일 이동평균인가
단일 세션의 비율은 노이즈가 많은 시계열 데이터의 작은 표본에 불과하므로, 일반적으로 발표되는 버전은 평활화(smoothing) 과정을 거칩니다. 통상적인 관례는 대략 한 거래 월에 해당하는 21일 이동평균을 사용하는 것입니다. 이는 최근 21일간의 일일 비율을 합산하여 21로 나눈 뒤, 윈도우를 한 세션씩 이동시키는 방식입니다. 10일 및 50일 버전도 존재하며, 선택하는 기간에 따라 단일 일자의 급등락이 얼마나 반영될지가 결정됩니다.
두 가지 세부 사항을 알아둘 필요가 있습니다. 21일간의 일일 비율을 평균하는 것은 한 달간의 풋옵션 거래량을 콜옵션 거래량으로 나누는 산술 방식과는 다릅니다. 전자는 모든 세션에 동일한 가중치를 부여하지만, 후자는 거래가 활발한 세션에 더 큰 가중치를 둡니다. 또한 극단적인 수치에서 평활화된 값은 한 달간의 세션에 걸쳐 형성된 것이므로, 해당 극단치에서 벗어나는 속도 역시 느립니다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH
daily AS
(
SELECT
d,
toFloat64(sumIf(volume, right_letter = 'P'))
/ toFloat64(sumIf(volume, right_letter = 'C')) AS raw_ratio
FROM
(
SELECT
date AS d,
volume,
substring(ticker, length(ticker) - 8, 1) AS right_letter
FROM global_markets.options_greeks
WHERE date >= '2026-01-02'
AND date < '2026-08-01'
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'TSLA', 'KO')
AND volume > 0
)
GROUP BY d
HAVING countIf(right_letter = 'C') > 0
)
SELECT
session_date,
day_label,
daily_ratio,
ma21_ratio
FROM
(
SELECT
d,
toString(d) AS session_date,
concat(formatDateTime(d, '%b '), toString(toDayOfMonth(d))) AS day_label,
round(raw_ratio, 2) AS daily_ratio,
round(avg(raw_ratio) OVER (ORDER BY d ROWS BETWEEN 20 PRECEDING AND CURRENT ROW), 2) AS ma21_ratio
FROM daily
)
WHERE d >= '2026-04-01'
ORDER BY d톱니 모양의 선은 단일 종목 바스켓의 일일 비율이며, 부드러운 선은 21일 이동평균입니다. 표시된 첫 번째 세션인 Apr 1에 일일 수치는 1.04이었고, 평활화된 수치는 0.81이었습니다. Jul 31에는 해당 수치가 각각 0.56와 0.58으로 나타났습니다. 84 세션에 걸쳐 평균값은 원본 데이터가 움직인 거리의 일부만을 이동하는데, 이것이 바로 평활화된 수치를 인용하는 핵심 이유입니다.
패널 집계 방식
계약 유형은 옵션 심볼 자체에서 파생됩니다. 8자리 행사가격 코드 앞에 위치한 문자가 C이면 콜옵션(call option), P이면 풋옵션(put option)입니다. 해당 세션에 거래량이 보고된 계약만 집계에 포함되므로, 거래가 발생하지 않은 행사가격은 양측 모두에 영향을 주지 않습니다. 첫 번째 패널은 각 종목별로 한 달간의 총 풋옵션 거래량을 총 콜옵션 거래량으로 나눕니다. 나머지 패널들은 먼저 세션별로 하나의 비율을 계산한 뒤 해당 세션들을 요약하는데, 이는 발표되는 이동평균이 산출되는 방식과 일치합니다. 바스켓 구성: 광범위 시장 측면에서는 SPY, QQQ, IWM을, 단일 종목 측면에서는 AAPL, MSFT, NVDA, TSLA, KO를 포함합니다. 모든 패널에는 해당 데이터를 생성한 SQL이 정확히 명시되어 있습니다.
자주 묻는 질문(FAQ)
풋/콜 비율(put/call ratio)은 어떻게 계산합니까?
동일한 기간 동안의 풋옵션 계약 수를 콜옵션 계약 수로 나눕니다. 공개되는 대부분의 지표는 해당 세션의 거래량을 사용하므로, 수치가 0.65라면 콜옵션 100계약당 풋옵션 65계약이 거래되었음을 의미합니다. 미결제약정(open interest)을 기준으로 하는 버전은 거래된 계약이 아닌 미결제 상태인 계약 수를 사용하며, 이는 다른 성격의 정보를 제공합니다.
풋/콜 비율이 1을 넘으면 높은 수준입니까?
분류에 따라 다릅니다. 위 패널에 제시된 개별 주식 바스켓의 경우, 일일 수치의 90백분위수(90th percentile)가 0.76에 위치하므로 이 수준을 넘어서는 거래(prints)는 흔치 않습니다. 반면 포트폴리오 헤지가 풋옵션 쪽에 집중되는 광범위한 시장 ETF나 지수 옵션의 경우, 1 내외 혹은 그 이상의 수치는 일반적입니다.
거래량 기준 풋/콜 비율과 미결제약정 기준 풋/콜 비율의 차이는 무엇입니까?
거래량은 해당 세션 중에 체결된 계약 수를 집계하며 매일 아침 초기화됩니다. 미결제약정은 미결제 상태로 남아 있는 계약 수를 집계하며 날마다 이월됩니다. 거래량 기준 비율은 한 세션 내에서도 두 배로 변할 수 있는 반면, 미결제약정 기준 비율은 수 퍼센트 정도만 변동하므로, 같은 날에도 두 지표가 서로 다른 방향을 가리키는 경우가 많습니다.
금융 언론에서는 어떤 풋/콜 비율을 인용합니까?
대개 Cboe 주식 풋/콜 비율이나 전체 풋/콜 비율을 인용하며, 원시 일일 데이터보다는 21거래일 이동평균(moving average) 형태로 제시하는 경우가 가장 많습니다. 네 가지 Cboe 분류는 각기 다른 수준에서 움직이므로, 분류가 명시되지 않은 인용 수치는 어떠한 벤치마크와도 비교할 수 없습니다.
이 페이지의 모든 패널은 해당 데이터를 산출한 SQL과 함께 제공되므로, 각 수치는 행 단위로 검증할 수 있습니다. 다른 종목이나 더 긴 기간에 대해 동일한 산술 계산을 수행하려면, Strasmore 터미널에서 평이한 영어로 요청하십시오.