이 글은
2022.09.30 - [금융공학] - 상관관계를 보이는 두 자산의 움직임 모델
에서 이어집니다. 저번 글에서는 상관관계를 가지는 두 주가의 움직임을 GBM으로 어떻게 세팅하는지를 알아보았습니다.
복습
두 기초자산 $X_t, Y_t$의 GBM 모델을
$$ dX_t /X_t = (r-q_x)dt + \sigma_x dW_t~,~ dY_t/Y_t = (r-q_y)dt + \sigma_y dB_t $$
라 하고.
$$ \mathbb{Corr}\left( \textstyle{\frac{W_t}{\sqrt{t}}, \frac{B_t}{\sqrt{t}}} \right) =\rho$$
인 상관계수를 가진다고 하면, 서로 독립인 표준정규분포 변수 $z_1, z_2$에 대해
$$
\begin{cases}
\textstyle{\frac{W_t}{\sqrt{t}}} & = z_1 \\
\textstyle{\frac{B_t}{\sqrt{t}}} & = \rho z_1 + \sqrt{1-\rho^2} z_2 \\
\end{cases}
$$
로 세팅하면 됩니다.
코딩 실습
그럼 두 기초자산을 GBM으로 가정했을 때, 만기시점의 종가 간에 어떤 모양을 그리는지 상관계수 별로 알아보겠습니다. 두 기초자산의 현재가는 100에서 시작한다고 가정하고, 만기 1년 시점에 어디에 가있는지를 보겠습니다.
import numpy as np
import matplotlib.pyplot as plt
def GenerateMultiAssetGBM():
s1, s2 = 100, 100
q1, q2 = 0, 0
vol1, vol2 = 0.2, 0.3
rfr = 0.02
mat = 1
rhos = [-1, -0.8, 0, 0.8, 1]
drift1 = (rfr - q1 - 0.5 * vol1 ** 2) * mat
drift2 = (rfr - q2 - 0.5 * vol2 ** 2) * mat
diffusion1 = vol1 * np.sqrt(mat)
diffusion2 = vol2 * np.sqrt(mat)
norm_rand = np.random.normal(size=(1000, 2))
plt.figure(figsize=(15, 10))
plt.suptitle('Effect of Correlation', fontsize=20)
for i, rho in enumerate(rhos):
z1 = norm_rand[:, 0]
z2 = rho * z1 + np.sqrt(1 - rho ** 2) * norm_rand[:, 1]
res1 = s1 * np.exp(drift1 + diffusion1 * z1)
res2 = s2 * np.exp(drift2 + diffusion2 * z2)
if i < len(rhos) - 1:
plt.subplot(3, 2, i + 1)
else:
plt.subplot(3, 2, (len(rhos), len(rhos) + 1))
plt.title('correlation : {}'.format(rho), x=0.5, y=0.8, fontsize=10)
plt.xlabel('s1')
plt.ylabel('s2')
plt.scatter(res1, res2, facecolors='none', edgecolors='cornflowerblue')
plt.tight_layout
plt.show()
if __name__ == '__main__':
GenerateMultiAssetGBM()
간략히 살펴보겠습니다.
s1, s2 = 100, 100 # 두 기초자산 1st, 2nd의 현재가들
q1, q2 = 0, 0 # 연속배당률
vol1, vol2 = 0.2, 0.3 # 변동성
rfr = 0.02 # 무위험 이자율
mat = 1 # 만기
rhos = [-1, -0.8, 0, 0.8, 1] # 실험할 상관계수 5개 list
drift1 = (rfr - q1 - 0.5 * vol1 ** 2) * mat
drift2 = (rfr - q2 - 0.5 * vol2 ** 2) * mat
diffusion1 = vol1 * np.sqrt(mat)
diffusion2 = vol2 * np.sqrt(mat)
○ 계산의 편의를 위해 GBM 모델을 drift 항과 diffusion항을 나누어 미리 계산해 놓습니다.
○ $X_T = X_0 \exp\left( (r-q_x-\frac12\sigma_x^2)T +\sigma_x\sqrt{T} z\right) = X_0 \exp\left({\rm{drift}}+{\rm{diffusion}} \cdot z \right)$ 입니다.
norm_rand = np.random.normal(size=(1000, 2))
# 1000개의 만기종가 sample을 기초자산2개 각각에 대해 만들기 위해
# 표준정규분포값 추출
for i, rho in enumerate(rhos):
z1 = norm_rand[:, 0] # z1 : 1000개의 원소로 이루어진 표준정규분포난수 배열
z2 = rho * z1 + np.sqrt(1 - rho ** 2) * norm_rand[:, 1]
# Cholesky방법을 이용하여 두번째 난수를 발생(첫번째 난수와 상관관계가 있도록)
res1 = s1 * np.exp(drift1 + diffusion1 * z1)
res2 = s2 * np.exp(drift2 + diffusion2 * z2)
# 위의 랜덤값 z1, z2를 가지고 각각 자산의 종가를 만들어냄
if i < len(rhos) - 1:
plt.subplot(3, 2, i + 1) # 3*2 6개의 프레임이 있는 그림판을 만듬 그중 i+1번째 프레임
else:
plt.subplot(3, 2, (len(rhos), len(rhos) + 1))
# 상관계수는 5개이므로 마지막 화면은 두 개 칸 쓰기
plt.title('correlation : {}'.format(rho), x=0.5, y=0.8, fontsize=10)
plt.xlabel('s1')
plt.ylabel('s2')
plt.scatter(res1, res2, facecolors='none', edgecolors='cornflowerblue')
○ title 의 x=0.5, y=0.8 은 제목이 쓰이는 위치를 말합니다.
○ face colors = 'none' 이면: marker의 내부가 색칠되지 않은 상태를 말합니다.
○ edgecolors 는 marker의 테두리 색입니다.
○ plot.scatter 형식으로 차트를 그립니다.
결과를 보실까요?
correlationdl -1에서 1까지 움직일 때 1st 기초자산의 만기 종가와 2nd 기초자산의 만기 종가를 점도표로 그려본 모양입니다.
○ 상관계수가 -1, -0.8일 때: 반비례 경향
○ 상관계수가 0일 때, 경향성 없이 플롯팅 되어 있음
○ 상관계수 0.8~1 일 때, 정비례 경향
을 보이고 있습니다. 우리의 python code가 오류 없이 잘 작동됨을 알 수 있습니다.
'금융공학' 카테고리의 다른 글
상관관계가 있는 세 자산이 움직이는 모습은? (0) | 2022.10.14 |
---|---|
상관관계가 있는 여러 자산이 움직이는 모습 (0) | 2022.10.13 |
상관관계를 보이는 두 자산의 움직임 모델 (0) | 2022.09.30 |
디지털 옵션 #5. 디지털 옵션 가격, Binomial Tree (0) | 2022.09.02 |
디지털 옵션 #4. 디지털 옵션 가격, FDM (0) | 2022.09.01 |
댓글