🎓 レベル:発展 | 重要度:B(標準)
📎 前提:ブラウン運動と幾何ブラウン運動 | 関連:債券価格とイールドカーブ・ブラウン運動(統計)
要点(BLUF)
- 短期金利モデルは、金利そのものを確率過程でモデル化します。代表が Vasicek で、長期水準 に引き戻される平均回帰を持ちます。
- Vasicek は正規分布なので負の金利を許します。CIR は 項により(Feller 条件のもとで)金利を正に保ちます。
- 株価(GBM)が指数的に発散していくのと違い、金利は平均回帰で一定のレンジに留まります。この性質が、債券・金利デリバティブの価格づけの土台になります。
1. なぜ金利専用のモデルか
株価には幾何ブラウン運動(ブラウン運動と幾何ブラウン運動)を使いましたが、金利を GBM でモデル化するのは不適切です。GBM は指数的に増え続け、いくらでも大きくなれますが、金利は中央銀行や経済の力で一定の水準に引き戻される——青天井にはなりません。この「引き戻し」を**平均回帰(mean reversion)**と呼び、ドリフト項に組み込みます。
が長期均衡水準、 が回帰の速さ。 が より高ければドリフトは負(下げる)、低ければ正(上げる)。これが Vasicek モデルです。
2. Vasicekモデルの平均回帰
高い金利から出発させ、長期水準 に吸い寄せられる様子を見ます。
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 は過去を忘れて の周りに落ち着く。回帰速度 は「ズレの半分が約1.4年で解消」する速さです。長期的には金利は平均 、分散 の正規分布(定常分布)に収束します。
3. Vasicek vs CIR:負金利の問題
Vasicek の弱点は、正規分布ゆえ金利が負になりうること。歴史的には「金利が負はおかしい」とされ(近年はマイナス金利も現実化・要最新確認)、これを避けるのが CIR(Cox–Ingersoll–Ross)モデルです。拡散項に を掛け、金利が0に近づくとランダム性が消えて0を割らないようにします。
Feller 条件 が満たされれば、金利は厳密に正を保ちます。両モデルを多数シミュレートし、負金利の発生を比べます。
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 条件 が余裕で満たされ、金利が正に保たれています。 という一工夫が、金利の符号というモデルの妥当性を左右するのです。
4. 債券価格づけへの使い方
Vasicek・CIR はともにアフィン項構造モデルで、 満期のゼロクーポン債価格が
という閉形式( は時間の決定論的関数)で書けるのが大きな利点です。これにより、現在の短期金利 からイールドカーブ全体を一貫して生成でき、金利デリバティブ(キャップ・スワプション)の価格づけにつながります。実務では市場のイールドカーブに整合させる Hull–White(時間依存の を持つ拡張 Vasicek)などが使われます(要最新確認)。
⚠️ よくある誤解
- 金利に GBM を使ってはいけない:GBM は平均回帰せず指数的に発散します。金利には Vasicek・CIR のような平均回帰モデルを使います。
- 「負金利はモデルの欠陥」とは言い切れない:かつては Vasicek の負金利が欠点とされましたが、2010年代以降は実際にマイナス金利が観測され、負を許すモデルが見直されています(要最新確認)。CIR が常に「正しい」わけではありません。
- オイラー離散化は CIR で 0 を割りうる: の数値計算では、刻みが粗いと が負に行き が NaN になります。
np.maximum(r,0)での切り詰めや、専用スキーム(全切り詰め法)で対処します。
関連ノート
- 第7章 金利モデルと債券 目次
- ブラウン運動と幾何ブラウン運動 — 前提:確率過程(GBM との対比)
- 債券価格とイールドカーブ — モデルが生成するイールドカーブ
- ブラウン運動(統計)— 確率過程の土台
- 金融工学テキスト 全体目次 — 第8章 リスク管理へ続く