AIとファイナンス

AIとファイナンスの架け橋、それがこのブログの目指すところです。兼業投資家向けに、Pythonを駆使して株やFXの分析を「自分で」行えるようになるための情報を提供します。ニューラルネットワークを活用した市場予測から、実証済みの金融理論まで、全てのコードを公開し、誰もが活用できるように!是非色々なコードで遊んでみてください!

【分析】日米の名目金利差とドル円相場の関係【Python】

こんにちは!今日は、「日米の名目金利差とドル円相場」の関係についてみていきましょう!

金利差とドル円相場の関係って?
まず、名目金利差とは何か、そしてそれがドル円相場にどう関わってくるのかを簡単に説明しましょう。名目金利差とは、文字通り、異なる国の名目金利の差のことを指します。この金利差が外国為替レート、特にここではドル円相場にどのように影響を与えるのかを探るのが今回のテーマです。

理論的には、金利が高い国の通貨は、金利が低い国の通貨に対して高く評価される傾向があります。これは「キャリートレード」という投資戦略にも利用されています。しかし、実際のところ、これが常に当てはまるわけではなく、多くの要因が相場に影響を与えます。そこで、過去20年のデータを使って、この関係を実際に確認してみましょう。

いつも通りコードへのリンクは下段にありますのでそちらからご覧ください。

データのダウンロード
まずはデータの取得から。日本とアメリカの金利データおよびドル円相場のデータを20年分集める必要があります。ここでは、yfinanceライブラリを使ってドル円のデータをダウンロードし、金利データについては公的なデータソースから取得します。

try:
    # カンマを区切り文字として指定
    df_jp = pd.read_csv('/content/Data_jp.csv', encoding='cp932', sep=',')
except UnicodeDecodeError:
    df_jp = pd.read_csv('/content/Data_jp.csv', encoding='shift_jis', sep=',')

# Excelファイルを読み込む
df_us = pd.read_excel('/content/Data_us.xlsx')
try:
    # カンマを区切り文字として指定
    df_jp = pd.read_csv('/content/Data_jp.csv', encoding='cp932', sep=',')
except UnicodeDecodeError:
    df_jp = pd.read_csv('/content/Data_jp.csv', encoding='shift_jis', sep=',')

# Excelファイルを読み込む
df_us = pd.read_excel('/content/Data_us.xlsx')
# 日付の形式を統一する(format指定を省略)
df_jp['Date'] = pd.to_datetime(df_jp['Date'])
df_us['Effective Date'] = pd.to_datetime(df_us['Effective Date'])

# データフレームの統合
df_merged = pd.merge(df_jp, df_us, left_on="Date", right_on="Effective Date", how="outer")
# 「Effective Rate」と「Rate (%)」の列だけを保持し、NaNが含まれる行を削除
df_filtered = df_merged[['Date', 'Effective Rate', 'Rate (%)']].copy()
df_filtered.dropna(inplace=True)

# 金利差の計算
df_filtered['Rate Difference'] = df_filtered['Effective Rate'] - df_filtered['Rate (%)']
# ドル円為替レートデータのダウンロード
usdjpy = yf.download("JPY=X", start="2004-03-01", end="2024-03-01")

# 終値のみ表示
usdjpy_close = usdjpy['Close']

# マージ(統合)する
# 既存のdf_mergedデータフレームとdf_usdjpyデータフレームをDate列でマージ
df_final = pd.merge(df_filtered, usdjpy_close, on='Date', how='left')
df_final.dropna(inplace=True)
df_final = df_final.rename(columns={
    'Effective Rate': 'Rate JP',
    'Rate (%)': 'Rate US'
})

今回はここまででかなり長いコードになってしまっています。これは今回yfinaceだけでなく、そのほかの公的機関からデータを取得し、形が全く違うからなんですね。実はデータ分析の世界ではこのクリーニング作業に一番時間がかかったりします。

データの視覚化

データを手に入れたら、次はそれを視覚化することによって、より深く理解を深めます。まずはドル円終値と日米の金利をそれぞれ時間の経過と共にプロットし、変化を観察します。

# データフレームの準備
df_final['Date'] = pd.to_datetime(df_final['Date'])

fig, ax1 = plt.subplots(figsize=(14, 7))

# Rate JP, Rate US, Rate Differenceを左の縦軸にプロット
ax1.plot(df_final['Date'], df_final['Rate JP'], label='Rate JP', color='blue')
ax1.plot(df_final['Date'], df_final['Rate US'], label='Rate US', color='red')
ax1.plot(df_final['Date'], df_final['Rate Difference'], label='Rate Difference', color='orange')

# Rate Differenceがゼロのラインを緑の濃い線で強調
ax1.axhline(0, color='darkgreen', linewidth=2)

# 右の縦軸を設定してCloseをプロット
ax2 = ax1.twinx()
ax2.plot(df_final['Date'], df_final['Close'], label='Close', color='purple')

# レジェンドとラベル
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')
ax1.set_xlabel('Date')
ax1.set_ylabel('Rate')
ax2.set_ylabel('Close')

# 日付フォーマット
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))

plt.show()

結果

こうしてみると日銀とFRB金利差がゼロに近かった2009年ごろから2016年ごろまで、ドル円相場は70円台から130円手前までかなりダイナミックに動いたことがわかりますね!

金利差とドル円相場の関係

次に、金利差とドル円相場の終値との関係を散布図で見てみましょう。この散布図から、金利差がドル円相場に与える影響の傾向を探ります。さらに、この関係を数学的に理解するために、リッジ回帰を使ってみます。リッジ回帰は、回帰分析の一種であり、過学習を防ぐために正則化項を導入したものです。

結果

リッジ回帰の結果の式で行くと名目金利差がゼロのときはx=0となるので切片の99.43円がドル円の正規レートということになります。ちなみに過去10年でやると、108.77円に値が変わってきます。

結果(過去検証期間10年)

過去五年でやると概ね同じような値で、名目金利差がゼロであれば$1=108.97円という結果になりました。なので過去のデータだけで行けば、マイナス金利が解除され、FRBが遅かれ早かれ利下げに動く場合108円方向に向かいそう、ということは言えそうですよね。さて、今回は名目金利差でやってみたので次回は10年債の利回りでやってみようかなと思います。

 

 

今回のコードは以下からアクセスしてください。

また今回は各中央銀行からのデータのダウンロードが必要となるのでご注意ください。

colab.research.google.com

 

 

参考サイト

無担保コールレート(オーバーナイト物)とは何ですか? 資金過不足とは何ですか? : 日本銀行 Bank of Japan (boj.or.jp)

日本銀行時系列統計データ検索サイト (boj.or.jp)

Federal Reserve Board - Home