Python でウィーナー過程のシミュレーションを行います。
数学におけるウィーナー過程(ウィーナーかてい、英: Wiener process)は、ノーバート・ウィーナーの名にちなんだ連続時間確率過程である。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ウィーナー過程\(W_t\)は、以下の3つの条件により特徴づけられます。
- \(W_0 = 0\)
- \(W_t\) はほとんど確実に(確率 1 で)連続である。
- \(W_t\)は独立増分を持ち、\(0 \leq s \le t \)なる任意の\( s, t \)に対して、 \(W_t-W_s\)は正規分布\(N(0, t-s)\)に従う。
numpy.random.normal で独立増分を生成し、 numpy.cumsum で生成した独立増分を足し合わせるだけです。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
def winer_process(dt, x0=0, n=1000):
t = np.linspace(0, n, n+1)
w = np.zeros(n+1)
w[1:n+1] = np.cumsum(np.random.normal(0, dt, n))
return t, w
def plot_brownian_motion(dt, x0=0, n=1000):
t, w = winer_process(dt, x0, n)
plt.plot(t, w)
plt.xlabel('Time(t)')
plt.ylabel('W(t)')
plt.title(f'Brownian Motion when dt={dt}')
plt.show()
if __name__ == '__main__':
plot_brownian_motion(dt=0, x0=0, n=1000)
plot_brownian_motion(dt=0.1, x0=0, n=1000)
plot_brownian_motion(dt=100, x0=0, n=1000)
このコードでは、以下のようなブラウン運動が生成されました。
独立増分\(dt=0\)の時は当然ながら全く動きがありません。
独立増分\(dt=0.1\)では以下のようにランダムな動きがでます。
独立増分\(dt=100\)では、変動が \(dt=0.1\) と比較してかなり大きくなります。