見出し画像

日米金利差からドル円為替レートを予測。【pythonで決定木分析】

昨今急速に円安が進んでいます。

地元紙では珍しく、県知事選前なのに一面に経済欄が載っていたので、為替レートについて考察してみます。

https://www.okinawatimes.co.jp/


1.円安ドル高が進む理由

円安が進む背景には様々な要因がありますが、下記ツイートで最も端的に説明せれていたので、引用させて頂きます。

因みにYCCとは、イールドカーブコントロール(Yield Curve Control)の略語です。

YCCは日本銀行が行う金融政策の一つで、長期金利に目標を設定。目標を達成するために必要なだけ国債の売買を行うことを言います。

現在の日本国債10年の金利上限目標は0.25%です。これを上回る場合、日銀が無制限国債を購入して金利上昇を強制的に押さえつけます。

一方、アメリカではインフレ退治に躍起となっているFRBが0.75%の金利上昇を継続して行っているため、日米の金利差は広がるばかりとなっています。

また、アメリカ以外の世界各国の中央銀行も同様に利上げに動いていることも円安に拍車をかける展開となっています。

日本の金利 0.241% < アメリカの金利 3.312%

この状態では、ドルを保有していた方が、高い利息を受け取れるため投資家は円を売ってドルを買います。

かなりザックリとした説明ですが、円安ドル高の大まかな説明は以上です。




2.現状把握【pythonとエクセル】

ここからはpythonとエクセルを利用して現状分析を行います。

分析期間:【2021/1/1~2022/9/8】

ドル円レートに影響を与えそうな指標をピックアップ:【bitcoin、原油価格、S&P500、日経平均株価、米国10年金利】




ここまでのコード👇

import datetime
import yfinance as yf
import japanize_matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(font='IPAexGothic')
from pandas_datareader import data as pdr
import requests
 
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
 
#スタート日を決める
start = "2021-1-1"
 
#①株価を取得する
start = start #株価を取得するスタート日を決める
end = datetime.date.today()     #現在までの営業日(今日 =today)を取得する最終日とする


# codelistに取得したい指標を入れる
codelist = ["JPY=X","^N225","^GSPC","BTC-USD","CL=F","^TNX"]

yf.pdr_override() # <== that's all it takes :-)
data2 = pdr.get_data_yahoo(codelist, start, end)["Adj Close"] .dropna()

data2.rename(columns={'JPY=X':'ドル円',
                     '^N225':'日経平均',
                    '^GSPC':'S&P500',
                    "BTC-USD":"bitcoin",
                   "CL=F":"原油",
                 "^TNX":"米国10年金利"},inplace=True)
#株価の最初の5営業日(ここでは2021年1月1日)と最後の2営業日を表示
display(data2.head(2).append(data2.tail(2)))
# 作成したデータをcsvで保存 
data2.to_csv("株式情報.csv", encoding="utf-8-sig")
#ここで実際の価格からパーセントの変化率に変換したのち、累積積を算出して実際の価格推移に変更。
df_all=(1+data2.pct_change()).cumprod()
 
#グラフの箱サイズ
df_all.plot(figsize=(12, 6),fontsize=16)
#凡例の位置
plt.legend(loc = 'upper left', bbox_to_anchor=(0, 1), borderaxespad=0, fontsize=16)  
plt.grid(True)
# サブプロット
data2.plot(figsize=(18,10),fontsize=10,subplots=True,layout=(4, 3),grid=True)
igfont = {'family':'IPAexGothic'}
plt.title('title',**igfont)
plt.show()

#データを対前日比の株価変動率に変換しstdpctに格納
stockpct = data2.pct_change().dropna() * 100
# 作成したデータをcsvで保存 ここではforecastが作成したデータ
stockpct.to_csv("株式情報前日比変動率.csv", encoding="utf-8-sig")
#株価変動率の基本統計量を取得 
stastics = round(stockpct.describe(),2)
display(stastics)


日本国債10年金利のデータはヤフーファイナンスに無かったので、インベスティングドットコムのサイトよりコピー。https://jp.investing.com/rates-bonds/japan-10-year-bond-yield-streaming-chart

手作業でエクセルへ貼り付けします。

加工後のデータが以下です。


加工後のcsvファイルを取り込んで再度実行。

すると驚くことに、日本の金利は2021年から11倍になっていました。

2021/1/4時点の金利が0.021%なので、現在の0.241%は確かに11倍強です。

元々ゼロに限りなく近い金利水準であったことが分かります。👇





ここまでのコード👇

import pandas as pd
df_past = pd.read_csv("jpy_usd.csv",index_col="Date",parse_dates=True,  encoding="shift-jis")
display(df_past.describe())
df_pct=(1+df_past.pct_change()).cumprod()
 
#グラフの箱サイズ
df_pct.plot(figsize=(12, 6),fontsize=16)
#凡例の位置
plt.legend(loc = 'upper left', bbox_to_anchor=(0, 1), borderaxespad=0, fontsize=16)  
plt.grid(True)
# サブプロット
df_past.plot(figsize=(18,10),fontsize=10,subplots=True,layout=(4, 3),grid=True)
igfont = {'family':'IPAexGothic'}
plt.title('title',**igfont)
plt.show()
stockpct = df_past.pct_change().dropna() * 100
stastics = round(stockpct.describe(),2)
display(stastics)



