こんにちは、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で構築・将来価格予測
それでは実際に仮想通貨・ビットコインの将来的な値動きを予測する時系列解析モデルを作成していきます。
以下の手順で進めていきます。
- データ準備|ビットコインのヒストリカルデータ取得
- データ確認|取得したヒストリカルデータを可視化
- データ加工|時系列解析用のインプットデータ作成
- モデリング|Prophetを活用した時系列予測モデル作成
- 結果の確認|時系列モデルによる予測結果を可視化
【データ準備】ビットコインのヒストリカルデータ取得
まずはじめに、ビットコインのヒストリカルデータを取得します。データ取得の際は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を活用したヒストリカルデータの取得方法について詳しく知りたい方はこちらの記事をご覧下さい。
【Python】仮想通貨・ビットコイン価格の過去データ取得方法2選|ヒストリカルデータ分析に基づく自動売買実現に向けて
仮想通貨のテクニカル分析に興味がある方向けに、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
を活用したグラフの描画方法についてはこちらの記事で詳しく解説しています。
【Python・データ分析】Matplotlibでグラフ(折れ線・棒・円・散布図・ヒストグラム)出力・コードの使い方解説
「pythonライブラリである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による時系列解析モデルの予測性能を評価
最後に本記事で作成したモデルの予測性能を評価する方法について解説します。以下の手順で解説します。
- データ準備|Prophetによる交差検証
- モデル評価|評価指標の計算
- モデル評価|結果可視化
【データ準備】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の範囲)
本記事では評価指標の意味とそれぞれの見方に関する解説は割愛しています。詳しく知りたい方はこちらの記事をご覧下さい。
【AI・機械学習】回帰モデルの性能評価および評価指標の解説|決定係数・RMSE・MAE・残差プロット
機械学習の性能評価方法の中で「回帰モデルはどうやって評価するの?」本記事ではその疑問に回答します。具体的に、決定係数、RMSE、MAE等の評価指標があり、それら特徴・利用シーンを1つずつ詳しく解説します。
【モデル評価】時系列予測モデルの予測性能可視化
最後に、前述で算出した評価指標をグラフとして可視化します。次のようなコードを実行しましょう。
from prophet.plot import plot_cross_validation_metric
# 評価結果を可視化
figure = plot_cross_validation_metric(df_cv, metric='rmse')
横軸はHorizon(予測値の範囲)
であり、縦軸と青線が評価指標(今回の場合RMSE)
を示しています。
【仮想通貨・ビットコイン】自動取引実践法・その他優良情報
最後までご覧いただきありがとうございました。当サイトでは仮想通貨・ビットコインにおける多様な自動取引手法の解説記事を多数取り扱っております。
取引所別:APIの取得手順と使い方の解説記事
対応言語 | 記事名 |
---|---|
Python | 【GMOコイン】 APIで仮想通貨取引の自動化 |
Python | 【BitTrade】 APIで仮想通貨取引の自動化 |
Python | 【bitbank】 APIで仮想通貨取引の自動化 |
Python | 【Coincheck】APIで仮想通貨取引の自動化 |
Python | 【bitFlyer】APIで仮想通貨取引を自動化 |
Python | 【BITPOINT】APIで仮想通貨取引の自動化 |
機械学習やテクニカル分析を採用した仮想通貨取引の解説記事
対応言語 | 記事名 | 指標 |
---|---|---|
共通 | 自動売買の種類・自作時のポイント | 全て |
Python | リアルタイムチャート分析基礎 | トレンド |
Python | 移動平均線 | トレンド |
Python | ゴールデンクロス・デッドクロス | トレンド |
Python | アービトラージ(裁定取引) | 時間・値幅 |
Python | ボリンジャーバンド | オシレータ |
Python | MACD | オシレータ |
Python | RSI | オシレータ |
Python | 時系列予測モデルの構築 | 機械学習・AI |
【オシレータ】:現在の相場に対する買われすぎ・売られすぎの判断に有効
その他仮想通貨自動トレード解説記事
対応言語 | 記事名 |
---|---|
Python | 【データ収集】仮想通貨の過去データを大量取得する方法 |
Python | 【初心者向け】ccxtを活用した仮想通貨の自動取引 |
Node.js | 【初心者向け】ccxtを活用した仮想通貨の自動取引 |
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら