높은 put/call 비율은 강세 신호인가
높은 put/call 비율을 역발상 강세 신호로 보는 이유와 함께, 개별 종목 및 지수 옵션의 백분위수 구간과 극단값 이후 실제 흐름을 살펴봅니다.
높은 put/call 비율은 전형적인 역발상 강세 신호다. 풋옵션 매수가 이례적으로 많다는 것은 시장 참여자들이 이미 하락에 대비했다는 의미로 해석된다. 그러나 이 해석을 실제 매매에 적용할 때 한 가지 문제가 생긴다. ‘높다’고 볼 수 있는 기준값이 정해져 있지 않다는 점이다. 화면에 표시된 1.15가 개별 종목 옵션에서는 극단적인 수준일 수 있지만, 지수 상품에서는 평범한 거래일의 수치일 수 있다.
이 질문에 답하려면 비교 기준이 되는 분포가 필요하다. 이 페이지는 두 시장 모두에 대해 기준 분포를 제시한 뒤, 높은 수치 이후 어떤 흐름이 나타났는지 측정한다. put/call 비율 설명에서는 이 비율의 산출 방식을 다룬다. 아래 내용은 모두 해당 정의를 바탕으로 한다.
측정 방식과 관련해 두 가지를 짚어둘 필요가 있다. 여기서 제시하는 모든 비율은 해당일에 거래된 계약 수를 기준으로 산출한다. 따라서 거래량 비율이다. 미결제약정은 아직 청산되지 않은 포지션을 집계하며, 별도의 기준에 해당한다(거래량과 미결제약정에서 두 개념의 차이를 설명한다). 또한 수치는 전체 시장의 거래 내역이 아니라, 개별 종목 열 종목과 광범위한 시장을 추종하는 ETF 세 개로 구성된 고정 바스켓에서 산출했다. 따라서 마지막 소수점보다 분포의 형태를 중심으로 해석해야 한다.
높은 put/call ratio는 어느 수준인가?
백분위수는 특정 수준만으로는 알 수 없는 질문에 답해준다. 아래 곡선은 2022년 1월부터 2026년 7월까지 모든 거래일을 포괄하며, 각 포트폴리오에 대해 거래일별 ratio를 하나씩 보여준다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH book_days AS (
SELECT date AS day,
if(underlying_symbol IN ('SPY', 'QQQ', 'IWM'), 'index_etf', 'equity') AS book,
sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'P') AS put_volume,
sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'C') AS call_volume
FROM global_markets.options_greeks
WHERE date >= toDate('2022-01-01')
AND date <= toDate('2026-07-31')
AND volume > 0
AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'AMZN',
'META', 'TSLA', 'GOOGL', 'JPM', 'KO', 'XOM')
GROUP BY day, book
HAVING call_volume > 0
),
paired AS (
SELECT day,
toFloat64(sumIf(put_volume, book = 'equity'))
/ toFloat64(sumIf(call_volume, book = 'equity')) AS equity_pcr,
toFloat64(sumIf(put_volume, book = 'index_etf'))
/ toFloat64(sumIf(call_volume, book = 'index_etf')) AS index_pcr
FROM book_days
GROUP BY day
HAVING sumIf(call_volume, book = 'equity') > 0
AND sumIf(call_volume, book = 'index_etf') > 0
),
curves AS (
SELECT arrayMap(v -> round(v, 2),
quantilesDeterministic(0.05, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95, 0.99)
(equity_pcr, cityHash64(day))) AS eq,
arrayMap(v -> round(v, 2),
quantilesDeterministic(0.05, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95, 0.99)
(index_pcr, cityHash64(day))) AS idx
FROM paired
)
SELECT z.1 AS percentile,
z.2 AS equity_pcr,
z.3 AS index_etf_pcr
FROM (
SELECT arrayJoin(arrayZip(['p05', 'p10', 'p25', 'p50', 'p75', 'p90', 'p95', 'p99'], eq, idx)) AS z
FROM curves
)개별 종목 바스켓에서 거래일별 put/call ratio의 중앙값은 콜옵션 1계약당 0.67계약이었다. 상위 10% 거래일은 0.89부터 시작했고, 가장 극단적인 상위 1%는 1.34를 웃돌았다. 낮은 구간도 기준을 설정하는 데 유용하다. 거래일 20개 중 1개는 0.48 이하로 마감했다.
ETF 열은 곡선의 모든 지점에서 다른 분포를 보인다. ETF의 거래일별 중앙값은 1.45로 나타났다. 이는 개별 종목 중앙값이 크게 밑도는 일대일 기준선보다 높은 수준이다. ETF의 상위 10% 구간은 1.77부터 시작했다. 어느 포트폴리오의 수치인지 밝히지 않은 ratio는 사실상 의미가 거의 없다. 1.15라는 거래 수치는 어느 열에서 나왔는지에 따라 전혀 다른 의미를 갖는다.
지수 비율이 1을 웃도는 것은 정상이고 주식 비율이 1을 웃도는 것은 그렇지 않은 이유
같은 거래량을 기초자산별로 나누면 수치가 명확하게 갈린다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH symbol_days AS (
SELECT underlying_symbol AS symbol,
date AS day,
sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'P') AS put_volume,
sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'C') AS call_volume
FROM global_markets.options_greeks
WHERE date >= toDate('2026-01-01')
AND date <= toDate('2026-07-31')
AND volume > 0
AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'AMZN',
'META', 'TSLA', 'GOOGL', 'JPM', 'KO', 'XOM')
GROUP BY symbol, day
HAVING call_volume > 0
)
SELECT symbol,
round(toFloat64(sum(put_volume)) / toFloat64(sum(call_volume)), 2) AS put_call_ratio,
round(100 * countIf(put_volume > call_volume) / count(), 1) AS above_one_pct,
count() AS observations
FROM symbol_days
GROUP BY symbol
ORDER BY put_call_ratio DESC2026년 첫 7개월 동안 IWM는 콜옵션 1건당 풋옵션 2.73건으로 집계돼 표의 최상단에 올랐다. 144개 거래일 가운데 98.6%일에는 풋/콜 비율이 1을 웃돌았다. 최하단에서는 XOM가 0.38로 거래됐고, 2.8%의 거래일에 비율이 1을 웃돌았다.
이 격차는 구조적이다. 광범위한 시장을 추종하는 ETF 옵션은 포트폴리오 헤지에 사용된다. 200개 종목을 보유한 운용자는 모든 보유 종목에 대한 풋옵션을 매수하기보다 지수 풋옵션을 매수한다. 이 거래에는 반대편에서 대응하는 콜옵션 거래가 없을 수 있다. 반면 개별 주식 옵션 거래량은 상승 여력을 확보하기 위한 콜옵션 매수와 이미 보유한 주식에 대한 콜옵션 매도 쪽으로 기운다. ‘전체’ 비율은 두 거래 장부를 합산한 수치다. 따라서 두 비율의 중간에 위치하며, 투자심리뿐 아니라 당일 상품 구성에 따라서도 움직인다.
한 가지 추가로 알아둘 점은 비율의 수준 자체가 한 단계 달라졌다는 사실이다. 현재 지수와 ETF 거래량에서 당일 만기 옵션(0DTE 옵션)이 차지하는 비중이 크다. 과거 널리 사용되던 기준이 정립될 당시에는 이 범주의 거래가 지금과 같은 규모로 이뤄지지 않았다. 거래 구성 자체가 달라진 시장에서는 과거의 기준을 그대로 적용할 수 없다.
높은 put/call ratio는 강세 신호인가? 극단값 이후에 나타난 현상
역발상 해석은 검증할 수 있다. 각 거래일을 해당일의 주식 비율에 따라 5개 구간으로 나눈 뒤, 이후 5거래일과 20거래일 동안 S&P 500 추종 상품이 어떻게 움직였는지 측정한다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH raw AS (
SELECT date AS day,
sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'P') AS put_volume,
sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'C') AS call_volume
FROM global_markets.options_greeks
WHERE date >= toDate('2022-01-01')
AND date <= toDate('2026-07-31')
AND volume > 0
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'META',
'TSLA', 'GOOGL', 'JPM', 'KO', 'XOM')
GROUP BY day
HAVING call_volume > 0
),
equity_pcr AS (
SELECT day, toFloat64(put_volume) / toFloat64(call_volume) AS pcr
FROM raw
),
spy_daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
toFloat64(argMax(close, window_start)) AS close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2022-01-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-08-01')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY day
),
forward AS (
SELECT day,
close,
any(close) OVER (ORDER BY day ASC ROWS BETWEEN 5 FOLLOWING AND 5 FOLLOWING) AS close_5,
any(close) OVER (ORDER BY day ASC ROWS BETWEEN 20 FOLLOWING AND 20 FOLLOWING) AS close_20
FROM spy_daily
),
joined AS (
SELECT p.day AS day,
p.pcr AS pcr,
100 * (f.close_5 / f.close - 1) AS fwd_5d_pct,
100 * (f.close_20 / f.close - 1) AS fwd_20d_pct
FROM equity_pcr AS p
INNER JOIN forward AS f ON p.day = f.day
WHERE f.close_5 > 0 AND f.close_20 > 0
),
cuts AS (
SELECT quantilesDeterministic(0.2, 0.4, 0.6, 0.8)(pcr, cityHash64(day)) AS q
FROM joined
)
SELECT multiIf(pcr < q[1], 'lowest fifth',
pcr < q[2], 'second fifth',
pcr < q[3], 'middle fifth',
pcr < q[4], 'fourth fifth',
'highest fifth') AS pcr_band,
count() AS observations,
round(min(pcr), 2) AS band_floor_ratio,
round(quantileDeterministic(0.5)(fwd_5d_pct, cityHash64(day)), 2) AS fwd_5d_median_pct,
round(quantileDeterministic(0.5)(fwd_20d_pct, cityHash64(day)), 2) AS fwd_20d_median_pct,
round(quantileDeterministic(0.25)(fwd_20d_pct, cityHash64(day)), 2) AS fwd_20d_p25_pct,
round(quantileDeterministic(0.75)(fwd_20d_pct, cityHash64(day)), 2) AS fwd_20d_p75_pct
FROM joined CROSS JOIN cuts
GROUP BY pcr_band
ORDER BY band_floor_ratio ASC가장 차분한 거래일 5분위는 0.34에서 시작하고, 가장 활발한 거래일 5분위는 0.81에서 시작한다. 따라서 상위 구간에는 역발상 투자자가 과열됐다고 판단할 모든 수치가 포함된다. 해당 226거래일 이후 20거래일 수익률의 중앙값은 3%였다. 가장 차분한 5분위 이후의 수치는 0.91%였다. 5거래일 기준으로는 두 구간의 수치가 각각 0.82%과 0.3%였다.
중앙값만으로는 중요한 부분이 가려진다. 상위 5분위에서 20거래일 수익률의 중간 50% 구간은 -1.82%에서 5.71%까지였다. 가장 차분한 5분위에서는 중간 50% 구간이 -0.83%에서 2.67%까지였다. 두 구간은 상당 부분 겹친다. 거래일이 어느 구간에 속하는지는 분포의 중심을 움직인다. 그러나 그 중심을 둘러싼 범위는 거의 좁히지 못한다. 경험칙은 바로 이 부분을 빠뜨린다.
표본 가중치와 관련해 한 가지 유의할 점이 있다. 2022년 1월부터 2026년 7월까지의 기간에는 한 차례의 약세장과 그 이후의 회복장이 포함된다. 구간별 표본은 대략 226거래일이다. 이는 유효한 표본이지만, 시장 역사상 하나의 국면에 해당한다.
극단적 수치는 시장 저점에 몰리는가?
극단적 수치는 하락한 달에 몰린다. 이는 다른 주장이다. 2022년 이후의 모든 월을 해당 월 중 트래커가 어떻게 움직였는지에 따라 그룹화한 뒤, 각 그룹에 상위 10% 구간의 풋/콜 수치가 몇 건 포함됐는지 집계했다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH raw AS (
SELECT date AS day,
sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'P') AS put_volume,
sumIf(volume, upper(substring(ticker, length(ticker) - 8, 1)) = 'C') AS call_volume
FROM global_markets.options_greeks
WHERE date >= toDate('2022-01-01')
AND date <= toDate('2026-07-31')
AND volume > 0
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'META',
'TSLA', 'GOOGL', 'JPM', 'KO', 'XOM')
GROUP BY day
HAVING call_volume > 0
),
equity_pcr AS (
SELECT day, toFloat64(put_volume) / toFloat64(call_volume) AS pcr
FROM raw
),
cut AS (
SELECT quantileDeterministic(0.90)(pcr, cityHash64(day)) AS p90
FROM equity_pcr
),
by_month AS (
SELECT toStartOfMonth(day) AS month_start,
countIf(pcr >= cut.p90) AS extreme_reads,
quantileDeterministic(0.5)(pcr, cityHash64(day)) AS median_pcr
FROM equity_pcr CROSS JOIN cut
GROUP BY month_start
),
spy_daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
toFloat64(argMax(close, window_start)) AS close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2022-01-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY day
),
spy_month AS (
SELECT toStartOfMonth(day) AS month_start,
100 * (argMax(close, day) / argMin(close, day) - 1) AS move_pct
FROM spy_daily
GROUP BY month_start
)
SELECT multiIf(s.move_pct <= -3, 'index down 3% or more',
s.move_pct < 0, 'index down under 3%',
s.move_pct < 3, 'index up under 3%',
'index up 3% or more') AS index_move_bucket,
count() AS observations,
round(avg(m.extreme_reads), 1) AS top_decile_reads_avg,
round(quantileDeterministic(0.5)(m.median_pcr, cityHash64(m.month_start)), 2) AS typical_pcr_ratio
FROM by_month AS m
INNER JOIN spy_month AS s ON m.month_start = s.month_start
GROUP BY index_move_bucket
ORDER BY min(s.move_pct) ASC트래커가 3% 이상 하락한 달에는 상위 10% 구간의 수치가 월평균 4.2건 나타났다. 반면 3% 이상 상승한 달에서는 1.9건이었다. 각 그룹의 일별 수치 중앙값은 마지막 열에 제시했다. 최악의 그룹은 0.75, 최선의 그룹은 0.62이다. 표의 양 끝에는 각각 12개월과 22개월이 포함된다.
극단적인 풋/콜 수치와 가격 하락은 함께 나타난다. 이는 동시 발생이다. 앞선 섹션의 선행 수치가 그 의미를 보여준다. 이 비율은 같은 날의 시장 흐름을 측정하는 지표다. 따라서 비율의 급등은 하락에 앞서기보다 하락 구간 안에서 나타난다. 저점이라는 표시는 사후에 붙는다.
분포와 비교해 수준 읽기
위 수치에서 두 가지 원칙을 확인할 수 있다.
첫째, 같은 기준끼리 비교해야 한다. 어떤 수치의 의미는 동일한 자료가 비슷한 기간에 기록한 과거 분포와 비교할 때만 드러난다. 이는 백분위 표가 제공하는 정보이며, 기억에 의존한 임계값으로는 얻을 수 없다.
둘째, 분모를 확인해야 한다. 풋 매수 규모가 변하지 않아도 콜 거래량이 급증하면 비율은 하락한다. 비율의 하락과 급등은 각각 분수의 한쪽 항만 움직여도 나타날 수 있다. 따라서 풋 거래량과 콜 거래량을 따로 확인해야 계산 과정을 명확히 파악할 수 있다.
이 원칙은 단순한 숫자로 제시되는 모든 투자심리 지표에 적용된다. VIX와 30% 내재변동성 체결값은 각각의 고유한 분포와 함께 보지 않으면 해석할 수 없다. 또한 역발상 투자심리 규칙은 기준 수준을 추정하지 않고 측정할 때만 데이터상 유효성을 유지한다.
자주 묻는 질문
높은 put/call ratio는 강세 신호인가?
역발상 관점에서는 풋옵션 매수가 집중됐다는 점을 시장 참여자들이 이미 하락에 대비해 포지션을 구축했다는 신호로 해석한다. 위에서 제시한 개별 종목 바스켓을 기준으로 보면, 수치가 상위 5분위에 속한 세션 이후 S&P 500 추종 상품의 20거래일 수익률 중앙값은 3%였다. 가장 조용한 하위 5분위 이후에는 0.91%였다. 상위 5분위 결과의 중간 50% 구간은 -1.82%에서 5.71%까지였다.
정상적인 put/call ratio는 얼마인가?
어떤 옵션을 집계하느냐에 따라 전적으로 달라진다. 2022년부터 2026년 7월까지 10개 대표 개별 종목으로 구성한 바스켓에서 세션별 중앙값은 콜옵션 한 계약당 풋옵션 0.67계약이었다. 같은 세션의 3개 광범위 시장 ETF에서는 중앙값이 1.45이었다.
지수 put/call ratio가 주식 put/call ratio보다 높은 이유는 무엇인가?
광범위한 지수와 ETF 옵션은 포트폴리오 헤지에 주로 사용된다. 헤지 목적으로 지수 풋옵션을 매수할 때 이에 대응하는 콜옵션 거래가 반드시 함께 발생하는 것은 아니다. 개별 주식 옵션 거래량은 상승 여력을 확보하기 위한 콜옵션 매수와 기존 보유 주식에 대한 콜옵션 매도 비중이 높다. 이에 따라 해당 장부의 비율은 더 낮아진다.
put/call ratio는 시장 타이밍 판단에 유효한가?
위의 측정 결과는 각 분위의 수치 이후 나타난 결과 분포를 보여준다. 어느 한 구간 안의 결과 범위가 구간별 중앙값 간 차이보다 훨씬 넓다. 수치가 상위 10%에 속한 경우에는 지수가 하락으로 마감한 달도 집중됐다. 가장 약한 그룹에서는 월간 하락률이 4.2였다.
거래량 기준 put/call ratio와 미결제약정 기준 put/call ratio의 차이는 무엇인가?
거래량 기준 비율은 한 세션 동안 거래된 계약을 집계하므로 매일 새로 산출되고 빠르게 변한다. 미결제약정 기준 비율은 아직 청산되지 않은 포지션을 집계하므로 변화가 느리고 자체적인 수준을 형성한다. 두 지표는 서로 대체할 수 없다. 한 지표에서 사용한 기준값을 다른 지표에 적용하면 잘못 해석하게 된다.
이 수치는 어떻게 산출되는가
- 출처: 세션별 옵션 계약당 한 행으로 구성된 데이터이며, 해당 세션의 거래량을 포함한다. OCC 계약 코드에서 풋옵션과 콜옵션을 구분한다. 마지막 8개 문자는 행사가격이고, 그 앞의 문자는 콜옵션의 경우 C, 풋옵션의 경우 P다. 정확한 테이블과 필터는 각 패널 아래의 SQL을 열어 확인할 수 있다.
- 이 페이지의 모든 비율은 거래량 기준 비율이다. 미결제약정은 계산에 포함되지 않으므로, 여기에는 미결제약정 기준 비율이 없다.
- 내재변동성 품질 필터는 적용하지 않았다. 이 패널은 변동성을 측정하는 것이 아니라 거래 활동을 집계하므로, 계약은 거래량만을 기준으로 포함한다.
- 바스켓은 개별 주식 장부의 경우 AAPL, MSFT, NVDA, AMZN, META, TSLA, GOOGL, JPM, KO, XOM으로 구성된다. 지수 ETF 장부에는 SPY, QQQ, IWM이 포함된다. 거래소가 발표하는 비율은 전체 시장을 대상으로 하며 SPX 같은 지수 상품도 포함한다. 따라서 그 비율의 수준은 이 데이터와 다르다.
- 지수 가격은 S&P 500 추종 상품의 각 일자 정규장 마지막 체결가다. 표본의 마지막 20개 세션에는 이후 20개 세션의 수익률이 아직 없으므로 선도 수익률 계산에서 제외한다. 월간 변동률은 각 월의 첫 세션 종가부터 마지막 세션 종가까지 계산한다.
위의 모든 패널은 해당 패널을 뒷받침하는 SQL을 펼쳐 보여준다. 동일한 분위수 쿼리는 Strasmore 터미널에서 추적하는 모든 기초자산에 적용할 수 있다.