【Python】仮想通貨の時系列予測モデルをProphetで作成|AI・機械学習によるビットコイン自動取引

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ!
  • Pythonで仮想通貨の将来値動きを予測する時系列モデルを作成したい
  • 仮想通貨の自動売買に興味がある
目次

【AI・機械学習】仮想通貨の値動きを予測する時系列モデルをProphetで作成

Pythonと時系列解析モデルProphetを活用し、仮想通貨・ビットコインの時系列データを分析し、将来の値動きを予測するモデルを作成します。本記事ではこの方法について詳しく解説します。

【参考】Prophet

Prophetとは、2017年にMeta社(旧Facebook)によって開発された時系列解析用のライブラリであり、PythonとRの両言語で提供されています。

【参考】仮想通貨の自動売買

【事前準備】Pythonライブラリの準備

本記事では仮想通貨のヒストリカルデータを活用して、直近一年の値動きを予測する時系列モデルを作成します。そのために必要なPythonライブラリとして、以下をそれぞれインストールしておく必要があります。

  • データ処理に用いる「Pandas」
  • データの可視化に用いる「Matplotlib」
  • 仮想通貨のヒストリカルデータを取得する「Yahoo Finance」
  • 時系列モデルを構築する「Prophet」

インタラクティブシェル(ターミナルやコマンドプロンプト等)を開き、以下を実行してそれぞれのライブラリをインストールしましょう。

Pandas|データ処理

pip install pandas

Matplotlib|データ可視化

pip install matplotlib

Yahoo Finance|仮想通貨のヒストリカルデータ取得

pip install yfinance

Prophet|時系列解析モデル構築

pip install prophet

【Python】ビットコインの時系列解析モデルをProphetで構築・将来価格予測

それでは実際に仮想通貨・ビットコインの将来的な値動きを予測する時系列解析モデルを作成していきます。

以下の手順で進めていきます。

  1. データ準備|ビットコインのヒストリカルデータ取得
  2. データ確認|取得したヒストリカルデータを可視化
  3. データ加工|時系列解析用のインプットデータ作成
  4. モデリング|Prophetを活用した時系列予測モデル作成
  5. 結果の確認|時系列モデルによる予測結果を可視化

【データ準備】ビットコインのヒストリカルデータ取得

まずはじめに、ビットコインのヒストリカルデータを取得します。データ取得の際はYahoo Financeが提供するyfinanceメソッドを活用します。以下のコードを実行しましょう。

import pandas as pd
import yfinance

# ビットコイン価格の時系列データ
symbol = "BTC-JPY"  # 通貨コード
period = "max"      # 期間

# データ取得
Ticker = yfinance.Ticker(symbol)
data   = Ticker.history(period=period)
print(data)

# 出力イメージ

#                    Open         High          Low        Close         Volume  \
# Date                                                                            
# 2020-08-14  1259553.875  1294973.875  1244387.625  1254414.875  2583464298464   
# 2020-08-15  1254396.500  1275128.375  1254396.500  1264735.625  2489343859545   
# 2020-08-16  1264840.750  1272111.750  1251038.000  1267279.375  2193333617169   
# 2020-08-17  1267583.500  1309985.875  1257891.250  1298929.875  2992050141776   
# 2020-08-18  1298664.250  1302709.250  1259947.250  1261868.375  2740596004541   
# ...                 ...          ...          ...          ...            ...   
# 2022-08-09  3210681.000  3225039.250  3102091.750  3131711.500  3184627237655   
# 2022-08-10  3131519.750  3212830.750  3079745.750  3180726.000  4361467681259   
# 2022-08-11  3180819.250  3285641.250  3179163.250  3186711.000  4938452770705   
# 2022-08-12  3186667.250  3257527.500  3166469.750  3256226.750  3638253547214   
# 2022-08-14  3261561.750  3279846.500  3253514.000  3279846.500  3054908473344   

Pythonを活用したヒストリカルデータの取得方法について詳しく知りたい方はこちらの記事をご覧下さい。

【データ確認】ビットコインヒストリカルデータの可視化

前述で取得したビットコインのヒストリカルデータをグラフ化して確認します。今回の場合、2014年〜2022年8月までのデータ期間におけるビットコイン価格を採用しています。

グラフ化する場合、matplotlibを活用して次のようなコードを実行します。

import matplotlib.pyplot as plt

# グラフ可視化(折れ線グラフ)
plt.plot_date(data.index, data["Close"], linestyle='solid')

# 書式設定
plt.xlabel("Date")
plt.ylabel("Bitcoin")
plt.legend(loc="best")         # 凡例
plt.gcf().autofmt_xdate()      # X軸値を45度回転
plt.show()                     # グラフ表示

