이번 글에서는 시점 $t$에서 주식의 가격이 $S_t$인 상황에서 $S_t$가 GBM(Geometric Brownian Motion)을 따를 때, 특정 만기 시점 $T$에 생성된
$$S_T$$
의 누적분포함수(cumulative distribution function) 과 확률밀도함수(probability density function)를 구해보겠습니다.
GBM 복습
GBM은 예전글 GBM 은 어떤 모델일까?
에서 다룬바 있습니다. 수식으로 쓰면
$$ dS_t/S_t= (r-q) dt +\sigma dW_t$$
입니다. 여기서 $r$는 무위험 이자율, $q$는 연속배당률, $\sigma$는 변동성(volatility), 그리고 $W_t$는 위너프로세스입니다(위너프로세스에 대한 설명은 여기를 참고해 보세요.)
이 식을 (Ito lemma 등을 통해) 풀어써보면
$$ S_T = S_0 \exp \left( (r-q-\frac12\sigma^2)T +\sigma W_T \right) $$
라 쓸 수 있습니다. 즉,
$$ \ln(S_T/S_0) = (r-q-\frac12\sigma^2)T +\sigma W_T $$이고
$$W_T \sim \mathcal{N}(0,\sqrt{T}^2)$$ 이므로
$ \ln(S_T/S_0)$ 는 평균이 $(r-q-\frac12\sigma^2)T$ 이고 표준편차가 $\sigma\sqrt{T}$인 정규분포
임을 알 수 있습니다. 따라서 Z-score 정규화(이글 참고)를 해보면
$$ z= \frac{\ln(S_T/S_0) -(r-q-\frac12\sigma^2)T } {\sigma \sqrt{T}}\tag{1}$$
는 표준정규분포임을 알 수 있습니다.
$S_T$의 누적분포함수(cdf)와 확률밀도함수(pdf)
이제 식(1)을 이용하여 미래 특정시점 $T$에서의 주가 예상치 $S_T$의 cdf와 pdf를 구해보겠습니다.
1. 누적분포함수
$S_T$의 cdf를 $F(x)$라고 하면,
$$
\begin{align}
F(x) & = \mathbb{P}(S_T \leq x) \\
& = \mathbb{P} \left( \frac{\ln(S_T/S_0)-(r-q-\frac12\sigma^2)T}{\sigma\sqrt{T}} \leq \frac{\ln(x/S_0)-(r-q-\frac12\sigma^2)T}{\sigma\sqrt{T}} \right) \\
& = \mathbb{P} \left( z \leq \frac{\ln(x/S_0)-(r-q-\frac12\sigma^2)T}{\sigma\sqrt{T}} \right) \\
& = \Phi \left( d(x) \right)
\end{align}
$$
입니다. 그런데 $S_T$는 항상 양수이므로(why?) $x\leq 0$ 일 때는 의미가 없습니다. 즉, $x>0$입니다.
위 식에서 $\Phi(\cdot)$이고
$$ d(x) = \frac{\ln(x/S_0)-(r-q-\frac12\sigma^2)T}{\sigma\sqrt{T}} $$
입니다.
2. 확률밀도함수
$S_T$의 확률밀도함수를 구해보겠습니다. 확률밀도함수를 $g(x)$라 하면
$$g(x) \frac{dF(x)}{dx} = d'(x) \phi(d(x)) = \frac{1}{x\sigma\sqrt{T}} \phi(d(x)) ~~,~~ x>0$$
입니다.
그럼 간단하게 Python code를 통하여 $S_T$의 cdf와 pdf의 모양새를 알아보겠습니다.
Python Code : $S_T$의 cdf, pdf
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
import pandas as pd
def cdf_pdf_of_smat(x, s0, rfr, div, vol, maturity):
Ncdf = norm.cdf # standard normal distribution의 cdf
npdf = norm.pdf # pdf
drift = (rfr - div - 0.5 * vol ** 2) * maturity
diffusion = vol * np.sqrt(maturity)
# S_T = S0 exp( drift + diffusion *z ), z ~ N(0,1)
if x > 0: # 위의 수식 F(x) 와 g(x)
dx = (np.log(x / s0) - drift) / diffusion
cdf_value = Ncdf(dx)
pdf_value = 1 / (x * vol * np.sqrt(maturity)) * npdf(dx)
else:
cdf_value = 0
pdf_value = 0
return cdf_value, pdf_value
def test_of_pdf_cdf_Smaturity():
s0 = 100
rfr = 0.02
div = 0.01
vol = 0.2
maturity = 1
x_vec = np.arange(1, 300, 1) # 1~300 까지 각 x 에 대해
pdf_vec, cdf_vec = [], []
for x in x_vec:
tempvalue = cdf_pdf_of_smat(x, s0, rfr, div, vol, maturity) # 특정 x값에서의 cdf, pdf
cdf_vec.append(tempvalue[0]) # cdf list
pdf_vec.append(tempvalue[1]) # pdf list
from matplotlib import gridspec # gridspec을 사용하여 plot 구성
fig = plt.figure(figsize=(20, 20))
gs = gridspec.GridSpec(nrows=1, ncols=2, width_ratios=[1, 1])
ax = [fig.add_subplot(gs[0]), fig.add_subplot(gs[1])]
ax[0].plot(x_vec, cdf_vec, label='cdf of S_T') # cdf graph
ax[1].plot(x_vec, pdf_vec, label='pdf od S_T') # pdf graph
ax[0].set_title('ST cdf')
ax[1].set_title('ST pdf')
ax[0].legend()
ax[1].legend()
plt.show()
if __name__ == '__main__':
test_of_pdf_cdf_Smaturity()
그래프 결과는 아래와 같습니다.
cdf는 여느 다른 확률분포의 cdf와 마찬가지로 0 값에서 출발하여 1 값에 도착하는 증가수열처럼 그려집니다.
pdf 그래프는 $S_0 = 100$ 근처에서 가장 높은 밀도를 가지는 함수로 그려집니다. 엄밀히 말해서,
$S_T$는 로그노말(log normal) 분포를 따릅니다.
$\log(S_T)$가 정규분포의 일종이라는 얘기죠. 이와 관련해서는 예전 글 Log Normal Distribution
에서 다룬 바 있으니 비교해서 보시면 좋을 것 같습니다.
뜬금없이, 왜 GBM 모델로 생성된 $S_T$의 분포를 다루느냐 하면
$S_T$의 확률밀도를 이용하여 파생상품의 델타, 감마, 베가 등의 민감도를 구할 수 있기 때문입니다. 이는 다음 글에서 설명해 보도록 하겠습니다.
'금융공학' 카테고리의 다른 글
미래주가의 분포를 활용하여 콜옵션 델타 구하기 (0) | 2023.08.21 |
---|---|
GBM모델로 생성된 미래 주가는 어떻게 분포할까? 변동성이 커지면 분포는? (0) | 2023.08.11 |
MC로 콜옵션 델타 구하기: likelihood 방법 (0) | 2023.07.14 |
몬테카를로 시뮬레이션과 그릭의 안정성 #2 : 시드 고정 (0) | 2023.07.12 |
몬테카를로 시뮬레이션과 그릭의 안정성 #1 (0) | 2023.07.07 |
댓글