Loading [MathJax]/jax/output/CommonHTML/jax.js
본문 바로가기
금융공학

GBM 모델로 생성된 주가의 누적분포함수, 확률밀도함수

by hustler78 2023. 8. 8.
728x90
반응형

 

 

이번 글에서는 시점 t에서 주식의 가격이 St인 상황에서 St가 GBM(Geometric Brownian Motion)을 따를 때, 특정 만기 시점 T에 생성된 

ST

의 누적분포함수(cumulative distribution function) 과 확률밀도함수(probability density function)를 구해보겠습니다.

 

 

GBM 복습

GBM은 예전글  GBM 은 어떤 모델일까?

 

GBM 은 어떤 모델일까?

이번 글은 2022.06.19 - [금융공학] - GBM 주가패스 만들기 #2: EveryDay 주가까지! GBM 주가패스 만들기 #2: EveryDay 주가까지! 이 글은 2022.06.19 - [금융공학] - GBM 주가패스 만들기 #1: 만기시점 주가만 GBM 주

sine-qua-none.tistory.com

에서 다룬바 있습니다. 수식으로 쓰면


dSt/St=(rq)dt+σdWt

 

입니다. 여기서 r는 무위험 이자율, q는 연속배당률,  σ는 변동성(volatility), 그리고 Wt는 위너프로세스입니다(위너프로세스에 대한 설명은 여기를 참고해 보세요.)

 

이 식을 (Ito lemma 등을 통해) 풀어써보면

ST=S0exp((rq12σ2)T+σWT)

라 쓸 수 있습니다. 즉, 
ln(ST/S0)=(rq12σ2)T+σWT이고

WTN(0,T2) 이므로

 

ln(ST/S0) 는 평균이 (rq12σ2)T 이고 표준편차가 σT인 정규분포

임을 알 수 있습니다.  따라서 Z-score 정규화(이글 참고)를 해보면 

z=ln(ST/S0)(rq12σ2)TσT
는 표준정규분포임을 알 수 있습니다.

 

 

ST의 누적분포함수(cdf)와 확률밀도함수(pdf)


이제 식(1)을 이용하여 미래 특정시점 T에서의 주가 예상치 ST의 cdf와 pdf를 구해보겠습니다.

 

1. 누적분포함수


ST의 cdf를 F(x)라고 하면,

F(x)=P(STx)=P(ln(ST/S0)(rq12σ2)TσTln(x/S0)(rq12σ2)TσT)=P(zln(x/S0)(rq12σ2)TσT)=Φ(d(x))
입니다. 그런데 ST는 항상 양수이므로(why?)   x0 일 때는 의미가 없습니다.  즉, x>0입니다.
위 식에서  Φ()이고
d(x)=ln(x/S0)(rq12σ2)TσT
입니다. 

 

2. 확률밀도함수

 

ST의 확률밀도함수를 구해보겠습니다. 확률밀도함수를 g(x)라 하면
g(x)dF(x)dx=d(x)ϕ(d(x))=1xσTϕ(d(x))  ,  x>0
입니다.

 

 

그럼 간단하게 Python code를 통하여  ST의 cdf와 pdf의 모양새를 알아보겠습니다.

 

 


Python Code : ST의 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 그래프는 S0=100 근처에서 가장 높은 밀도를 가지는 함수로 그려집니다. 엄밀히 말해서,

 

 

ST는 로그노말(log normal) 분포를 따릅니다.

 

log(ST)가 정규분포의 일종이라는 얘기죠. 이와 관련해서는 예전 글  Log Normal Distribution

 

Log Normal Distribution

이번 글에서는 log normal distribution에 대해서 이야기해보겠습니다. 어떤 연속 확률변수 X가 lognormal을 따른다는 것은 기호로 XLN(μ,σ2) 라 쓰고, 정의는 아래와 같습니다. $X\sim

sine-qua-none.tistory.com

에서 다룬 바 있으니 비교해서 보시면 좋을 것 같습니다.

 

 

 

뜬금없이, 왜 GBM 모델로 생성된 ST의 분포를 다루느냐 하면

 

ST의 확률밀도를 이용하여 파생상품의 델타, 감마, 베가 등의 민감도를 구할 수 있기 때문입니다. 이는 다음 글에서 설명해 보도록 하겠습니다.

 

728x90
반응형

댓글