アルゴリざむらい

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

アービトラージアルゴリズムの解説2(板から裁定取引が可能な量を計算)

概要

取引所間の裁定取引を行うために、アービトラージアルゴリズムでは二つの取引所の「買い板」と「売り板」を監視し、「取引所1でのask(買うときの値段)が取引所2でのbid(売るときの値段)より安い」あるいは「取引所2でのaskが取引所1でのbidより安い」状況を発見次第、安い方で買って高いほうで売ることで利益を確定します。

ここで、板に乗っている情報というのは「取引できる価格」と「その価格で取引できる量」、の二つということになります。 今回は板から裁定取引ができる量を計算する部分について概説します。

板を具体的に見てみよう

取引所のAPIを叩いて板を取得すると、次のような値が得られます。(DASH/BTCの例)

取引所①
{"ask":[
[ 0.0534 0.134 ]
[ 0.0535 0.151 ]
[ 0.053562 0.3 ]
[ 0.053563 0.501 ]
[ 0.053564 0.449 ]],
"bid":
[[ 0.053397 0.028 ]
[ 0.053396 9.348 ]
[ 0.053366 0.63 ]
[ 0.053365 0.394 ]
[ 0.053364 0.075 ]]}

これは、askのほうでは「DASH を 0.0534 BTC/DASHで売ります」が 0.134 DASH、「DASH を 0.0535 BTC/DASHで売ります」が 0.151 DASH……という注文が並んでおり、bidのほうでは「DASH を 0.053397 BTC/DASH で買います」が 0.028 DASH、「DASH を 0.053396 BTC/DASH で買います」が 9.348 DASH……という注文が並んでいる、ということになります。別の取引所の板も見てみましょう。

取引所②
{"ask":[
[ 0.053609 0.046 ]
[ 0.053770 0.033 ]
[ 0.053772 0.179 ]
[ 0.053777 0.061 ]
[ 0.053802 0.001 ]],
"bid":
[[ 0.053607 0.076 ]
[ 0.053606 0.101 ]
[ 0.053595 1.083 ]
[ 0.053582 0.139 ]
[ 0.053551 0.14 ]]}

取引所②では、ask、bidともにさきほどの取引所より高い値がついています。 ここで、取引所①のbest ask、「DASH を 0.0534 BTC/DASHで売ります」でDASHを買って、取引所②のbest bid「DASH を 0.053609 BTC/DASHで買います」に売ることで、0.053609/0.0534 = 1.004、つまり0.4%の利益が出る、というわけです。

それでは、どれだけの量を取引所①で買って取引所②で売るのがよいのでしょうか?

best ask / best bid のみでの取引をすることを考えると、答えは 0.076 DASH ということになります。取引所①の best ask では 0.134 DASH を購入することができますが、この買いのうち取引所②の best bid で売って相殺できるのが 0.076 DASH しかないためです。

このように単純なアービトラージの機会検出モデルでは、取引できる量が best ask / best bid の小さいほうで決定されてしまうわけですが、もちろんこれはあまりいい解釈ではありません。取引所②のbest bidの次のbidの価格はbest bidに近いため、実質的には2番目のbidのことも考えると、いい bid の価格で捌けるのは0.076 + 0.101 = 0.176 で、best askの全量 0.134 をすべて捌けそうだからです。 もちろん ask のほうでも同様なことが言えるので、ここで「どこまでの量がお得な利益率で捌けるか」ということを考える必要があります。(公開したコードでこれはtool.pyのrate_cで実装しています)

実際のところ、best ask/ best bid 付近には、自動取引によるごく小額の量が乗り続けるということもよくあるため、一番上だけを監視していると実際には利益を出せる状況を取り逃がしてしまうことがありそうです。

取引可能な量の計算法

具体的な計算としては、まずは取引所①のask

取引所①のask
[ 0.0534 0.134 ]
[ 0.0535 0.151 ]
[ 0.053562 0.3 ]
[ 0.053563 0.501 ]
[ 0.053564 0.449 ]

の取引できる量について、その価格までの総和をとってみることにします。

取引所①のask その価格までの量の和をとったもの
[ 0.0534 0.134 ]
[ 0.0535 0.285 ]
[ 0.053562 0.585 ]
[ 0.053563 1.086 ]
[ 0.053564 1.575 ]

これで、たとえば最終行をみれば「少なくとも 1.575 DASHぶんは 0.053564 DASH/BTC より安く買える」ということがわかります。
取引所②のbidについても同様にします。

取引所②のbid その価格までの量の和をとったもの
[ 0.053607 0.076 ]
[ 0.053606 0.177 ]
[ 0.053595 1.260 ]
[ 0.053582 1.399 ]
[ 0.053551 1.539 ]

こうして作った列を、量の順にソートしてみましょう。

[ 0.053607 0.076 ] bid
[ 0.0534 0.134 ] ask
[ 0.053606 0.177 ] bid
[ 0.0535 0.285 ] ask
[ 0.053562 0.585 ] ask
[ 0.053563 1.086 ] ask
[ 0.053595 1.260 ] bid
[ 0.053582 1.399 ] bid
[ 0.053551 1.539 ] bid
[ 0.053564 1.575 ] ask

これによって、上2行をみると「少なくとも 0.076 DASH は 0.0534 で買って 0.053607 で売れる」こと、上三行から「少なくとも 0.0134 DASH は 0.0534 で買って 0.053606 で売れる」、上四行から「少なくとも 0.177 DASH は 0.0535 で買って 0.053606 で売れる」……と、量ごとの取引の条件がわかることになります。

公開したアルゴリズムでは、この取引条件が指定した期待利益率の閾値以上になる量を計算し、取引量を決定しています。

板情報の他の活用法

スリッページのリスクがどの程度あるか」なども板からある程度推測することができるはず(板の価格が飛び飛びの値をとっているときは、bestに近い注文とマッチングできないと条件の悪い注文をつかまされることになる)ので、機会があったら考えてみたいと思います。