[特徴量エンジニアリング]AI(機械学習)を使って、ビットコイン価格を予想!

自動売買

これまでに、機械学習を使ってビットコインの価格予想に挑戦してきました

上の記事では、チャートパターンを学習させ、次の日はビットコイン価格が「上がる」のか「下がる」のか予想させました

この場合の予想的中率は、52%でした

結構的中率が高いのでは?と感じる方もいるかもしれませんが、

ランダムに予想した場合の的中率は50%になるはずなので、52%は決して高いとは言えません

この時の反省を生かして、今回は、特徴量を与えて機械学習をさせました

特徴量エンジニアリング

特徴量エンジニアリングとは

これまでは、値動きのみを頼りに、AI(機械学習)に翌日のビットコイン価格を予想させてきました

そのため、人間で言うと、ニュースで情報を集めたり(ファンダメンタルズ分析)、テクニカル指標を参考にしたり(テクニカル分析)を一切せずに、チャートだけ見てトレードしているようなものです

これでは適切な投資判断はできません

そこで、もう少し情報(特徴量)を与えれば、ビットコイン価格予想の的中率が上がると思います

それが、特徴量エンジニアリングです

どんな特徴量を与えるのか

今回は、テクニカル指標を特徴量として与えようと思います

例えば、

・移動平均(SMA、EMA)

・MACD

・RSI

・ボリンジャーバンド

などです

テクニカル指標について詳しく知らない方向けに簡単に解説すると、

テクニカル指標は、チャート分析をするための判断材料で、普通は下のようにチャートと一緒に表示させます

AI(機械学習)を使って、ビットコイン価格を予想

実際に、機械学習モデルに特徴量を与えて、学習させてみました

このコードをコピペすれば、一応機械学習ができるので、興味がある方はやってみてください

データ取得

※ビットコイン自動売買プログラムのサンプルを載せますが、以下の点をご注意ください

注意事項

・取引における損失について、責任は負いかねます

・API Keyの流出など、セキュリティ面での責任は負いかねます

・上記以外のいかなる障害・トラブルにおいても責任を負いかねます

トレードで使われることの多い、ビットコインの「4時間足」データを取得しました

#bitbankのAPIを使う
import python_bitbankcc
pub = python_bitbankcc.public()

#2017〜2021年のデータを取得する
span = ["2017", "2018", "2019", "2020", "2021"]

ohlcv_data = []
for year in span:
    
    #データ取得
    value = pub.get_candlestick("btc_jpy", "4hour", year)
    
    #ohlcvデータを取り出す
    ohlcv = value["candlestick"][0]['ohlcv']
    
    #結合
    ohlcv_data.extend(ohlcv)

#データフレームに変換
import pandas
col = ["Open","High","Low","Close","Volume","Unix Time"]
df = pandas.DataFrame(ohlcv_data, columns=col)

こういうデータ(データフレーム)が得られると思います

これが学習の元データになります

特徴量を選ぶ

テクニカル指標の

・MACD

・RSI

・ボリンジャーバンド

を特徴量として与えようと思います

これらのテクニカル指標を計算し、データフレームに追加していきます

テクニカル指標の計算には、Ta-Libというライブラリを使います

import talib

MACDの計算

#MACD
macd, macdsignal, macdhist = talib.MACD(df["Close"], fastperiod=12, slowperiod=26, signalperiod=5)
df["MACD"] = macd
df["MACDSIGNAL"] = macdsignal
df["MACDHIST"] = macdhist

RSIの計算

#RSI
rsi = talib.RSI(df["Close"], timeperiod=14)
df["RSI"] = rsi

ボリンジャーバンド

#BB
bb_upper, bb_middle, bb_lower = talib.BBANDS(df["Close"])
close = df["Close"].astype("float64")
#ボリバンの幅を考える
df["BB_width"] = bb_upper - bb_lower
df["BB_position"] = bb_middle - close 

データはこんな感じになるはずです

データ加工

まずは、正解ラベルを作ります

#正解ラベル
label = []
for i in range(len(df)):
    if i == 0:
        label.append(0)
    else:
        if df["Close"][i] > df["Close"][i-1]:
            label.append(1)
        else:
            label.append(0)

            
df["Answer"] = label

次に、いらないデータを削除します

今回は、

・始値

・高値

・安値

・終値

・Unix時間

がいらないデータなので、これらを削除します

#いらないデータの削除
df = df.drop(["Open","High","Low","Close","Volume","Unix Time"], axis=1)

最後に、0やNanを含む行を削除します

#0、nanの削除
df = df.drop(index=len(df)-1)
df = df.dropna(how="any")

こんな感じになったと思います

学習

学習データテストデータに分けます

#学習データとテストデータの分割
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(df.filter(items=["MACD","MACDSIGNAL","MACDHIST","RSI","BB_width","BB_position"]), df["Answer"], test_size=0.3)
#train:学習データ、test:テストデータ

print("X_train : ", X_train.shape)
print("X_test : ", X_test.shape)
print("y_train : ", y_train.shape)
print("y_test : ", y_test.shape)

SVM(サポートベクターマシン)という機械学習モデルで学習させます

学習には学習データを使います

#サポートベクターマシーン
from sklearn.svm import SVC
svm = SVC(kernel="linear")
svm.fit(X_train, y_train)

テスト・評価

学習させたモデルがどれだけ正しく学習したか確認するために、テストをします

テストにはテストデータを使います

score = svm.score(X_test, y_test)
print("正答率:{}" .format(score))

実行してみたところ、正答率は73.5%になりました

他のモデルでも実装

SVM(サポートベクターマシン)以外の機械学習モデルでも、同じように予想してみました

ロジスティック回帰

ランダムフォレスト

k-means法

どの機械学習モデルでも、70%程度でした

まとめ

AI(機械学習)を使ってビットコインの価格予想に挑戦してきました

今回は、特徴量(テクニカル指標)を与えることで、正答率を52%から73%まで上げることができました!

これから、さらに正答率を上げるために、

・特徴量を見直してみたり

・別の特徴量を新たに導入したり

してみようと思います

参考文献

コメント

タイトルとURLをコピーしました