matplotlibを活用したグラフの描画方法についてはこちらの記事で詳しく解説しています。

【データ加工】時系列解析用のインプットデータ作成

後述でProphetを活用して時系列解析モデルを作成するために、時系列モデルに沿ったインプットデータのフォーマットを用意する必要があります。

Prophetの時系列解析モデルにインプットデータを渡す場合、ds列(日付データ)とy列(予測対象の価格データ)を含むデータフレームを用意します。次のようなコードを実行しましょう。

# Prophet投入用インプットデータ作成
df = pd.DataFrame({"ds":data.index, "y":data["Close"]}).reset_index(drop=True)
# 出力
print(df)

# 出力イメージ

#              ds             y
# 0    2014-09-17  4.963904e+04
# 1    2014-09-18  4.617907e+04
# 2    2014-09-19  4.303671e+04
# 3    2014-09-20  4.457462e+04
# 4    2014-09-21  4.345155e+04
# ...         ...           ...
# 2884 2022-08-10  3.180726e+06
# 2885 2022-08-11  3.186711e+06
# 2886 2022-08-12  3.256227e+06
# 2887 2022-08-13  3.259062e+06
# 2888 2022-08-14  3.284202e+06

【モデリング】Prophetによる時系列予測モデル作成

時系列予測モデルを実際に構築します。次のコードを実行しましょう。

from prophet import Prophet

# モデルインスタンス
proph = Prophet()

# モデル学習
proph.fit(df)

# 未来予測用のデータフレーム
future = proph.make_future_dataframe(periods=365)

# 時系列を予測
forecast = proph.predict(future)

Prophet()のインスタンスを作成し,fit()メソッドでモデル学習(パラメータ最適化)を実行しました。ここで、fitメソッドには,前述で加工したds列とy列を有するデータフレームを渡しています。

make_future_dataframe()とは、未来予測用のデータフレームを作成するメソッドです。

predict()メソッドをもとに、時系列の未来予測が適用されます。Prophetでの予測は、一般化加法モデル(GAM)を用いて行われます。GAMとは、傾向変動・季節変動・イベント情報などの様々な因子を考慮して予測を行う方法です。

予測結果を格納したforecastを確認すると次の結果が得られます。

# 出力
print(forecast)

# 出力イメージ

#           ds         trend     yhat_lower    yhat_upper   trend_lower   trend_upper  additive_terms  additive_terms_lower  additive_terms_upper         weekly  weekly_lower  weekly_upper         yearly   yearly_lower    yearly_upper  multiplicative_terms  multiplicative_terms_lower    multiplicative_terms_upper           yhat   
# 0 2020-08-14  1.851623e+06  596260.056490  1.408099e+06  1.851623e+06  1.851623e+06   -834631.10215         -834631.10215         -834631.10215   -5160.119899  -5160.119899  -5160.119899 -829470.982251 -829470.982251  -829470.982251                   0.0                         0.0                           0.0   1.016991e+06  
# 1 2020-08-15  1.843641e+06  642238.118914  1.447471e+06  1.843641e+06  1.843641e+06   -782059.21472         -782059.21472         -782059.21472     345.715854    345.715854    345.715854 -782404.930574 -782404.930574  -736843.471925                   0.0                         0.0                           0.0   1.016991e+06  
項目名概要
yhat予測値
yhat_upper予測の上限
yhat_lower予測の下限

【結果確認】時系列モデルによる予測結果を可視化

上図のように、黒線を実測値青線を予測値として可視化した時系列モデルの予測結果グラフを出力します。次のようなコードを実行しましょう。

from prophet.plot import plot_plotly
import plotly.offline as py

py.init_notebook_mode()

figure = plot_plotly(proph,      # 時系列モデル
                     forecast,   # 予測結果
                    )

# 出力
py.iplot(figure)

【性能評価】Prophetによる時系列解析モデルの予測性能を評価

最後に本記事で作成したモデルの予測性能を評価する方法について解説します。以下の手順で解説します。

  1. データ準備|Prophetによる交差検証
  2. モデル評価|評価指標の計算
  3. モデル評価|結果可視化

【データ準備】Prophetによる交差検証

交差検証とは、全てのデータセットを任意の割合で学習データ、検証データに分割して検証する方法であり、機械学習モデルの汎化性能評価に際して従来より使用されている検証方法です。

Prophetによる時系列モデルに交差検証を適用しモデルを評価します。cross_validationメソッドを活用した以下のコードを実行しましょう。

from prophet.diagnostics import cross_validation

# 予測性能評価用のデータ準備
df_cv = cross_validation(proph, initial='730 days', period='180 days', horizon = '365 days')

Initialとは学習データの始点を指します。periodとはcutoffを置く間隔になります。

