見出し画像

PYTHONで株価予測 SARIMAXモデル

1.初めに&結果

 前回、ARIMAXモデルで株価予測したコードを紹介しましたが、まだまだ実用的とは言えません。実際の株価は、市場全体の価格や他の株、世界情勢含めた他の要因の影響もあります。そこで今回は予測した単独の株価だけで予想するのではなく、他の情報も同時に学習することのできるSARIMAXモデルを紹介し、実際に予測結果を確認していきます。
 今回も今後も、pythonで時系列予測を学びたい方に自信を持ってお勧めできる内容をお届けしていきたいので、ぜひお付き合い下さい。


今回のゴール
今回APPLEの株価を、複数の変数と一緒にSARIMAXモデルを使用し学習し5日後の株価(赤線)をグラフに出力しました。正解とは言い難いですが、予測値の出力自体は可能です。このSARIMAXモデルは周期性の強い他のデータなら実用的な予測も可能かもしれませんので、皆様もトライしてみて下さい。

SARIMAXモデルでAPPLE株価予測結果


2.少しだけお勉強

(1)SARIMAXモデルとは

SARIMAXモデル(季節性自己回帰統合移動平均モデル)は、時系列データの予測や分析に広く使用される高度なモデルです。このモデルは、特に季節性パターンを示すデータや、外部の説明変数を考慮する必要がある場合に適していますので、データの背後にある複雑な構造を理解し、予測精度を向上させることができます。
 SARIMAXモデルは、ARIMAモデルを拡張した形で、以下のような特徴を持っています。

ARIMAモデルとの違い

  • 季節性成分の導入: ARIMAモデルは非季節性データの分析に適していますが、SARIMAXモデルでは追加の季節性パラメータ(季節性自己回帰、季節性差分、季節性移動平均)を用いることで、季節性の影響を受ける時系列データを効果的に分析できます。これにより、季節ごとに繰り返されるパターンをモデルが捉え、より正確な予測が可能になります。

  • 外部説明変数の組み込み: SARIMAXモデルは、時系列データに影響を与える可能性のある外部の説明変数(exogenous variables)をモデルに組み込むことができます。これにより、時系列データだけでなく、その他の影響因子も考慮した複雑な予測が行えるようになります。例えば、株価の予測においては、他の市場指標や経済指標を説明変数として加えることができます。


(2)正規化とは

データの正規化は、機械学習や統計モデリングにおいて、特に多変数を扱う際に重要な前処理手法です。このプロセスは、異なるスケールや単位を持つ複数の変数を一般的な基準に揃えることを目的としています。正規化を行う主な理由は、以下の通りです。

正規化の目的

  • 特徴間の比較可能性を確保: 異なる尺度を持つ特徴(例:株価と取引量)を同一の尺度に揃えることで、モデルが特徴間の関係を適切に学習できるようにします。

  • 収束速度の向上: 機械学習アルゴリズム、特に勾配降下法を用いる場合、特徴量のスケールが統一されていると、収束に要する時間を短縮できます。

  • 過学習のリスク低減: 正規化により、特定の特徴量がモデルに与える影響が過大になることを防ぎ、より汎化能力の高いモデルを構築できます。

多変数データにおける正規化

データの正規化は、機械学習や統計モデリングにおいて、特に多変数を扱う際に重要な前処理手法です。このプロセスは、異なるスケールや単位を持つ複数の変数を一般的な基準に揃えることを目的としています。正規化を行う主な理由は、以下の通りです。

正規化の目的

  • 特徴間の比較可能性を確保: 異なる尺度を持つ特徴(例:株価と取引量)を同一の尺度に揃えることで、モデルが特徴間の関係を適切に学習できるようにします。

  • 収束速度の向上: 機械学習アルゴリズム、特に勾配降下法を用いる場合、特徴量のスケールが統一されていると、収束に要する時間を短縮できます。

  • 過学習のリスク低減: 正規化により、特定の特徴量がモデルに与える影響が過大になることを防ぎ、より汎化能力の高いモデルを構築できます。

多変数データにおける正規化

多変数データを扱う場合、各変数が異なる単位や範囲を持つことが一般的です。例えば、株価予測モデルでは、価格(ドル)、取引量(株数)、および他の市場指標など、複数の異なる種類のデータを使用することがあります。これらの変数をそのままモデルに入力すると、特徴量のスケールの違いにより、モデルの学習プロセスが不均衡になる=正確な予測ができないことにつながります。


