Mímisbrunnr知恵の泉

← 金融工学 一覧

🎓 レベル:発展 | 重要度:B(標準)

📎 前提:ブラウン運動と幾何ブラウン運動 | 関連:債券価格とイールドカーブブラウン運動(統計)

要点(BLUF)

1. なぜ金利専用のモデルか

株価には幾何ブラウン運動(ブラウン運動と幾何ブラウン運動)を使いましたが、金利を GBM でモデル化するのは不適切です。GBM は指数的に増え続け、いくらでも大きくなれますが、金利は中央銀行や経済の力で一定の水準に引き戻される——青天井にはなりません。この「引き戻し」を**平均回帰(mean reversion)**と呼び、ドリフト項に組み込みます。

dr=a(br)平均回帰dt+σdWランダムdr = \underbrace{a(b - r)}_{\text{平均回帰}}\,dt + \underbrace{\sigma\,dW}_{\text{ランダム}}

bb が長期均衡水準、aa が回帰の速さ。rrbb より高ければドリフトは負(下げる)、低ければ正(上げる)。これが Vasicek モデルです。

2. Vasicekモデルの平均回帰

高い金利から出発させ、長期水準 bb に吸い寄せられる様子を見ます。

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

rng = np.random.default_rng(0)
a, b, sigma, r0 = 0.5, 0.03, 0.02, 0.08   # a=回帰速度, b=長期水準, r0=高い初期金利
T, N, M = 10.0, 1000, 8
dt = T/N
t = np.linspace(0, T, N+1)

r = np.zeros((M, N+1)); r[:, 0] = r0
for i in range(N):
    dW = rng.normal(0, np.sqrt(dt), M)
    r[:, i+1] = r[:, i] + a*(b - r[:, i])*dt + sigma*dW   # Vasicek の離散化

plt.figure(figsize=(8, 5))
plt.plot(t, r.T*100, lw=1)
plt.axhline(b*100, color="black", ls="--", lw=2, label=f"長期水準 b={b:.0%}")
plt.xlabel("時間 t(年)"); plt.ylabel("短期金利 (%)")
plt.title("Vasicek モデルの平均回帰")
plt.legend(); plt.grid(alpha=0.3); plt.tight_layout(); plt.show()

print(f"開始金利 r0={r0}, 長期水準 b={b}")
print(f"t=10 での8本の平均金利 = {r[:, -1].mean():.4f}")

出力:

開始金利 r0=0.08, 長期水準 b=0.03
t=10 での8本の平均金利 = 0.0359

出力の意味:8%から出発した金利は、どの経路も急速に長期水準3%へ引き戻され、10年後の平均は約3.6%(ランダムなぶれを含む)。GBM なら初期値の影響が残り続けますが、Vasicek は過去を忘れて bb の周りに落ち着く。回帰速度 a=0.5a=0.5 は「ズレの半分が約1.4年で解消」する速さです。長期的には金利は平均 bb、分散 σ2/(2a)\sigma^2/(2a) の正規分布(定常分布)に収束します。

3. Vasicek vs CIR:負金利の問題

Vasicek の弱点は、正規分布ゆえ金利が負になりうること。歴史的には「金利が負はおかしい」とされ(近年はマイナス金利も現実化・要最新確認)、これを避けるのが CIR(Cox–Ingersoll–Ross)モデルです。拡散項に r\sqrt{r} を掛け、金利が0に近づくとランダム性が消えて0を割らないようにします。

CIR:dr=a(br)dt+σrdW\text{CIR:}\quad dr = a(b-r)\,dt + \sigma\sqrt{r}\,dW

Feller 条件 2abσ22ab \ge \sigma^2 が満たされれば、金利は厳密に正を保ちます。両モデルを多数シミュレートし、負金利の発生を比べます。

import numpy as np

def simulate_short_rate(model, a, b, sigma, r0, T, N, M, seed):
    rng = np.random.default_rng(seed)
    dt = T/N
    r = np.full(M, r0, dtype=float)
    ever_neg = np.zeros(M, dtype=bool)
    for i in range(N):
        dW = rng.normal(0, np.sqrt(dt), M)
        if model == "vasicek":
            r = r + a*(b - r)*dt + sigma*dW
        else:  # CIR:√r が 0 近傍でランダム性を消し、負を防ぐ
            r = r + a*(b - r)*dt + sigma*np.sqrt(np.maximum(r, 0))*dW
        ever_neg |= (r < 0)
    return r, ever_neg

a, b, sigma, r0, T, N, M = 0.5, 0.03, 0.02, 0.03, 10.0, 2000, 50000
rv, neg_v = simulate_short_rate("vasicek", a, b, sigma, r0, T, N, M, 0)
rc, neg_c = simulate_short_rate("cir", a, b, sigma, r0, T, N, M, 0)

print(f"Vasicek: 終端平均 {rv.mean():.4f}, 標準偏差 {rv.std():.4f}, 一度でも負 {neg_v.mean():.1%}")
print(f"理論定常(Vasicek): 平均 {b}, 標準偏差 {np.sqrt(sigma**2/(2*a)):.4f}")
print(f"CIR    : 終端平均 {rc.mean():.4f}, 最小金利 {rc.min():.5f}, 一度でも負 {neg_c.mean():.1%}")
print(f"Feller条件 2ab={2*a*b:.4f} vs sigma^2={sigma**2:.4f}")

出力:

Vasicek: 終端平均 0.0301, 標準偏差 0.0201, 一度でも負 64.3%
理論定常(Vasicek): 平均 0.03, 標準偏差 0.0200
CIR    : 終端平均 0.0300, 最小金利 0.01751, 一度でも負 0.0%
Feller条件 2ab=0.0300 vs sigma^2=0.0004

出力の意味:Vasicek の終端平均 0.0301・標準偏差 0.0201 は理論定常(平均 0.03・標準偏差 0.0200)とよく一致し、平均回帰モデルとして正しく振る舞っています。しかし64.3%もの経路が一度は負金利を経験——正規分布の宿命です。一方 CIR は最小金利 0.01751、負になった経路は 0%。Feller 条件 2ab=0.03σ2=0.00042ab=0.03 \ge \sigma^2=0.0004 が余裕で満たされ、金利が正に保たれています。r\sqrt{r} という一工夫が、金利の符号というモデルの妥当性を左右するのです。

4. 債券価格づけへの使い方

Vasicek・CIR はともにアフィン項構造モデルで、TT 満期のゼロクーポン債価格が

P(t,T)=A(t,T)eB(t,T)rtP(t,T) = A(t,T)\,e^{-B(t,T)\,r_t}

という閉形式(A,BA, B は時間の決定論的関数)で書けるのが大きな利点です。これにより、現在の短期金利 rtr_t からイールドカーブ全体を一貫して生成でき、金利デリバティブ(キャップ・スワプション)の価格づけにつながります。実務では市場のイールドカーブに整合させる Hull–White(時間依存の bb を持つ拡張 Vasicek)などが使われます(要最新確認)。

⚠️ よくある誤解

関連ノート