AIでビットコイン相場を予想する(lightGBM編) 第1回

こんにちは。Qです。


lightGBMで相場を予想するための記事です。

第1回といいますが、多分第2回は当分ないです。(笑)


ここでは、lightGBMや機械学習どうこうというよりは、「まず動かす」を目標に記事を作成しています。

こちらの講座で使用するプログラムの予習記事としての役割も果たしています。(というよりそれがメインです)


前提条件

Pythonをかける方対象です。

動かし方の基礎の基礎なので予想はできません。(儲かりません)


今からすること

Pythonで作ったAIで相場を予想します。

相場のデータをモデルに放り込んで、「予想しろ」とプログラムに命令すると、今後相場が上がるか、下がるか予想してくれるようなプログラムを作るということです。

あくまで初歩の初歩ですのでご了承ください。


今回使用する手法

lightGBMというライブラリ(プログラミング言語のPythonの第三者が制作した拡張機能)を利用しています。

lightGBMとは勾配ブースティングという機械学習手法を元にした、アルゴリズムです。(正確には他のアルゴリズムも使えます)

詳細を知りたい方は下記のホームページなんかが良いと思います。

コードとデータのダウンロード

解凍して、jupyeter notebookで開いてください。

下記、必要であれば、ライブラリや環境のインストールなどの参考にしてください。

使用データ説明

BitMEX 1h 足 XBTUSD 随分前からあるので、コード内で適当に切り分けで使用しています。

カラム 

open → 始値 high→高値  low→安値  close→終値 time →datetime timestamp→unixtime(1970年1月1日0時0分0秒からの経過秒数)

コード説明

ここからコード説明に入りますが、お手元にあるjupyter notebookを開いてお読みください。

0. コードの全体像

今回は、雑にAIを作るところまで行きます。

データの読み込み→指標の作成→AI作成→評価という手順です。


1. ライブラリのインストール

スクリーンショット 2020-04-15 10.18.27

必要なライブラリをインストールしています。怠惰なもので、適当に普段使いものをコピペしています。今回、不使用なものもあります。ご了承ください。

2. データを確認する

スクリーンショット 2020-04-15 10.20.06

データを確認することがまず最初にやるべきことです。

read_csvメソッドでcsvファイルを読み込んでいます。perse_dates=[]は日付のカラムを日付型として読み込みます。(日付データは色々とややこしいので専用のデータ型があります)


3. データの削除

スクリーンショット 2020-04-15 10.27.31

あまりに期間が長いので少しデータを削除します。


4. 指標の作成(関数定義)

データの準備が整ったので、指標を作成します。

ロウソク足データを放り込んだら、AIが良い感じに分析してくれるみたいなのは期待しないでおきましょう。

スクリーンショット 2020-04-15 10.28.48

ここでは移動平均と移動平均の階差、移動平均同士の差をとっています。

若干コードの書き方に違いがあってすみません。(今気づきました)

関数なので、まだ作成はしてません。

ポイントは、時系列予想の時は、価格そのものではなく、階差や指標同士の差をとることです。人間も数値自体ではなくて「どれだけ価格が動いたか」をみますよね。

もっというと、ここでは絶対値ですが、「変化率」の方が良いと思います。同じビットコインでも3000ドルから4000ドルと 10000ドルから11000ドルではその意味は大きく違います。


5. 正解ラベルの作成

スクリーンショット 2020-04-15 11.10.23

AIは正解がないと学習できません。(正確には教師あり学習と呼ばれる手法では正解ラベルがいります。)

正解と照らし合わせてデータを学習することで、値動きの癖を覚えていきます。

ここではデフォルトでは、10h後の価格を予想しています。

10h後に価格が上がっていれば0、下がっていれば1のフラグが立ちます。


6. 統計情報をみる

スクリーンショット 2020-04-15 10.40.28

.describe()を使うと簡単に統計情報を確認できます。(すみません。癖で今回は必要ないのに書きました。)

ここでは、統計のお話はしませんが、指標作成後にみた方が良いかもしれません。

7. 指標作成(実行)

スクリーンショット 2020-04-15 10.42.20

先ほど作った関数を実行します。

これでdataframeの値が上書きされます。

8.  相関を見る・nanを消す