データの相関を見てみます👇

S&P500とビットコインの相関が0.41でそこそこ相関している程度で、日米間の10年金利は0.21とあまり相関はありません。直近の金融政策が真っ向から異なるので当然のことかもしれません。


ここまでのコード👇

# 箱ひげ図
plt.figure(figsize=(8, 6))
sns.boxplot(data = stockpct)
plt.grid(True)

#ヒートマップにて相関関係を表示
plt.figure(figsize=(10, 8))
sns.set(style="white") 
sns.set(font='IPAexGothic')
sns.heatmap(stockpct.corr(),cmap='YlGn', annot = True)

plt.grid(True)
#seabornで相関関係を表示
sns.pairplot(stockpct,
             kind = "reg",
             diag_kind = "hist",
             size = 2)

plt.show()




3.決定木分析【python】

機械学習の分析手法の一つである決定木分析を行い、日米の金利がドル円レートにどのように影響を与えているのかを見ていきます。

説明変数は『米国10年金利』『日本10年金利』の二変数です。

目的変数は『ドル円レート』となります。


まず、正解ラベル(翌日のドル円レートの上下)を作成します。

翌日に円安となる場合、フラグとして1を、

翌日に円高となる場合、フラグとして0を代入します。


こうすることで、『米国10年金利』『日本10年金利』がどう変化したら、円安になるのか?あるいはドル高になるのか?分析できます。

# 前日との差分を格納
df_past["Diff"] = df_past["ドル円"].diff()
# 正解ラベルyを格納
df_past["y"] = df_past["Diff"].apply(lambda x: 1 if x > 0 else 0).shift(-1)
display(df_past)




# 説明変数
X = df_past.drop(["bitcoin","原油","ドル円","S&P500", "日経平均","Diff", "金利差", "y"],axis=1,).dropna()

X = X.drop('2022-09-08', axis=0)
display(X)

# 正解ラベルyを作成 

y = df_past.drop(["bitcoin","原油","ドル円","S&P500", "日経平均","米国10年金利", "日本10年金利", "金利差", "Diff"],axis=1,).dropna()

yy = y["y"].values
yy





データの成形が終わったので、決定木分析にかけてみます👇。

ドル円レートの変動に重要な割合は、米国10年金利が62%となりました。


決定木分析(回帰図)を見てみると、米国10年金利が3.086%を超えるかどうかが最初の分岐点となっています。次の階層では米国10年金利と日本10年金利で更に分岐しています。

これを追っていくと、米国10年金利が3.0%で日本10年金利が0.22%の場合、翌日のドル円レートは53%の確率で円安となることが予測結果として出ました。👇



決定木分析(分類図)でも同様です。

今度は右側を見ていきます。米国10年金利が3.09%以上なら、日本10年金利を見ます。日本10年金利は0.25%が分岐点となっており、0.25%を下回った場合、翌日のドル円レートは円安になる確率は81%程度と予測されます👇。



ここまでのコード👇

from sklearn.model_selection import train_test_split
#from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
X_train, X_test, y_train, y_test = train_test_split(X,
                                                    yy,
                                                    test_size=0.15,
                                                    random_state=0,
                                                    shuffle=False,)
#決定木分析[回帰木]
import numpy as np
import pandas as pd
from sklearn import tree
from dtreeviz.trees import *
import graphviz

regression = tree.DecisionTreeRegressor(max_depth=3)
regression.fit(X,yy)

viz = dtreeviz(regression,X,yy,
               target_name = "y",
               feature_names = ["USA rate", "Japan rate"],
               X = [3,0.220]
               )

# 重要度を表示
print(dict(zip(X.columns, regression.feature_importances_)))

# bar plot
fig, ax = plt.subplots()
plt.grid()
ax.bar(X.columns, regression.feature_importances_)
fig.autofmt_xdate() # make space for and rotate the x-axis tick labels
plt.show()


viz


 #決定木分析 [分類木]
which = tree.DecisionTreeClassifier(max_depth=2)
which.fit(X, yy)
viz = dtreeviz(which,X,yy,
               feature_names = ["USA", "Japan"],
               target_name = "y",
               class_names=["Up","Down"],
               X = [3, 0.220]
               )
 
viz




今回のドル円レートの予測は以上です。

簡単な決定木分析を行いました。

為替は様々な要因で変動するため、『米国10年金利』と『日本10年金利』の二つの金利だけで、ドル円レートがどう動くかを予測することは難しいですが、一つの参考値として見てみる分には面白いかも知れません。

決定木分析は色々な分析手法の中でも、回帰分析と同じくらい使いやすく、分かりやすい方法です。実際の回帰図の計算には情報エントロピーの計算が入ってきますので、手計算は物凄く面倒ですが、pythonやRなどを使用すると楽に結果がでますので、興味のある方は上記コードを改変して利用してみてください。

Mini統計沖縄では、格安の料金で統計解析レポートをご提供しています。自社でデータ分析をする人材がいない場合や、データ分析をしたことがない、データ分析をする時間がないなどでお困りの方は是非お気軽にお問い合わせください。


メールやTwitterでもお仕事依頼を受け付けています。 どなたでもお気軽にお問い合わせください。