K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

イールドカーブのシフトを比較する

05.2.6

イールドカーブのシフトを比較する

最終更新 2020-04-08 読了時間 4 分
まとめ
イールドカーブは、3 か月から 30 年までの残存期間(年限)を横軸に、その期間の国債利回りを縦軸に取った曲線です。このページでは 2023 年 6 月・9 月・12 月の 3 時点のサンプルカーブを DataFrame にまとめ、ax.set_xscale("log") の対数軸に marker="o" の折れ線で重ねて、全年限が同じ幅で上がる「パラレルシフト」か、短期と長期で幅が違う「ツイスト」かを見分けます。続けて snapshots.loc[10] - snapshots.loc[2] で 10 年と 2 年の差(ターム・スプレッド)を棒グラフにし、時点間の変化量を bps 単位の imshow ヒートマップに並べます。読み終えると、スプレッドがマイナスになる逆イールドや、短期だけ上がるベアフラットニングを、図の形と数値の両方で説明できるようになります。

直感 #

イールドカーブ(利回り曲線)は、残存期間ごとの国債利回りをプロットした曲線で、金融政策や景気見通しを反映します。通常は期間が長いほど利回りが高い「順イールド」ですが、短期金利が長期を上回る「逆イールド」は景気後退の先行指標として知られています。1 時点のカーブだけでは「今の形」しか分かりませんが、6 月と 12 月のカーブを重ねれば、「3 か月物は 1.2% から 1.6% へ、10 年物は 2.7% から 3.4% へ」と、どの年限がどの程度シフトしたかがよくわかります。

詳細な解説 #

複数時点のカーブ比較 #

次のコードは、9 つの年限と 3 つの時点の利回りを表にし、年限を対数目盛りにした横軸の上に 3 本のカーブを色違いで重ねて SVG に保存します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path

plt.style.use("scripts/k_dm.mplstyle")
tenors = np.array([0.25, 0.5, 1, 2, 3, 5, 7, 10, 30])

snapshots = pd.DataFrame(
    {
        "2023-06": [0.012, 0.013, 0.015, 0.018, 0.021, 0.025, 0.026, 0.027, 0.030],
        "2023-09": [0.014, 0.016, 0.018, 0.021, 0.024, 0.027, 0.029, 0.031, 0.033],
        "2023-12": [0.016, 0.018, 0.020, 0.024, 0.027, 0.030, 0.032, 0.034, 0.036],
    },
    index=tenors,
)

fig, ax = plt.subplots(figsize=(9, 4.5))
colors = ["#0ea5e9", "#6366f1", "#f97316"]

for (label, values), color in zip(snapshots.items(), colors):
    ax.plot(
        snapshots.index,
        np.array(values) * 100,
        marker="o",
        linewidth=2,
        label=label,
        color=color,
    )

ax.set_xscale("log")
ax.set_xticks(tenors)
ax.set_xticklabels(["3M", "6M", "1Y", "2Y", "3Y", "5Y", "7Y", "10Y", "30Y"])
ax.set_ylabel("利回り(%)")
ax.set_title("主要金利のカーブシフト比較(サンプルデータ)")
ax.grid(True, which="both", linestyle="--", alpha=0.3)
ax.legend()

output = Path("static/images/finance/visualize/yield_curve_shift.svg")
output.parent.mkdir(parents=True, exist_ok=True)
fig.tight_layout()
fig.savefig(output)

複数時点の利回り曲線を重ねて政策効果を把握

図の読み方 #

3 本のカーブはどれも右上がりの順イールドで、6 月(青)から 12 月(橙)へ全体が上に移動しています。3M は 1.2% → 1.6% で +40 bps、10Y は 2.7% → 3.4% で +70 bps と長期側の上げ幅がやや大きいため、純粋なパラレルシフトではなく、長期が先行して上がる「ベアスティープニング」寄りの動きです。


スプレッド(10年-2年)の算出 #

