T-SUM 멘토링

[T-SUM] 9주차 자료 - Numpy를 통한 몬테카를로 시뮬레이션

LooanCheong 2023. 8. 16. 23:13
반응형

오늘의 내용 미리보기

본문

이번 시간에는 Numpy를 통해 몬테카를로 시뮬레이션을 진행하는 방법을 배워봅시다.

몬테카를로 시뮬레이션은 불확실한 사건의 가능한 결과를 예측하는 수학적 기법입니다.
말로만 하면 어려우니까 간단하게 예시를 봅시다.

우리가 주사위를 굴려서 얻을 수 있는 숫자를 예측한다고 해봅시다.
예측 결과는 굉장히 다양하게 나타날 수 있겠죠.

결과는 1부터 6까지의 수 중 하나일 것입니다.

간단하게 주사위와 같은 역할을 하는 함수를 하나 구현해 봅시다.

import numpy as np

nums = [i+1 for i in range(6)]
prob = np.ones(6) * (1/6)
num = np.random.choice(nums, p = prob)
num

이 함수를 실행할 때마다 1에서 6 사이의 랜덤 한 결과를 출력해 줍니다.

이를 그래프로도 나타내볼까요?

import numpy as np
import matplotlib.pyplot as plt

nums = [1, 2, 3, 4, 5, 6]
prob = np.ones(6) * (1/6)
res = np.random.choice(nums, 1000000, p=prob)
plt.hist(res, bins=np.arange(0.5, 7.5, 1), align='mid', rwidth=0.8)
plt.show()

대략 이런 결과가 나옵니다.

확률을 살짝 바꿔볼까요?

import numpy as np
import matplotlib.pyplot as plt

nums = [1, 2, 3, 4, 5, 6]
prob = [0.5, 0.1, 0.1, 0.1, 0.1, 0.1]
res = np.random.choice(nums, 1000000, p=prob)
plt.hist(res, bins=np.arange(0.5, 7.5, 1), align='mid', rwidth=0.8)
plt.show()

이런 방식으로 특정 사건에 대한 확률을 그래프로 나타낼 수 있습니다.

이제 몬테카를로 시뮬레이션을 구현해 봅시다.

이러한 과정으로 진행됩니다.

그리고 이를 구하기 위한 미래 주가 예측모형에 대해서도 알아봅시다.

시가 58000원 주식이 있다고 가정합시다.
반년 후의 주식 가격에 대해서 예측을 해보겠습니다.

μ = 0.1
σ = 0.25
이라고 가정해 봅시다.

이러한 과정을 거칩니다.

계산식을 이용해서 구해봅시다.

import numpy as np

s0, mu, sigma, T = 58000, 0.1, 0.25, 0.5
epsilon = np.random.randn()
sT = s0 * np.exp((mu - 0.5 * sigma**2) * T + sigma * epsilon * np.sqrt(T)).round(2)
r = (sT - s0) / s0

print(sT)
print(format(r, '.4f'))

이제 이를 반복해서 실행하여 주가 시뮬레이션을 진행합니다.
일단 5번만 반복해 볼까요?

import numpy as np
import pandas as pd

s0, mu, sigma, T = 58000, 0.1, 0.25, 0.5
M = 5
res = []

for i in range(M):
    epsilon = np.random.randn()
    sT = s0 * np.exp((mu - 0.5 * sigma**2) * T + sigma * epsilon * np.sqrt(T)).round(2)
    r = (sT - s0) / s0
    res.append(r)

df = pd.DataFrame({'수익률': res})
df

이제 반복 횟수를 늘려서 결과를 도출해 봅시다.

import numpy as np
import pandas as pd
import seaborn as sns

s0, mu, sigma, T = 58000, 0.1, 0.25, 0.5
M = 1000000
res = []

for i in range(M):
    epsilon = np.random.randn()
    sT = s0 * np.exp((mu - 0.5 * sigma**2) * T + sigma * epsilon * np.sqrt(T)).round(2)
    r = (sT - s0) / s0
    res.append(r)

df = pd.DataFrame({'수익률': res})

sns.distplot(df['수익률'], hist = False)

이런 식으로 몬테카를로 시뮬레이션을 이용한 주가 예측을 해보았습니다.

마지막으로 결과를 요약해 볼까요?

import numpy as np
import pandas as pd
import seaborn as sns

s0, mu, sigma, T = 58000, 0.1, 0.25, 0.5
M = 1000000
res = []

for i in range(M):
    epsilon = np.random.randn()
    sT = s0 * np.exp((mu - 0.5 * sigma**2) * T + sigma * epsilon * np.sqrt(T)).round(2)
    r = (sT - s0) / s0
    res.append(r)

df = pd.DataFrame({'수익률': res})

stats = df.describe()
stats

이렇게 Numpy를 통한 몬테카를로 시뮬레이션을 마쳤습니다.

마지막으로 복습하기

이번 시간에는 주사위 모형을 통한 간단한 확률을 표로 나타내는 법과
몬테카를로 시뮬레이션을 통한 주가 예측을 배웠습니다.

다음 시간에 만나요 안뇽.

반응형