LoginSignup
4
2

Pythonでランダムウォークのシミュレーション 

Last updated at Posted at 2024-03-30

ランダムウォーク

ランダムウォークは、株価変動の数理モデルなどに用いられる確率過程のことです。

ランダムウォークの定義は以下です。

ランダムウォークの定義

漸化式


z(0)=0
z(t_{k+1})=z(t_{k})+\sqrt{\Delta t}\epsilon(k)  k=0,1,2,…
\epsilon(k)~iid N(0,1)

一般式

z(t_{k}) = \sqrt{\Delta t}{\epsilon(0) +・・・+\epsilon(k-1) }=\sqrt{\Delta t} \sum_{i=0}^{k-1} \epsilon(i) 

iidは独立同分布,独立同一分布(independent and indentically distributed)の意味で、今回の場合$\epsilon(k)$は独立に標準正規分布N(0,1)に従うということです。

高校数学の基礎的な演算より、

期待値

E[\sqrt{\Delta t}\epsilon(k)]=\sqrt{\Delta t}E[\epsilon(k)]=0

分散

V[\sqrt{\Delta t}\epsilon(k)]=(\sqrt{\Delta t})^{2}=\Delta t

となります。

ランダムウォークの重要な性質

ランダムウォークには、いくつかの重要で興味深い性質があります。

Ⅰ.期待値

E[z(t_{k})]=E[\sqrt{\Delta t}\sum_{i=0}^{k-1} \epsilon(i) ]=0

点$t_{k}$にどこにいるかは分からないが、いる場所の期待値は0。(現時点t=0と同じ)

Ⅱ.分散

V[z(t_{k})]=V[\sqrt{\Delta t}\sum_{i=0}^{k-1} \epsilon(i) ] =\Delta t \sum_{i=0}^{k-1} Var[\epsilon(i)] = \Delta t k =t_{k}

ランダムウォークの分散は、その時点までの時間の長さに等しい

Ⅲ.分散

Cov[z(t_{k}),z(t_{j})] = Cov[z(t_{k}),z(t_{k})+{z(t_{j})-z(t_{k})}] = Cov[z(t_{k}),z(t_{k})]+Cov[z(t_{k}),z(t_{j})-z(t_{k})] = t_{k}

ランダムウォークの共分散は、短いほうの時間の長さに等しい

正規分布に従う乱数の生成

正規分布に従う乱数の生成には、random.gauss関数を用います。

import random 
x=random.gauss(0,1)

ランダムウォークの場合は、各時点$t$で前時点$t-1$からの増分が平均0,分散1の標準正規分布に従います。(分散は時点の増分$Δt$)

ランダムウォークをpythonで実行するプログラムの例は以下です。

import numpy as np
import matplotlib.pyplot as plt
import random

# 初期位置
time=[0]
price=[0]

#ランダムウォークの定義
for t in range(1,1000):
  time.append(t)
  dprice=random.gauss(0,t)
  price.append(price[t-1]+dprice)

#散布図にプロット
plt.plot(time,price)
plt.title('RandomWalk')
plt.show()

時刻timeとその時の値priceを配列とし、時点0~100においてランダムウォークの定義のまま実行しました。

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

ブラウン運動とは、1827年にロバート・ブラウンが発見した、液体中や気体中に微粒子がランダムに運動する現象のことです。1905年にアインシュタインがブラウン運動の理論を構築しました。

ブラウン運動は、「微粒子の運動」と「株価などのランダムに変動するものの運動」のどちらも指すことがあります。

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

ブラウン運動のpythonコードは以下の通りです。

import numpy as np
import matplotlib.pyplot as plt

# ブラウン運動のパラメータ
n_steps = 1000

# 初期位置
x, y = 0, 0
x_positions, y_positions = [x], [y]

# ブラウン運動のシミュレーション
for _ in range(n_steps):
    angle = np.random.uniform(0, 2*np.pi)
    x += np.cos(angle)
    y += np.sin(angle)
    x_positions.append(x)
    y_positions.append(y)

# プロット
plt.plot(x_positions, y_positions)
plt.title('Brownian Motion')
plt.show()

np.random.uniformで連続一様分布に従う乱数を生成し、その乱数に対応する角度分進みます。

*もちろん実行する度に概形は変わります。

その他

近年では機械学習による株価変動予測が進んでいます。決算報告や自然災害の要因は全くモデルに組み込まれていませんが、予測の精度を確かめるものとして活用することもできると思います。

実際の株価変動は、「大きく変動するときのみ他社の株価と強い相関を持つ」「正規性はあまり成り立たず、負の方向に膨らみ、尖度の大きい分布」などの特徴があります。(コピュラと呼ばれるモデルがあります。)

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2