一つ一つ順を追っていきながら機械学習を使った株価予測モデルを作っていきます。
本記事では、Sktimeの環境整備、yahoo_finance_api2を用いた株価データ取得を行います。
概要
画像処理系の機械学習モデルの開発経験は持つ者の時系列予測モデルの開発経験はない筆者が、
一つ一つ勉強しながら株価予測AIを作るまでを記事にしていきます。
以下のような書籍を読みつつ実際に動かしながら学んでいきます。
リンク
本記事では時系列データに特化した機械学習ライブラリであるSktimeの開発環境整備とデータの取得・確認を行っていきます。
なお、本記事で紹介するコードは全てGithubにて公開しています。
kaz12tech/stock_predict
免責事項
本記事は、機械学習、AIの学習を目的としており、投資を薦めるものではありません。
本記事の内容を基に投資を行って生じる、いかなる損失も本記事は一切の責任を負いません。
なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。
Sktimeインストール
Sktimeをインストールします。
はじめにサポート環境を確認します。この辺の確認を怠って無駄にハマると悲しくなるのでしっかりと公式ドキュメントから確認します。
- Python 3.6, 3.7, 3.8
- Mac OS X, Unix-like OS, Windows 8.1以上
- PyPiまたはcondaによるインストール
サポートされているので、Minicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。
conda環境構築手順を下記に記載します。
sktimeのインストール時の注意点は1点です。
sktimeはprophetをインストールするのですが、明示的にバージョンを指定しておかないと3以上のpystanがインストールされます。しかし、prophetは3以上のpystanを非サポートとしているためprophetが正常に動作しない場合があります。
sktimeのインストール前にバージョン3未満のpystanを事前にインストールしておくとトラブルが少ないです。
# python version 3.7のconda環境を作成
$ conda create -n stock_predict python=3.7 jupyter -y
# 作成した環境をアクティベート
$ conda activate stock_predict
$ cd stock_predict
# Proxy配下の場合は事前に下記を設定
$ export http_proxy="http://"username":"password"@proxy:port"
$ export https_proxy="http://"username":"password"@proxy:port"
# sktime-all-extrasに含まれるprophetが利用するpystanのバージョンを明示的に指定してインストール
# バージョンを指定しておかないと3以上のpystanがインストールされる場合があるため注意
# prophetは現状pystan 3以上非サポート、https://github.com/facebook/prophet
$ pip3 install pystan==2.19.1.1
# 依存するすべてのライブラリを含めてSktimeをインストール
$ conda install -c conda-forge sktime-all-extras
sktimeがインストールできていることを確認するために下記コードを実行します。
コードの内容は、航空会社の乗客数の予測を行うシンプルなものです。
# file: sktime_installation_confirmation.py
import sktime
from sktime.datasets import load_airline
from sktime.forecasting.base import ForecastingHorizon
from sktime.forecasting.model_selection import temporal_train_test_split
from sktime.forecasting.theta import ThetaForecaster
from sktime.performance_metrics.forecasting import mean_absolute_percentage_error
print("sktime version: ", sktime.__version__)
# 航空会社の単変量時系列データセットをロード
y = load_airline()
# シャッフルなしでtrainとtestに分割
y_train, y_test = temporal_train_test_split(y)
print(y_train)
# Forecasting horizon
fh = ForecastingHorizon(y_test.index, is_relative=False)
# シータ法適用
forecaster = ThetaForecaster(sp=12) # monthly seasonal periodicity
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
# 平均絶対パーセント誤差(MAPE)算出
mape = mean_absolute_percentage_error(y_test, y_pred)
print("MAPE:", mape)
# 以下出力結果
sktime version: 0.7.0
Period
1949-01 112.0
1949-02 118.0
1949-03 132.0
1949-04 129.0
1949-05 121.0
...
1957-08 467.0
1957-09 404.0
1957-10 347.0
1957-11 305.0
1957-12 336.0
Freq: M, Name: Number of airline passengers, Length: 108, dtype: float64
MAPE: 0.08661467699983212
問題なく動作していますね。
続いて、株価予測のための学習データを準備していきます。
株価データ準備(yahoo_finance_api2)
今回は、yahoo_finance_api2を使って日本株の株価データを取得してみます。
はじめに下記コマンドでyahoo_finance_api2をインストールします。
$ pip install yahoo_finance_api2
サンプルコードを試しに動かしてみます。
# file: yahoo_finance_api2_confirmation.ipynb
import sys
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
import pandas as pd
def data_shaping(symbol_data):
'''
yahoo_finance_api2のdataをDataFrameに整形
'''
# DataFrameに初期化
df_symbol_data = pd.DataFrame(symbol_data)
# UNIX時間をUTC時間に変換
df_symbol_data.timestamp = pd.to_datetime(df_symbol_data.timestamp, unit='ms')
return df_symbol_data
my_share = share.Share('GOOGL') # NASDAQの証券コード指定:Google
symbol_data = None
try:
# 20日分を1日間隔で取得
symbol_data = my_share.get_historical(share.PERIOD_TYPE_DAY,
20,
share.FREQUENCY_TYPE_DAY,
1)
except YahooFinanceError as e:
print(e.message)
sys.exit(1)
df_symbol_data = data_shaping(symbol_data)
df_symbol_data.head()
上記を実行するとGoogleの株価データが取得できました。
それぞれの数値は以下の値となっているようです。
- timestamp 取引日時
- open 始値
- high 高値
- low 底値
- close 終値
- valume 出来高
任天堂であれば、my_share = share.Share('7974.T')
のように東証の証券コードを指定すると取得できます。
まとめ
本記事では、sktimeの導入手順と、yahoo-finance-api2の導入手順及び、日本株の株価取得方法を学んでいきました。
次回、単変量時系列予測から始めていきたいと思います。
参考文献
1. SKTIME Get Started
2. yahoo-finance-api2/#description
0 件のコメント :
コメントを投稿