이번 글
2022.08.30 - [금융공학] - 디지털 옵션 #1. 디지털 옵션이란? 수학공식은?
에서 이어집니다. 저번 글에서는 디지털 옵션을 정의하고, 가격이 수학 공식으로 어떻게 표현되는지를 다루었었죠.
먼저 지난 글에서 다루었던 내용들을 요약해 보겠습니다.
디지털 옵션과 가격 공식
디지털 옵션은 아래 그림처럼 행사가 이상인지, 이하인지에 따라 약정된 쿠폰이 있는 상품입니다.
행사가가 $K$, 만기가 $T$인 디지털옵션의 쿠폰이 행사가를 기준으로 행사가보다 아래쪽 방향은 $c_1$, 위쪽 방향은 $c_2$라 했을 때, 현재 시점 $t=0$에서의 가격은
디지털 옵션의 가격
$$ f(0,S_0) = e^{-rT)} \left[ c_2 \Phi(d_2) + c_1 \Phi(-d_2) \right] ,$$
$$ d_2 = \frac{\ln(S_0/K)+(r-q-\textstyle{\frac12}\sigma^2)T}{\sigma\sqrt{T}} $$
었습니다.
Python Code : 디지털 옵션의 Closed Form
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):
d2 = (np.log(s0 / strike) + (rfr - div - 0.5 * vol ** 2) * maturity) / (vol * np.sqrt(maturity))
df = np.exp(-rfr * maturity)
mat_ayoff = downCoupon * N(-d2) + upCoupon * N(d2)
return mat_ayoff * df
Closed Form을 그대로 가져다 쓴 것이기 때문에 따로 설명할 부분은 없을 듯 합니다.
def DigitalOption_ClosedForm(s0, strike, upCoupon, downCoupon, maturity, rfr, vol, div):
# 위의 코드 참조
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)
print('Digital Option Value by ClosedForm : {:.3f}'.format(do_value_closedform))
if __name__ == '__main__':
Calculate_DigitalOption()
위와 같은 식으로 관심 있는 디지털 옵션의 가격을 구해볼 수 있습니다. 결과는
Digital Option Value by ClosedForm : 1.921
입니다.
디지털 옵션의 그래프
디지털 옵션은 어떻게 생겼을 까요? 기초자산 주가에 따른 디지털옵션의 그래프를, 변동성을 바꿔가며 그려보겠습니다.
def Draw_DigitalOption_Chart():
s0 = 100
strike = 100
upCoupon = 3
downCoupon = 1
maturity = 1
rfr = 0.02
vol = [0.1, 0.2, 0.3, 0.5, 1]
div = 0.01
s = np.linspace(50, 200, 101)
doValue = np.array([upCoupon if spot >= s0 else downCoupon for spot in s])
plt.plot(s, doValue, label='Payoff', linestyle='--')
for v in vol:
doValue_closedform = np.array(
[DigitalOption_ClosedForm(spot, strike, upCoupon, downCoupon, maturity, rfr, v, div) for spot in s])
plt.plot(s, doValue_closedform, label='ClosedForm Value(Vol={:.1f}%'.format(v * 100))
plt.legend()
plt.show()
if __name__ == '__main__':
Draw_DigitalOption_Chart()
간략히 살펴보도록 하겠습니다.
s = np.linspace(50, 200, 101) #주가를 50에서 200까지 100등분
doValue = np.array([upCoupon if spot >= strike else downCoupon for spot in s])
# 주가가 행사가보다 작으면 upCoupon, 아니면 downCoupon을 값으로 하는 배열 만듬
plt.plot(s, doValue, label='Payoff', linestyle='--')
○ 파이썬의 list안에서 if문 쓰는 문법을 알아놓으면 간결한 코딩을 할 수 있습니다.
vol = [0.1, 0.2, 0.3, 0.5, 1] # 다양한 변동성에 대해
for v in vol:
doValue_closedform = np.array(
[DigitalOption_ClosedForm(spot, strike, upCoupon, downCoupon, maturity, rfr, v, div) for spot in s])
# 해당 변동성에 대해 Closed Form 배열을 구함
plt.plot(s, doValue_closedform, label='ClosedForm Value(Vol={:.1f}%'.format(v * 100))
결과를 보실까요?
○ 파란색 점선 그래프는 만기 페이오프 그래프입니다.
○ 변동성이 작을 경우, 행사가에서 멀리 떨어진 곳에서는 만기 페이오프(파란색 점선)에 가깝게 붙어 있다가 행사가 주변에서는 무섭게 변합니다.
○ 변동성이 커질수록 그래프의 기울기가 완만해지고 만기 페이오프로부터 떨어져 있는 정도가 커집니다.
왜? 변동성이 작으면 그래프가 급변하는 모습을 보이고, 변동성이 크면 그래프가 누울까요?
변동성이 작으면..
변동성은 주가가 얼마나 활발히 움직이는지를 재는 척도인데, 변동성이 작으면 향후 움직임이 작은 경향을 보인다는 뜻입니다. 따라서 행사가에서 주가가 멀리 떨어져 있으면 그 상태를 유지하려고 하죠. 주가가 행사가보다 작은 구간에서는 그냥 $c_1$쿠폰을 주고 끝낼 확률이 높은 것으로 판단하고, 행사가보다 주가가 위에 있으면 $c_1$으로 마무리 지을 확률을 높게 봅니다. 하지만 행사가 근처로 오면 어떨까요? 조금만 움직여도 쿠폰이 $c_1$에서 $c_2$로, 또는 역으로 바뀔 가능성이 커지겠죠? 이때 가격이 급변하게 되는 것입니다.
변동성이 크면..
주가가 광폭행보를 보이는 경우에는 행사가에서 얼마나 떨어져 있느냐가 중요하지 않게 됩니다. 주가가 아무리 행사가 아래로 멀리 떨어져 있어도 갑자기 폭등해서 행사가 위로 끝날 확률이 높고요, 반대 경우도 마찬가지 있니다. 따라서 이런 상황들이 그래프에 반영이 되어서 그래프가 눕게 되는 것입니다.
다음 글에서도 역시 디지털 옵션의 가격을 구해볼 텐데요, 다른 방법론들을 도입하겠습니다.
'금융공학' 카테고리의 다른 글
디지털 옵션 #4. 디지털 옵션 가격, FDM (0) | 2022.09.01 |
---|---|
디지털 옵션 #3. 디지털 옵션 가격, MonteCarlo Simulation (0) | 2022.09.01 |
디지털 옵션 #1. 디지털 옵션이란? 수학공식은? (0) | 2022.08.30 |
배리어옵션 - UOC 옵션 #5 Binomial Tree(이항트리) (0) | 2022.08.29 |
배리어옵션 - UOC 옵션 #4 MonteCarlo Simulation (0) | 2022.08.29 |
댓글