이 글에서는
2022.08.12 - [금융공학] - 파생상품의 가격 결정: binomial tree를 이용해 봅시다.
에서 다룬 binomial tree를 가지고 파생상품의 가격 결정을 하는 방법을 예시를 통해 알아보겠습니다. 지겹지만 이항모델 복습을 다시 한번 해 봅시다.
이항 모델 복습
주식은 상승(상승률 $u$), 하락(하락률 $d$) 두 가지 상태이고, $ud=1$ 을 만족하며 GBM의 기댓값과 분산을 만족하도록 상승확률 $p$와 하락 확률 $1-p$를 설계하며 다음과 같았습니다.
up &down 확률
$$ \begin{align} p &= \frac{e^{(r-q)\Delta t}-d}{u-d}\\ 1-p &= \frac{u-e^{(r-q)\Delta t}}{u-d} \\ \end{align} $$
$u, d$의 값
$$ u = e^{\sigma \sqrt{\Delta t}} ~, ~d= e^{-\sigma \sqrt{\Delta t}}$$
파생상품의 가격은 다음과 같이 구합니다.
시점 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) = e^{-r\Delta t} \left[ p f(n+1,i+1) + (1-p) f(n+1,i)\right]$$
이 된다.
$$f(N,i)$$ 는 만기 때 페이오프임
Binomial Tree 세팅
Binomial tree로 파생상품의 가격을 결정하기 위해 다음의 세팅이 필요합니다.
1. 파생상품 만기 $T$까지의 기간 $[0,T]$를 $N$ 등분한다.
기간을 $N$등분하여
$$ 0=t_0 < t_1 <\cdots < t_{N-1} <t_N =T$$
라 합시다. 그러면 time index는
$$ 0, 1, \cdots , N-1 ,N$$ 이 됩니다. 시간을 나타내는 변수는 $n$이라 씁니다.
2. 시점 간격 $\Delta t$를 구하여 확률 및 상승, 하락률을 산출
1번에서 $\Delta t = t_1 -t_0$ 로 시간 간격을 구하고, 이것을 이용해 $ u, d, p$ 를 산출합니다.
3. 각각의 time index $n$에 나타날 주가 배열을 만든다.
time index $n$에 나타나는 주가는
$$ S_0 u^i d^{n-i}, 0\leq i \leq n$$
입니다. 이것을 다음과 같이 $n+1$ 사이즈의 배열로 만듭니다.
$S_0 u^n$ |
$S_0 u^{n-1} d^1 $ |
$\vdots$ |
$S_0 u^1 d^{n-1}$ |
$S_0 d^n$ |
이것을 종합하여 그림으로 나타내면 다음과 같습니다.
델타원 상품의 가격 구하기
델타원 상품은 지난 글들에서 가격을 계산해 보았던 상품입니다.
1. exact formula : 2022.08.05 - [금융공학] - Black Scholes Equation의 풀이: 델타원 상품 참고
2. 시뮬레이션 : 2022.08.08 - [금융공학] - Black Scholes Equation의 풀이: 시뮬레이션 참고
위의 링크된 글들을 참고해 보시면 델타원의 상품이 어떻게 구해지는 볼 수 있습니다. 델타원 상품의 exact formula 가격은
$$ S_0 e^{-dT}$$
입니다 ($S_0$는 현재 기초자산의 가격, $d$는 연속 배당)
이것을 이번에는 binomial tree로 구해보겠습니다.
python code입니다.
import numpy as np
import matplotlib.pyplot as plt
def binomial_tree_pricing():
s0 = 100
r = 0.02
q = 0.01
sigma = 0.2
maturity = 1
nNode = 5
dt = maturity / nNode
u = np.exp(sigma * np.sqrt(dt))
d = 1 / u
a = np.exp((r - q) * dt)
p = (a - d) / (u - d)
def treeNode(n, i):
if n == nNode:
return s0 * u ** i * d ** (n - i)
elif n < nNode:
up_val = treeNode(n + 1, i + 1)
down_val = treeNode(n + 1, i)
df = np.exp(-r * dt)
return (p * up_val + (1 - p) * down_val) * df
res = treeNode(0, 0)
print('Binomial Tree price : {:.3f}'.format(res))
print('excat price : {:.3f}'.format(s0 * np.exp(-q * maturity)))
if __name__ == '__main__':
binomial_tree_pricing()
코드 분석을 해보겠습니다.
s0 = 100 # 현재가
r = 0.02 # 무위험 이자율
q = 0.01 # 연속배당률
sigma = 0.2 # 기초자산의 변동성
maturity = 1 # 만기
nNode = 5 # time step의 개수
dt = maturity / nNode #시점 사이의 간격
u = np.exp(sigma * np.sqrt(dt)) # 기초자산의 상승률 u= e^{σ√(Δt)}
d = 1 / u # 기초자산의 하락률
a = np.exp((r - q) * dt)
p = (a - d) / (u - d) # 기초자산이 상승할 확률
# binomial tree의 각 노드 값을 재귀적으로(recursively)구한다.
def treeNode(n, i):
if n == nNode: # 만기일 때,
return s0 * u ** i * d ** (n - i) #payoff가 델타원이므로 기초자산 자기 자신
elif n < nNode: # 만기 시점 step 보다 전일 때,
up_val = treeNode(n + 1, i + 1) # 기초자산 상승시의 파생상품 가격
down_val = treeNode(n + 1, i) # 기초자산 하락시의 파생상품 가격
df = np.exp(-r * dt) # 단위시간간격 동안의 할인 팩터(discount factor)
return (p * up_val + (1 - p) * down_val) * df #점화식으로 구해지는 파생상품의 가격
res = treeNode(0, 0) #timestep 0일 때, 기초자산 배열의 0번째 가격이 바로 현재시점의 파생상품 가격
○ python으로 사용자 정의 함수를 만들 때 좋은 특징 중 하나가, 바로 위처럼 함수를 재귀적으로 사용할 수 있는 점입니다. 함수 treeNode 을 작성하는데, 내용에 다시 treeNode가 포함되어 있죠. 이렇게 재귀적으로 함수를 코딩하는 방법은
2022.06.12 - [수학의 재미/아름다운 이론] - 해를 향하여 #1 : Bisection Method 와
2022.06.12 - [수학의 재미/아름다운 이론] - 해를 향하여 #2: Newton-Raphson Method에서도 다룬 바 있으니 한번 참고해 보시기 바랍니다.
결과를 보겠습니다.
Binomial Tree price : 99.005
excat price : 99.005
Process finished with exit code 0
수식으로 구한 exact formula와 가격이 똑같습니다.
이처럼 파생상품의 가격을 이산적으로 쪼개 binomial tree로 계산해도 똑같은 결과를 얻습니다.
하지만, tree가 어떻게 생성되는지 직접 보고 싶을 땐, python 코드보다는 Excel에서의 분석이 좋습니다. 셀 기반으로 visualizing 하기 편하거든요.
다음 글에서는 엑셀 VBA를 사용하여 binomial tree를 구해보겠습니다.
'금융공학' 카테고리의 다른 글
옵션 #1. 옵션이란? 옵션의 유명한 관계식이 있다던데.. (2) | 2022.08.17 |
---|---|
파생상품의 가격 결정: binomial tree로 델타원상품 가격 구하기 VBA (0) | 2022.08.13 |
파생상품의 가격 결정: binomial tree를 이용해 봅시다. (0) | 2022.08.12 |
Binomial Tree #3 : 이항모델 가지치기 (0) | 2022.08.11 |
Binomial Tree #2: CRR 모델이란? (0) | 2022.08.09 |
댓글