免責事項
株価は予測が非常に難しく、多くの外部要因に影響を受けるため、この記事の内容だけでの投資はお控えください。筆者は一切の責任を負いませんので、その旨をご了承の上、ご参照ください。

1.必要なモジュールのインポート

まず、データの取得や処理、モデルの構築に必要なモジュールをインポートします。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import yfinance as yf
from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from datetime import datetime

各モジュールの

  • pandas: データ処理と解析のためのライブラリ
  • matplotlib: データの視覚化ツール
  • numpy: 数値計算のためのライブラリ
  • yfinance: Yahoo Financeからのデータ取得に使用
  • statsmodels: ARIMAモデルの実装
  • sklearn.metrics: 予測モデルの評価指標を提供
  • datetime: 日付・時間を扱うためのモジュール

2.株価データの取得

提供された関数get_stock_dataは、指定した銘柄の株価データを取得します。yfinanceを使用して、Yahoo Financeからデータを取得します。今回は「トヨタ自動車株式会社」の株価を利用します。

# 株価データを取得する関数
def get_stock_data(ticker, period="90d", interval="1d"):
    return yf.download(ticker, period=period, interval=interval)

3.データの可視化

plot_stock_data関数は、取得したデータを視覚化するための関数です。データのトレンドや変動をグラフで確認できます。

# 株価データをプロットする関数
def plot_stock_data(df, kind="line"):
    if kind == "candle":
        import mplfinance as mpf
        mpf.plot(df, type="candle", figratio=(10,5))
    else:
        df.plot()

4.移動平均の導入

この関数は、データフレームに移動平均を追加します。移動平均は価格の変動をスムーズにし、トレンドを明確にするのに役立ちます。

# データフレームに移動平均を追加する関数
def add_moving_average(df, span=5):
    price = df["Close"]
    df["sma05"] = price.rolling(window=span, min_periods=1).mean()

5.ARIMAモデルを使った予測

predict_arima関数は、ARIMAモデルを使用して株価を予測します。モデルは過去のデータのパターンを学習し、未来の価格を予測します。

# ARIMAを使用して予測する関数
def predict_arima(train_data, test_data, order=(6,1,0)):
    history = [x for x in train_data]
    model_predictions = []
    for time_point in range(len(test_data)):
        model = ARIMA(history, order=order)
        model_fit = model.fit()
        output = model_fit.forecast()
        yhat = output[0]
        model_predictions.append(yhat)
        true_test_value = test_data[time_point]
        history.append(true_test_value)
    return model_predictions
# 実行部分
ticker = "7203.T"
data = get_stock_data(ticker)
data = data.drop("Volume", axis=1)

plot_stock_data(data)
add_moving_average(data)

train_data, test_data = data[0:int(len(data)*0.7)], data[int(len(data)*0.7):]
train_data = train_data['Close'].values
test_data = test_data['Close'].values

model_predictions = predict_arima(train_data, test_data)

6.実行と結果の可視化

トヨタの株価データを取得し、学習データとテストデータに分割。その後、ARIMAモデルを使用して予測を行い、実際の価格と比較してグラフに表示します。

# 予測結果の可視化
plt.plot(test_data, color='Red', label='result')
plt.plot(model_predictions, color='Blue', label='prediction')
plt.title('TOYOTA stock price prediction')
plt.xlabel('time')
plt.ylabel('TOYOTA stock price')
plt.legend()
plt.show()

7.評価指標の計算

評価指標を使用してモデルの予測性能を評価します。精度を示す決定係数は、0.48と若干低い数値になりました。なお、予測範囲を90dayから365dayにすると、精度は高くすることができます。

ただ、あくまで過去のデータからの予測なので、予測モデルの精度が高いから言って必ずしも株価を予測できるかと言うと、そうではないので、あくまで一つの参考指標で利用することをおすすめします。

# 評価指標の計算
mae = mean_absolute_error(test_data, model_predictions)
mse = mean_squared_error(test_data, model_predictions)
rmse = np.sqrt(mse)
r2 = r2_score(test_data, model_predictions)

evaluation_metrics = {
    "MAE": mae,
    "MSE": mse,
    "RMSE": rmse,
    "R2 スコア": r2
}

evaluation_metrics

{‘MAE’: 27.589427007171803,
‘MSE’: 1405.904313769972,
‘RMSE’: 37.495390566974656,
‘R2 スコア’: 0.48070406893815776}