본문 바로가기
금융공학

디지털 옵션 #5. 디지털 옵션 가격, Binomial Tree

by hustler78 2022. 9. 2.
728x90
반응형

 

 

 

 

이번 글은

2022.09.01 - [금융공학] - 디지털 옵션 #4. 디지털 옵션 가격, FDM

 

디지털 옵션 #4. 디지털 옵션 가격, FDM

이번 글은 2022.09.01 - [금융공학] - 디지털 옵션 #3. 디지털 옵션 가격, MonteCarlo Simulation 디지털 옵션 #3. 디지털 옵션 가격, MonteCarlo Simulation 지난 글에서는 디지털 옵션의 가격을 Closed Form으로..

sine-qua-none.tistory.com

에서 이어집니다. 지금까지 디지털 옵션의 가격을 Closed Form, MonteCarlo Simulation, FDM으로 구해봤었습니다. 이번 글에서는 디지털 옵션의 가격을 Binomial Tree를 이용하여 구해보겠습니다.

 

 

Binomial Tree  복습

주식은 상승(상승률 $u$), 하락(하락률 $d$) 두 가지 상태이고, $ud=1$ 을 만족하며 GBM의 기댓값과 분산을 만족하도록 상승확률 $p$와 하락 확률 $1-p$을 적용하여 다음의 이항 모델을 만듭니다.

 

이러한 이항 모델(binomial model)을 붙여 아래와 같이 이항트리를 만들었지요.

 

가로축은 시점 축, 세로축은 기초자산의 축입니다. 시점 $n$에서 상승횟수가 $i$인 주가의 값은

$$ S_0 u^i d^{n-i}$$

입니다($S_0$는 현재주가)

 

파생상품의 가격은 다음과 같이 구합니다.

시점 step $n$번째의 아래서부터 $i$번째 노드는 기초자산의 가격이 $ S_0 u^{i}d^{n-i}$ 이고 이때의 파생상품의 가격을 $ f(n,i), 0\leq n\leq N, 0\leq i\leq N$이라 쓰면

○ $f(N,i)$ 는 만기 시점 페이오프(위 그림에서 가장 오른쪽 노드들)
○ $ f(n,i) = e^{-r\Delta t} \left[ p f(n+1,i+1) + (1-p) f(n+1,i)\right]$ 의 점화식을 만족
○ $ f(0,0)$ 이 바로 현재 시점, 현재 주가 에서의 파생상품의 가치

 

 

디지털 옵션의 가격 구하기

 

위의 그림에서 만기 $T$, 행사가 $K$이고 행사가 아래의 쿠폰이 $c_1$, 위 쿠폰이 $c_2$인 디지털옵션의 만기 페이오프는, 모든 $i\leq N$에 대해

$$f(N,i) = \begin{cases} c_1,~~S_0 u^i d^{N-i} < K \\ c_2,~~S_0 u^i d^{N-i} \geq K \end{cases}$$ 

 

 

 

디지털옵션의 python code

 

python code입니다.

2022.08.22 - [금융공학] - 옵션 #7. 옵션 프리미엄 구하기 실습: Binomial Tree에서 다루었던 코딩 내용 중 만기 페이오프만 바꾸면 해결될 것 같습니다. 

 

 

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
import time

N = norm.cdf

def DigitalOption_ClosedForm(s0, strike, upCoupon, downCoupon, maturity, rfr, vol, div):
	# 생략

def DigitalOption_BinomialTree(s0, strike, upCoupon, downCoupon, maturity, rfr, vol, div):
    nNode = 1000
    dt = maturity / nNode

    u = np.exp(vol * np.sqrt(dt))
    d = 1 / u
    a = np.exp((rfr - div) * dt)
    p = (a - d) / (u - d)

    valueNode = np.zeros((nNode + 1, nNode + 1))
    for n in reversed(range(nNode + 1)):
        for i in range(n + 1):
            spotS = s0 * u ** i * d ** (n - i)
            if n == nNode:
                valueNode[n, i] = upCoupon if spotS >= strike else downCoupon
            else:
                up_val = valueNode[n + 1, i + 1]
                down_val = valueNode[n + 1, i]
                df = np.exp(-rfr * dt)
                valueNode[n, i] = (p * up_val + (1 - p) * down_val) * df

    return valueNode[0, 0]

def Calculate_DigitalOption():
    s0 = 100
    strike = 100
    upCoupon = 3
    downCoupon = 1
    maturity = 1
    rfr = 0.02
    vol = 0.2
    div = 0.01

    do_value_closedform = DigitalOption_ClosedForm(s0, strike, upCoupon, downCoupon, maturity, rfr, vol, div)
    do_value_binomialtree = DigitalOption_BinomialTree(s0, strike, upCoupon, downCoupon, maturity, rfr, vol, div)

    print('Digital Option Value by ClosedForm : {:.3f}'.format(do_value_closedform))
    print('Digital Option Value by Bin.Tree   : {:.3f}'.format(do_value_binomialtree))

if __name__ == '__main__':
    Calculate_DigitalOption()

 

관심 있게 볼 부분은 만기페이오프 설정하는 부분인데요.

 

            if n == nNode:
                valueNode[n, i] = upCoupon if spotS >= strike else downCoupon

○ 이 부분이 만기페이오프 설정 부분입니다.

 


그럼 결과를 보도록 하겠습니다.

 

Digital Option Value by ClosedForm : 1.921
Digital Option Value by Bin.Tree   : 1.897

상당히 유사하지만, MC나 FDM 방법론과 비교했을 때, 아무래도 좀 차이가 납니다.  MC, FDM, Closed Form은 주가 모델을 GBM으로 간주하여 구하는 방법인 반면, Binomial Tree는 주가가 위 또는 아래로만 움직이는 이항 모델을 가정했기 때문에 근본적으로 차이가 나게 되는 것이죠.

 

그래도 이항 모형이 각광을 받는 이유는, 중간중간 각각의 Node에서 벌어지는 일을 신속하게 처리할 수 있다는 점입니다. UOC옵션을 보면, 배리어 이상으로 올라가는 경우에는 바로 Rebate로 가격을 바꿔버렸지요. 더욱더 활용가치가 높은 영역이 바로 American Style의 옵션 가격을 구할 때입니다. 일반적인 옵션이 만기 시점에'만' 주식을 사거나 팔 수 있는 권리를 행사할 수 있는 권리를 가진 반면, American option은 만기시점 전 아무 때나 그 권리를 행사할 수 있습니다.

 

기회가 될 때 한번 다뤄보도록 하겠습니다.

728x90
반응형

댓글