Mímisbrunnr知恵の泉

← シミュレーション 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:代表的分布の生成(正規・指数・ポアソン) | 金融:ブラウン運動と幾何ブラウン運動モンテカルロ法によるオプション価格

要点(BLUF)

1. ポアソン過程:指数間隔を積み上げる

レート λ\lambda のポアソン過程は、事象の到着間隔が独立な指数分布 Exp(λ)\text{Exp}(\lambda)代表的分布の生成(正規・指数・ポアソン))。間隔を累積すれば到着時刻列になります(離散事象の到着過程の土台)。

import numpy as np

# 乱数シードを固定
rng = np.random.default_rng(65)

lam = 5.0; T_end = 10000
inter = rng.exponential(1/lam, int(lam*T_end*1.2))   # 指数間隔
arrival = np.cumsum(inter)
arrival = arrival[arrival < T_end]                    # 観測区間内の到着
print(f"ポアソン過程: 単位時間あたり事象数 N(T)/T = {len(arrival)/T_end:.4f}  (理論 lambda={lam})")

出力:

ポアソン過程: 単位時間あたり事象数 N(T)/T = 4.9765  (理論 lambda=5.0)

出力の意味:指数間隔を積み上げただけで、単位時間あたり事象数が λ=5\lambda=5 に一致。非斉次(レートが時間変化する)ポアソン過程は間引き法(thinning)——高いレートで生成し、確率 λ(t)/λmax\lambda(t)/\lambda_{\max} で受理——で作れます(棄却法の応用)。

2. ブラウン運動:独立増分を √dt でスケールする

標準ブラウン運動(ウィーナー過程)WtW_t は、(1) W0=0W_0=0、(2) 独立増分、(3) Wt+sWtN(0,s)W_{t+s}-W_t \sim \mathcal{N}(0, s) を満たす過程。時間刻み dtdt ごとの増分は N(0,dt)\mathcal{N}(0, dt)、つまり標準正規に dt\sqrt{dt} を掛けたものを積み上げます。

Wt+dt=Wt+dtZ,ZN(0,1)W_{t+dt} = W_t + \sqrt{dt}\,Z,\qquad Z \sim \mathcal{N}(0,1)
import numpy as np

# 乱数シードを固定
rng = np.random.default_rng(64)

T = 1.0; steps = 1000; n_paths = 20000
dt = T / steps
increments = rng.normal(0, np.sqrt(dt), (n_paths, steps))   # 各増分 ~ N(0, dt)
W = np.cumsum(increments, axis=1)                            # 標本路

for k in [steps//4 - 1, steps//2 - 1, steps - 1]:
    t = (k+1) * dt
    print(f"ブラウン運動 t={t:.2f}: 分散={W[:,k].var():.4f}  (理論 {t:.4f})")

出力:

ブラウン運動 t=0.25: 分散=0.2498  (理論 0.2500)
ブラウン運動 t=0.50: 分散=0.5037  (理論 0.5000)
ブラウン運動 t=1.00: 分散=1.0034  (理論 1.0000)

出力の意味:ブラウン運動の分散が時間 tt に正比例t=0.25,0.5,1.0t=0.25, 0.5, 1.0 で分散 0.25, 0.50, 1.00)。これがブラウン運動の決定的な性質で、標準偏差は t\sqrt{t} で広がる——[[01-04_大数の法則と中心極限定理の役割|ランダムウォークの n\sqrt{n} 拡散]]の連続時間版です。増分を dt\sqrt{dt} でスケールするのが要で、dtdt で掛けると(誤って)分散が消えてしまいます。

3. Euler–Maruyama 法:SDE を離散化する

一般の確率微分方程式(SDE)

dXt=a(Xt)dt+b(Xt)dWtdX_t = a(X_t)\,dt + b(X_t)\,dW_t

は、ブラウン増分 dtZ\sqrt{dt}\,Z を使って離散化できます(Euler–Maruyama 法):

Xt+dt=Xt+a(Xt)dt+b(Xt)dtZX_{t+dt} = X_t + a(X_t)\,dt + b(X_t)\,\sqrt{dt}\,Z

ドリフト項に dtdt、拡散項に dt\sqrt{dt} を掛けるのがポイント。例として、平均回帰する Ornstein–Uhlenbeck (OU) 過程 dX=θ(μX)dt+σdWdX = \theta(\mu - X)dt + \sigma\,dW を解き、定常分布の平均 μ\mu・分散 σ2/(2θ)\sigma^2/(2\theta) に収束するか確かめます。

import numpy as np

# 乱数シードを固定
rng = np.random.default_rng(66)

theta, mu, sigma = 1.0, 2.0, 0.5
steps = 200_000; dt = 0.01
X = 0.0
xs = np.empty(steps)
for i in range(steps):
    X += theta*(mu - X)*dt + sigma*np.sqrt(dt)*rng.standard_normal()   # Euler-Maruyama
    xs[i] = X

burn = 10_000
print(f"OU過程 平均={xs[burn:].mean():.4f}  (理論 {mu})")
print(f"OU過程 分散={xs[burn:].var():.4f}  (理論 {sigma**2/(2*theta):.4f})")

出力:

OU過程 平均=1.9849  (理論 2.0)
OU過程 分散=0.1285  (理論 0.1250)

出力の意味:OU 過程は初期値0から始まって、定常分布の平均 μ=2\mu=2(1.985)・分散 σ2/(2θ)=0.125\sigma^2/(2\theta)=0.125(0.129)へ収束。Euler–Maruyama で SDE をステップ更新するだけで、平均回帰という連続時間ダイナミクスが再現できました。分散がわずかに大きい(0.129 vs 0.125)のは離散化バイアス——dtdt を小さくすると縮みます(Euler–Maruyama は強収束次数 1/2・弱収束次数 1)。

4. 応用への橋渡し(境界)

これらのパス生成は多くの応用の入口です。

数式の直観的意味

確率過程のパス生成は「ランダムな変化を、時間方向に少しずつ積み上げる」操作です。ブラウン運動で増分を dt\sqrt{dt} でスケールするのは、独立増分の分散が時間に比例する(Var(Wt)=t\text{Var}(W_t)=t)ことの裏返し——nn ステップで分散が ndt=tn \cdot dt = t になるには、各増分の標準偏差が dt\sqrt{dt} でなければならない。これは中心極限定理で標本和が n\sqrt{n} で広がるのと同じ算術で、ブラウン運動は「無限に細かいランダムウォークの極限」。Euler–Maruyama がドリフトに dtdt・拡散に dt\sqrt{dt} を使う非対称性も、この「ランダム項は dt\sqrt{dt} オーダー」という確率解析の核心を反映しています。だから拡散項を dtdt で離散化する素朴な真似をすると、ランダム性が消えて間違う——通常の ODE 数値解法と SDE が決定的に違う点です。

⚠️ よくある誤解・落とし穴

対応シミュレーション参照

本文のポアソン過程(default_rng(65))・ブラウン運動(default_rng(64)、分散∝t)・OU過程の Euler–Maruyama(default_rng(66))。応用はブラウン運動と幾何ブラウン運動へ。

関連ノート