BitMEXのデータでドルバーを作りたい【ファイナンス機械学習】
みなさん,機械学習していますか?
僕はしていません.まだデータ前処理の段階だからです.
今日はBotterの中でも有名なUKIさんが推し,界隈のBotterは皆イナゴ買いしたと言われる「ファイナンス機械学習」についての記事です.
ファイナンス機械学習では金融時系列データをどのようにして学習データとするかの解説のなかで,よく知られている一定時間ごとのOHLCをとったタイムバーではなく, 一定量取引されたら新しいバーを作る,出来高バーやドルバーを推奨していました.
今日の記事では,BitMEXの価格データから,ドルバーを作るまでを解説していきます.
1から実装していては大変なため,「mlfinlab」というオープンソースパッケージを使っていきます.
ドルバーを作りたいモチベーション
UKIさんの記事や,ファイナンス機械学習にも書いてあるように,ドルバーを使うことで標準バーよりも統計的性質が改善します. UKIさんの記事によると,仮想通貨市場においても同じことが言えるようです.
参照: https://note.com/uki_profit/n/ne218672309cf#rsYqG
mlfinlabのインストール
mlfinlabは,ファイナンス機械学習の中での様々な実装に基づくパッケージであり,このパッケージを使うことによって簡単に本書の中での実装を再現することができます.
Windowsなどを使っている方にはAnaconda環境での使用を推奨するとGithubにあったので,今回はAnaconda上でインストールしていきます.
mlfinlabのインストールはpipを使って簡単に行うことができます.: pip install mlfinlab
こちらのインストールに失敗する方は,mlfinlabのdocumentationのInstallationの中にある,"Installation for Developers"を試してみてください.
https://mlfinlab.readthedocs.io/en/latest/getting_started/installation.html
ドルバーを作成してみる
今回の記事では以前私のブログで紹介した,「BitMEXの秒足を約定履歴から30秒で自動生成するプログラム✨」を一部変更して作成していきます.
実際に変更したプログラムがこちらです. こちらのプログラムの実行にはpandasのインストールが必要であり, BitMEXからの約定データをダウンロードすることに留意してください.
# 💩💩💩💩 uncoding=utf-8 💩💩💩💩 import gzip import pandas as pd from mlfinlab.data_structures import standard_data_structures from urllib import request # 参考: https://qiita.com/yuukiclass/items/88e9ac6c5a3b5ab56cc4 def main(): date, symbol, threshold= input('yyyymmdd symbol threshold\n').split() date, threshold = int(date), int(threshold) baseurl = 'https://s3-eu-west-1.amazonaws.com/public.bitmex.com/data/trade/' print('Downloading...') filepath = '{}.csv.gz'.format(date) request.urlretrieve(baseurl + '{}.csv.gz'.format(date), filepath) print('Making candles...') df = unzip(filepath) df_dollar = makeCandles(df, symbol) print('Done!') file_title = 'bitmex-{}.csv'.format(date) display(df_dollar) df_dollar.to_csv(file_title) dollar = standard_data_structures.get_dollar_bars(df_dollar, threshold=threshold,batch_size=1000000, verbose=True, to_csv=True, output_path=file_title) return def makeCandles(df, symbol): # 参考: https://note.com/nagi7692/n/ne674d117d1b6?magazine_key=m0b2a506bf904 df = df.query('symbol == "{}"'.format(symbol)) df.drop(["symbol", "side", 'tickDirection', 'trdMatchID', 'grossValue', 'homeNotional', 'foreignNotional'], axis=1, inplace=True) df = df.sort_index() df['timestamp'] = pd.to_datetime(df['timestamp'], format="%Y-%m-%dD%H:%M:%S.%f") df = df.rename(columns={'timestamp': 'date_time', "size": "volume"}) df = df[["date_time", "price", "volume"]] return df def unzip(filepath): with gzip.open(filepath, 'rt') as f: df = pd.read_csv(f) return df if __name__ == "__main__": main()
こちらのプログラムも,実行すると標準入力での入力が求められるので,入力します. e.g)20200401 XBTUSD 4000000
すると,同じディレクトリにdollar-bitmex-2020XXXX.csvというファイルにドルバーのデータが生成されます.
おわりに
このプログラムを使用してできることはファイナンス機械学習の全容の1割にも満たず,実際に機械学習モデルを動かすこともできません. 次の記事では,実際にラベリングなどをして機械学習してみたいと思っています.
参考にした記事
mlfinlabのDocumentation: Data Structures — mlfinlab 0.12.3 documentation