Bitcoinが昨年から爆騰している。最近は少し下がっているが。以前これまでのトレンドから価格を予測してみた。以前下のような予測を立ててみたが、現在はこれよりもかなりバブリーに上昇しているので、今後は2万ドル付近まで下がっていくと予測している。

最近Pythonのライブラリで、経時データを予測するものが増えている。FacebookのProphet、AmazonのGluonTS、英国Alan turing研究所のsktime等。これらを用いてBitcoin価格の経時データから未来の価格を予測してみた。今回はProphetとsktimeについての結果となる。
データとしては、ビットコインのドル価格推移データを2021.1.15まで入手してこれを使用した。データは色々なところが提供しているが、今回は以下のサイトからcsvデータをダウンロードした。データは3日毎であることに注意する必要がある。

sktimeから。これは2019年3月にリリースされたものである。時系列予測アルゴリズムとして、5種類ほど用意されているようであるが、今回はThetaforecasterを用いた。sktimeに3日おきのデータを入れるとエラーを起こしてしまうので、補間して毎日としたデータに変換する必要がある。またデータの98%をtrainデータとして最近の2%に相当する部分を予測することとした。

結果を上の図に示す。ちょっと小さくなってしまって見難いが、一番右のオレンジの線が実際の価格の動きで、その下の青い線の部分がsktimeにより予測した価格となる。当然ではあるが、今回のような急激な価格高騰の予測は難しい。しかし若干は上昇する予測を示している。
次はProphet。これはFacebookが公開している経時データ予測ライブラリで、2017年にリリースされた。これも同じように98%をtrainデータとした。下が予測結果。

上の図で、黒点が実際のデータで、青線と青色のハッチング部分が予測である。Prophetのデフォルトの作図では、右側の予測の部分は予測のみのプロットとなり、実際の黒点データはプロットしてくれない。これも若干上昇する予測となっているが実際の急騰は再現してくれない。今回のような急騰を予測させることにそもそもの無理があるとも言える。少し落ち始めている現在のデータを与えると、恐らく今後も落ちると予測するのだろう。やはり急激な騰落予想は至難の業である。
以下に実際のコードを掲載する。google colaboratoryで計算したもので、興味のある方は参考にして下さい。
#1ライブラリをインポートし、データの読込み
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from google.colab import drive
import csv
import sklearn
#1データをDataFrameとして読込み dataはBlockchain.comから持ってきたもの データ欠損無し 但し3日おき
drive.mount('/gdrive')
data=pd.read_csv('/gdrive/My Drive/Colab Notebooks/Bitcoin/market-price2021.csv',encoding='utf-8')#1prophetをinstall
!pip install fbprophet
from fbprophet import Prophet
#1prophetによる価格予測
#1trainとtestに分割
from sklearn.model_selection import train_test_split
x = data['Timestamp']
y = data['market-price']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.02, shuffle=False)
train = pd.concat([x_train, y_train], axis=1)
train.rename(columns={'Timestamp':'ds','market-price':'y'}, inplace=True)
train['cap'] = 40000
train['floor'] = 0.000001
#1prediction
model = Prophet()
model.fit(train, algorithm='Newton')
future_data = model.make_future_dataframe(periods=6, freq = 'm')
forecast_data = model.predict(future_data)
model.plot(forecast_data)
plt.show()#1sktimeのinstall
!pip install sktime
from sktime.forecasting.naive import NaiveForecaster
from sktime.datasets import load_airline
from sktime.forecasting.theta import ThetaForecaster
from sktime.forecasting.model_selection import temporal_train_test_split
from sktime.performance_metrics.forecasting import smape_loss
from sktime.utils.plotting import plot_series
from sktime.forecasting.ets import AutoETS
data = data[data['market-price'] != 0]
#1元データが3日おきなので、補間して毎日とする
data["Timestamp"] = pd.to_datetime(data["Timestamp"]) #1このセルを複数回実行するときはコメントアウトすること
data.set_index('Timestamp', inplace=True) #1同上
data1 = data.resample('D').mean()
data2 = data1.interpolate()
#1prediction
y_train, y_test = temporal_train_test_split(y, test_size=0.02)
fh = np.arange(1, len(y_test) + 1)
forecaster = ThetaForecaster(sp=12)
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
plot_series(y_train, y_test, y_pred, labels=["y_train", "y_test", "y_pred"])
smape_loss(y_test, y_pred)#ビットコイン #bitcoin #価格予測 #Prophet #sktime

コメント