10年債と2年債の利回り差(ターム・スプレッド)は景気サイクルの代表的な指標です。スプレッドがマイナス(逆イールド)になると、過去の多くの景気後退に先行しています。次のコードは 3 時点のスプレッドを求め、正なら緑、負なら赤の棒にします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
spread = (snapshots.loc[10] - snapshots.loc[2]) * 100

fig, ax = plt.subplots(figsize=(8, 3.5))
ax.bar(spread.index, spread.values,
       color=["#10b981" if v > 0 else "#ef4444" for v in spread.values])
ax.axhline(0, color="#64748b", linewidth=0.8)
ax.set_ylabel("10Y-2Yスプレッド(%)")
ax.set_title("ターム・スプレッドの推移")
ax.grid(axis="y", alpha=0.3)

for i, (label, val) in enumerate(zip(spread.index, spread.values)):
    ax.text(i, val + 0.02, f"{val:.2f}%", ha="center", fontsize=10)

fig.tight_layout()
plt.show()

カーブの変化量をヒートマップで可視化 #

各年限でのシフト幅を色で表現すると、パラレルシフト(全年限が均等に変動)とツイスト(短期と長期で方向が異なる変動)を区別できます。次のコードは 2 区間 × 9 年限の変化を bps に換算し、2 行 × 9 列の色付きマスにします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
shift_06_to_09 = (snapshots["2023-09"] - snapshots["2023-06"]) * 10000  # bps
shift_09_to_12 = (snapshots["2023-12"] - snapshots["2023-09"]) * 10000

tenor_labels = ["3M", "6M", "1Y", "2Y", "3Y", "5Y", "7Y", "10Y", "30Y"]
shift_matrix = pd.DataFrame(
    {"06→09": shift_06_to_09.values, "09→12": shift_09_to_12.values},
    index=tenor_labels,
).T

fig, ax = plt.subplots(figsize=(10, 2.5))
im = ax.imshow(shift_matrix.values, cmap="YlOrRd", aspect="auto")
ax.set_xticks(range(len(tenor_labels)))
ax.set_xticklabels(tenor_labels)
ax.set_yticks(range(len(shift_matrix.index)))
ax.set_yticklabels(shift_matrix.index)
ax.set_title("年限別シフト幅(bps)")

for i in range(shift_matrix.shape[0]):
    for j in range(shift_matrix.shape[1]):
        ax.text(j, i, f"{shift_matrix.iloc[i, j]:.0f}",
                ha="center", va="center", fontsize=9)

fig.colorbar(im, ax=ax, label="bps", shrink=0.8)
fig.tight_layout()
plt.show()

図の読み方 #

06→09 の行は 3M が 20、1Y〜3Y が 30、10Y が 40 bps です。長期側が大きいので、カーブが立つスティープニングの区間と読めます。09→12 の行は 3M〜1Y が 20、2Y 以上が 30 bps で、短期を除けばほぼ一律の上昇、つまりパラレルシフトに近い区間です。同じ「3 か月で金利上昇」でも、ヒートマップにすると区間ごとの形の違いが数値で残ります。


使いどころと落とし穴 #

短期金利が大きく上昇し長期が横ばいの場合は「ベアフラットニング」、逆に長期が上がるなら「ベアスティープニング」と呼ばれます。上のヒートマップで「3M の列が 50 bps、30Y の列が 0 bps」のような並びが出れば前者、逆なら後者で、カーブの形から金融市場が利上げを織り込んでいるのか、インフレ期待を織り込んでいるのかを読み分けられます。期間を set_xscale("log") の対数スケールにしておくと、3M から 30 年債までの広いレンジでも短期側の点がつぶれずに視認性が保てます。

実際のデータを使う場合は、FRED の DGS2・DGS10 のような日次系列から 10 年と 2 年の差を計算し、スプレッドの時系列を別グラフで描くと、ゼロを割り込む逆イールドの日付をそのまま景気後退サインの検知に応用できます。日本国債の場合はYCC(イールドカーブ・コントロール)政策の影響で10年付近が固定されるため、10Y のマスだけ変化幅がほぼ 0 になるなどカーブの形状が独特になる点にとくに注意が必要です。