
bitFlyerの高頻度ボットを食らうクジラへの対策
(Photo by Michel.)
こんにちは、Hohetoです。まず最初に…
このnoteは書きかけのnoteです。
2020年2月下旬から3月上旬にかけてbitFlyerのSFD相場がひと段落していたのですが、そのころの出来事を3月6日に下書きを書いたのですが…
記事をリリースする間もなく再びSFD相場が訪れたので放置状態になりました。このままだとお蔵入りになりそうだったので、とりあえずエビデンスやグラフが少ない下書き状態でリリースします。状況に応じて加筆修正していきます。
2月終わりごろSFDが解除されて通常ボットを動かしていたところ、おかしな動きによってボットが損失を出していたので調査しました。
今回のnoteでは、その一部始終を紹介します。
クジラによって動かされる現物乖離率
bitFlyerのFXBTCJPYの現物価格との乖離は、大口の取引者によって比較的簡単に動きます。
この記事では意図的に乖離を動かせるほどの参加者のことを「クジラ」と呼ぶことにします(bitFlyerの中だけのクジラです)。
図1.は3月1日~3月5日の、FXBTCJPYとBTCJPYの乖離率(以下bFFX乖離率と呼びます)の推移をグラフにしたものです。
図1.bFFX乖離率の推移 2020年3月1日~3月5日
このグラフは30分足の簡易版ですが、
この期間のbFFX乖離率は概ね4%~5%の範囲を推移しており、短時間の間に0.5%前後も上下に変動している様子が分かります。
大口の取引含めて、だいたい100BTCほど約定のインバランスが起こると、bFFX乖離率が0.1~0.2%程度ほど拡がる(あるいは解消する)ようです。
bFFX乖離率が動くときのクジラの挙動
bFFX乖離率に変動が起こるときにボットが損失を被りやすいことに気付いた筆者は、これらの時間帯の挙動について調べ始めました。
そして、興味深い動きを発見しました。
ボット停止。心電図みたいにbuyが入れられて売り指値が食い物にされてる。かなC
— Hoheto (@i_love_profit) February 27, 2020
図2.の上段のグラフは、3月5日9:20~9:30のFXBTCJPYの約定履歴について、過去分をAPIによって取得して時系列にプロットしたものです。
下段のグラフは、出来高の部分、上側にBuyテイク量(青色)を、下側にSellテイク量(赤色)をそれぞれ0.1秒刻みでプロットしたものです。
図2. FXBTCJPYの約定履歴とVolume 2020年3月5日9:20~9:30
パッとみて分かる通り、少し時間を置きながら10~20BTC程度の大きめの成行き注文が入っていることが分かります。
これが冒頭で触れたボットの損失の原因でした。この成行によって逆側のポジション(図の場合はショートポジション)を抱えたまま、価格が順方向に変動していったことによる損失でした。
おそらく、LTPの近くに指している指値供給型(メイカータイプ)のボットは、この成行きによってだいたい逆選択ポジションを作ってしまうのではないかと思います。
なぜクジラはこういう発注の仕方をするのか?
この10BTC以上の成行き発注は、2月下旬にSFD相場が終わってbFFX乖離率が5%以下から大幅に剥がれたときから、至る所で観測されます。
そこで疑問に思ったのが、「なぜこういう発注の仕方をするのか?」ということでした。
10~20BTCをまとめて発注するよりも、1BTC程度に小分けにして発注したほうがマーケットインパクトを押さえることができるのでは?と考えるのが自然です。
そこで、リアルタイムの挙動を確認するために、Websocketからの約定履歴の配信時刻と共に記録してみました。
図3. 大きな成行注文と遅延の関係
表1. 約定履歴と配信遅延(bitFlyer FXBTCJPY)
bitFlyer側の挙動としては、
①大きな成行が入った後、数秒間は約定が行われない
(表1の「約定タイムスタンプ」列の緑色の字を参照)
②大きな成行が入ったときの約定データは、数秒間遅延してからWebSocketで配信されてくる
(表1の「配信タイムスタンプ」列のオレンジ色の字を参照)
というものです。
①の事実からは、「bitFlyerは大きな成行が入った後は、マッチングエンジンを意図的に一時的に停止している」ような印象を受けます。もしかすると負荷によってその後のマッチングが遅延している可能性もあるのですが、せいぜいその成行によって引き起こされる約定は数十件程度なので、これで数秒間も遅延するのは「?」という印象です。
一方、②の事実も興味深く、現在の挙動ではWebSocket購読者は、大きな約定が起こってから数秒間はその約定情報を知ることができません。
最も穿った見方をするのであれば、
大きな約定が起こった場合、その後数秒は意図的にマッチングエンジンを停止し、その約定情報についても数秒間は配信を行わない。そうしておいて板が集まった時点でマッチングを再開する という感じになります。
ただし、あくまでこの考察は筆者の所感であり、事実と反している可能性も十分にあります。本当にマッチングエンジンが拙いだけなのかもしれません。
どのみち、botterとしてはこの挙動は認識しておくべきでしょう。
ちなみに、BitMEXで大きな約定が起こったときの配信データを比較材料として掲載しておきます。
表2. 約定履歴と配信遅延(BitMEX XBTUSD)
400BTC超の約定の後も、継続してマッチングが行われている様子が分かります。配信も若干の遅延はありますが、1秒以内に収まっています。
クジラの動きへの対策
さて、botterとして重要なのは挙動の良し悪しではなく、この挙動を理解してロジックに落とし込むことです。
筆者としては、クジラたちはこの挙動を重々承知の上で成行注文を飛ばしているような印象を受けます。
彼らは「大きな成行を出してもそのインパクトは限定的であり、数秒で板が集まってくる」ということを感覚的にも感じているのではないでしょうか。
残念ながら、bitFlyer起点で起こるこの成行注文については、意図的にbot側が回避する術はありません。
ではどうするか…?というのが各々のbotterの腕の見せ所となります。
無策で板を出して、クジラに食われて利用される…なんて悔しいですよね?クジラの背に立って優雅に海原を駆け巡りたいものです。
終わりに
最近のbFFXの乖離の動きに辟易しているので、「bitFlyerの高頻度ボットを食らうクジラへの対策」というnoteを書こうかな。
— Hoheto (@i_love_profit) March 3, 2020
こちらのアンケートの通り、今回のnoteは深堀りせずにここまでとさせていただきます。
SFD相場でな~んもやることない…という方は、ご自身で挙動を調べたり、対策を検討してみてはいかがでしょうか。
それでは、よきbotterライフを!
ご意見・ご感想は筆者Twitter(@i_love_profit)までお願いします。