Mímisbrunnr知恵の泉

← 金融工学 一覧

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

📎 前提:債券価格とイールドカーブ | 関連:グリークス(デルタ・ガンマとの対応)

要点(BLUF)

1. デュレーション

債券価格は複数時点のキャッシュフローの集まりなので、「実質的に何年もの」かを1つの数字で表したのがマコーレー・デュレーションです。各キャッシュフローの現在価値で重みづけした、平均回収期間。

DMac=ttPVtP,PVt=CFt(1+y)tD_{\text{Mac}} = \frac{\sum_t t\cdot \mathrm{PV}_t}{P}, \qquad \mathrm{PV}_t = \frac{CF_t}{(1+y)^t}

これを金利感応度に直したのが修正デュレーションで、利回りが1動いたときの価格の変化率(弾力性)を表します。

Dmod=DMac1+ydPPDmoddyD_{\text{mod}} = \frac{D_{\text{Mac}}}{1+y} \qquad\Longrightarrow\qquad \frac{dP}{P} \approx -D_{\text{mod}}\,dy

マイナス符号は「金利が上がると価格が下がる」逆相関(債券価格とイールドカーブ)を表します。

2. コンベクシティと価格変化の近似

修正デュレーションは直線近似なので、金利が大きく動くと誤差が出ます。価格・利回り曲線は下に凸(コンベックス)なので、2次の項を足すと精度が上がります。これがコンベクシティです。

C=tt(t+1)PVt/(1+y)2PdPDmodPdy+12CP(dy)2C = \frac{\sum_t t(t+1)\,\mathrm{PV}_t/(1+y)^2}{P} \qquad\Longrightarrow\qquad dP \approx -D_{\text{mod}}\,P\,dy + \tfrac12\,C\,P\,(dy)^2

10年債で、金利+1%のときの実際の価格変化を、1次近似(デュレーションのみ)と2次近似(+コンベクシティ)で比べます。

import numpy as np

def cashflows(face, coupon_rate, n, freq=1):
    N = n*freq
    c = face*coupon_rate/freq
    cf = np.full(N, c, dtype=float); cf[-1] += face
    t = np.arange(1, N+1)/freq
    return t, cf

def price_from_y(t, cf, y):
    return np.sum(cf/(1+y)**t)

face, coupon_rate, n, y = 100.0, 0.05, 10, 0.04
t, cf = cashflows(face, coupon_rate, n)
P = price_from_y(t, cf, y)
pv = cf/(1+y)**t

mac_dur = np.sum(t*pv)/P                          # マコーレー
mod_dur = mac_dur/(1+y)                           # 修正デュレーション
convexity = np.sum(t*(t+1)*pv/(1+y)**2)/P         # コンベクシティ

print(f"価格 = {P:.4f}")
print(f"マコーレー・デュレーション = {mac_dur:.4f} 年")
print(f"修正デュレーション = {mod_dur:.4f}")
print(f"コンベクシティ = {convexity:.4f}")

dy = 0.01
actual = price_from_y(t, cf, y+dy) - P
approx_d = -mod_dur*P*dy                          # 1次(デュレーション)
approx_dc = -mod_dur*P*dy + 0.5*convexity*P*dy**2 # 2次(+コンベクシティ)
print(f"金利+1%の実際の価格変化 = {actual:.4f}")
print(f"デュレーション近似      = {approx_d:.4f}")
print(f"+コンベクシティ近似     = {approx_dc:.4f}")

出力:

価格 = 108.1109
マコーレー・デュレーション = 8.1909 年
修正デュレーション = 7.8759
コンベクシティ = 77.4820
金利+1%の実際の価格変化 = -8.1109
デュレーション近似      = -8.5147
+コンベクシティ近似     = -8.0958

出力の意味:金利+1%で価格は実際 8.1109-8.1109 下がります。デュレーションだけの近似は 8.5147-8.5147下げすぎ(直線なので凸の曲がりを無視)。コンベクシティを足すと 8.0958-8.0958 と、実際の 8.11-8.11 にぐっと近づきます。コンベクシティ項 +12CP(dy)2+\tfrac12 C P(dy)^2 は常に正で、金利が動いたとき価格を「お得な方向」に押し戻す——金利上昇時は下げを和らげ、下落時は上げを増やす。だから投資家はコンベクシティの高い債券を好みます。

3. 近似の精度を可視化

金利変化の幅を広げると、1次近似がどこで破れ、2次近似がどこまで持つかが見えます。

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

def cashflows(face, coupon_rate, n, freq=1):
    N = n*freq; c = face*coupon_rate/freq
    cf = np.full(N, c, dtype=float); cf[-1] += face
    t = np.arange(1, N+1)/freq
    return t, cf

def price_from_y(t, cf, y):
    return np.sum(cf/(1+y)**t)

face, coupon_rate, n, y = 100.0, 0.05, 10, 0.04
t, cf = cashflows(face, coupon_rate, n)
P = price_from_y(t, cf, y)
pv = cf/(1+y)**t
mod_dur = (np.sum(t*pv)/P)/(1+y)
convexity = np.sum(t*(t+1)*pv/(1+y)**2)/P

dys = np.linspace(-0.03, 0.03, 61)
actual = np.array([price_from_y(t, cf, y+d) for d in dys])
dur_only = P - mod_dur*P*dys
dur_conv = P - mod_dur*P*dys + 0.5*convexity*P*dys**2

plt.figure(figsize=(7, 5))
plt.plot(dys*100, actual, lw=2, label="実際の価格")
plt.plot(dys*100, dur_only, "--", label="デュレーション近似(1次)")
plt.plot(dys*100, dur_conv, ":", lw=2, label="+コンベクシティ(2次)")
plt.xlabel("金利変化 Δy (%)"); plt.ylabel("債券価格")
plt.title("金利変化に対する価格:1次 vs 2次近似")
plt.legend(); plt.grid(alpha=0.3); plt.tight_layout(); plt.show()

出力の意味:実際の価格曲線(下に凸)に対し、デュレーション近似(破線)は接線なので、金利が大きく動くほど下側に外れます。コンベクシティを足した2次近似(点線)は、実際の曲線にぴったり寄り添い、±2%\pm2\% 程度までよく合います。デュレーションは小さな金利変動、コンベクシティは大きな変動で効く——テイラー展開の1次・2次そのものです。

4. グリークスとの対応

債券の金利リスク管理は、オプションのグリークス(グリークス)と同じ構造です。

オプション(原資産 SS債券(金利 yy
デルタ V/S\partial V/\partial S(1次)修正デュレーション(1次)
ガンマ 2V/S2\partial^2 V/\partial S^2(2次)コンベクシティ(2次)

どちらも「価格を1次(傾き)と2次(曲がり)で近似する」テイラー展開。デルタヘッジが「デュレーション・マッチング(資産と負債のデュレーションを合わせて金利リスクを消す)」に対応します。リスク管理の言語は、原資産が株でも金利でも共通です。

⚠️ よくある誤解

関連ノート