上記コードの場合、1回目の検証を730日目を開始日とする365日間のデータをテストデータとして用い、それ以外のデータを学習用データとして用いています。また、2回目の検証ではテストデータを180日ずらしているため、910日目(730日+180日)を開始日とする365日間のデータをテストデータとして用いています。

上記のコードを実行すると、次のような出力結果が得られます。

# 出力
print(df_cv)

# 出力イメージ
#              ds          yhat    yhat_lower    yhat_upper             y           cutoff  
# 0    2017-03-09  1.362407e+05  1.319480e+05  1.407798e+05  1.368427e+05       2017-03-08 
# 1    2017-03-10  1.367783e+05  1.326551e+05  1.413909e+05  1.281325e+05       2017-03-08 
# 2    2017-03-11  1.371884e+05  1.330390e+05  1.416659e+05  1.349147e+05       2017-03-08  
# 3    2017-03-12  1.375473e+05  1.332243e+05  1.420603e+05  1.401411e+05       2017-03-08  
項目名概要
ds予測日
yhat予測値
yhat_lower予測の下限
yhat_upper予測の上限
y実測値
cutoff予測した期間

時系列モデルの場合、上記のy(実測値)と予測値(yhat)の差分を比較すると、予測性能が評価できます。

【モデル評価】評価指標の計算

時系列モデルを評価するための評価指標を算出します。以下を実行しましょう。

コード

from prophet.diagnostics import performance_metrics

# 回帰モデルの評価指標獲得
df_performance = performance_metrics(df_cv)

出力結果

# 出力
print(df_performance)

# 出力イメージ
#      horizon           mse          rmse           mae      mape     mdape     smape   coverage 
# 0    37 days  1.229585e+12  1.108866e+06  5.090510e+05  0.270854  0.139097  0.269189   0.479121
# 1    38 days  1.242802e+12  1.114810e+06  5.164919e+05  0.277897  0.141935  0.275359   0.469780 
# 2    39 days  1.259926e+12  1.122464e+06  5.234559e+05  0.284570  0.144340  0.281353   0.459890   
  • MSE(平均二乗誤差)
  • RMSE(平均平方二乗誤差)
  • MAE(平均絶対誤差)
  • MAPE(平均絶対パーセント誤差)
  • COVERAGE(予測値の上限yhat_lowerから予測値の下限yhat_upperの範囲)

本記事では評価指標の意味とそれぞれの見方に関する解説は割愛しています。詳しく知りたい方はこちらの記事をご覧下さい。

【モデル評価】時系列予測モデルの予測性能可視化

最後に、前述で算出した評価指標をグラフとして可視化します。次のようなコードを実行しましょう。

from prophet.plot import plot_cross_validation_metric

# 評価結果を可視化
figure = plot_cross_validation_metric(df_cv, metric='rmse')

横軸はHorizon(予測値の範囲)であり、縦軸と青線が評価指標(今回の場合RMSE)を示しています。

【仮想通貨・ビットコイン】自動取引実践法・その他優良情報

最後までご覧いただきありがとうございました。当サイトでは仮想通貨・ビットコインにおける多様な自動取引手法の解説記事を多数取り扱っております。

取引所別:APIの取得手順と使い方の解説記事

スクロールできます
対応言語記事名
Python【GMOコイン】 APIで仮想通貨取引の自動化
Python【Huobi Japan】 APIで仮想通貨取引の自動化
Python【bitbank】 APIで仮想通貨取引の自動化
Python【Coincheck】APIで仮想通貨取引の自動化
Python【bitFlyer】APIで仮想通貨取引を自動化
Python【BITPOINT】APIで仮想通貨取引の自動化

機械学習やテクニカル分析を採用した仮想通貨取引の解説記事

スクロールできます
対応言語記事名指標
共通自動売買の種類・自作時のポイント全て
Pythonリアルタイムチャート分析基礎トレンド
Python移動平均線トレンド
Pythonゴールデンクロス・デッドクロストレンド
Pythonアービトラージ(裁定取引)時間・値幅
Pythonボリンジャーバンドオシレータ
PythonMACDオシレータ
PythonRSIオシレータ
Python時系列予測モデルの構築機械学習・AI
【トレンド】:値動きが上昇・下降どちらのトレンドなのか判断に有効
【オシレータ】:現在の相場に対する買われすぎ・売られすぎの判断に有効

その他仮想通貨自動トレード解説記事

スクロールできます
対応言語記事名
Python【データ収集】仮想通貨の過去データを大量取得する方法
Python【初心者向け】ccxtを活用した仮想通貨の自動取引
Node.js【初心者向け】ccxtを活用した仮想通貨の自動取引

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次