Google colabで為替レートと日経平均をグラフ化し単回帰分析をしてみる
機械学習の基本のYOUTUBE動画をひと通り見て少しづつアウトプットしてみたくなったのでやってみた。
単純だけど面白い。
Google colabで為替レートと日経平均をグラフ化し単回帰分析をしてみる
必要なライブラリのインストール・インポート
データの取得やグラフ描画に必要なライブラリを使います。今回はPandas(データ操作用)とMatplotlib(グラフ描画用)、そしてYahoo FinanceのAPIを利用するためにyfinanceライブラリを使います。
# yfinanceはYahoo FinanceのAPIを使用するライブラリ
!pip install yfinance --upgrade --quiet
# 必要なライブラリをインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
データの取得
次に、日本円の為替レート(USD/JPY)と日経平均株価(Nikkei 225)のデータをYahoo Financeから取得します。
期間を設定して、取得したいデータを指定します。
データ取得の期間を設定(2021年から2024年)
# データ取得の期間を設定(2021年から2024年)
start_date = '2021-01-01'
end_date = '2024-9-30'
# USD/JPYの為替レートデータを取得
jpy_data = yf.download('JPY=X', start=start_date, end=end_date)
# 日経平均株価データを取得
nikkei_data = yf.download('^N225', start=start_date, end=end_date)
USD/JPY為替レートを折れ線グラフに表示
まず、USD/JPY為替レートを折れ線グラフで表示
# 月次データにリサンプリング(平均)
jpy_monthly = jpy_data['Close'].resample('M').mean()
# 為替レートの折れ線グラフ表示
plt.figure(figsize=(10, 6))
plt.plot(jpy_monthly.index, jpy_monthly, label='USD/JPY', color='blue')
plt.title('Monthly Average of USD/JPY Exchange Rate')
plt.xlabel('Date')
plt.ylabel('USD/JPY Exchange Rate')
plt.xticks(rotation=45) # 日付の表示を45度回転して見やすくする
plt.grid(True)
plt.legend()
plt.show()
結果
日経平均株価を折れ線グラフに表示
次に、日経平均株価を折れ線グラフで表示
# 月次データにリサンプリング(平均)
nikkei_monthly = nikkei_data['Close'].resample('M').mean()
# 日経平均株価の折れ線グラフ表示
plt.figure(figsize=(10, 6))
plt.plot(nikkei_monthly.index, nikkei_monthly, label='Nikkei 225', color='green')
plt.title('Monthly Average of Nikkei 225 Index')
plt.xlabel('Date')
plt.ylabel('Nikkei 225 Index')
plt.xticks(rotation=45) # 日付の表示を45度回転して見やすくする
plt.grid(True)
plt.legend()
plt.show()
結果
両方のグラフを同じ図に表示する
USD/JPY為替レートと日経平均株価を同じグラフに表示
matplotlibのtwinx()を使って、異なる軸を共有する2つのグラフを作成
# グラフのサイズを設定
fig, ax1 = plt.subplots(figsize=(10, 6))
# 左側のY軸に日経平均株価をプロット
ax1.plot(nikkei_monthly.index, nikkei_monthly, label='Nikkei 225', color='green')
ax1.set_xlabel('Date')
ax1.set_ylabel('Nikkei 225', color='green')
ax1.tick_params(axis='y', labelcolor='green')
ax1.grid(True)
# 右側のY軸に為替レートをプロット
ax2 = ax1.twinx() # ax1と同じx軸を共有
ax2.plot(jpy_monthly.index, jpy_monthly, label='USD/JPY', color='blue')
ax2.set_ylabel('USD/JPY Exchange Rate', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
# タイトルと表示設定
plt.title('Nikkei 225 and USD/JPY Exchange Rate')
fig.tight_layout() # ラベルの重なりを防ぐ
plt.show()
結果
データの整形
取得したデータを使いやすい形に整えます。株価と為替レートの終値(Close)のみを使用し、新しいDataFrameにまとめます。これで日付に対応する為替レートと株価の対応を揃えます。
# データの整形(Close列のみ抽出して新しいDataFrameを作成)
df = pd.DataFrame({
'JPY': jpy_data['Close'],
'Nikkei': nikkei_data['Close']
})
# 欠損値を削除
df = df.dropna()
# 整形後のデータの表示(オプション)
df.head()
散布図を作成
# 散布図を作成
plt.figure(figsize=(10, 6))
# USD/JPY為替レートをX軸、日経平均株価をY軸に設定
plt.scatter(df['JPY'], df['Nikkei'], alpha=0.5, color='blue')
# グラフのタイトルとラベル
plt.title('Scatter plot of USD/JPY vs Nikkei 225')
plt.xlabel('USD/JPY Exchange Rate')
plt.ylabel('Nikkei 225 Index')
# グリッド線を表示
plt.grid(True)
# グラフを表示
plt.show()
結果
相関の計算
次に、為替レートと株価の相関を計算します。Pandasのcorr()関数を使用します。これは2つの変数間の相関係数を計算
# 相関行列の計算
correlation_matrix = df.corr()
# 相関行列を表示
print(correlation_matrix)
評価
0.65 という数値は、中程度から強い正の相関を示しています。
相関係数の一般的な解釈ガイドライン:
0.0 - 0.2:ほとんど相関なし
0.2 - 0.4:弱い相関
0.4 - 0.7:中程度の相関
0.7 - 0.9:強い相関
0.9 - 1.0:非常に強い相関
散布図に近似曲線と式を追加
回帰直線を引く
import numpy as np
# 散布図を作成
plt.figure(figsize=(10, 6))
plt.scatter(df['JPY'], df['Nikkei'], alpha=0.5, color='blue', label='Data Points')
# 近似曲線の計算(線形回帰)
# numpyのpolyfitを使って1次回帰(直線)を求める
slope, intercept = np.polyfit(df['JPY'], df['Nikkei'], 1)
# 回帰直線のプロット
plt.plot(df['JPY'], slope * df['JPY'] + intercept, color='red', label=f'Fit Line: y = {slope:.2f}x + {intercept:.2f}')
# グラフのタイトルとラベル
plt.title('Scatter plot of USD/JPY vs Nikkei 225 with Fit Line')
plt.xlabel('USD/JPY Exchange Rate')
plt.ylabel('Nikkei 225 Index')
# 凡例の表示
plt.legend()
# グリッドの表示
plt.grid(True)
# グラフの表示
plt.show()
単回帰分析で為替レート200円時の株価を予測
回帰モデルの作成
すでにnumpyのpolyfit()を使って線形回帰モデルの傾き(slope)と切片(intercept)を求めているので、この回帰式を使います。
y = 165.41X +8923.69
Nikkei=slope×JPY+interceptNikkei=slope×JPY+intercept
JPY = 200 を代入して予測株価を計算
# 1ドル200円の時の日経平均株価を予測
jpy_value = 200
predicted_nikkei = slope * jpy_value + intercept
print(f'If USD/JPY is 200, the predicted Nikkei 225 index is: {predicted_nikkei:.2f}')
結果
If USD/JPY is 200, the predicted Nikkei 225 index is: 42006.54
まとめ
機械学習の基本のYOUTUBE動画をひと通り見て少しづつアウトプットしてみたくなったのでやってみた。
単回帰分析
重回帰分析
ロジスティック回帰分析
今回は単回帰分析をPandas,Numpy,Matplotlibでやってみた。
次回はScikit-learnで単回帰分析やってみたい!
単純だけど面白い。