내재변동성 계산 방법과 반복 풀이
내재변동성은 폐쇄형 공식 없이 옵션 시장가격을 Black-Scholes 모형에 대입해 반복 계산으로 역산합니다. Python 검색 루프와 주의점을 설명합니다.
내재변동성은 공식으로 계산하지 않고 반복 계산으로 산출한다. 옵션의 시장가격을 변동성 수치로 역산하는 폐쇄형 해는 존재하지 않는다. 따라서 해법은 변동성을 추정한 뒤 Black-Scholes로 옵션 가격을 계산한다. 이후 해당 모형 가격과 시장 호가를 비교하고, 두 값이 센트 단위까지 일치할 때까지 이 과정을 반복한다. 이어지는 내용에서는 전체 산출 방법을 설명한다. 옵션 가격결정 함수, 표준 라이브러리만 사용하는 Python 검색 루프, 그리고 같은 계약에 대해 두 데이터 제공업체가 서로 다른 수치를 발표하는 이유를 다룬다.
내재변동성에 폐쇄형 공식이 없는 이유
Black-Scholes는 한 방향으로 작동한다. 현재가, 행사가격, 만기까지 남은 기간, 금리, 변동성을 입력하면 이론가격을 산출한다. 이 여섯 가지 중 다섯 가지는 관측할 수 있다. 변동성은 관측값이 아니다. 변동성은 현재부터 만기까지 주가가 얼마나 움직일지에 대한 가정이다.
트레이더는 문제를 역으로 푼다. 화면에는 가격이 표시되어 있고 변동성이 미지수다. 내재변동성은 Black-Scholes 가격이 옵션의 시장가격과 같아지도록 하는 변동성 입력값이다. 변동성 항인 시그마는 정규분포함수에 d1과 d2를 통해 두 번 들어가며, 어떤 식 변형으로도 시그마만 분리할 수 없다. 여기서 대수적 풀이가 끝난다. 이후에는 수치 탐색을 사용한다. 내재변동성이 측정하는 것에서는 그 의미를 설명하고, 이 페이지에서는 계산 원리를 다룬다.
이 모델의 두 가지 특성 덕분에 탐색은 수월하다. 변동성이 상승하면 예외 없이 콜옵션의 모델 가격도 상승하며, 그 움직임은 연속적이다. 계속 상승하기만 하는 값은 양쪽 경계를 좁혀 가며 범위를 특정할 수 있다.
계약별로 한 번씩 실행되는 솔버
출력값은 주식별 하나가 아니라 계약별로 하나씩 산출되며, 같은 종목의 같은 만기 구간에 속한 계약들도 서로 다른 결과를 낸다. 2026년 6월 30일에 거래된 잔존 기간 20~45일의 모든 Apple (AAPL) 옵션을 주가 대비 행사가격 비율별로 구분한 결과는 다음과 같다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH toFloat64(strike_price) / toFloat64(underlying_close) AS moneyness
SELECT multiIf(moneyness < 0.90, '0.80-0.90',
moneyness < 0.95, '0.90-0.95',
moneyness < 1.00, '0.95-1.00',
moneyness < 1.05, '1.00-1.05',
moneyness < 1.10, '1.05-1.10',
'1.10-1.20') AS strike_vs_spot,
round(100 * avg(toFloat64(implied_volatility)), 1) AS implied_vol_pct,
count() AS contract_count
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = toDate('2026-06-30')
AND days_to_expiry BETWEEN 20 AND 45
AND iv_converged = 1
AND volume > 0
AND moneyness BETWEEN 0.80 AND 1.20
GROUP BY strike_vs_spot
ORDER BY min(moneyness)행사가격 구간을 따라가면 0.80-0.90 구간은 35.5%로, 0.95-1.00 구간은 28.1%로, 1.10-1.20 구간은 27.3%로 산출됐다. 한 기업, 한 거래일, 6개의 결과다. 이 곡선의 굴곡에는 변동성 스큐라는 이름이 있으며, 종목별 단일 변동성으로는 이를 나타낼 수 없다.
솔버가 일치시켜야 하는 Black-Scholes 가격
S는 주가, K는 행사가격, T는 만기까지 남은 기간(연 단위), r은 무위험이자율이다. N()은 표준정규 누적분포다. 이는 표준정규분포에서 추출한 값이 특정 지점보다 작을 확률을 뜻한다. Python은 이 마지막 기능을 math.erf에 담고 있으므로 인터프리터만으로 충분하다.
apt-get update && apt-get install -y python3
루트 권한이 없는 시스템에서는 두 명령어 앞에 sudo을 붙인다. 그런 다음 다음 내용을 iv.py로 저장한다.
import math
def norm_cdf(x):
return 0.5 * (1.0 + math.erf(x / math.sqrt(2.0)))
def bs_call(S, K, T, r, sigma):
if T <= 0.0 or sigma <= 0.0:
return max(S - K, 0.0)
d1 = (math.log(S / K) + (r + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
d2 = d1 - sigma * math.sqrt(T)
return S * norm_cdf(d1) - K * math.exp(-r * T) * norm_cdf(d2)
이것이 전체 선도 모델이다. 변동성을 입력하면 가격이 나온다.
내재변동성 계산 방법: 단계별 설명
이분법을 먼저 익히는 것이 좋다. 발산하지 않으며 미적분도 필요하지 않다.
- 답의 범위를 0.01(연 1%)과 5.0(500%) 사이로 설정한다. 거래되는 모든 옵션은 이 범위 안에 있다.
- 설정한 범위의 중간값을 사용해 옵션 가격을 계산한다.
- 모델 가격이 시장 호가보다 높으면 추정치가 너무 높은 것이다. 범위의 상한을 중간값으로 낮춘다. 모델 가격이 시장 호가보다 낮으면 하한을 중간값까지 올린다.
- 모델 가격이 시장 호가와 1센트 이내로 일치하면 계산을 중단한다.
def implied_vol(price, S, K, T, r, lo=0.01, hi=5.0, tol=0.01):
for _ in range(100):
mid = 0.5 * (lo + hi)
diff = bs_call(S, K, T, r, mid) - price
if abs(diff) < tol:
return mid
if diff > 0.0:
hi = mid
else:
lo = mid
return 0.5 * (lo + hi)
# $100 stock, $100 strike, three months, 4% rates, $5.00 on the screen
print(round(implied_vol(5.00, 100.0, 100.0, 0.25, 0.04), 4))
python3 iv.py을 실행하면 약 0.226이 출력된다. 이는 해당 가상 호가의 내재변동성이 연 22.6%에 가깝다는 뜻이다. 반복할 때마다 범위가 절반으로 줄어든다. 폭이 4.99인 범위를 스무 번 절반으로 줄이면 0.00001보다 좁아진다. 따라서 100회 반복 제한에 도달하지 않는다.
뉴턴-랩슨법이 더 빠르게 수렴하는 이유와 한계
이분법은 모델이 이미 제공하는 정보를 버린다. Vega는 변동성이 한 단위 변할 때 옵션 가격이 변하는 폭이며, Black-Scholes 모형은 이를 폐쇄형으로 계산한다. 뉴턴-랩슨법은 이를 기울기로 활용한다. 가격 오차를 측정한 뒤 vega로 나누고, 그만큼 추정치를 조정한다.
def bs_vega(S, K, T, r, sigma):
d1 = (math.log(S / K) + (r + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
return S * math.sqrt(T) * math.exp(-0.5 * d1 * d1) / math.sqrt(2.0 * math.pi)
def implied_vol_newton(price, S, K, T, r, sigma=0.5):
for _ in range(20):
v = bs_vega(S, K, T, r, sigma)
if v < 1e-8:
return None # 기울기가 더 이상 없으므로 이분법에 작업을 넘긴다
step = (bs_call(S, K, T, r, sigma) - price) / v
sigma -= step
if sigma <= 0.0:
return None # 조정 폭이 지나쳐 비현실적인 영역으로 들어갔다
if abs(step) < 1e-6:
return sigma
return None
등가격 부근에서는 이분법이 열두 번 정도 반복해야 하는 반면, 뉴턴-랩슨법은 세 번 또는 네 번 만에 수렴한다. 실패 원인은 분모에 있다. 행사가격이 주가에서 멀어질수록 vega가 작아진다. 동일한 AAPL 계약을 대상으로 각 구간의 평균 vega를 등가격 기준의 백분율로 나타내면 다음과 같다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH toFloat64(strike_price) / toFloat64(underlying_close) AS moneyness,
(
SELECT avg(toFloat64(vega))
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = toDate('2026-06-30')
AND days_to_expiry BETWEEN 20 AND 45
AND iv_converged = 1
AND volume > 0
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.025
) AS atm_vega
SELECT multiIf(moneyness < 0.90, '0.80-0.90',
moneyness < 0.95, '0.90-0.95',
moneyness < 1.00, '0.95-1.00',
moneyness < 1.05, '1.00-1.05',
moneyness < 1.10, '1.05-1.10',
'1.10-1.20') AS strike_vs_spot,
round(100 * avg(toFloat64(vega)) / atm_vega, 1) AS vega_pct_of_atm,
count() AS contract_count
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = toDate('2026-06-30')
AND days_to_expiry BETWEEN 20 AND 45
AND iv_converged = 1
AND volume > 0
AND moneyness BETWEEN 0.80 AND 1.20
GROUP BY strike_vs_spot
ORDER BY min(moneyness)양쪽 외가격 구간에서는 민감도가 등가격 vega의 일부에 불과하다. 0.80-0.90 구간에서는 등가격 vega의 33.1%, 1.10-1.20 구간에서는 31.6%에 해당한다. 이처럼 작은 값으로 가격 오차를 나누면 조정 폭이 지나치게 커진다. 추정치가 0 아래로 내려갈 수도 있으며, 그 지점에서는 모형이 더 이상 유효한 결과를 제시하지 못한다. 실제 운용 환경의 솔버는 두 방법을 결합한다. 먼저 구간을 설정한 뒤 뉴턴-랩슨법으로 정밀하게 조정한다. 그리스 민감도 자체에 대해서는 Vega에서 설명한다.
왜 두 출처가 서로 다른 내재변동성을 보고하는가
모형은 공개되어 있고 산술 계산도 정해져 있으므로, 의견 차이는 입력값에서 발생한다.
- 중간값과 최근 체결가의 차이. 계산에는 하나의 가격이 필요하다. 어떤 계약의 매수호가가 $2.00, 매도호가가 $2.20이면 중간값은 $2.10이다. 반면 최근 체결가는 90분 전의 $2.02일 수 있다. 이런 계약에서는 가격 10센트 차이가 변동성 1포인트보다 더 큰 영향을 미친다.
- 배당과 캐리. 위 함수는 배당을 지급하지 않는 주식의 유럽형 콜옵션 가격을 산출한다. 만기 전에 배당이 지급되면 선도가격이 낮아진다. 각 거래 데스크는 자체 조정 방식과 금리를 적용한다.
- 미국형 조기 행사. 미국 개별주식 옵션은 어느 거래일에나 행사할 수 있다. 이 권리는 유럽형 공식으로는 반영할 수 없는 가치를 지닌다. 이를 무시하는 계산기는 그 차이를 변동성에 반영한다. 이항 트리는 행사 권리를 직접 가격에 반영한다.
- 오래된 호가. 화요일에 마지막으로 거래된 행사가격에도 여전히 호가가 표시될 수 있다. 계산기는 전달받은 값을 사실로 간주한다.
수렴 여부를 확인하면 마지막 두 문제가 드러난다. 아래 패널은 2026년 6월 30일 기준으로 널리 거래되는 8개 종목을 대상으로, 잔존 만기가 20~45일인 거래 계약을 집계했다. 그리고 등가격 변동성과 계산이 수렴한 계약의 비중을 함께 제시한다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) AS distance_from_spot
SELECT underlying_symbol AS symbol,
round(100 * avgIf(toFloat64(implied_volatility), iv_converged = 1 AND distance_from_spot < 0.05), 1) AS atm_iv_pct,
round(100 * countIf(iv_converged = 1) / count(), 1) AS solved_pct,
count() AS contract_count
FROM global_markets.options_greeks
WHERE date = toDate('2026-06-30')
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'TSLA', 'SPY', 'KO', 'JNJ')
AND days_to_expiry BETWEEN 20 AND 45
AND volume > 0
GROUP BY symbol
HAVING countIf(iv_converged = 1 AND distance_from_spot < 0.05) > 0
ORDER BY atm_iv_pct DESCTSLA은 8개 종목 가운데 47.7%로 가장 높은 등가격 변동성을 기록했다. 최저치는 14.4%를 기록한 SPY였다. TSLA 옵션 체인에서는 거래된 계약의 97.8%에서 수렴한 결과가 산출됐다. 나머지는 계산기에 입력된 가격으로는 어떤 변동성을 적용해도 재현할 수 없는 행사가격이다. 내재가치보다 낮은 호가나 교차 시장인 경우도 포함된다. 이 수치가 높은 수준인지 여부는 별도의 문제다. 30% IV가 높은 수준인가에서 이를 다루며, 예상 변동폭에서는 이를 달러 범위로 환산한다.
같은 계약을 매 거래일 다시 산출하다
내재변동성에는 저장된 값이 없다. 화면에 표시된 가격을 바탕으로 매번 다시 계산한다. 아래는 2026년 7월 17일 만기인 AAPL의 거래량이 가장 많은 계약을 6월 1일부터 만기까지 추적한 결과다. 행사가격과 만기일은 변하지 않았다.
모든 수치 뒤에 숨겨진 정확한 SQL
WITH (
SELECT ticker
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = toDate('2026-06-30')
AND expiration_date = toDate('2026-07-17')
AND iv_converged = 1
AND volume > 0
ORDER BY volume DESC
LIMIT 1
) AS pinned_contract
SELECT date,
round(100 * avg(toFloat64(implied_volatility)), 1) AS implied_vol_pct,
round(avg(days_to_expiry)) AS days_to_expiry
FROM global_markets.options_greeks
WHERE ticker = pinned_contract
AND date BETWEEN toDate('2026-06-01') AND toDate('2026-07-17')
AND iv_converged = 1
AND volume > 0
GROUP BY date
ORDER BY date29개 거래 세션 동안 계산된 내재변동성은 25.1%에서 시작했다. 당시 잔존 기간은 46일이었다. 이후 26.6%에서 마감했으며, 남은 기간은 4일이었다. 이 선 위의 각 지점은 해당 거래 세션의 호가를 위에서 설명한 반복 계산 과정에 대입해 산출한 결과다. 티커별 페이지에서도 동일한 방식으로 계산한 결과를 제공한다. AAPL 내재변동성은 전체 옵션 체인에 대해 매일 이를 계산한다. 따라서 독자는 이 페이지의 코드로 해당 페이지에 표시된 수치를 모두 재현할 수 있다.
내재변동성 계산 FAQ
내재변동성을 계산하는 공식이 있습니까?
없습니다. Black-Scholes 모형은 변동성을 옵션 가격으로 변환하지만, 이 변환에는 기본적인 역함수가 없습니다. 시그마가 정규분포 함수 안에 두 번 포함되기 때문입니다. 여기서든 다른 곳에서든 확인하는 모든 내재변동성 수치는 반복 해법을 통해 산출됩니다.
계산에는 몇 번의 반복이 필요합니까?
이분법을 한 번 수행할 때마다 구간이 절반으로 줄어듭니다. 따라서 0.01에서 5.0까지의 범위는 스무 번의 반복으로 0.00001 미만까지 좁혀집니다. 호가를 가장 가까운 센트 단위까지 일치시키는 데는 보통 열두 번 정도가 필요합니다. Newton-Raphson 방법은 등가격 부근에서 세 번 또는 네 번이면 수렴하지만, 베가가 작을 때는 단계 계산이 불안정해질 수 있습니다.
내 브로커와 데이터 공급업체의 내재변동성이 서로 다른 이유는 무엇입니까?
두 곳이 서로 다른 입력값을 사용했기 때문입니다. 대표적인 차이는 중간호가와 최근 체결가 중 무엇을 사용했는지, 금리와 배당 가정을 어떻게 설정했는지, 그리고 모형이 미국형 옵션의 조기행사를 반영하는지 여부입니다. 거래량이 적은 행사가에서는 오래된 호가만으로도 결과가 몇 포인트 달라질 수 있습니다.
같은 행사가의 콜옵션과 풋옵션은 동일한 내재변동성을 제공합니까?
이론적으로는 그렇습니다. 풋-콜 패리티가 동일한 행사가와 만기에서 두 옵션의 관계를 규정하기 때문입니다. 그러나 실제로는 두 호가가 독립적으로 형성됩니다. 따라서 계산된 수치가 약간 다를 수 있으며, 이것이 옵션 체인 전체의 평균이 데이터 공급업체마다 달라지는 또 다른 이유입니다.
시장 데이터 없이 내재변동성을 계산할 수 있습니까?
가상의 호가라면 가능합니다. 위 코드는 사용자가 직접 입력한 가격, 행사가, 현물 가격, 만기까지의 기간, 금리를 사용합니다. 실시간 데이터 공급업체의 수치와 일치시키는 것이 더 어렵습니다. 공급업체가 사용한 것과 동일한 입력값이 필요하기 때문입니다.
이 페이지의 모든 패널에는 해당 패널의 SQL이 저장되어 있습니다. 패널을 연 뒤 Strasmore 터미널에서 실시간 옵션 체인에 동일한 계산을 실행하십시오.