본문 바로가기
금융공학

상관관계가 있는 두 자산이 움직이는 모습은?

by hustler78 2022. 9. 30.
728x90
반응형

이 글은 

2022.09.30 - [금융공학] - 상관관계를 보이는 두 자산의 움직임 모델

 

상관관계를 보이는 두 자산의 움직임 모델

파생상품은 기초자산의 움직임에 연동하여 수익이 결정되는 금융상품이라고 하였습니다. 대표적으로 ○ 선물, 선도 : [금융공학] - 선도와 선물 #1 : 선도 ○ 옵션 : 옵션 #1. 옵션이란? 옵션의 유

sine-qua-none.tistory.com

에서 이어집니다. 저번 글에서는 상관관계를 가지는 두 주가의 움직임을 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가 오류 없이 잘 작동됨을 알 수 있습니다.

 

 

 

728x90
반응형

댓글