幾何ブラウン運動のシミュレーション

dS = aSdt + bdW

の確率微分方程式の解は以下になる。

S = S0 exp((r - 1/2 σ**)t + σW)

この式で注意するポイントは3つある。

1点めは基本は金利rで増えること

2点目はボラティリティが大きいと金利rで増えた分が減少すること

3点目は不確定のノイズWがボラティリティと掛け合わせで影響を与えること


実行結果

画像1

Pythonコード

import math
import numpy as np
import scipy.stats as scs
import statsmodels.api as sm
from pylab import mpl, plt

plt.style.use('seaborn')
mpl.rcParams['font.family'] = 'serif'
%matplotlib inline

def gen_paths(S0, r, sigma, T, M, I):
   ''' Generate dMonte Carlo paths for geometric Brownian motion.
   
   Parameters
   ==========
   S0: float
       initial stock/index value
   r: float
       constant short rate
   sigma: float
       constant volatility
   T: float
       final time horizon
   M: int
       number of time steps/intervals
   I: int
       number of paths to be simulated
       
   Returns
   =======
   paths: ndarray, shape (M + 1, I)
       simulated paths given the parameters
   '''
   dt = T / M
   paths = np.zeros((M + 1, I))
   paths[0] = S0
   for t in range(1, M + 1):
       rand = np.random.standard_normal(I)
       rand = (rand - rand.mean()) / rand.std()  
       paths[t] = paths[t - 1] * np.exp((r - 0.5 * sigma ** 2) * dt +
                                        sigma * math.sqrt(dt) * rand)  
   return paths
   S0 = 100.  
r = 0.05  
sigma = 0.3  
T = 1.0   
M = 250  
I = 100 
np.random.seed(1000)

paths = gen_paths(S0, r, sigma, T, M, I)

plt.figure(figsize=(10, 6))
plt.plot(paths[:, :10000])
plt.xlabel('time steps')
plt.ylabel('index level');
   
   




この記事が気に入ったらサポートをしてみませんか?