[Python] ウィーナー過程のシミュレーション

Python でウィーナー過程のシミュレーションを行います。

数学におけるウィーナー過程(ウィーナーかてい、: Wiener process)は、ノーバート・ウィーナーの名にちなんだ連続時間確率過程である。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

ウィーナー過程\(W_t\)は、以下の3つの条件により特徴づけられます。

  1. \(W_0 = 0\)
  2. \(W_t\) はほとんど確実に(確率 1 で)連続である。
  3. \(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\) と比較してかなり大きくなります。