アルゴリざむらい

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

pythonで仮想通貨の取引所間アービトラージ

概要

 この記事は、仮想通貨の取引所間価格差から利益を出そう、という内容のものです。下にpythonのコードを公開しています。現在、アービトラージで、日利およそ0.2%程度の利益をあげることに成功しています。

 一時は1BTC = 2000000JPYまで高騰した仮想通貨市場ですが、Coincheckの騒動もあり、各国の金融規制の影響もあり、ここ最近は1000000JPY付近をふらふらと変動していて先が見えない状況です。 価格の上昇を見込んで、いくつかの通貨を売らずにホールドしている方も多いかと思います。

 仮想通貨市場はまだ十分に大きくないこと、取引手数料が株式に対して安いこと、プロの手によるアルゴリズム取引がそこまで入り込んでいないことなどから、現在、アマチュアでも取引所間の価格差から利益を生み出すことが十分可能な状況になっています。

 使用しているアルゴリズムの動作とコードを公開するので、ぜひ使ってみてください。(改良案や質問があればコメントしてくださると助かります。) github.com

ソースコードは随時改善・更新しているので、たまにチェックすることをおすすめします。

アービトラージの仕組み

 取引所間に価格差があるとき、安い取引所で買い、高い取引所で売ることで利益が発生します。ただし、いちいち安いところで買って高いところに送金して売っていては、送金手数料のコストと送金途中の価格差が閉じるリスクが大きすぎて現実的ではありません。

 そこで、取引所A・取引所Bでそれぞれ2種類の通貨を保持しておき、価格が乖離したところで「取引所Aで購入」「取引所Bで売却」を同時に行い、価格が収束した時点で「取引所Aで売却」「取引所Bで購入」という逆の注文を行ってはじめの状態にもどす操作を繰り返すことで、低リスクで安定した利益を生み出します。

 今回のアルゴリズムは、取引所Aが取引所Bよりも0.3%高くなればAで売ってBで買い、取引所Bが取引所Aよりも0.3%高くなればBで売ってAで買う、というような挙動を繰り返し行います。

取引所の選定

 XRP/BTCのような、同じ通貨ペアの取引所ごとの価格をCoinMarketCapで見てみましょう。 coinmarketcap.com

 取引所ごとに結構な価格差があるのがわかると思います。

 中には平均に比べて数%以上価格が乖離している取引所がありますが、この多くは注文数と量が少ない(板が薄い)取引所で、この価格でそのまま約定するのは困難です。現実的には、ある程度以上取引量が大きな取引所を選ぶ必要があります。

 大きな取引所同士ではそこまで大きな乖離は発生せず、差は出てせいぜい0.5%といったところです。この小さな乖離から利益を生むためには、手数料が安い取引所を用いることが重要になります。安定した約定のために今回は成行注文を使うので、 "taker fee" が安い取引所を選びます。

  • シェアが大きい(板が厚い)こと

  • 取引手数料(taker fee)が安いこと

の条件から、今回の実装ではデフォルトの設定で次の取引所を指定しています。

Bit-Z
https://u.bit-z.com/register?invite_code=1485453&lang=en
香港、北京、シンガポールなど中華系の資本で運営されている。2016年設立。
取引手数料0.1%。
サーバーのレスポンスはまあまあ早い。ccxtでのコードはbitz

Binance
https://www.binance.com/?ref=17182835

こちらも中国発。(国外向けのため、中国の金融政策の影響は受けにくいとのこと)
取引手数料0.1%(BNBトークンでの支払いにすると0.05%。世界最安水準)
取り扱い通貨の数も多く、サーバーのレスポンスも世界最速級。ccxtでのコードはbinance

ほか、HitBTCも規模がBit-Zと同程度に大きめでおすすめです。
2018/06/04追記: 2018年6月なかばごろから、金融庁の施策の関係で日本からのHitBTCの使用が一時的に(公式ブログによると、おそらく秋ごろまで)できなくなるようです。HitBTCを使っている人は他の取引所への移行をおすすめします。
HitBTC
https://hitbtc.com/?ref_id=5a74c2369b641
イギリスの取引所。
BTC, USDTに対しての ETH, BCH, XMR, DASH, XRP, EOS, LSK, TRXなど多くのメジャーな通貨ペアを持っている。 取引手数料0.1%。ccxtでのコードはhitbtc2
(入金後、Main Account から Trade Account に資金を移動させないと取引ができないので注意)

他の取引所の候補

 一応、ccxt(仮想通貨取引所を横断的に扱えるライブラリ)を用いて開発しているので、大抵の大きな取引所には対応できます(注意点もあるのでGitHubのマニュアル参照)。
 (上であげた三つの取引所については私の環境で正常に稼働することを確認しています)

 手数料が安い他の取引所については次の記事を参考にしてください。
