今回はpythonの写経記事です。
参考にさせていただくのは、我がプログラミングのメンターであるタダケンさんEnjoy Techがかつて投稿されたTOPIX予測モデルの作成記事です。
早速スタート!Google Colaboratoryを利用することで、環境設定不要
まずはGoogle Colaboratoryを利用することで環境設定は不要です。
早速コードをゴリゴリ写経していきます。
データの取得
まずは記事に従って、TOPIXの過去のデータを取得。
I0000.JP Stock Price & News - TOPIX Index - Wall Street Journal
ファイルアップロードの準備
from google.colab import files uploaded = files.upload()
こちらでファイルをアップロードするためのボタンが出現します。
アップロードファイルをpandasのdataframeで使えるように
import io import pandas as pd import numpy as np df = pd.read_csv(io.StringIO(uploaded['HistoricalPrices.csv'].decode('utf-8'))) df.head()
ioってなに?...
ioとは、StringIOインスタンスを使うための、モジュールです。
StringIOを使うと、文字列をファイルのように扱うことができ、read,write,printといったファイル操作をStringIOを介して行うことができるそうです。
なるほど?笑
因みに、 pandas
はpythonでデータ分析を効率的に行うためのライブラリであり、データの読み込みや統計量の表示、グラフ化など、データ分析に役立ちます。
データ型の変更
%matplotlib inline import matplotlib.pyplot as plt df["ds"] = pd.to_datetime(df["Date"]).dt.date df["y"] = np.log(df[" Close"]) df["y"].plot()
冒頭が%で始まっている...?
matplotlibを使う際は、初めにmatplotlibライブラリをインポートしますが、
先頭の %matplotlib inline
は、グラフを描画する際に指定する記述です。
また4行目のpd.to_datetime(df["Date"]).dt.dateは
一度to_datetimeでTimestamp型に変換したのち、
.dt.dateでdate型に変換しています。
予測モデルの作成
早速モデルの作成だ!
と思ったら...
謎のエラーに遭遇
from fbprophet import Prophet model = Prophet() model.fit(df)
ここでエラーが! エラー内容は、 ImportError: cannot import name 'MONDAY' とのこと。
ちょびっと調べてみると、こちらの記事が該当。
要するに、ディレクトリ名とモジュール名が被ってるからエラー!とのこと。
いや、、、分からん、、、
メンターのタダケンさんに質問すると...
との返答があったので、アドバイス通り
!pip install fbprophet==0.3.post1
実行すると... 無事エラーが消えました。
こちらのgithubに載っている内容でした。
githubで検索するという方法もあるんですね〜!勉強になりました...
そしてモデルをもとに予測を実行。
future = model.make_future_dataframe(periods=365) forecast = model.predict(future) forecast[["ds","yhat","yhat_lower","yhat_upper"]].tail()
こちらで入力している3行目の.tail()
は末尾の行の要素を返すメソッド。
model.plot(forecast);
で予測モデルをビジュアライズ。
予測モデルの検証
次に予測モデルが本当に正しいのか、精度評価を行なっていきます。
検証用データを交差検証法を利用して作成
次にprophetのdiagnosticsクラスを使って効果検証していきます。
ここで利用しているcross_validationメソッドを利用し、交差検証法という手法でモデルの精度検証を行います。
交差検証法って何...?
1. 保有データを分割し、「一部のデータ」に分析手法を利用し訓練(訓練)
2. 訓練したデータに対して、残ったデータでモデルを評価(テスト)
3. 1~2を複数回繰り返し、分析の精度を評価
するものです。機械学習や深層学習では最も使われるモデル評価の1つです。
ちなみに僕の場合は期間を長く設定したので、3分ぐらいかかりました。
詳しく知りたい方はこちら
予測モデルの精度を平均絶対誤差率を利用して判定
def cal_mape(df): return((df["yhat"] - df["y"]).div(df["y"]).abs().sum()*(1/len(df))) cal_mape(cv)
こちらは平均絶対誤差率を利用。
平均絶対誤差率...?
- トレンドの推定などに利用される予測精度を測る指標
- 通常はパーセントで精度を表現
- 実測値と予測値の差分を実測値で割り、それらを合計したものを予測値の数で割り、100を乗じる
詳しく知りたい方はこちら
結果がこちら!
0.02715394851644534
27%!
(2018年1月10日修正)
2.7%の間違いでした。
(ご指摘いただいたきょうはるさん、ありがとうございます!)
まとめ: 予測データ面白い!そして数学の知識が必要!笑
今回はタダケンさんの、TOPIX予測モデルの作成記事をそのまま写経しながら意味を理解していきました。
僕もいつか日経225の株価予測と、個別銘柄の予測とかできるようになりたいです。
そして今回写経していて思ったのは、pythonの基礎知識よりどのような手法をどのように使うかを知っている方が重要だとわかりました。
あとは数学。
シグマとか出てきて頭が痛かったです笑
タダケンさん、いつもアドバイス等ありがとうございます!!!
読んでくださりありがとうございました〜!