スクリーンショット 2020-04-15 10.46.38

最初の方の移動平均が値抜けしていると思うので、落としてしまいます。

言ってしまうと、相関はここでは、必要はないです。(なぜ書いたんだというツッコミが来そうですが、ガッツリ分析とか別ロジックを試すなら必要になってきます)

9. 必要なカラムを抜き出す

スクリーンショット 2020-04-15 10.49.11

分析に使用するカラムを指定して抜き出してください。

Xは分析に使用するデータ、yは正解を表すラベルです。

ここでは、"y_label_10"というのが正解ラベルの名前です。関数の仕様上 10には〜h後の〜の数値が入ります。

10.データを分割する

スクリーンショット 2020-04-15 10.52.08

データを分割しています。

データを分割するのは、データを分けないで全てのデータを学習すると、AIが答えを丸暗記(過学習と言います)をしてしまうためです。未知のデータを使って本当に学習できているか、を試します。

また第2回があれば説明しますが、ちゃんと分析する際には、データはtrain validation testの3つに分けることが多いです。

(追記)すみません。今思うとtest_sizeではなくて、train_sizeの方が変数名がわかりやすかったと思います。

11. 学習する

スクリーンショット 2020-04-15 10.57.33

lightGBMで学習しています。

代表的なパラメータには、下記のようなものがあります。

スクリーンショット 2020-04-15 10.58.34

公式HPがパラメータの説明については充実しています。

細かいパラメータの説明は行いませんが、今回のポイントは、正解ラベルが価格上昇と価格下落の2クラスだということです。

値動きの幅を当てる場合(回帰問題)や、3クラス以上の分類は、objectiveやmetricで別のパラメータを使います。

testデータの正答率を評価指標として(evalで指定)、lgb.trainで学習データを学習します。

gbmインスタンスに学習結果を保存されます。

学習したモデルはgbmに入っているので、.predictメソッドを使って未知のデータを予想します。(下の2行です。)

y_pred変数に予測した結果は格納されます。

12.  予想したデータの偏りをカウントする

スクリーンショット 2020-04-15 11.04.32

結構予測が偏ってますね・・。AIの通りに売買するとロングしか持てない状態になるかもしれません。

13. AIを評価する

スクリーンショット 2020-04-15 11.06.28

混同行列(Confusion Matrix)という手法でAIを評価します。

混同行列とは、モデルの予想と実際の正解をマトリクス上に配置した手法です。

ここではPositive = UP、Negative = Downとします。(下記参考スライド)

スクリーンショット 2020-04-16 6.15.10

(参考)webページ

詳しい指標の意味ではなく、数値の見方を今回作ったモデルで説明します。

上のスライドの図と見比べると、2900件のデータのうち、2106件のデータを上がると予想し、実際に上がったのは1035件だということがわかります。(ほぼランダムです)

また、2900件のうち794件を下がると予想し、正解したのは409件です。(これもほぼランダムです。)

14.重要度を評価する

スクリーンショット 2020-04-16 6.21.39

lightGBMは(勾配ブースティングの場合)AI作成に使用した変数の重要度が出せます。

ここでは、ma5_diffが最上位、つまり5足分の移動平均の1つ前の値との差が一番大きな判別要素であったといえます。(とはいえほぼランダムですが)


ここまでで、コードで何をしているかについては終わりです。

データの部分を1m足にしたり、いれる変数を変えることで自分でもAIを作ってみることができると思います。


14. 宿題

ここまでは簡単な相場AIの作り方でした。

できればコードをぐぐりながら色々いじると良いと思います。

二つほど宿題を出します。もし良ければ考えてみてください。

1. 今は10h後を予想していますが、これが1h後ならどうでしょうか。

2. 1hだと少し精度が上がるように感じると思います。しかし、考え方によっては、このモデルの作り方には重要な欠点があります。それはなんでしょうか。(ヒント:過学習)


次回は当分ないかもしれませんが、「宿題解けました」みたいな方がもしいましたら、パラメータ調整、サンプリングの工夫などの手法を使ったコードをお渡しします。ぜひDMください笑


今日はここまで。いつも、読んでいただき、ありがとうございます。

Q

--------------------------------------------------------------------------

twitter : @trading_algo_Q

discord 初心者 botterの集い 



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