algorisamurai.hateblo.jp
 まずはこれらの取引所でアカウントを作りましょう。(このプロジェクトは取引所からのアフィリエイト収入で動いているので、上のリンク経由でアカウントを作っていただけると助かります。

通貨の選定

 アービトラージのためには2つの取引所に同じ通貨ペア(BTC/LSKなど)が存在する必要があります。CoinMarketCapなどを見て、両取引所である程度の量取引されている通貨ペアを選びましょう。

ボリュームがある程度多くて有望なのは、(Binance/Bit-Zの場合だと)

BTC - ETH, ETC, BCH, LTC, LSK, EOS, DASH, TRX, ZEC, QTUM, NULS, MCO

あたりでしょうか。

私が使っているBTC/DASHのペアだと、デフォルトの設定でだいたい一日に20〜回程度の取引が行われています。
(競合しても何もいいことはないので、自分でペアを選ぶことをおすすめします)

実行環境

コードはPython3で動くようにしています。 外部ライブラリとしてpandas, numpy, requests, docopt, ccxtを用いているので、 Python3の環境を構築後、パッケージ管理ソフトのpipをインストールして

pip install pandas numpy requests docopt ccxt

のコマンドを使うなどしてこれらのライブラリを導入してください。

参考ページ:

qiita.com qiita.com

環境ができた場合の操作

たとえば基軸通貨としてBTC、そのペアとしてLSKを使う場合、

①各取引所へBTCとLSKを入金

 どちらの取引所にもBTCとLSKを同額程度になるよう四つに分けて入れるか、BinanceにはBTCのみ、Bit-ZにはLSKのみ、というように偏った状態にしてください。送金には送金手数料の安い通貨を用い、着金後に取引所で目的の通貨に両替することをおすすめします。

②config.iniの入力

config.iniをテキストエディタで開いて、必要事項を入力します。

  • どの通貨ペアを使うかを入力

[settings]
BASE = BTC
ALT = LSK

のように、右辺に基軸となる通貨とアルトコインの名前を入力します。上の例の場合、基軸通貨としてBTC、ペアにする通貨としてLSKを指定しています。

[settings]の他のthreshold0, threshold1は、どの程度の乖離があったときに売買を行うかの閾値の設定になっています。基本的にはそのままでも大丈夫です。
thresholdは大きくすると裁定機会が減るかわりに一度の取引での利益が増え、小さくすると裁定機会は増えるかわりに一度の取引での利益は小さくなります。
Binanceでは0.05%、Bit-ZやHitBTCでは手数料を0.1%とるため、最低でもthresholdは1.0015(0.05 + 0.10 = 0.15%に対応)以上、現実的には1.0025より大きい値にしておかないと、手数料負けして損をするので気をつけてください。
デフォルトでは現在1.003を指定しています。このあたりの値だと安定したパフォーマンスが見込めるかと思います。



  • 各取引所のAPIキーとAPIのSECRETキーを入力

f:id:algorisamurai:20180308174545p:plain
Binanceでは、APIキーとSECRETキーは「トップページ」→「上の人型マーク」→「API Setting」→適当な名前をつけて「Create New Key」で作成します。注文を行うため「Read Info」と「Enable trading」にチェックを入れておいてください。

f:id:algorisamurai:20180426170631p:plain
Bit-Zでは、APIキーとSECRETキーは「トップページ」→「上のAccount」→「My Api」→「(適当な名前を入力して)Create New Api Key」で作成します。

 こうして作ったAPIキーと秘密鍵の長い文字列をコピーして、設定ファイルのそれぞれの該当箇所にペーストします。

[EXCHANGE1]
NAME = binance
APIKEY = foobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobar
SECRET = abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

[EXCHANGE2]
NAME = bitz
APIKEY = foobarfoobarfoobarfoobarfoo
SECRET = abcdefghijklmnopqrstuvwxyz
PASS = password

ここで、Bit-Zでは取引の際に取引パスワード(Trade Password)が必要なので、アカウントを作成するときに決めた取引パスワードをPASS = 取引パスワード の形で追記するようにしてください。

あとはコードとiniファイルがあるディレクトリに移動して

python arb.py

と実行すれば、自動的にお金が増えはじめます。 様子はコンソールにこんな感じで出力されます。

Mar 30 00:20:58 [0.103475, 1.4030] ch:0.000 BNB:1.1487
Mar 30 00:28:38 [0.103477, 1.4030] ch:-0.0210 BNB:1.1484
Mar 30 00:28:43 [0.103477, 1.4030] ch:-0.0040 BNB:1.1483
Mar 30 00:28:47 [0.103477, 1.4030] ch:-0.0010 BNB:1.1483
Mar 30 03:45:34 [0.103490, 1.4050] ch:1.3320 BNB:1.1275
Mar 30 03:46:47 [0.103529, 1.4060] ch:-1.0670 BNB:1.1108

表示しているものは、左から、取引が行われた日時、[ ]内が[基軸通貨の残高, ペアにした通貨の残高]のそれぞれの2つの取引所の合計となっており、この例では3時間くらいで0.1〜0.2%程度残高が増えているのがわかります。

右のch:とBNB:はそれぞれ、取引した量(ペアにした通貨単位)、Binanceの取引に用いるトークンの残高(1以下になると1BNBを購入する)を表しています。取引した量の正負は取引の向き(取引所1で買って取引所2で売ったか、取引所2で買って取引所1で買ったか)に対応しています。

おわりに

私の仮想通貨ウォレットです。儲かったら投げ銭していただけると光栄です。

Rippleアドレス:
rNvTpTCNZvaFFoBEj2Ba3PA28Pz22Mzzrv

BTCアドレス:
1P1Y1JTkPWhExsxJbgibEvRsBPj5RN8hqk

質問があればなんでもコメントしてください。