→ 연속 시간에 발생하는 무작위 걸음 (random walk)으로 , 움직임이 이산적(discrete)이 아닌 연속적(continuous)
ex) 코인을 던져서 매 시간마다 한 걸음씩 이동하는 무작위 걸음을 생성하는 것과 유사하지만, 브라운 운동을 생성하기 위해서는 코인을 무한히 빠르게 던지고, 각 시점마다 무한히 작은 걸음을 취해야한다.
스탠다드 버전 브라운 운동은 아래와 같은 특징을 가지고 있는 무작위 걸음
B(0)=0: 시작점에서의 값은 0입니다.
시작점: B(0) = 0 : 시작점에서의 값은 0입니다.
정규 분포의 변화: 0 <= t <= T에 대해, B(T) - B(t) ~ N(0, T-t) - 두 시점 사이의 브라운 운동의 변화는 중심이 0이고 분산이 T-t인 정규 분포를 따릅니다.
독립적 증가: 시간 구간이 서로 겹치지 않으면, 그 구간들에 대한 브라운 운동의 증가는 서로 독립적입니다.
연속성: B(t)는 시간 t
브라운 운동
→ 연속 시간에 발생하는 무작위 걸음 (random walk)으로 , 움직임이 이산적(discrete)이 아닌 연속적(continuous)
ex) 코인을 던져서 매 시간마다 한 걸음씩 이동하는 무작위 걸음을 생성하는 것과 유사하지만, 브라운 운동을 생성하기 위해서는 코인을 무한히 빠르게 던지고, 각 시점마다 무한히 작은 걸음을 취해야한다.
스탠다드 버전 브라운 운동은 아래와 같은 특징을 가지고 있는 무작위 걸음
B(0)=0: 시작점에서의 값은 0입니다.
시작점: B(0) = 0 : 시작점에서의 값은 0입니다.
정규 분포의 변화: 0 <= t <= T에 대해, B(T) - B(t) ~ N(0, T-t) - 두 시점 사이의 브라운 운동의 변화는 중심이 0이고 분산이 T-t인 정규 분포를 따릅니다.
독립적 증가: 시간 구간이 서로 겹치지 않으면, 그 구간들에 대한 브라운 운동의 증가는 서로 독립적입니다.
연속성: B(t)는 시간 t
과제 2
GBM이라고 하자 t시점에서의 주식의 기대가격은 S(0)시작할 시점 x $e^t(\mu + \sigma^2 / 2)$
로그를 취한거는 노말분포를 따른다는 것
문제 설명
이 문제는 주식의 가격이 시간에 따라 어떻게 변화하는지 모델링하고
그 정보를 사용하여 유럽식 콜 옵션의 가격을 계산하는 것
여기서 사용한 모델은 주식 가격의 미래 가격 경로 예측으로 유명한
위험 중립 기하 브라운 운동(Geometric Brownian Motion, GBM) 이라고 함
주어진 조건은 아래와 같음
초기 주식 가격: 100
무위험 이자율: 0.05 (5%)
변동성: 0.2 (20%)
만기까지의 시간: 1년
시간 단계 수: 365 (하루를 한 단계로 가정)
시뮬레이션할 샘플 경로의 수: 300
콜 옵션 가격을 계산하기 위해서는 행사 가격 $K$가 필요한데, 문제에서 주어지지 않았으므로
$K$ = 105를 사용 (100보다 크게 설정한 이유는 콜옵션 가격을 구하는 것이기 때문에)
해결 방법
주식 가격 시뮬레이션:
위험 중립 기하 브라운 운동 모델을 사용하여 주식 가격의 미래 경로를 300개 시뮬레이션
이를 위해 먼저 주식 가격 변화에 영향을 주는 무작위 요소(표준 정규 분포에서 추출한 난수)를 생성
그런 다음, 이 난수를 사용하여 각 시간 단계에서의 주식 가격을 계산
콜 옵션 가격 계산:
만기일에 주식의 가격이 행사 가격보다 높은 경우, 콜 옵션의 소유자는 이익을 얻는다. 이러한 이익을 '페이오프'라고 한다.
모든 시뮬레이션된 경로에 대해 페이오프를 계산하고, 그 평균을 취한다.
평균 페이오프를 현재 가치로 할인하여 콜 옵션의 가격을 구함
1단계: 주식 가격 시뮬레이션
import numpy as np
np.random.seed(202104) # 난수 생성의 일관성을 위해 시드 설정
# 파라미터
S0 = 100 # 초기 주식 가격
r = 0.05 # 무위험 이자율
sigma = 0.2 # 변동성
T = 1 # 만기까지 시간(년)
N = 365 # 시간 단계 수
dt = T / N # 각 단계의 시간 간격
M = 300 # 시뮬레이션할 경로의 수
# 랜덤 요소 생성
Z = np.random.normal(0, 1, (M, N))
# 주식 가격 데이터를 저장할 배열 초기화
S = np.zeros((M, N+1))
S[:, 0] = S0
# 주식 가격 시뮬레이션
for i in range(1, N+1):
S[:, i] = S[:, i-1] * np.exp((r - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * Z[:, i-1])
np.random.seed(202104): 난수 생성 시 일관된 결과를 얻기 위해 시드 값을 설정
Z = np.random.normal(0, 1, (M, N)): 각 시간 단계에서 주식 가격 변화에 영향을 주는 무작위 요소를 생성. 이 값은 표준 정규 분포에서 뽑힌 난수
주식 가격 시뮬레이션 루프: 이 부분에서 위험 중립 GBM 공식을 사용하여 각 시간 단계마다 주식 가격을 계산
2단계: 콜 옵션 가격 계산
K = 105 # 행사 가격을 예제로 105로 설정
# 만기 시의 각 경로에 대한 페이오프 계산
payoffs = np.maximum(S[:, -1] - K, 0)
# 페이오프의 현재 가치의 평균을 취함
option_price = np.exp(-r * T) * np.mean(payoffs)
print(f"콜 옵션 가격: {option_price}")
payoffs = np.maximum(S[:, -1] - K, 0): 만기 시 주식 가격이 행사 가격 K보다 높은 경우, 차액만큼의 이익(페이오프)이 발생. 주식 가격이 K 이하인 경우 페이오프는 0
np.maximum 함수는 이러한 조건을 처리하여 각 시뮬레이션된 경로에 대한 페이오프를 계산
option_price = np.exp(-r * T) * np.mean(payoffs): 계산된 페이오프의 평균을 취하고, 이를 무위험 이자율로 할인하여 콜 옵션의 현재 가치를 구한다.
전체 코드
from scipy.stats import norm
from scipy import log, exp, sqrt
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 파라미터 설정
S0 = 100 # 초기 주식 가격
r = 0.05 # 무위험 이자율
sigma = 0.2 # 변동성(volatility)
T = 1 # 만기까지의 시간
N = 365 # 시간 단계의 총 수
dt = T / N # 시간 단계의 폭
M = 300 # 샘플 경로의 수
# 랜덤 시드 설정
np.random.seed(202104)
# 랜덤 숫자 생성
Z = np.random.normal(0, 1, size=(M, N))
# 주식 가격 배열 초기화
S = np.zeros((M, N+1))
S[:, 0] = S0
# 위험 중립 GBM을 사용한 주식 가격 시뮬레이션
for t in range(1, N+1):
S[:, t] = S[:, t-1] * np.exp((r - 0.5 * sigma**2) * dt + sigma * sqrt(dt) * Z[:, t-1])
# 행사 가격 설정 (임의로 지정)
K = 105
# 콜 옵션 가격 계산
payoffs = np.maximum(S[:, -1] - K, 0)
option_price = np.exp(-r * T) * np.mean(payoffs)
# 결과 출력
print(f"옵션 가격: {option_price}")
plt.figure(figsize=(10, 6))
plt.plot(S.T[:, :10])
plt.title('주식 가격 시뮬레이션 경로')
plt.xlabel('시간 단계')
plt.ylabel('주식 가격')
plt.show()