見出し画像

Pythonで一年後のビットコインの価格予測をしてみた

はじめに

ご覧いただきありがとうございます。
Aidemy Premiumにて「データ分析コース」を受講しました。

私はもともと暗号資産に興味があり、ビットコインを所有しています。
学んだことを活かして価格予測ができると面白いかな、と思い
今回Pythonを用いたデータ分析を進めていきます。


1.データ分析の目的

  • 過去1年のビットコインの価格推移をもとに、この先1年の価格がどう変化していくかを分析

  • Pythonを用いて価格の上がるところ、下がるところを予測

  • SARIMAモデルの実装

2.データの取得と読み込み

  • 実行環境 Google Colaboratory

  • 使用するライブラリ

import warnings
import itertools
import pandas as pd
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
%matplotlib inline


データは公開されているビットコイン価格をcsvで取得。
 https://www.coingecko.com/ja より取得しました。
会員登録なしでダウンロードできるのでおすすめです🤙🏼◎


csvデータを読み込みます。

btc = pd.read_csv(
    filepath_or_buffer="/content/btc-usd-max.csv",
    dtype={'x02': 'float64'})
btc 

# indexに期間を代入。期間は"2022-08-29', '2023-08-28"とします。
index = pd.date_range('2022-08-29', '2023-08-28', freq='M')

グラフ化してみます📈

# データを折れ線グラフで表します
# グラフのタイトルを設定
plt.title("BTC_chart")

# グラフのx軸とy軸の名前設定
plt.xlabel("date")
plt.ylabel("price")
# データのプロット
btc.plot()
plt.show()
btc_chart


3.データの整理

今回使用するデータは、2023年8月20日~2023年8月20日の1年分のデータを取得しています。
これを機械学習で学習し、この先1年のビットコインの価格予測をしていきます。

from datetime import datetime
format_string = "%Y-%m-%d %H:%M:%S %Z"

#期間を取り出します。期間は"2022-08-20', '2023-08-20"とします。

# btcのインデックスにindexを代入する
btc.index = btc["snapped_at"].map(lambda x: datetime.strptime(x, format_string))
btc


4.モデルの構築

今回は「SARIMAモデル」で行っていきます。

📖 【SARIMAモデルとは】
SARIMAモデルは(p,d,q)をさらに季節周期を持つ時系列データにも拡張できるようにしたモデルです。
SARIMAモデルは(p, d, q)のパラメーターに加えて(sp, sd, sq, s)というパラメーターも持ちます。
sp:季節性自己相関
sd:季節性導出
sq: 季節性移動平均

チャットGPTより

ビットコインの価格データは、季節性(年末年始やクリスマスなどのイベント)やトレンド(年々上昇傾向にあるなど)の影響を受けていると考えられます。
そのため、SARIMAモデルはビットコインの価格予測に向いているモデルといえますね。


では、SARIMAモデルを用いて、時系列解析をしていきます。


# orderの最適化関数
def selectparameter(DATA, s):
    p = d = q = range(0, 2)
    pdq = list(itertools.product(p, d, q))
    seasonal_pdq = [(x[0], x[1], x[2], s) for x in list(itertools.product(p, d, q))]
    parameters = []
    BICs = np.array([])
    for param in pdq:
        for param_seasonal in seasonal_pdq:
            try:
                mod = sm.tsa.statespace.SARIMAX(DATA,
                                                order=param,
                                                seasonal_order=param_seasonal)
                results = mod.fit()
                parameters.append([param, param_seasonal, results.bic])
                BICs = np.append(BICs, results.bic)
            except:
                continue
    return parameters[np.argmin(BICs)]

# 周期は月ごとのデータであることも考慮してs=12となります
# orderはselectparameter関数の0インデックス, seasonal_orderは1インデックスに格納されています
target = btc["2022-08-20":"2023-08-20"]


best_params = selectparameter(target["price"], 12)


SARIMA_btc = sm.tsa.statespace.SARIMAX(target["price"], order=best_params[0],
                                             seasonal_order=best_params[1],
                                             enforce_stationarity=False, enforce_invertibility=False).fit()


実行するとこうなります。


5.一年先のビットコインの価格予測

2023年8月20日~2023年8月20日の過去1年分のデータをもとに
一年先である2023年8月20日〜2024年8月20日の価格予測をしてみます。


# predに予測期間での予測値を代入します
pred = SARIMA_btc.predict('2023-08-20', '2024-08-20')
pred.plot()


# pred.plot()
pred


実行するとこうなります。


SARIMAモデルで予測をすると、一年後2024年8月には
ビットコインの価格が右肩上がりで上昇していることがわかりました。



まとめ

今回はSARIMAモデルを使用しましたが、
きれいに価格上昇しているデータが出て、ビットコインの価格を比較的正確に予測できることがわかりました。

複数のモデルを組み合わせてデータ分析を行うと、より精度の高い予測を行うことができると感じました。

この記事が気に入ったらサポートをしてみませんか?