🎓 レベル:標準 | 重要度:A(必須)
📎 前提:債券価格とイールドカーブ | 関連:グリークス(デルタ・ガンマとの対応)
要点(BLUF)
- デュレーションは債券の金利感応度。マコーレー・デュレーションは「キャッシュフローの加重平均回収期間」、修正デュレーションは「利回りに対する価格の弾力性」です。
- 価格変化は1次近似で 。金利が動いたときの価格の動きを直線で捉えます——オプションのデルタに対応。
- コンベクシティは価格・利回り曲線の曲がり(2次項)。大きな金利変動で1次近似の誤差を補正します——ガンマに対応。
1. デュレーション
債券価格は複数時点のキャッシュフローの集まりなので、「実質的に何年もの」かを1つの数字で表したのがマコーレー・デュレーションです。各キャッシュフローの現在価値で重みづけした、平均回収期間。
これを金利感応度に直したのが修正デュレーションで、利回りが1動いたときの価格の変化率(弾力性)を表します。
マイナス符号は「金利が上がると価格が下がる」逆相関(債券価格とイールドカーブ)を表します。
2. コンベクシティと価格変化の近似
修正デュレーションは直線近似なので、金利が大きく動くと誤差が出ます。価格・利回り曲線は下に凸(コンベックス)なので、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%で価格は実際 下がります。デュレーションだけの近似は と下げすぎ(直線なので凸の曲がりを無視)。コンベクシティを足すと と、実際の にぐっと近づきます。コンベクシティ項 は常に正で、金利が動いたとき価格を「お得な方向」に押し戻す——金利上昇時は下げを和らげ、下落時は上げを増やす。だから投資家はコンベクシティの高い債券を好みます。
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次近似(点線)は、実際の曲線にぴったり寄り添い、 程度までよく合います。デュレーションは小さな金利変動、コンベクシティは大きな変動で効く——テイラー展開の1次・2次そのものです。
4. グリークスとの対応
債券の金利リスク管理は、オプションのグリークス(グリークス)と同じ構造です。
| オプション(原資産 ) | 債券(金利 ) |
|---|---|
| デルタ (1次) | 修正デュレーション(1次) |
| ガンマ (2次) | コンベクシティ(2次) |
どちらも「価格を1次(傾き)と2次(曲がり)で近似する」テイラー展開。デルタヘッジが「デュレーション・マッチング(資産と負債のデュレーションを合わせて金利リスクを消す)」に対応します。リスク管理の言語は、原資産が株でも金利でも共通です。
⚠️ よくある誤解
- マコーレーと修正デュレーションを混同しない:マコーレーは「年」単位の平均回収期間、修正は価格変化率(弾力性)。 で割るだけの違いですが、用途が違います。価格感応度に使うのは修正デュレーション。
- デュレーションは満期と同じではない:クーポンがある債券のデュレーションは満期より短くなります(途中でクーポンが返るぶん前倒し)。ゼロクーポン債だけがデュレーション=満期です。
- コンベクシティは常に味方とは限らない:コール条項付き債券(繰上償還)などはマイナスのコンベクシティを持ち、金利低下時に価格が頭打ちになります(要最新確認)。
関連ノート
- 第7章 金利モデルと債券 目次
- 債券価格とイールドカーブ — 前提:価格・利回りの関係
- 短期金利モデル — 次のトピック:金利そのものを確率過程に
- グリークス — デルタ・ガンマとの対応
- 金融工学テキスト 全体目次