(3)今回使用した株価の説明

SPY:米株価市場平均の代表例であるS&P500指数に連動するETF
QQQ:NASDAQに上場する上位100社で構成される指数に連動するETF
TLT:長期米国債価格に連動するETF

3.SARIMAXモデルで株価予測

(1)株価の取得

ようやく実際に、株価の予測を行っていきます。まずは株価の取得ですが、前回と同様にyfinanceライブラリを使用してAAPL(アップル)、SPY(S&P 500 ETF)、QQQ(ナスダック100 ETF)、TLT(長期国債ETF)の終値株価データを取得します。

# 株価データを取得
tickers = ['AAPL', 'SPY', 'QQQ', 'TLT']
df = yf.download(tickers, start='2023-01-01', end='2024-01-14')['Adj Close']

# 欠損データの処理
df.dropna(inplace=True)

df

(2)データの正規化

次に、目的変数(AAPLの株価)と説明変数(SPY、QQQ、TLTの株価)を正規化するためにMinMaxScalerを使用しました。この手法は、すべてのデータポイントを0と1の間の値に変換し、異なるスケールを持つ変数間の直接的な比較を可能にします。正規化により、モデルが特定の変数に過度に影響されることなく、全体のデータ構造をより均等に学習することができます。

# データの正規化
scaler_y = MinMaxScaler()
scaler_X = MinMaxScaler()
y_scaled = scaler_y.fit_transform(y.reshape(-1, 1))
X_scaled = scaler_X.fit_transform(X)


(3)SARIMAXモデルの設定と予測

正規化されたデータを用いて、SARIMAXモデルを設定し、訓練しました。このモデルは、季節性要素を考慮せず、外部の説明変数を含む時系列データの予測に適しています。訓練後、モデルは未来の株価を予測し、これらの予測値を元のスケールに逆正規化して実際の株価とすることができます。

# SARIMAXモデルの設定と訓練
model = SARIMAX(y_scaled, exog=X_scaled, order=(5,1,0), seasonal_order=(0,0,0,0))
model_fit = model.fit(disp=False)

# 予測の実行
n_forecast = 5  # 予測するステップ数
forecast = model_fit.forecast(steps=n_forecast, exog=[X_scaled[-1]]*n_forecast)

# 予測値の逆正規化
forecast = scaler_y.inverse_transform(forecast.reshape(-1, 1))

# 予測データのインデックスを作成
last_date = df.index[-1]
forecast_index = pd.date_range(start=last_date, periods=n_forecast + 1, freq='B')[1:]

# 予測データをDataFrameに変換
forecast_df = pd.DataFrame(forecast, index=forecast_index, columns=['Forecasted AAPL'])

(4)結果の可視化

最後に予測に使ったデータと予測結果を一緒にmatplotlibを使って可視化します。

# プロット
plt.figure(figsize=(12,6))
plt.plot(df.index, df['AAPL'], label='Historical AAPL Price')
plt.plot(forecast_df.index, forecast_df['Forecasted AAPL'], label='Forecasted Price', color='red')
plt.xlim([df.index[0], forecast_df.index[-1]])
plt.title('AAPL Stock Price Prediction with SARIMAX')
plt.xlabel('Date')
plt.ylabel('Adjusted Close Price')
plt.legend()
plt.show()
SARIMAXモデルでのAPPLE株価予測結果

4.まとめ&コード全文

今回SARIMAXモデルでの株価予測とデータの正規化についてご紹介しました。正直PYTHONを使った予測だけならって意外と簡単と思っていただけたでしょうか?
 まだ精度向上には、最適な説明変数の選択や別のモデルにしてみるなど、チャレンジしてみる内容は盛りだくさんです。今後も時系列予測に興味のある方にとって楽しみとなれる記事を書いていきたいと思いますので、次回もお楽しみに!

以下、コード全文です。
pythonで時系列予測の学習にピッタリなコードだと思います。学習させるティッカーコードや期間の変更だけでなく、SARIMAXパラメータを調整して予測精度の向上にチャレンジしてみて下さい。

ここから先は

1,697字

¥ 330

この記事が気に入ったらサポートをしてみませんか?