본문 바로가기
금융공학

디지털 옵션 #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  복습

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

 

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

 

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

S0uidniS0uidni

입니다(S0S0는 현재주가)

 

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

시점 step nn번째의 아래서부터 ii번째 노드는 기초자산의 가격이 S0uidniS0uidni 이고 이때의 파생상품의 가격을 f(n,i),0nN,0iNf(n,i),0nN,0iN이라 쓰면

f(N,i)f(N,i)만기 시점 페이오프(위 그림에서 가장 오른쪽 노드들)
f(n,i)=erΔt[pf(n+1,i+1)+(1p)f(n+1,i)]f(n,i)=erΔt[pf(n+1,i+1)+(1p)f(n+1,i)] 의 점화식을 만족
f(0,0)f(0,0) 이 바로 현재 시점, 현재 주가 에서의 파생상품의 가치

 

 

디지털 옵션의 가격 구하기

 

위의 그림에서 만기 TT, 행사가 KK이고 행사가 아래의 쿠폰이 c1c1, 위 쿠폰이 c2c2인 디지털옵션의 만기 페이오프는, 모든 iNiN에 대해

f(N,i)={c1,  S0uidNi<Kc2,  S0uidNiK 

 

 

 

디지털옵션의 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
반응형