仮想通貨の裁定取引bot作って、稼げるかやってみた

# はじめに
興味＆小金稼ぎを狙って、ビットコインの取引所間裁定取引（アービトラージ）システムを開発してみました。
色々な知見が得られて面白かったので、アウトプットとして残そうと思います

なお結構前（２０１７〜２０１８年頃）の内容になるので、色々変わっている点がある可能性がありますが、あしからず

# 裁定取引（アービトラージ）とは
別名サヤ抜きとかと言われています。
金融的な歴史ある取引手法で、一応世界三大利殖法というものに認定されているらしいです。

[世界三大利殖法「アービトラージ」とは？特徴・仕組み・稼ぎ方を解説！ | ABEYUTO（阿部悠人）公式メディア | ABEYUTO（阿部悠人）公式メディア](https://abeyuto.com/invest/abitorage/)

市場に何かしらの歪みが発生した瞬間に、歪みを突いて注文を入れることで確実に利益を上げられる手法です。

歪みというのが、結構色々なパターンがあって
- 先物と現物の価格差
- 通貨間の価格差
- 取引所間の価格差

とかがあります。

今回は取引所間の価格差の歪みを狙った、プログラムを作ってみました。

仮想通貨はまだまだ株とか歴史ある金融商品に比べて、取引所自体に機能が少なく（売りから入れないなど）
実行には取引所のAPIも公開されている必要があるので、現実的に取引所間しかできないという理由もあります

以下、裁定取引のことはアビトラと表記します

# 取引所はどこを使った、具体的な手法は？

- Coincheck
- Zaif
- bitbank
- Liquid by Quoine
- bitFlyer

を利用しました。具体的な手法は下記です。


## パターン１：購入後に送金して売却する

最初に試してみた、安い取引所で買って、送金して高い取引所で売るパターンです。**後述の理由でこのパターンではうまくいかなかったです。**

準備として利用する取引所に、同じ金額の日本円をそれぞれ入金しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235232/5dd04a52-b5cf-bced-89e2-ee3bb77e9ead.png)


プログラムで価格情報を監視して、取引所間の差が生まれた瞬間に安い方で買い注文を入れます

例）

取引所Aで1BTCが1,000,000円
取引所Bで1BTCが1,010,000円（価格差 +10,000円）

取引所Aで0.1BTC購入し、取引所Bに送金して売却する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235232/a97a30c8-0937-684a-efd2-b636708ad171.png)


**これにより一瞬で1000円の儲けが発生します。**

これを続けていけば、全自動で稼げると思っていたのですが、、、

ビットコインの送金が思った以上に遅いということが発覚、、、本とか読んで一瞬で送金されると思っていたが、余裕で３０分とか、ひどいと数時間かかりました。
あくまで瞬間的に発生する歪みの間に取引完了しないと意味がありません。
ここはXRPとか送金スピード早い通貨であれば、もしかしたらここは解決するかもしれないです。


それからも色々試してみたのですが、送金をフローに組み込むと根本的に色々問題があり

#### １．口座間の金額のバランスが崩れるので、定期的にリバランスしないといけない

買った口座から送金していくので、特定の口座には日本円もBTCもないということが発生します。日本円を自動で入金するのは難易度高いので、定期的にBTCを余っている取引所から移す必要があるのですが、そこのロジックが煩雑になってしまいました。

#### ２．送金手数料が結構高くて利益を圧迫する

取引所によっては送金手数料が結構高いんですよね、、、（ビットコインの本読んでいて、仮想通貨は取引コストが安い＆早いのが特徴と思っていたのですが、、、）

もともとアービトラージ自体、細かい利益をコツコツ積み上げていくモデルなので、１回ごとの取引コストが上がるのは結構痛いなと

やろうとすると、送金手数料を含めても利益が出るような条件でのみ取引することになるのですが、それだと取引回数が大幅に減ってしまうという問題がありました。

#### ３．この仕組みで送金APIを使える取引所がそれほど多くない

そもそも送金APIが結構セキュアにできているんですよね（不正送金とかにつながるので当たり前ですが）

最初のいくつかの取引所はガバガバで実装できたのですが、取引所を増やしていくにあたって、
- 送金APIを叩いて成功してから１営業日後に振り込まれる
-  APIのパラメタにGoogle Authの二段階認証の6桁の数字を求められる（どうしろと）

とかが見つかってきて、さすがに厳しかったです。



## パターン2:送金をせずに、リバランスする

送金を組み込むのがどうやっても厳しそうなので、あきらめかけましたが

作っている中で取引所の価格情報を見ていると、**基本は安い取引所、高い取引所が大体固定されているものの、逆転する瞬間が1日に数回あることに気づきました。**

そこで全口座に同額の日本円、BTCを入れておき

- アービトラージとして利益を取りに行く注文
- リバランスをする注文

に分けて利益を取りつつ、損しない範囲でリバランスすれば回っていくのではないかと思いました


１．初期状態

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235232/f985c7cd-1d37-8841-73de-e0ab1002740b.png)



２．価格差発生
取引所Aで1BTCが1,000,000円
取引所Bで1BTCが1,010,000円（価格差 +10,000円）

取引所Aで0.1BTC購入し、取引所Bに送金して売却する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235232/0a189a99-ea16-f75e-0dc2-067da5cf6397.png)


３．リバランス

このままだとAではBTCが購入できず、BではBTCが売却できなく機会損失してしまうため、AとBの価格が逆転した時に反対の注文を行います（取引手数料も考慮する必要あり）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235232/80033b05-fbf4-8561-1b34-8498342dd7e5.png)



とりあえず価格差が発生した瞬間、安いところで買って、高いところで売ればいいというモデルと違い
売買する＝バランスが崩れて、しばらく特定の取引所で売買できない状態になる

ということなので、収益最大化のために

- 〜円差が出たら、利益を取りに行く注文をする
- 〜円差が出たら、リバランスする注文をする

というパラメーターは割とこまめにチューニングする必要があります。

ビットコイン自体のボラティリティが高い時期だったということもあり、割とここらへんはデータ見つつ頻繁にメンテしていました。

あとBTCを一定量保持するので、どうしても価格変動のリスクはつきまといますね。


# 結局儲かったの？
BTCの価格上昇もあり、元本からの比較だと結構増えました。（実際には図よりもっと少額だったので雀の涙ほどですが、、）

ただ意外と運用コストと、機会損失しないためのパラメタのチューニングが大変になってきて、モチベーションが続かず頓挫してしまいました。

あと取引所ごとによくわからん挙動が多いんですよね。（ある取引所は午前４時に、一瞬だけ相場とかけ離れた金額になるとか、、、）

パラメーターの最適化とかは機械学習とか組み合わせていくと面白い領域かなーっと思ってやりたかったのですが、そこまでは至らず。

機会があれば、またやってみたいなと思います。

雑ですが、ソースもアップしておきます。
https://github.com/haruhiko-tano/arbitrage-bot