目次
「債券は退屈な資産」——こう考える個人投資家は多い。しかし、債券市場は株式市場を上回る規模を誇り、中央銀行の金融政策から企業財務まで、経済全体の根幹をなす市場だ。本稿では債券投資の基礎を数理的な理解とともに体系的に解説する。
債券の 3 つの要素
| 要素 | 説明 | 具体例 |
|---|---|---|
| 額面(元本) | 満期に償還される金額 | 100 万円 |
| クーポン(利子) | 定期的に支払われる利息 | 年 3%(年 3 万円) |
| 満期 | 元本が償還されるまでの期間 | 10 年 |
1. 債券の基本概念
1.1 債券の仕組み
債券は**「国や企業がお金を借り、定期的に利息を支払い、満期に元本を返す」**という債務関係を証書化したものだ。
投資家 ──→ [100 万円] ──→ 発行体(国・企業)
←─ [毎年 3 万円] ── クーポン支払い
←─ [10 年後 100 万円] ── 元本償還
1.2 債券の種類
| 種類 | 発行体 | リスク | 利回り |
|---|---|---|---|
| 国債 | 国 | 低い(デフォルトリスクほぼなし) | 低い |
| 地方債 | 地方自治体 | 低い〜中 | 中 |
| 社債 | 企業 | 中〜高い(信用力による) | 中〜高い |
| 劣後債 | 金融機関 | 高い | 高い |
1.3 債券価格と市場価格
債券は発行後、市場で取引される。価格は需要と供給で決まり、額面(100 円)を上回ったり下回ったりする。
# 債券価格の例
# 日本国債 10 年物、クーポン 0.1%
market_price = 99.50 # 額面 100 円に対して 99.50 円( discount 債)
# または
market_price = 101.20 # 額面 100 円に対して 101.20 円(premium 債)
2. 利回りの計算——表面利回りと実質利回り
2.1 表面利回り(クーポン利回り)
表面利回りは購入価格に対する年間クーポンの割合だ。
表面利回り = クーポン / 購入価格 × 100
| 購入価格 | クーポン | 表面利回り |
|---|---|---|
| 100 円(額面) | 3 円 | 3.00% |
| 95 円(割引) | 3 円 | 3.16% |
| 105 円(割増) | 3 円 | 2.86% |
def current_yield(coupon, price):
"""表面利回りの計算"""
return coupon / price * 100
# 例:クーポン 3 円、価格 95 円
print(f"表面利回り:{current_yield(3, 95):.2f}%") # 3.16%
2.2 最終利回り(Yield to Maturity, YTM)
最終利回りは債券を満期まで保有した場合の年平均リターンだ。債券分析で最も重要な指標となる。
購入価格 = Σ[Ct / (1+YTM)^t] + [額面 / (1+YTM)^n]
ここで:
- Ct: t 年目のクーポン
- n: 満期までの年数
この式を YTM について解く(数値計算が必要)。
from scipy.optimize import brentq
def bond_price(face_value, coupon_rate, ytm, years):
"""YTM から債券価格を計算"""
coupon = face_value * coupon_rate
price = sum(coupon / (1 + ytm) ** t for t in range(1, years + 1))
price += face_value / (1 + ytm) ** years
return price
def ytm_from_price(face_value, coupon_rate, price, years):
"""債券価格から YTM を計算(数値的な逆算)"""
coupon = face_value * coupon_rate
def objective(ytm):
return bond_price(face_value, coupon_rate, ytm, years) - price
# YTM を数値的に求解
return brentq(objective, 0.0001, 0.5)
# 例:額面 100 円、クーポン 3%、価格 95 円、5 年物
face_value = 100
coupon_rate = 0.03
price = 95
years = 5
ytm = ytm_from_price(face_value, coupon_rate, price, years)
print(f"最終利回り(YTM): {ytm * 100:.2f}%") # 約 4.02%
2.3 利回りの分解
最終利回りは以下の 3 つに分解できる:
最終利回り ≈ 表面利回り + キャピタルゲイン/ロス + 再投資利回り
| 構成要素 | 説明 |
|---|---|
| 表面利回り | クーポンによるインカムゲイン |
| キャピタルゲイン/ロス | 割引・割増購入による価格差益/損 |
| 再投資利回り | クーポンを再投資した際の利回り |
# 簡易的な YTM 分解(近似)
def decompose_ytm(coupon, price, face_value, years):
"""YTM の分解(近似値)"""
current_yield = coupon / price
capital_gain_yield = (face_value - price) / price / years
reinvestment_yield = 0 # 簡略化のため 0 とする
approx_ytm = current_yield + capital_gain_yield + reinvestment_yield
return {
"current_yield": current_yield,
"capital_gain_yield": capital_gain_yield,
"approx_ytm": approx_ytm
}
# 例:クーポン 3 円、価格 95 円、額面 100 円、5 年
result = decompose_ytm(coupon=3, price=95, face_value=100, years=5)
print(f"表面利回り:{result['current_yield']*100:.2f}%")
print(f"キャピタルゲイン利回り:{result['capital_gain_yield']*100:.2f}%")
print(f"近似 YTM: {result['approx_ytm']*100:.2f}%")
3. デュレーション——金利リスクの測定
3.1 デュレーションの定義
デュレーションは債券の価格が金利変化に対してどれだけ敏感かを表す指標だ。
デュレーション ≈ 金利が 1% 上昇したときの債券価格の変化率(%)
| デュレーション | 金利 1% 上昇時の価格変化 |
|---|---|
| 2 年 | -2% |
| 5 年 | -5% |
| 10 年 | -10% |
3.2 マコーレーデュレーション
マコーレーデュレーションはキャッシュフローの加重平均受取期間だ。
MacD = Σ[t × PV(Ct)] / Σ[PV(Ct)]
ここで:
- t: 受取時期(年)
- PV(Ct): t 年目のキャッシュフローの現在価値
def macaulay_duration(face_value, coupon_rate, ytm, years):
"""マコーレーデュレーションの計算"""
coupon = face_value * coupon_rate
pv_total = 0
weighted_sum = 0
for t in range(1, years + 1):
pv = coupon / (1 + ytm) ** t
pv_total += pv
weighted_sum += t * pv
# 元本の現在価値
pv_face = face_value / (1 + ytm) ** years
pv_total += pv_face
weighted_sum += years * pv_face
return weighted_sum / pv_total
# 例:額面 100 円、クーポン 3%、YTM 4%、5 年物
duration = macaulay_duration(face_value=100, coupon_rate=0.03, ytm=0.04, years=5)
print(f"マコーレーデュレーション:{duration:.2f}年")
3.3 修正デュレーション
実務で使われるのは修正デュレーションだ。
修正デュレーション = マコーレーデュレーション / (1 + YTM)
def modified_duration(face_value, coupon_rate, ytm, years):
"""修正デュレーションの計算"""
mac_d = macaulay_duration(face_value, coupon_rate, ytm, years)
return mac_d / (1 + ytm)
# 価格変化の予測
def predict_price_change(duration, yield_change):
"""デュレーションによる価格変化の予測"""
return -duration * yield_change * 100
# 例:修正デュレーション 4.5、金利 0.5% 上昇
mod_d = modified_duration(100, 0.03, 0.04, 5)
price_change = predict_price_change(mod_d, 0.005)
print(f"金利 0.5% 上昇で価格 {price_change:.2f}% 下落")
3.4 デュレーションの特性
| 要因 | デュレーションへの影響 |
|---|---|
| 満期が長い | デュレーション長い |
| クーポン高い | デュレーション短い |
| 利回り高い | デュレーション短い |
# デュレーションの比較
bonds = [
{"name": "短期低クーポン", "coupon": 0.01, "ytm": 0.02, "years": 2},
{"name": "長期低クーポン", "coupon": 0.01, "ytm": 0.02, "years": 10},
{"name": "長期高クーポン", "coupon": 0.05, "ytm": 0.02, "years": 10},
]
for bond in bonds:
d = macaulay_duration(100, bond["coupon"], bond["ytm"], bond["years"])
print(f"{bond['name']}: {d:.2f}年")
# 出力例:
# 短期低クーポン:1.98 年
# 長期低クーポン:9.56 年
# 長期高クーポン:8.23 年
4. コンベクシティ——デュレーションの補正
4.1 コンベクシティの必要性
デュレーションは金利変化と価格変化が線形と仮定するが、実際には曲線(凸)関係にある。
実際の価格変化 = デュレーション効果 + コンベクシティ効果
価格変化率 ≈ -D × Δy + (1/2) × C × (Δy)²
ここで:
- D: 修正デュレーション
- C: コンベクシティ
- Δy: 金利変化
4.2 コンベクシティの計算
def convexity(face_value, coupon_rate, ytm, years):
"""コンベクシティの計算"""
coupon = face_value * coupon_rate
pv_total = 0
convexity_sum = 0
for t in range(1, years + 1):
pv = coupon / (1 + ytm) ** t
pv_total += pv
convexity_sum += t * (t + 1) * pv
# 元本
pv_face = face_value / (1 + ytm) ** years
pv_total += pv_face
convexity_sum += years * (years + 1) * pv_face
return convexity_sum / (pv_total * (1 + ytm) ** 2)
# 価格変化のより正確な予測
def predict_price_change_with_convexity(duration, convexity, yield_change):
"""デュレーション+コンベクシティによる価格変化予測"""
dur_effect = -duration * yield_change
conv_effect = 0.5 * convexity * (yield_change ** 2)
return (dur_effect + conv_effect) * 100
# 例:デュレーション 4.5、コンベクシティ 25、金利 1% 上昇
conv = convexity(100, 0.03, 0.04, 5)
price_change = predict_price_change_with_convexity(4.5, conv, 0.01)
print(f"金利 1% 上昇で価格 {price_change:.2f}% 変化")
4.3 デュレーションとコンベクシティの効果
| 金利変化 | デュレーション効果 | コンベクシティ効果 | 合計 |
|---|---|---|---|
| +1% | -4.50% | +0.13% | -4.37% |
| -1% | +4.50% | +0.13% | +4.63% |
コンベクシティは価格下落を緩和し、価格上昇を増幅するプラスの効果を持つ。
5. イールドカーブ——期間構造の読み方
5.1 イールドカーブとは
イールドカーブは異なる満期の債券利回りを結んだ曲線だ。
利回り(%)
│
4.0├ ●
│ ●
3.0├ ●
│ ●
2.0├●
└────┴────┴────┴──── 満期(年)
1 3 5 10
5.2 イールドカーブの形状
| 形状 | 説明 | 経済状況 |
|---|---|---|
| 順イールド | 長期金利 > 短期金利 | 正常的な成長局面 |
| 逆イールド | 短期金利 > 長期金利 | 景気後退の先行き懸念 |
| フラット | 長期金利 ≈ 短期金利 | 転換点、不確実性 |
5.3 イールドカーブのデータ取得と可視化
import matplotlib.pyplot as plt
import numpy as np
# 日本国債の利回り(例)
maturities = np.array([1, 2, 3, 5, 7, 10, 20, 30])
yields = np.array([0.05, 0.10, 0.15, 0.35, 0.45, 0.55, 1.20, 1.45]) # 2024 年某月
# イールドカーブのプロット
plt.figure(figsize=(10, 6))
plt.plot(maturities, yields, 'o-', linewidth=2, markersize=8)
plt.xlabel('満期(年)')
plt.ylabel('利回り(%)')
plt.title('日本国債イールドカーブ')
plt.grid(True, alpha=0.3)
plt.show()
5.4 イールドカーブの分析指標
スプレッド(長期金利 - 短期金利)
def yield_curve_spread(long_yield, short_yield):
"""イールドカーブのスプレッド(10 年 -2 年)"""
return long_yield - short_yield
# 例:10 年利回り 0.55%、2 年利回り 0.10%
spread = yield_curve_spread(0.55, 0.10)
print(f"イールドスプレッド:{spread*100:.2f}bp")
# 解釈
if spread > 0:
print("順イールド(正常的)")
elif spread < 0:
print("逆イールド(景気後退懸念)")
else:
print("フラット(転換点)")
カーブの傾き変化
| 変化 | 名称 | 意味 |
|---|---|---|
| 長期金利上昇 | スティープニング | 成長期待、インフレ懸念 |
| 長期金利下落 | フラットニング | 景気懸念、安全資産選好 |
| 短期金利上昇 | 金融引き締め | 中央銀行の利上げ |
| 短期金利下落 | 金融緩和 | 中央銀行の利下げ |
6. 債券投資の実践戦略
6.1 ラダー戦略
満期の異なる債券を等間隔で購入し、利率リスクを分散する戦略。
年 1: [●───────] 1 年物
年 2: [●───────] 2 年物
年 3: [●───────] 3 年物
年 4: [●───────] 4 年物
年 5: [●───────] 5 年物
def build_ladder_portfolio(total_amount, num_bonds):
"""ラダー型ポートフォリオの構築"""
amount_per_bond = total_amount / num_bonds
ladder = []
for i in range(1, num_bonds + 1):
ladder.append({
"maturity": i,
"amount": amount_per_bond,
"allocation": f"{i}年物"
})
return ladder
# 例:1000 万円を 5 本の債券に分散
ladder = build_ladder_portfolio(10_000_000, 5)
for bond in ladder:
print(f"{bond['allocation']}: {bond['amount']:,.0f}円")
メリット:
- 利率変動リスクを分散
- 毎年満期が来て流動性を確保
- 再投資のタイミングを分散
6.2 バーベル戦略
短期債と長期債のみを保有し、中期債を避ける戦略。
年 1: [●───────] 短期債
年 2:
年 3:
年 4:
年 5: [●───────────────] 長期債
| 特性 | 説明 |
|---|---|
| 短期債 | 流動性確保、利率リスク低 |
| 長期債 | 高い利回り、キャピタルゲイン狙い |
6.3 ボディ戦略
中期債中心の保有。バランス型アプローチ。
7. 債券投資のリスク管理
7.1 債券の主要リスク
| リスク | 説明 | 対策 |
|---|---|---|
| 金利リスク | 金利上昇で価格下落 | デュレーション管理 |
| 信用リスク | 発行体のデフォルト | 格付け確認、分散投資 |
| インフレリスク | 実質利回りの低下 | TIPS、物価連動債 |
| 為替リスク | 外貨建ての場合 | ヘッジ、円換算 |
| 流動性リスク | 売却できない | 発行額の大きい債券 |
7.2 格付けと信用リスク
| 格付け | S&P/Moody's | 説明 | 利回りスプレッド |
|---|---|---|---|
| AAA/Aaa | 最上位 | 極めて安全 | ベンチマーク +0.1% |
| AA/Aa | 上位 | 非常に安全 | +0.3% |
| A/A | 中上位 | 安全 | +0.6% |
| BBB/Baa | 中位 | 投資適格 | +1.0% |
| BB/Ba | 中下位 | 投機的 | +2.0% |
| B/B | 下位 | 高リスク | +4.0% |
| CCC/C | 最下位 | デフォルト近い | +8.0% 以上 |
7.3 リスク調整後リターン
def risk_adjusted_return(bond_yield, duration, rating_spread):
"""リスク調整後リターンの簡易計算"""
# 金利リスクをデュレーションで調整
risk_premium = bond_yield - rating_spread
return risk_premium / duration
# 例:利回り 2.5%、デュレーション 5 年、信用スプレッド 0.5%
rar = risk_adjusted_return(0.025, 5, 0.005)
print(f"リスク調整後リターン:{rar*100:.2f}%")
8. 債券と株式のポートフォリオ
8.1 債券の分散効果
債券は株式と低い相関(場合によっては負の相関)を持つため、ポートフォリオに組み入れることでリスクを低減できる。
| ポートフォリオ | 期待リターン | ボラティリティ | シャープレシオ |
|---|---|---|---|
| 株式 100% | 7.0% | 15.0% | 0.40 |
| 株式 60% + 債券 40% | 5.5% | 9.0% | 0.50 |
| 債券 100% | 3.5% | 4.0% | 0.50 |
8.2 最適ポートフォリオの計算
import numpy as np
def portfolio_metrics(stock_weight, stock_return, stock_vol, bond_return, bond_vol, correlation):
"""2 資産ポートフォリオのリスク・リターン計算"""
bond_weight = 1 - stock_weight
# 期待リターン
portfolio_return = stock_weight * stock_return + bond_weight * bond_return
# ポートフォリオ分散
portfolio_var = (
stock_weight**2 * stock_vol**2 +
bond_weight**2 * bond_vol**2 +
2 * stock_weight * bond_weight * correlation * stock_vol * bond_vol
)
portfolio_vol = np.sqrt(portfolio_var)
return portfolio_return, portfolio_vol
# 例:株式リターン 7%、ボラ 15%、債券リターン 3.5%、ボラ 4%、相関 0.2
stock_ret, stock_vol = 0.07, 0.15
bond_ret, bond_vol = 0.035, 0.04
corr = 0.2
# 様々な配分を計算
for stock_w in [1.0, 0.8, 0.6, 0.4, 0.2, 0.0]:
ret, vol = portfolio_metrics(stock_w, stock_ret, stock_vol, bond_ret, bond_vol, corr)
print(f"株式{stock_w*100:.0f}%: リターン{ret*100:.1f}%, リスク{vol*100:.1f}%")
8.3 年齢に応じた配分
「100-年齢」の債券比率が一つの目安だ。
| 年齢 | 株式 | 債券 | 特徴 |
|---|---|---|---|
| 20 代 | 80% | 20% | 成長重視 |
| 40 代 | 60% | 40% | バランス型 |
| 60 代 | 40% | 60% | 安定重視 |
| 80 代 | 20% | 80% | 元本重視 |
まとめ
債券投資の核心をまとめると以下のようになる:
- 利回り: 表面利回り(クーポン/価格)と最終利回り(YTM、真のリターン)を理解
- デュレーション: 金利リスクの測定指標。1% 金利上昇でデュレーション分%価格が下落
- コンベクシティ: デュレーションの補正項。価格変動の非線形性を捉える
- イールドカーブ: 期間構造から景気観測。順イールドは正常、逆イールドは後退懸念
- 投資戦略: ラダー、バーベル、ボディでリスク分散
- ポートフォリオ: 債券は株式と低い相関で分散効果
債券は「退屈」に見えるが、その数理は奥深く、経済全体の血液として機能している。金利環境が大きく変化する中で、債券の正しい理解は個人投資家にとっても不可欠だ。
免責事項 — 当記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。投資判断はご自身の責任で行ってください。