アルゴリざむらい

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

アービトラージアルゴリズムの解説1(板の取得・売買と並列処理)

概要

以下で公開しているアルゴリズムの仕組みについて簡単に解説します。 algorisamurai.hateblo.jp

今回は板の取得・注文に並列処理を使うメリットについての話です。

板の取得

アービトラージは、「取引所Aの買値」のほうが「取引所Bの売値」より安い、というような状況を見つけてきて注文を投げてAで買ってBで売る投資手法であるため、「買値と売値がいくらか」の情報を取引所から入手してくる必要があります。
取引所には、人々が「〇〇円なら売りますよ」(askと呼びます)「△△円なら買いますよ」(bidと呼びます)という提案が並んでいて、これをと言います。 各板における一番安い「〇〇円なら売りますよ」はbest ask、と一番高い「△△円なら買いますよ」はbest bidと呼ばれています。

要は取引所1のbest askが取引所2のbest bidより安かったら1で買って2で売れば得できる、というわけです。 アービトラージでは、まずこの機会を発見するため、常時板を監視する必要があります。

板を取得するためには、各取引所が公開しているAPIと呼ばれる仕組みを使います。取引所のURLに「板の情報がほしい」というリクエストを送って、かえってきた結果を使って取引のチャンスかどうかを判断します。

並列化

特に何も考えずにコードを書くと自然に

取引所1にリクエス

取引所1から結果が返ってくる

取引所2にリクエス

取引所2から結果が返ってくる

分析

という流れになるのですが、実はこれは効率的ではありません。通信にかかる時間&向こうのサーバー内での処理時間のために、リクエストを送ってから結果が返ってくるまでの間には50ミリ秒~200ミリ秒ほどの時間がかかるのです。そのぶん、先に取得した取引所1の板のほうが後に取得した取引所2の情報より「古い」ので、この時間差の間に変化してしまっている可能性があるわけです。
そこで登場するのが「処理の並列化」です。

並列処理では、簡単に言うと

取引所1にリクエス

取引所2にリクエス

取引所1と2の結果が返って揃うのを待つ

分析

という手続きをとります。これによって、板の取得にかかっていた時間が (取引所1との通信時間+取引所2との通信時間)から(取引所1との通信時間 と 取引所2との通信時間 の大きい方)
まで削減され、所要時間を減じると同時に板の情報の時間ラグも軽減することができるわけです。

これは注文時の処理にも有効で、こちらでは「板を取得してからなるべく早く注文のリクエストを投げる」のに非常に有効に作用します。

処理の所要時間

アービトラージで時間的に重要なのは「いかに時間ラグの少ない二つの取引所の板を取得できるか」と「いかに板を取得してから短期間で取引ができるか」です。

ここで、アルゴリズムが使っている時間の内訳をみてみると、通信時間がほぼ100パーセントを占めていることがわかります。内部の計算は1ミリ秒以下で、比較するとぜんぜん時間を使っていません。

並列化は上のソースコードに実装していて有効に働いていますし、それ以前の話として、多少効率は落ちるものの現在の仮想通貨市場は並列化の実装がなくても十分アービトラージでプラスを出すことが可能な状況です。
今の段階ではまだ不必要かもしれませんが、時間の問題をさらに推し進められるとすれば、コードを実行するサーバを取引所のサーバの近くに用意する、ということ程度でしょうか。 レンタルサーバをうまくすれば現実的に可能なような気もします。