一つ一つ順を追っていきながら機械学習を使った株価予測モデルを作っていきます。
本記事では、Sktimeを使って株価データから単回帰分析を行ってみます。
概要
以下の記事で、時系列データに特化した機械学習ライブラリSktimeの導入、及び、yahoo_finance_api2を用いた日本株データ取得を行いました。
[sktime] 株価予測AIを作るまで:その①環境整備、データ準備 [yahoo_finance_api2]
Sktimeの環境整備、yahoo_finance_api2を用いた株価データ取得方法を紹介しています。
本記事では、その続きとして単回帰分析を行っていきたいと思います。
単回帰分析とは
数多の解説記事が存在するため詳細な説明は省きますが、一言でいえば1 つの入力変数から 1 つの出力変数を予測することです。
今回は、株価の過去の終値を入力に将来の終値を予測してみます。
なお本記事で紹介するソースコードはこちらのGithubに全て載せています
免責事項
本記事は、機械学習、AIの学習を目的としており、投資を薦めるものではありません。
本記事の内容を基に投資を行って生じる、いかなる損失も本記事は一切の責任を負いません。
なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。
おすすめの書籍
[初心者向け] Pythonで機械学習を始めるまでに読んだおすすめ書籍一覧
本記事では、現役機械学習エンジニアとして働く筆者が実際に読んだ書籍の中でおすすめの書籍をレベル別に紹介しています。
おすすめのオンライン講座
[初心者向け] 機械学習がゼロから分かるおすすめオンライン講座
本記事では、機械学習エンジニアとして働く筆者が、AI・機械学習をまったく知らない方でも取り組みやすいおすすめのオンライン講座をご紹介しています。
データの前処理
今回は初歩としてyahoo_finance_api2から取得した株価データからtimestampとclose(取引日時と終値)のみを抽出します。
必要なモジュールをインポートします。
次に、yahoo_finance_api2から取得したデータを整形する関数を定義します。
処理概要はDataFrameに格納し、timestampをUTC時間に変換しています。
任天堂の株価を5年分取得します。
DataFrameから今回の単回帰分析に使用するtimestampとcloseを抽出します。
またtimestampをPeriodIndexに変更します。
ここまでの前処理結果をグラフで表示します。
from sktime.utils.plotting import plot_series
を使用すると簡単に表示できます。
最後に、このデータを学習データとテストデータに分割します。今回は、対象データの5%をテストデータとして利用します。
青色で表されている箇所が学習データ、オレンジで表されている箇所がテストデータです。
可視化が楽にできると理解しやすく非常に助かります。
モデルのトレーニング
今回はシータ法を用いてモデルをトレーニングしてみます。
シータ法は、ドリフト付きの単純指数平滑化を用いた手法です。詳細はこちらの書籍などが最も詳細に記載していそうですが、
日本語版の書籍が欲しいですね。
それではモデルを構築し、学習させてみます。
stock_close_simple_regression_theta.pkl
が出力されました。
環境にもよりますが、学習自体は1分もたたずに終了しました。
予測(Forecast)
トレーニングによって作成したモデルを使ってテストデータ期間の終値を予測してみたいと思います。
まず、予測期間を示すForecastingHorizon
を定義します。
予測していきます。
予測結果は上図のようになりました。直近10日ほどの上昇傾向は予測できていますが、以降の予測は全く予測できていませんね。
学習データの日付から離れれば離れるほど予測精度が悪くなっているようです。
精度向上のためには、他の説明変数などを追加する必要がありそうです。
モデルの評価
最後に生成したモデルの評価を行います。
今回はMAPE(平均絶対パーセント誤差)を用います。ざっくりというと誤差の割合であるため算出結果は少ないほど精度が高いことを示しています。
出力結果は0.07561995411730185
となりました。
まとめ
本記事では、SktimeのThetaForecasterを使用して株価の終値を単回帰分析を実施してみました。
筆者自身勉強中の身であるためご指摘事項等あれば、コメント頂けると幸いです。
また今後は重回帰分析や特徴量エンジニアリングに取り組みたいと思います。
0 件のコメント :
コメントを投稿