今回はビットコインの価格を
予測してみたいと思います。
解説動画はこちら
さてここからはGoogleColaboratoryを使って
コードを実行していきましょう。
データをダウンロードする
最初はビットコインの価格データの
ダウンロードからです。
ビットコインの価格データは
ここにあります。
ダウンロードはここ
csvファイル名は bitflyerJPY.csv.gz
colab上で実行する場合は
デフォルトのフォルダに置かれます。
データを見てみる
次はライブラリの読み込みです。
データフレームの作成
データ量を見てみると
非常に多いことがわかると思います。
データはこんな形になっています。
日付、価格、取引量
というデータの様ですが
日付がUnixTimeStampなので
分かる形になおします。
Unixtimestampを日付に直す
これで見える様になりましたね。
20210320のデータまでありました。
データは秒単位で入っている様ですね。
直近のデータを可視化してみましょう。
matplotlibで終わりの1万行分を
可視化してみます。
matplotlibで可視化
数時間分のデータですが
かなりの値動きがあることが分かります。
plotlyを使って可視化する
ここからはplotlyを使って
もっと細かく見ていきましょう。
plotlyでローソク足を表示させてみましょう。
データとしては
初値、高値、安値、終値
この4つが必要です。
pandasで簡単に集計できます。
resampleで集計間隔を決め
ohlcで四本値を計算できます。
日別の4本値に集計する
plotlyはグリグリ動かせるので
ズームしたりして色々遊べます。
これでみると2017年くらいからのデータで
2019年あたりに欠損があるようです。
予測モデルを作ってみる
ここからは予測モデルを作っていきましょう。
今回使用するのはFaceBookの
Prophetというライブラリで
時系列データの予測を行うことができます。
FacebookProphetライブラリの読み込み
学習用のデータを作成します。
学習には予測値(y)と日付(ds)という
2列分のデータが必要です。
ここでは終値をyに日付をdsに
置き換えて学習データを作成しています。
予測用の学習データの用意
これで準備できました。
学習は簡単に行えます。
予測モデルの学習
予測は何日先まで予測するかの
数値を入れてあげるだけです。
ここでは7日先までを予測します。
予測と可視化
はい
結果が出ました。
1年分のデータを用いての予測は
上昇傾向が続くという結果のようです。
予測結果の部分をみてみましょう。
予測結果
ここを可視化してみます。
yhatが予測値
upperとlowerが上限下限です。
だいたいこの間に収まるだろうという予測です。
1年という長い期間を用いた場合は
上昇傾向が続く形になりました。
もっと短い期間ではどうでしょうか?
次は1ヶ月でやってみましょう。
予測用のデータの日数を
変えるだけです。
過去30日から次の日の価格を予想する
最初落ち込みが激しいですが
これも上昇傾向ですね。
7日だとどうでしょうか?
これもやや上昇傾向にあるように思えます。
まとめ
トレンドが続くものとした予測であれば
良さそうな感じです。
ただしこれは参考値にしかなりません。
トレンドの変化があるところでの
予測は難しいと思うので
短い期間で学習、予測という形で
価格を予想する際の参考に
していただければと思います。
今回はこれまでです
それでは。
予測してみたいと思います。
解説動画はこちら
さてここからはGoogleColaboratoryを使って
コードを実行していきましょう。
データをダウンロードする
最初はビットコインの価格データの
ダウンロードからです。
ビットコインの価格データは
ここにあります。
ダウンロードはここ
csvファイル名は bitflyerJPY.csv.gz
colab上で実行する場合は
!wget --no-check-certificate https://api.bitcoincharts.com/v1/csv/bitflyerJPY.csv.gzこれでファイルがダウンロードされ
デフォルトのフォルダに置かれます。
データを見てみる
次はライブラリの読み込みです。
import pandas as pd import numpy as np import matplotlib.pyplot as plt import plotly import plotly.graph_objects as go %matplotlib inline早速データを読み込んでみましょう。
データフレームの作成
df = pd.read_csv('bitflyerJPY.csv.gz') df.columns = ['datetime', 'price', 'amount']データ量が多いので時間が掛かります。
データ量を見てみると
df.shape(63655790, 3)
非常に多いことがわかると思います。
データはこんな形になっています。
df.head()
datetime | price | amount | |
---|---|---|---|
0 | 1499155298 | 296016.0 | 0.600000 |
1 | 1499155299 | 296016.0 | 0.018600 |
2 | 1499155302 | 296550.0 | 0.050000 |
3 | 1499155310 | 296558.0 | 0.050000 |
4 | 1499155319 | 296539.0 | 0.229197 |
日付、価格、取引量
というデータの様ですが
日付がUnixTimeStampなので
分かる形になおします。
Unixtimestampを日付に直す
df['datetime'] = pd.to_datetime(df['datetime'],unit='s')インデックスをdatatimeindexに直す
df = df.set_index('datetime') df.tail()
price | amount | |
---|---|---|
datetime | ||
2021-03-20 01:10:13 | 6385001.0 | 0.06000 |
2021-03-20 01:10:17 | 6386760.0 | 0.00101 |
2021-03-20 01:10:17 | 6386760.0 | 0.00499 |
2021-03-20 01:10:17 | 6386101.0 | 0.00100 |
2021-03-20 01:10:20 | 6389000.0 | 0.00100 |
これで見える様になりましたね。
20210320のデータまでありました。
データは秒単位で入っている様ですね。
直近のデータを可視化してみましょう。
matplotlibで終わりの1万行分を
可視化してみます。
matplotlibで可視化
plt.figure(figsize=(10,6)) df['price'].tail(10000).plot() plt.show()
数時間分のデータですが
かなりの値動きがあることが分かります。
plotlyを使って可視化する
ここからはplotlyを使って
もっと細かく見ていきましょう。
plotlyでローソク足を表示させてみましょう。
データとしては
初値、高値、安値、終値
この4つが必要です。
pandasで簡単に集計できます。
resampleで集計間隔を決め
ohlcで四本値を計算できます。
日別の4本値に集計する
data=df['price'].resample('1D').ohlc()可視化
fig = go.Figure( data= [go.Candlestick( x = data.index, open=data['open'], high=data['high'], low=data['low'], close=data['close']) ] ) fig.show()
plotlyはグリグリ動かせるので
ズームしたりして色々遊べます。
これでみると2017年くらいからのデータで
2019年あたりに欠損があるようです。
予測モデルを作ってみる
ここからは予測モデルを作っていきましょう。
今回使用するのはFaceBookの
Prophetというライブラリで
時系列データの予測を行うことができます。
FacebookProphetライブラリの読み込み
from fbprophet import Prophet import warnings warnings.simplefilter('ignore')
学習用のデータを作成します。
学習には予測値(y)と日付(ds)という
2列分のデータが必要です。
ここでは終値をyに日付をdsに
置き換えて学習データを作成しています。
予測用の学習データの用意
model_df = data[['close']].tail(365) model_df = model_df.reset_index() model_df = model_df.rename(columns={'datetime':'ds','close':'y'}) model_df.head()
ds | y | |
---|---|---|
0 | 2020-03-21 | 688958.0 |
1 | 2020-03-22 | 647262.0 |
2 | 2020-03-23 | 719267.0 |
3 | 2020-03-24 | 752500.0 |
4 | 2020-03-25 | 741720.0 |
これで準備できました。
学習は簡単に行えます。
予測モデルの学習
model = Prophet() model.fit(model_df)
予測は何日先まで予測するかの
数値を入れてあげるだけです。
ここでは7日先までを予測します。
予測と可視化
future_df = model.make_future_dataframe(7) forecast = model.predict(future_df) model.plot(forecast)
はい
結果が出ました。
1年分のデータを用いての予測は
上昇傾向が続くという結果のようです。
予測結果の部分をみてみましょう。
予測結果
forecast_df = forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']] forecast_df = forecast_df.set_index('ds') forecast_df.tail()
yhat | yhat_lower | yhat_upper | |
---|---|---|---|
ds | |||
2021-03-23 | 6.375499e+06 | 6.065328e+06 | 6.667189e+06 |
2021-03-24 | 6.443882e+06 | 6.149507e+06 | 6.721009e+06 |
2021-03-25 | 6.480789e+06 | 6.192598e+06 | 6.773611e+06 |
2021-03-26 | 6.522106e+06 | 6.250351e+06 | 6.805741e+06 |
2021-03-27 | 6.572089e+06 | 6.278178e+06 | 6.857975e+06 |
ここを可視化してみます。
forecast_df.tail(10).plot() plt.show()
yhatが予測値
upperとlowerが上限下限です。
だいたいこの間に収まるだろうという予測です。
1年という長い期間を用いた場合は
上昇傾向が続く形になりました。
もっと短い期間ではどうでしょうか?
次は1ヶ月でやってみましょう。
予測用のデータの日数を
変えるだけです。
過去30日から次の日の価格を予想する
# 過去30日の値から次の日を予想する model_df = data[['close']].tail(30) model_df = model_df.reset_index() model_df = model_df.rename(columns={'datetime':'ds','close':'y'}) model = Prophet() model.fit(model_df) future_df = model.make_future_dataframe(1) forecast = model.predict(future_df) model.plot(forecast)
最初落ち込みが激しいですが
これも上昇傾向ですね。
7日だとどうでしょうか?
これもやや上昇傾向にあるように思えます。
まとめ
トレンドが続くものとした予測であれば
良さそうな感じです。
ただしこれは参考値にしかなりません。
トレンドの変化があるところでの
予測は難しいと思うので
短い期間で学習、予測という形で
価格を予想する際の参考に
していただければと思います。
今回はこれまでです
それでは。
コメントする