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

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

言語 JA

ETFと利回りを比較

05.1.6

ETFと利回りを比較

最終更新 2020-04-08 読了時間 5 分
まとめ
株式 ETF の価格と米国債の利回りは逆方向に動くことが多く、2 つを同じ図に重ねると金利環境が株価にどう効いているかが見えます。このページでは stooq をデータ源にして、S&P 500 連動の VOO、全米株式の VTI、指数そのものの S&P 500(^SPX)と Nasdaq(^NDQ)、そして米国債 10 年(10USY.B)と 2 年(2USY.B)の利回りを 2021 年 8 月から 2022 年 1 月まで取得します。利回り 2 本を折れ線で並べて長短金利差(イールドカーブの傾き)を確認し、最後に mplfinance で S&P 500 のローソク足と 10 年債利回りを twinx() の 2 軸で重ねます。読み終えると、get_finance_data(source="stooq") の銘柄コードを替えるだけで任意の ETF と金利を同じ図で比べられるようになります。

直感 #

金利が上がると、株式より安全な国債で得られる利回りが増えるので、株式に求められるリターンも上がり、株価(特に将来の利益に期待が集まる成長株)には下押し圧力が掛かります。2021 年末から 2022 年初はまさに 10 年債利回りが 1.3% から 1.8% へ上がり、S&P 500 が最高値から調整に入った時期です。この関係を見るには「ETF の価格」と「利回り」を同じ期間・同じ横軸に揃える必要があり、ここでは pandas-datareader 経由で stooq から両方を取ります。pandas-datareader の使い方は メディアプログラミング入門 WebスクレイピングとWebAPI の講義資料 45 ページで紹介されていたものです。

準備 #

株価と利回りの取得には mplfinance のページで作った get_finance_data() を utils.py から読み込みます。source="stooq" を受け付けるように拡張してあります。

1
2
3
4
5
6
import numpy as np
import pandas as pd
import pandas_datareader.data as web
import matplotlib.pyplot as plt
from IPython.display import display, HTML
from utils import get_finance_data, get_rsi

ETF と株価指数を取得する #

VOO と VTI は Vanguard の ETF で、それぞれ S&P 500 と全米株式に連動します。指数そのもの(^SPX、^NDQ)も取って、ETF の値動きが指数をなぞっていることを確かめます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 銘柄名、期間、保存先ファイル
start = "2021-08-01"
end = "2022-01-31"

# データを取得する
voo = get_finance_data("VOO", source="stooq", start=start, end=end)
display(HTML(f"<h3>VOO</h3>"))
display(voo.head())

vti = get_finance_data("VTI", source="stooq", start=start, end=end)
display(HTML(f"<h3>VTI</h3>"))
display(vti.head())

spx = get_finance_data("^SPX", source="stooq", start=start, end=end)
display(HTML(f"<h3>S&P500</h3>"))
display(spx.head())

ndq = get_finance_data("^NDQ", source="stooq", start=start, end=end)
display(HTML(f"<h3>Nasdaq</h3>"))
display(ndq.head())

VOO

OpenHighLowCloseVolume
Date
2022-01-31405.67413.9700404.3500413.699200435
2022-01-28397.82406.3300393.3000406.2612096807
2022-01-27402.93405.9700394.8200396.5412455226
2022-01-26405.66408.1954394.3400398.5614377346
2022-01-25398.17404.2600392.7325399.4616836326

VTI

OpenHighLowCloseVolume
Date
2022-01-31222.09226.950221.22226.815306436
2022-01-28217.50222.170214.93222.094961209
2022-01-27220.81222.400215.90216.755791524
2022-01-26222.72224.160216.05218.377096416
2022-01-25219.10222.015215.64219.226600378

S&P500

OpenHighLowCloseVolume
Date
2022-01-314431.794516.894414.024515.552960132803
2022-01-284336.194432.724292.464431.852926083817
2022-01-274380.584428.744309.504326.513070684348
2022-01-264408.434453.234304.804349.933239353450
2022-01-254366.644411.014287.114356.453069079477

Nasdaq

OpenHighLowCloseVolume
Date
2022-01-3113812.2014242.9013767.7114239.883268652504
2022-01-2813436.7113771.9113236.5513770.573092819850
2022-01-2713710.9913765.9113322.6613352.783373437394
2022-01-2613871.7714002.6513392.1913542.123664304374
2022-01-2513610.8713781.6313414.1413539.293265336637

債券利回りを取得する #

stooq では米国債の利回りも株と同じ形式で取れます。10USY.B が 10 年、2USY.B が 2 年で、Close 列が年利回り(%)です。

1
2
3
4
5
6
7
usy10 = get_finance_data("10USY.B", source="stooq", start=start, end=end)
display(HTML(f"<h3>10-Year U.S. Bond Yield</h3>"))
display(usy10.head())

usy2 = get_finance_data("2USY.B", source="stooq", start=start, end=end)
display(HTML(f"<h3>2-Year U.S. Bond Yield</h3>"))
display(usy2.head())

10-Year U.S. Bond Yield

OpenHighLowClose
Date
2022-01-311.7891.8161.7711.780
2022-01-281.8301.8481.7731.777
2022-01-271.8401.8511.7831.799
2022-01-261.7691.8761.7691.867
2022-01-251.7531.7921.7351.776

2-Year U.S. Bond Yield

OpenHighLowClose
Date
2022-01-311.19861.21451.15871.1827
2022-01-281.21411.22601.16031.1703
2022-01-271.18221.20611.16031.1882
2022-01-261.03131.16031.01541.1544
2022-01-251.00551.03530.98971.0254
1
2
3
4
5
6
7
plt.figure(figsize=(12, 4))
plt.plot(usy10.Close, label="米国債券10年 年利回り")
plt.plot(usy2.Close, label="米国債券2年 年利回り")
plt.legend()
plt.tick_params(rotation=90)
plt.grid()
plt.show()

債権利回りの図

実行結果の読み方 #

10 年債利回り(青)は 2021 年 8 月の 1.2% 台から 2022 年 1 月末の 1.8% 前後まで上がり、2 年債(オレンジ)は 0.2% から 1.2% へとそれ以上の速さで上がっています。2 本の差(長短金利差)が 1.0% から 0.6% へ縮んでおり、市場が利上げを織り込み始めた局面だと読めます。

S&P 500 と 10 年債利回りの比較 #

株価指数のローソク足と利回りの折れ線は単位が違うので、twinx() で左右に別の縦軸を持たせて重ねます。mplfinance の ax= 引数に matplotlib の Axes を渡すと、通常の matplotlib の図の中にローソク足を描けます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import mplfinance as mpf

fig = mpf.figure(figsize=(16, 7), tight_layout=True, style="default")

ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()
mpf.plot(spx, type="candle", style="yahoo", datetime_format="%Y/%m/%d", ax=ax1)
ax1.set_ylabel("S&P500")
ax1.invert_xaxis()

mpf.plot(
    usy10,
    type="line",
    style="starsandstripes",
    datetime_format="%Y/%m/%d",
    ax=ax2,
)

# 左側にラベルを表示する
ax2.tick_params(labelleft=True, labelright=False)
ax2.set_ylabel("10-Year U.S. Bond Yield")
ax2.yaxis.set_label_position("left")
ax2.legend(["10-Year U.S. Bond Yield"])
<matplotlib.legend.Legend at 0x7fcc4de60970>

S&P500と10年債利回りの比較

実行結果の読み方 #

横軸が反転しているので左端が 2022 年 1 月です。10 年債利回り(折れ線)が 1.7〜1.8% へ上がった左側の区間で、S&P 500 のローソク足は 4,800 付近の高値から陰線が続いて 4,400 台まで下げています。右側の 2021 年秋は利回りが 1.5% 前後で横ばい、株価は上昇基調で、金利の上昇が株価の調整と重なる局面がこの 6 か月では 1 回はっきり現れています。

使いどころと落とし穴 #

stooq は API キー不要で手軽ですが、日付が新しい順に返るため sort_index() を忘れると移動平均や差分の向きが逆になります。利回りと株価を重ねるときは必ず twinx() で軸を分け、同じ軸に載せるために片方を定数倍するのは避けます(倍率で見え方が変わってしまいます)。6 か月という短い期間では金利と株価の関係が 1 局面しか見られないので、因果を主張するなら 2010 年以降などの長期で 相互相関 を計算し、ラグを確認する方が安全です。

まとめ #

get_finance_data(ticker, source="stooq", start, end) の 1 行で、ETF(VOO・VTI)、株価指数(^SPX・^NDQ)、米国債利回り(10USY.B・2USY.B)がすべて同じ OHLC 形式で取れます。利回りは 2 本を plt.plot で重ねて長短金利差の縮小を読み、株価と利回りは mpf.plot(..., ax=ax1) と ax1.twinx() で 2 軸の 1 枚にまとめました。2021 年末からの 10 年債利回りの上昇と S&P 500 の調整が同じ図の中で重なって見えるのが、この比較チャートの読みどころです。