옵션 가격결정에서 Black-Scholes·이항트리·그릭스를 운영하는 법
Black-Scholes와 이항트리의 적용 범위, Delta·Gamma·Vega 헤지, 내재변동성과 검증 절차를 옵션 가격결정 실무 관점에서 정리한다.
2026-08-14 · 최초 발행 2024-04-29
가격은 모델 선택 이전에 입력과 권리 조건에서 갈린다
옵션 가격결정은 위험중립측도 아래에서 미래 페이오프의 할인 기대값을 구하는 과정이다. 기초자산 가격, 행사가격, 만기, 무위험이자율, 배당, 변동성을 받아 권리 조건에 맞는 모델을 고르고 가격과 그릭스를 계산한다.
Black-Scholes(BS)는 로그정규 수익률과 상수 변동성·금리, 연속 배당을 가정해 유럽형 옵션의 닫힌해(Closed-form)를 제공한다. 반면 Binomial Tree(BT)는 이산시간 격자를 따라 값을 계산하는 수치해법이다. 조기행사가 가능한 미국형 옵션이나 배당 이벤트, 장벽처럼 경계조건이 복잡한 경우에 유리하다.
그릭스는 가격 자체와 별개로 장부가 어떤 입력 변화에 노출돼 있는지 보여주는 민감도 지표다. 실무에서는 가격 민감도인 Delta, 델타의 곡률인 Gamma, 변동성 민감도인 Vega가 헤지와 한도 관리의 중심이 된다.
BS의 가정과 이항트리의 격자를 구분해 사용한다
BS는 연속 거래와 무마찰시장, 상수 σ·r·q를 전제하며 유럽형 권리행사에 맞춰져 있다. 닫힌해를 사용하므로 수치 오차를 최소화할 수 있고 초저지연 계산에 적합하다. 다만 입력값, 특히 σ의 추정에 민감하다.
BT는 시간 분할 N을 늘릴수록 이론값에 수렴한다. 조기행사, 배당 이벤트, 장벽 조건을 격자 안에 반영하기 쉽지만 계산 복잡도는 O(N^2)이다. u/d/p 구성과 N을 조정해 수렴성과 안정성을 확인해야 하며, 확률 p가 [0,1] 범위를 벗어나지 않게 관리해야 한다.
| 관점 | Black-Scholes | Binomial Tree |
|---|---|---|
| 계산 성능 | 닫힌해, 마이크로초~밀리초 단위 계산 | O(N^2), N 증대 시 지연 증가 |
| 대량 처리 | 대량 그리드 계산에 유리 | 경계조건이 복잡해질수록 자원 증가 |
| 적용 조건 | 유럽형, 상수 σ/r/q 가정에서 강점 | 미국형·배당 이벤트·장벽 반영 용이 |
| 안정성 관리 | σ, T 등 입력 민감도가 큼 | p∉[0,1] 방지와 N 수렴성 관리 필요 |
| 운영 특성 | 구현이 단순하고 캘리브레이션이 용이 | 파라미터 튜닝과 성능의 트레이드오프 존재 |
변동성은 시장가격에서 내재변동성(Implied Volatility)을 역산하고, 만기와 행사가격별 스마일·스커를 고려한다. 금리와 배당수익률은 기간구조를 사용하는 편이 좋으며, 현물지수와 선물을 기초자산으로 둘 때는 q 처리 방식을 구분해야 한다.
입력부터 감사추적까지 이어지는 계산 경로
입력 단계에서는 S/K/T/r/q의 시점을 맞추고 거래소 캘린더와 배당 이벤트를 반영한다. IV 서피스는 만기×행사가격 축에서 스무딩하며, 차익거래 제약(no-arbitrage)도 확인한다.
계산 단계에서는 유럽형을 BS로, 미국형 또는 조기행사 가능성이 있는 상품을 BT로 연결한다. BT에서는 p∈[0,1]과 N 수렴성을 시험하고, BS에서는 T→0과 σ→0 같은 극단 파라미터의 경계 처리가 필요하다.
출력값은 재현 가능해야 한다. 시점별 입력 스냅샷, 시드, 버전을 남기고, PnL Explain으로 Δ/Γ/베가·캐리 분해를 수행해 일중 오차의 원인을 추적한다. 상수 σ 가정의 한계와 조기행사 근사오차는 스트레스와 백테스트를 병행해 점검한다.
가격 계산과 헤지는 같은 장부에서 다뤄야 한다
마켓메이킹에서는 유럽형 옵션에 BS와 IV 서피스를 적용해 즉시 가격을 계산하고 Δ·Γ로 헤지 수량을 산출한다. 미국형이거나 배당이 많은 종목은 BT로 공정가를 계산하고, 수치적 불확실성을 호가 스프레드에 반영한다.
EOD 평가는 IV 서피스 보정, BS/BT 가격 계산, 그릭스 집계, 한도 확인의 순서로 운영할 수 있다. 시나리오 분석에서는 변동성 ±x%, 금리 평행이동, 스커 틸트를 적용한 뒤 PnL 민감도를 측정한다.
델타 헤지는 포지션 총 델타가 0이 되도록 다시 맞추는 작업이다. 거래 빈도, 거래비용, 슬리피지를 함께 고려해야 한다. 감마와 베가는 장부 한도 안에서 관리하며, 캘린더와 버터플라이 구조로 중립화를 시도할 수 있다. 구조화 상품에서는 기초 옵션 레고 구성요소의 가격과 그릭스를 파생해 감마·베가 중립 포트를 만들고, 배당 이벤트는 BT로 엑스-디비전 시점을 반영해 조기행사 프리미엄을 계량한다.
최소 구현으로 확인하는 가격과 민감도
전제조건은 다음과 같다.
- Python 3.10+, 표준 라이브러리(math)만 사용
- 수치 안정성 목적의 간단한 검증 포함
# Black-Scholes 가격과 그릭스, 내재변동성(이분법), Binomial Tree(미국형 지원)
# Python 3.10+
import math
def _norm_cdf(x: float) -> float:
return 0.5 * (1.0 + math.erf(x / math.sqrt(2.0)))
def _norm_pdf(x: float) -> float:
return math.exp(-0.5 * x * x) / math.sqrt(2.0 * math.pi)
def black_scholes_price(S, K, T, r, q, sigma, call=True):
if T <= 0:
return max(0.0, (S - K) if call else (K - S))
if sigma <= 0:
# 거의 확정적 상황 처리: 내재가치의 할인 근사
disc_q = math.exp(-q*T); disc_r = math.exp(-r*T)
fwd = S*disc_q / disc_r
intrinsic = max(0.0, (fwd - K) if call else (K - fwd))
return intrinsic * disc_r
d1 = (math.log(S / K) + (r - q + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
d2 = d1 - sigma * math.sqrt(T)
disc_q = math.exp(-q*T)
disc_r = math.exp(-r*T)
if call:
price = S * disc_q * _norm_cdf(d1) - K * disc_r * _norm_cdf(d2)
else:
price = K * disc_r * _norm_cdf(-d2) - S * disc_q * _norm_cdf(-d1)
return price
def black_scholes_greeks(S, K, T, r, q, sigma, call=True):
if T <= 0 or sigma <= 0:
# 경계 처리: 수치적 의미 제한, 0 또는 근사값 제공
return {"delta": 1.0 if (call and S > K) else (-1.0 if (not call and S < K) else 0.0),
"gamma": 0.0, "vega": 0.0}
d1 = (math.log(S / K) + (r - q + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
delta_call = math.exp(-q*T) * _norm_cdf(d1)
delta_put = delta_call - math.exp(-q*T)
gamma = math.exp(-q*T) * _norm_pdf(d1) / (S * sigma * math.sqrt(T))
vega = S * math.exp(-q*T) * math.sqrt(T) * _norm_pdf(d1)
return {"delta": delta_call if call else delta_put, "gamma": gamma, "vega": vega}
def implied_vol_bisection(mkt_price, S, K, T, r, q, call=True, tol=1e-8, max_iter=100):
lo, hi = 1e-6, 5.0
for _ in range(max_iter):
mid = 0.5 * (lo + hi)
price = black_scholes_price(S, K, T, r, q, mid, call)
if abs(price - mkt_price) < tol:
return mid
if price > mkt_price:
hi = mid
else:
lo = mid
return 0.5 * (lo + hi)
def binomial_price(S, K, T, r, q, sigma, steps=200, call=True, american=False):
if T <= 0:
return max(0.0, (S - K) if call else (K - S))
dt = T / steps
if sigma <= 0:
# σ→0 한계 처리: 할인된 내재가치 근사
return black_scholes_price(S, K, T, r, q, 1e-12, call) if not american else max(
0.0, (S - K) if call else (K - S)
)
u = math.exp(sigma * math.sqrt(dt))
d = 1.0 / u
a = math.exp((r - q) * dt)
p = (a - d) / (u - d)
if not (0.0 <= p <= 1.0):
# 비정상 파라미터 조합 안정화
p = min(max(p, 0.0), 1.0)
disc = math.exp(-r * dt)
# 말단 노드 페이오프
values = []
for j in range(steps + 1):
S_T = S * (u ** j) * (d ** (steps - j))
payoff = max(0.0, (S_T - K) if call else (K - S_T))
values.append(payoff)
# 후진 유도
for i in range(steps - 1, -1, -1):
for j in range(i + 1):
cont = disc * (p * values[j + 1] + (1 - p) * values[j])
if american:
S_ij = S * (u ** j) * (d ** (i - j))
exer = max(0.0, (S_ij - K) if call else (K - S_ij))
values[j] = max(cont, exer)
else:
values[j] = cont
return values[0]
간단한 검증 시나리오로는 유럽형 콜에서 S=100, K=100, T=1, r=3%, q=0%, σ=20%를 사용할 수 있다. 이때 BS 가격은 ≈ 7.965, Δ≈0.636, Γ≈0.0199, V≈37.52다. 같은 파라미터의 미국형 풋에는 BT(steps=500)를 적용하며, BS 풋보다 조기행사 프리미엄만큼 상향된다.
운영상 기대할 수 있는 변화
유동 종목에서는 가격 괴리를 ±1틱 안으로 줄이는 적중률 상승을 기대할 수 있다. 델타 중립을 유지할 때 일중 PnL 분산이 10~30% 감소하는 사례도 가능하다. 성능 측면에서는 BS가 수십만 건/초를 처리하고, BT(N=500)는 밀리초 수준의 배치 처리에 사용할 수 있다.
그릭스를 공통 리스크 언어로 두면 의사결정의 일관성이 높아진다. 모델 리스크 통제도 강화돼 백테스트와 감사 대응을 체계적으로 수행하기 쉬워진다. 유럽형·저지연 환경에는 BS를 우선 적용하고, 조기행사·배당 이벤트·비표준 구조에는 BT를 병행하는 구성이 단순하면서도 재현 가능한 가격결정 파이프라인의 출발점이 된다.