クリプトHFTとか競プロとか

競技プログラミングや仮想通貨に関することを中心にブログを書いていきます.

BitMEXのデータでドルバーを作りたい【ファイナンス機械学習】

みなさん,機械学習していますか?

僕はしていません.まだデータ前処理の段階だからです.

今日はBotterの中でも有名なUKIさんが推し,界隈のBotterは皆イナゴ買いしたと言われる「ファイナンス機械学習」についての記事です.

ファイナンス機械学習では金融時系列データをどのようにして学習データとするかの解説のなかで,よく知られている一定時間ごとのOHLCをとったタイムバーではなく, 一定量取引されたら新しいバーを作る,出来高バーやドルバーを推奨していました.

今日の記事では,BitMEXの価格データから,ドルバーを作るまでを解説していきます.

1から実装していては大変なため,「mlfinlab」というオープンソースパッケージを使っていきます.

f:id:KabukiMining:20200409152738j:plain

ドルバーを作りたいモチベーション

UKIさんの記事や,ファイナンス機械学習にも書いてあるように,ドルバーを使うことで標準バーよりも統計的性質が改善します. UKIさんの記事によると,仮想通貨市場においても同じことが言えるようです.

参照: https://note.com/uki_profit/n/ne218672309cf#rsYqG

mlfinlabのインストール

mlfinlabは,ファイナンス機械学習の中での様々な実装に基づくパッケージであり,このパッケージを使うことによって簡単に本書の中での実装を再現することができます.

Windowsなどを使っている方にはAnaconda環境での使用を推奨するとGithubにあったので,今回はAnaconda上でインストールしていきます.

github.com

mlfinlabのインストールはpipを使って簡単に行うことができます.: pip install mlfinlab

こちらのインストールに失敗する方は,mlfinlabのdocumentationのInstallationの中にある,"Installation for Developers"を試してみてください.

https://mlfinlab.readthedocs.io/en/latest/getting_started/installation.html

ドルバーを作成してみる

今回の記事では以前私のブログで紹介した,「BitMEXの秒足を約定履歴から30秒で自動生成するプログラム✨」を一部変更して作成していきます.

kabukimining.hateblo.jp

実際に変更したプログラムがこちらです. こちらのプログラムの実行には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()

こちらのプログラムも,実行すると標準入力での入力が求められるので,入力します.

f:id:KabukiMining:20200409134333p:plain
コンソール画面のSS
e.g)20200401 XBTUSD 4000000

すると,同じディレクトリにdollar-bitmex-2020XXXX.csvというファイルにドルバーのデータが生成されます.

おわりに

このプログラムを使用してできることはファイナンス機械学習の全容の1割にも満たず,実際に機械学習モデルを動かすこともできません. 次の記事では,実際にラベリングなどをして機械学習してみたいと思っています.

参考にした記事

mlfinlabのDocumentation: Data Structures — mlfinlab 0.12.3 documentation