Python学習編52回目です。
scikit-learnライブラリで実際にデータをいじってみる。題材は金利と株価。データは財務省の国債金利とTOPIX終値。前回は国債金利のデータとして変化率を用いて失敗したので、今回は変化値を用いる。
まずは様子見に散布図を書かせよう
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
stock = pd.read_csv('10年債とTOPIX.csv')
X = stock[['10年債利回り変化値']].values
y = stock['TOPIX変化率'].values
plt.scatter(X,y);
うーん、いかにも無相関。回帰分析してみるか。
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
model=LinearRegression() # 線形回帰モデル
model.fit(X_train,y_train) # モデルを訓練データに適合
y_predicted=model.predict(X_test) # テストデータで予測
print(mean_squared_error(y_test,y_predicted)*10000) # 予測精度(平均二乗誤差)の評価。%の2乗の単位
coefficient = model.coef_[0] # 係数を取得
intercept = model.intercept_ # 切片を取得
print(f"回帰式: y = {intercept} + {coefficient}x") #回帰式を表示
x_plot=np.linspace(-0.1,0.1) # xの値の範囲を設定
X_plot=x_plot[:,np.newaxis] #モデルのpredictメソッドに適合する形式にするため、xの値を2次元配列に変換
y_plot=model.predict(X_plot) # 生成したxの値に対する予測値yを計算
plt.scatter(X,y, s = 2) # 元のデータ点を散布図としてプロット
plt.plot(x_plot,y_plot); # 線形回帰モデルに基づく予測値を直線としてプロット
結果
1.3630924462077079 (平均二乗誤差)
回帰式: y = 0.0004750490141110606 + 0.019519677941214175x
うーん。平均二乗誤差1.36%、傾き約1.95%ってことは、「10年債利回りが0.1%上がればTOPIXが0.2%上がる傾向に上がりますよ。±1.4%くらいは覚悟した方がいいですけどね」ってことで、全く使えない分析だな。いや適当に選んだから1発目から優位な分析になるわけないか。あと「金利動向を見て株価の変動を推測する」的な運用をするなら、同日のデータを取っても意味ない。なんで、やるなら「金利動向のn営業日後のTOPIXの変化率で優位なデータが出るか、n=1~xで動かしてみてみる」って方針になりそうだ。
次回に続く