Pythonでモンテカルロ法、将来の株価をシミュレーションする

本記事の目的と対象

本記事の目的は、Pythonを用いて株価のモンテカルロ・シミュレーションを行う方法を示すことである。

対象者は以下の条件を満たす読者である。
  • Pythonを使える環境が整っている人(Win10での環境設定はこちら
  • Pythonを用いて株価のモンテカルロ・シミュレーションを実施したい人
本記事で示すコードはGithubで公開されている。
MonteCarloNote/PyhonStockMonteCarlo.py



目次

モンテカルロ法(モンテカルロ・シミュレーション)とはなにか

モンテカルロ法とは、コンピュータに乱数を発生させて解を推定する方法で、いわば究極の力業
である[1]。

金融工学が生まれた頃は、不確実性を伴う株価やデリバティブの価格を既知の関数の組み合わせで表現し、効率的に計算することが求められた。

しかし、コンピュータが普及し、その計算能力が向上することで、金融世界の不確実性をそのままコンピュータ上で計算できるようになった。

モンテカルロ法とは、こうした不確実性を乱数として表現し、コンピュータに計算させる方法である。

モンテカルロ法により将来の変数を予測する手法をモンテカルロ・シミュレーションと呼ぶ。

ブラック・ショールズモデルにおける株価過程

ブラック・ショールズモデルとは、株価\( S_t\)が以下のような確率微分方程式に従うと仮定するモデルをいう。
\[ \begin{split}dS_t=\mu S_tdt+\sigma S_tdW_t \end{split} \]
ただし\(W_t \)はブラウン運動である。

株価初期値を\( S_0\)として、「伊藤の公式」をつかって\( S_t\)について解くと、
\[ \begin{split} S_t=S_0e^{(\mu-\frac{1}{2}\sigma^2)dt+\sigma W_t}\end{split} \]
を得る。

ブラウン運動\( W_t\)は正規分布に従い、したがって株価\( S_t\)は正規分布が指数の肩に乗った形をしている。

このような形を幾何ブラウン運動(geometric Brownian Motion)という。

本記事では株価に幾何ブラウン運動を仮定したブラック・ショールズモデルをベースに、モンテカルロ・シミュレーションを実施し、将来の株価を予測する。

株価過程の離散化

コンピュータは、連続的な数値の変化を扱うことが苦手である。

したがって、連続時間モデルであるブラック・ショールズモデルはそのままではプログラム出来ず、離散的な表現に書き換える必要がある。

時間の微小変化\( dt\)を離散的な時間変化\( \Delta t\)に、ブラウン運動の微小変化\(dW_t \)を離散的増分\( \Delta W_t\)に置き換える。

このとき\( \Delta W_t\)は、標準正規分布に従う確率変数\( \epsilon\)を用いて、
\[ \begin{split} \Delta W_t=\epsilon\sqrt{\Delta t}\end{split} \]
と書くことが出来る。

幾何ブラウン運動の式と上記の離散化の表現を用いて、時点\( t+\Delta t\)と\( t\)の株価の関係式は、以下のように書ける。
\[ \begin{split} S_{t+\Delta t}=S_{t}e^{(\mu-\frac{1}{2}\sigma^2)\Delta t+\sigma \epsilon\sqrt{\Delta t}}\end{split} \]
この式をベースに、標準正規確率変数\(\epsilon \)をコンピュータで多数発生させ、将来の株価をシミュレーションする。



Pythonによるモンテカルロ・シミュレーションのコード例

まず必要なモジュールと関数をインポートする。
import numpy as np
from math import exp,sqrt
import random
import matplotlib.pyplot as plt

次に幾何ブラウン運動株価過程を関数として定義する。
def gBM(S,sigma,mu,t,z):
    gBM= S*exp((mu - sigma**2/2)*t + sigma * sqrt(t) * z)
    return gBM

そしてパラメタを入力する。
sigma=0.3
mu=0.05
delta_t=0.01

また、各時点の株価を格納する空の配列を用意し、株価の初期値\(S_0\)を設定する。
process=np.zeros(10000) #10,000ステップ
process[0]=100 #初期値

最後に実際にモンテカルロ・シミュレーションを行うコードを示す。

定義したgBM関数を用いて、\(S_0\)から\( S_{\Delta t}\)を作り、\( S_{\Delta t}\)から\( S_{\Delta t+\Delta t}\)を作り、を繰り返す。

時間ステップが1つ増えるたび、乱数が加わっていくことに注意する。

標準正規乱数はrandom.gauss(0,1)で得られる。
for n in range(1,len(process)):
    process[n]=gBM(process[n-1],sigma,mu,delta_t,random.gauss(0,1))

こうして、幾何ブラウン運動に従う株価過程が得られる。

配列をプロットすれば、実際の株価チャートに似たギザギザのグラフが得られる。
plt.plot(process)
plt.show()

乱数によるシミュレーションであるから、毎回結果が変わることに注意されたい。



まとめ

本記事では、基本的な連続株価過程を離散近似し、乱数を多数発生させることで、株価の変動をシミュレートした。

株価過程を修正することで、より複雑な確率分布を持つモデルや、株価変動の非連続性(ジャンプ)を反映させることも可能である。

参考文献

[1]大野 薫, 2012, モンテカルロ法によるリアル・オプション分析―事業計画の戦略的評価, きんざい