😽
Binance永久先物の約定履歴と、いろんな時間間隔のタイムバーと戯れる
きっかけ
ここまで色々調べていていくつか思ったことがありました。
- 短期的な価格の値動きは、銘柄間のクロスセクションではなく、自己相関や自分自身のアノマリーに引っ張られているように見えました
- なので、広く銘柄を見ていくつか有望な銘柄を選択したあとは、ひとつひとつの銘柄に集中して検討をしたほうが良い結果を生むかもしれないと思いました
そして、一銘柄を集中して見るのなら、Binanceから約定履歴をダウンロードして、ほしい時間間隔のタイムバーを作ることができるようにならないといけないな、と思いました。
やること
- Binanceは過去の約定履歴をzip圧縮されたCSVファイルとしてダウンロードできるので、それをダウンロードして、後で扱いやすいようにDataFrameをpkl.gz形式で保存します
- この約定履歴は一日に一回の更新なので、実際のBotでの取引には使えません。値動きの分析専用です
- pkl.gz形式で保存したDataFrameを使い、タイムバーを作り、pkl.gz形式で保存します。タイムバーの間隔は86400秒 (1日) の約数であればよしとします
- ターゲットの銘柄は以下のものにしました
- BTCUSDT
- ETHUSDT
- XRPUSDT
- BNBUSDT
- ADAUSDT
- SOLUSDT
- DOGEUSDT
- MATICUSDT
- AVAXUSDT
- 1000SHIBUSDT
- ATOMUSDT
やったこと (約定履歴ダウンロード)
プログラムを書いて、約定履歴をダウンロードして保存できるようになりました。
プログラム本体はこちらです。雑なコードですが、なにかの参考にはなるかもしれません。
いくつかの関数は別ファイル (exercise_util.py) に分けています。
工夫したポイントはこんな感じです。
- Binanceのトレードのヒストリカルデータは、途中からカラム名を入れる仕様に変わっているので、そこをきちんと処理する必要があった
- joblibとretryを使って、CPUコアを使い切ってリトライ付きダウンロードをすることで、ちょっと速くダウンロードができるようにした
- マルチコアを使った進行状況をtqdmを使って表示するようにした
- pandas.to_pickle()は、保存中に強制終了すると保存しかけのファイルが残るので、きちんと保存完了できたものとそうでないものを区別するようにした
- ダウンロード途中で強制終了しても、ダウンロードが終わっていないファイルを見つけて再ダウンロードするようにした。
ダウンロードしたデータファイルの容量は、こんな感じになりました。思ったよりデータ容量が少なくてよかったです。
銘柄 | 容量 |
---|---|
BTCUSDT | 24GB |
ETHUSDT | 20GB |
DOGEUSDT | 11GB |
XRPUSDT | 8.9GB |
1000SHIBUSDT | 7.9GB |
ADAUSDT | 7.5GB |
BNBUSDT | 7.0GB |
MATICUSDT | 5.5GB |
SOLUSDT | 4.2GB |
ATOMUSDT | 4.3GB |
AVAXUSDT | 3.0GB |
合計 | 103GB |
やったこと (タイムバー作成)
プログラムを書いて、約定履歴からほしい長さのタイムバーを作って保存できるようになりました。
プログラム本体はこちらです。雑なコードですが、なにかの参考にはなるかもしれません。
exercise_util.pyはこのプログラムでも使っています。
工夫したポイントはこんな感じです。
- 一日の始まりのinterval秒の間、たまたまトレードがない場合は、前日の最後のタイムバーのクローズを持ってきて、オープン、クローズ、高値、安値の値として使うようにした
- joblibを使って、CPUコアを使い切ってタイムバーの作成をちょっと速くできるようにした
- マルチコアを使った進行状況をtqdmを使って表示するようにした
- タイムバー生成の途中で強制終了しても、未完成のタイムバーファイルを削除してきちんとやりなおすようにしてみた
おわりに
前回はオーダープロファイルを使った特徴量を作ろうと思っていてまあまできているのですが、特徴量をいじる前に、サイコロを振る練習 (執行戦略の模索) をしないとだめだろう、ということで次はそこをやってみたいと思います。
Discussion