アルゴリざむらい

主にpythonを用いて投資のアルゴリズムを検討します。連絡はalgorisamurai[at]gmail.comまで([at]は@にしてください)

pythonで仮想通貨の三点アービトラージ

概要

一般にアービトラージ戦略といえば、取引所Aと取引所Bで発生する価格差があるとき、高いほうで売り注文、安いほうで買い注文を約定させることで、その差額を利益として確定させる投資手法です。
こちらの自動取引アルゴリズムは以下のページで公開・解説しています。   algorisamurai.hateblo.jp

アービトラージには他にTriangular arbitrage/三点アービトラージ・取引所内アービトラージと呼ばれる手法があって、こちらは同じ取引所において、三つの通貨を順番に交換することによって利益を生み出すアルゴリズムです。
三点アービトラージの裁定機会を発見するコード(python)を以下のページの/tri_arbで公開しています。
github.com

ここからは三点アービトラージについて、具体例を使って説明します。

具体例

簡単のため、取引所Binance内部での、Bitcoin, Ethereum, Ripple (BTC, ETH, XRP)の相場について考えてみましょう。 この三つの通貨を相互に取引できる市場は、

  • ETH / BTC板
  • XRP / ETH板
  • XRP / BTC板

の三つです。 ここで、

  • ETH / BTC板 で ETH を BTC で購入
  • XRP / ETH板 で XRP を ETH で購入
  • XRP / BTC板 で XRP を売却して BTC にする

という一連の取引を行うことで、BTC→ETH→XRP→BTC、という流れで通貨が交換され、もとのBTCに帰ってきます。(逆ルートである BTC→XRP→ETH→BTC も同様です)。

たとえば板を見て、

  • 0.05BTC で 1ETH 買える
  • 0.001ETH で 1XRP 買える
  • 1XRP が 0.000051BTC で売れる

という状況があったとき、0.05BTC→1ETH→1000XRP→0.0505BTC と交換することで0.0005BTC増える、というのが具体的な三点アービトラージの流れです。

要するに

  • BTCで(ETHを介して)XRPを購入

する価格より

  • BTCでXRPを売却

する価格のほうが高い、という状況を裁定機会として捉え、取引を行うことになります。

この場合は売値0.0000505/買値(0.05 × 0.001) = 1.01 なので、利益は1%、またBinanceの場合は手数料が0.05%のため、0.05 × 3(取引回数)=0.15%を引いた、0.85%が正味の利益ということになります。
実際の市場は1%が拾えるほど大きく歪むことは少なく、小数点以下の期待値の取引を繰り返して利益を生み出していくことになります。

また、BTC・ETH・XRPのようなメジャーな通貨間では板が厚く、歪みが手数料のレンジを超えることはほとんどありません。たとえばBinanceだと、選べる基軸通貨(BTC, BNB, ETH, USDT)の中から二つ選ぶほかは、板が薄めの適当な仮想通貨を選んでくることをおすすめします。

三点アービトラージの注意点

三点アービトラージに重要になってくるのが、取引手数料とサーバーの反応にかかる時間です。板が薄いために比較的大きな歪みが生じやすい一方で、一回の手続きでの取引回数が通常のアービトラージの3倍のため、通常のアービトラージ以上に手数料の安さが重要になってきます。

また、取引所の板は刻一刻と変化するため、スリッページを避けるためなるべく「直前の」データを得たうえで「瞬時に」注文を行う必要があります。そのため、レスポンスの速い取引所を選ぶことも重要です。

裁定機会の検出

上のリンクのコードを使用して、BinanceでBTC・BNB・LSKの組み合わせを対象に三点アービトラージの機会を検出してみました。
0.15%の手数料に0.05%を上乗せした、利益率0.20%を超える機会を検出してみます。

結果、約12時間の間にあった23回の裁定機会のうち、10回は即座に解消されていたものの、13回については歪みがなくなるまで0.2〜4.0秒程度の猶予期間があることが検出されました。さらに、この13回のうち9回は1.0秒以上の猶予期間を持っていました。 (板の取得中に既に取得した板が変動することを考えると、10回の中には誤検出も含まれていると考えられます)

取引三つ(BTC→BNB→LSK→BTC or BTC→LSK→BNB→BTC)を行うのに0.2秒かかると考えると、利益率が閾値を上回った0.2秒後に新たに取得した板でも利益率が大きいまま(猶予期間内にある)なら、取引が可能だった、と判断できることになります。

今回のコードでは自動取引までは実装していませんが、条件をうまく設定することでプラスを出すことは十分可能かと思います。

今後の展開

改善案としては

  • BNB/BTC板・LSK/BNB板・LSK/BTC板をシーケンシャルに取得するのではなく、同時に取ってくるようにする

こと、また

  • 組み合わせに使う通貨それぞれに分割して入金しておき、取引を同時に行うようにする

ことで手続きの高速化がはかれるのではないか、という感じです。

試しに並列処理で書いてみたんですが、ネットワークの問題か現状と比べて別にはやくならなかったので、我こそはという人はget_orderbooks()をいかに早くできるか挑んでみてください。

現状のシーケンシャルな処理だけでも、数ヶ月前試した原始的なコード(裁定機会を見つけたら一番小さなロットで取引してみる)では微妙なプラスが出ていたので、三点アービトラージで稼ぐのは無理、ということも決してなさそうです。通貨を基本的に一種類しか持たなくていいこと、裁定機会自体はけっこう多いことなど、取引所間のアービトラージと違った利点もあるので、私も気が向いたときにまた挑んでみるつもりです。

18//04/23追記:並列処理による同時の板取得を実装しました。