Mímisbrunnr知恵の泉

← 金融工学 一覧

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

📎 前提:ランダムウォークと効率的市場仮説 | 数理:ブラウン運動(統計)・正規分布(標準正規・標準化)(統計)

要点(BLUF)

1. ブラウン運動(連続時間の極限)

ランダムウォークと効率的市場仮説 のランダムウォークで、時間刻みを Δt0\Delta t\to 0 にした極限がブラウン運動 WtW_t です。定義する性質は次の3つ(詳細は ブラウン運動(統計))。

増分の分散が時間に比例する(標準偏差は Δt\sqrt{\Delta t})ことが、リスクの測り方 の √t則の連続版です。この WtW_t が、これ以降すべての連続時間モデルの「ランダムさの源泉」になります。

2. 算術ブラウン運動と幾何ブラウン運動

ブラウン運動で価格を動かす最も素朴な方法は、算術ブラウン運動です。

dXt=μdt+σdWtXt=X0+μt+σWtN(X0+μt, σ2t)dX_t = \mu\,dt + \sigma\,dW_t \qquad\Longrightarrow\qquad X_t = X_0 + \mu t + \sigma W_t \sim \mathcal{N}(X_0+\mu t,\ \sigma^2 t)

これは正規分布なので、確率的に負の値を取ります。株価は0未満になれないので、価格モデルとしては不適切です。そこで「変化率がブラウン運動で動く」と考えるのが**幾何ブラウン運動(GBM)**です。

dSt=μStdt+σStdWtdS_t = \mu S_t\,dt + \sigma S_t\,dW_t

ここで μ\muドリフト(期待成長率)σ\sigmaボラティリティ。両辺を StS_t で割ると dSt/St=μdt+σdWtdS_t/S_t = \mu\,dt + \sigma\,dW_t——左辺は瞬間リターンで、「リターンが平均 μ\mu・ボラ σ\sigma で揺れる」という、リターンの測り方 の自然な連続版になっています。2つを並べて描きます。

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

rng = np.random.default_rng(1)
S0, mu, sigma, T, N = 100.0, 0.10, 0.20, 1.0, 252
dt = T/N
t = np.linspace(0, T, N+1)

n_paths = 6
dW = rng.normal(0, np.sqrt(dt), (n_paths, N))                       # 増分
W = np.concatenate([np.zeros((n_paths, 1)), np.cumsum(dW, axis=1)], axis=1)

X = mu*t + sigma*W                                  # 算術ブラウン運動
S = S0*np.exp((mu - 0.5*sigma**2)*t + sigma*W)      # 幾何ブラウン運動

fig, ax = plt.subplots(1, 2, figsize=(11, 4))
ax[0].plot(t, X.T, lw=1); ax[0].axhline(0, color="k", lw=0.8)
ax[0].set_title("算術ブラウン運動(0 を割って負にもなる)"); ax[0].set_xlabel("時間 t")
ax[1].plot(t, S.T, lw=1)
ax[1].set_title("幾何ブラウン運動(常に正)")
ax[1].set_xlabel("時間 t"); ax[1].set_ylabel("価格")
plt.tight_layout(); plt.show()

出力の意味:左の算術ブラウン運動は0の線を平気で割り込み、負の「価格」が現れます。右の GBM はどの経路も常に正で、価格として自然です。違いは「絶対額が揺れる」か「変化率が揺れる」か。GBM は変化率(リターン)が一定のボラで揺れるので、価格が高いときは値動きも大きく、0 には漸近しても到達しません。

3. GBMの解と対数正規分布

GBM の確率微分方程式 dS=μSdt+σSdWdS=\mu S\,dt+\sigma S\,dW の解は

St=S0exp ⁣((μσ22)t+σWt)S_t = S_0\exp\!\left(\Big(\mu-\frac{\sigma^2}{2}\Big)t + \sigma W_t\right)

です(この導出には確率過程の連鎖律が要る——次の 伊藤の補題 でやります)。注目すべきは指数の肩の σ2/2-\sigma^2/2 という補正項。これがあるおかげで、対数価格 lnSt\ln S_t は正規分布

lnStN ⁣(lnS0+(μσ22)t,  σ2t)\ln S_t \sim \mathcal{N}\!\left(\ln S_0 + \Big(\mu-\frac{\sigma^2}{2}\Big)t,\ \ \sigma^2 t\right)

に従い、StS_t 自身は対数正規分布になります。1年後の価格を大量に生成して分布を見ます。

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from scipy import stats

rng = np.random.default_rng(1)
S0, mu, sigma, T = 100.0, 0.10, 0.20, 1.0
M = 200000

W_T = rng.normal(0, np.sqrt(T), M)                  # 終端のブラウン運動
S_T = S0*np.exp((mu - 0.5*sigma**2)*T + sigma*W_T)  # 1年後の価格

print(f"E[S_T]  (シミュ) = {S_T.mean():.4f}")
print(f"S0*e^(μT)        = {S0*np.exp(mu*T):.4f}")
print(f"中央値  (シミュ) = {np.median(S_T):.4f}")
print(f"S0*e^((μ-σ^2/2)T) = {S0*np.exp((mu-0.5*sigma**2)*T):.4f}")
print(f"P(S_T < S0)      = {np.mean(S_T < S0):.4f}")

plt.figure(figsize=(7, 4))
plt.hist(S_T, bins=120, density=True, alpha=0.4, label="シミュレーション")
x = np.linspace(S_T.min(), np.percentile(S_T, 99.5), 400)
pdf = stats.lognorm.pdf(x, s=sigma*np.sqrt(T), scale=S0*np.exp((mu-0.5*sigma**2)*T))
plt.plot(x, pdf, "r-", lw=2, label="対数正規 pdf(理論)")
plt.axvline(S_T.mean(), color="green", ls="--", label="平均")
plt.axvline(np.median(S_T), color="purple", ls=":", label="中央値")
plt.xlabel("1年後の価格 S_T"); plt.ylabel("密度")
plt.title("GBM の終端価格は対数正規分布")
plt.legend(); plt.tight_layout(); plt.show()

出力:

E[S_T]  (シミュ) = 110.4566
S0*e^(μT)        = 110.5171
中央値  (シミュ) = 108.2834
S0*e^((μ-σ^2/2)T) = 108.3287
P(S_T < S0)      = 0.3452

出力の意味:分布は右に裾を引いた対数正規で、理論 pdf(赤線)とよく重なります。重要なのは平均(110.46)と中央値(108.28)がズレていること。対数正規は非対称なので、E[ST]=S0eμT=110.52E[S_T]=S_0e^{\mu T}=110.52 に対し中央値は S0e(μσ2/2)T=108.33S_0e^{(\mu-\sigma^2/2)T}=108.33 と低くなります。さらに P(ST<S0)=0.345P(S_T<S_0)=0.345——ドリフトが正(年10%)でも、1年後に値下がりしている確率は約35%。「平均は上がるが、過半数は中央値以下」という株価の直感に反する性質が、この補正項 σ2/2-\sigma^2/2 から自然に出てきます。これは リターンの測り方 のボラティリティ・ドラッグの正体でもあります。

⚠️ よくある誤解

関連ノート