日本円と仮想通貨を用いた自動三角裁定システムを試した

2017/8～11あたりまで試した内容．

あまり効果が見られなかったので，ソース含めて公開することにした．
※ソースコードは，ずっと下にある表内のリンクからGitHubへ飛ぶ

#やったこと
* 通貨の自動取引システム作成
* 取引するのは日本円と仮想通貨
* 取引手段は三角裁定

#三角裁定の概要
[三角裁定(Triangular Arbitrage)](https://en.wikipedia.org/wiki/Triangular_arbitrage)とは，FX(外国為替)で使われていた[裁定取引](https://ja.wikipedia.org/wiki/%E8%A3%81%E5%AE%9A%E5%8F%96%E5%BC%95)手法．

3通貨間の価格バランスが崩れた瞬間に，ぐるっと一周するように取引すると，<b>それぞれの通貨は価格が変わっていないのに</b>儲かる，という仕組み．

例えば日本円，米ドル，ユーロの3通貨について手数料抜きで考えると下図のようになる．
3通貨間のバランスが取れている限り，一周の取引をしても利益は無い．

![三角裁定_相場が均衡する場合.png](https://qiita-image-store.s3.amazonaws.com/0/201962/c91abf41-c679-11ec-dee9-0f654a67440a.png)

ところが日本円・ユーロ間の価格だけがズレた瞬間に，下図のように日本円→ユーロ→ドル→日本円のように一周の取引をすると，何もしてないのに利益が出る．つまり本来の「安い時に買って待ち，高い時に売る」という以外の要因で儲かる．

※下図の例で逆順の取引をすると利益はマイナス(損)となる．

![三角裁定_相場が崩れた場合.png](https://qiita-image-store.s3.amazonaws.com/0/201962/7d965b80-f404-6813-8da3-5075291d2bdf.png)

最近はシステムによる自動取引が主流となったため，FXにおいて手動で三角裁定を行おうとしても利益は見込めないとされている（価格バランスがズレた瞬間，人間より遥かに早くシステムが検知・取引されてしまう）．

しかし最近出てきたばかりの仮想通貨においてはシステム取引が主流ではないため，どんな挙動をするか気になった．

#仮想通貨を用いた自動取引の先行文献
仮想通貨の自動取引は，既に多くの試みがある（下表を参照）．
表のうち"<b>Auto Triangular Arbitrage</b>"と"<b>Auto Triangular Arbitrage 2</b>"が，本手法のために開発したシステム(以降"AutoTA")．本稿で主に紹介するのはAutoTA2のほう．

|名称|特徴|時期|
|:--|:--|:--|
|[Expert Advisor](https://qiita.com/Salinger/items/a70e85e0765552459c60)|Meta Trader 4 & ブレイクアウト手法(BTC/JPY？)|2016年5月|
|[macd.py](https://qiita.com/soar/items/c26c31eaf2f8ffd0b355)|MACDで判定<br>（テクニカル分析指標)|2017年5月|
|[rsi.py](https://qiita.com/soar/items/91c917a6809402045200)|RSIで判定<br>（テクニカル分析指標）|2017年5月|
|[adx.py](https://qiita.com/soar/items/91c917a6809402045200)|ADXで判定<br>（テクニカル分析指標）|2017年5月|
|[ビットコインアービトラージシステム](http://fxantenna.com/post-1915/)|業者間裁定(BTC/JPY)<br>現在は法人向けのみ？|2017年7月|
|Auto Triangular Argitrage|業者内三角裁定2パターン<br>JPY->BTC->MONA/JPY->MONA->BTC|2017年8月|
|[R2 Bitcoin Arbitrager](https://qiita.com/bitrinjani/items/3ed756da9baf7d171306)|業者間裁定(BTC/JPY？)|2017年9月|
|[Auto Triangular Arbitrage 2](https://github.com/sh141/AutoTA-TriangularArbitrage)|業者内三角裁定8パターン|2017年11月|

調べた限りでは，先行文献は概ね次の2種類に分けられる．

1. BTC/JPYのみ，同じ取引所で自動取引
2. BTC/JPYのみ，複数の取引所間で自動取引

裁定取引が行われているのは2で，どうやら安いほうの取引所で買って高いほうの取引所で売る，のようなことをするらしい．手数料がネックになるようだ．

これらに対して，本手法は【JPY+BTC+任意の仮想通貨】による三角裁定を同じ取引所で行う．裁定方法が3通貨間である点と，同じ取引所内で裁定取引を行う点が従来と異なる．

何番煎じかと思ったら，意外と新規性があったようだ．

#本手法の概要
概要といっても，同じ取引所内でひたすら三角裁定をするだけ．

取引所は[Zaif Exchange](https://zaif.jp/)を利用した．

同じ取引所内で複数パターンの三角裁定取引が行えそうなのはzaifだけだった．また，当時のzaifは取引手数料が0のペアもあり，特にMONAの手数料にはマイナス(取引すると逆にお金が貰える)まであった．

自動取引に利用可能な通貨はJPY,BTC,MONA,BCH,XEM,ETHの6種類．
それらを下図のように取引する．
![円と仮想通貨による三角裁定モデル.png](https://qiita-image-store.s3.amazonaws.com/0/201962/ac395bf2-062c-3685-b248-609f214da583.png)


zaifの機能上，三角裁定できるのは以下8パターンとなる．
※~~BTC,MONA以外の仮想通貨はBTCとの取引ペアしかない~~
※BTC以外の仮想通貨はJPYまたはBTCとの取引ペアしかない

* JPY -> BTC -> MONA -> JPY
* JPY -> BTC -> BCH -> JPY
* JPY -> BTC -> XEM -> JPY
* JPY -> BTC -> ETH -> JPY
* JPY -> MONA -> BTC -> JPY
* JPY -> MONA -> BCH -> JPY
* JPY -> MONA -> XEM -> JPY
* JPY -> MONA -> ETH -> JPY


開発したAutoTA2は各通貨ペアの相場を監視し，下図のように，8パターンのうち最も利益が高くなるような取引順を選んで自動取引を行う．
![自動取引の流れ.png](https://qiita-image-store.s3.amazonaws.com/0/201962/ad585cdf-78f1-84d7-e2de-1d996c2e7be0.png)


1度の投資額は10,000円とした．学生は金が無いので．

1つ致命的な欠陥があり，<b>開発したシステムでは同時取引できない</b>．3通貨間の価格がズレている間に全ての取引を完了する必要があるが，システムでは1ペアずつ順番に取引していくため，素早く約定してくれないと悲惨なことになりそう．

取引結果の統計はおまけなので，あまり当てにはしなかった．
PC上で完結させたかったので，データベースはSQLiteを使用．

#取引結果
先ほどの表にもあったが，まず先行して開発した初期版のAutoTAがこちら．

![autota.png](https://qiita-image-store.s3.amazonaws.com/0/201962/60cf04c3-756b-9a1a-bc78-1c14b8ef2ff5.png)

初期版はJPY->BTC->MONA->JPY か JPY->MONA->BTC->JPYの2パターンのみで自動取引を行う．
これを予備実験的に回してみて，<b>なんだかよくわからないが効果がありそう</b>だと判断して，今回の8パターン版であるAutoTA2を作った．実行画面がこちら．

![AutoTA2_実行画面02.png](https://qiita-image-store.s3.amazonaws.com/0/201962/bc644215-4635-9ab1-78f7-4f52756926b2.png)

画面に映っている分には，30回ほど取引して平均30円ほどの利益が出ている．

つまり，これを走らせて寝ているだけで合計9,000～10,000程度は儲かりそう，という結果だった．

しかし修正しつつ試行錯誤した最終結果は-20,000円ほどだった．原因は次節の問題点にある．

#主な問題点
* <b>取引途中にエラーを起こすと台無し</b>

zaif APIに渡す値が間違っているなど，途中でエラーを起こすと三角裁定自体がパーになる．

初期版では504エラー(zaifが悪い)が起きた瞬間にこちらのシステムまで例外を吐いて落ちていたため，<b>僕が寝ている間に稼いで欲しいのにシステムも一緒に寝る</b>という有様だった．

AutoTA2では[例外耐性](https://qiita.com/sh141/items/bc38c5aae380effc22dd)を付けて無理やり落ちないようにしていたが，上述の通りAPIに渡す値を間違えたりすると際限なくエラーを吐き続け，システムも誤った値を際限なくAPIへ送り続けるので，取引が事実上停止する．

最新版ではほとんど見られなくなったが，修正完了まではデータ収集どころではなかった．

---
* <b>取引が途中で停滞する</b>

これはシステムの欠陥である「順番にしか取引しない」部分にも関係している．取引が全約定しないと次の取引へ進まないので，例えばJPY->BTC->MONA->JPYのうちBTC->MONAで詰まると延々待たされる．

ではなぜ詰まるかというと，原因は<b>相場の板の薄さ</b>にあった．
1取引所における仮想通貨市場はFXと比べると小規模で(だからこそ三角裁定の余地があったのだが)，注文が通らないことも度々ある．

例えば「MONAを1,000JPYで10買いたい」と考えて10,000JPYを出して買い注文を入れたとする．しかしMONAが1,000JPYで10以上売り板に出ていなければ全約定しない．

仮想通貨市場は板の薄い通貨ペアが結構あるため，<b>7まで買えたが残りの3は放置したまま無情にも値上がりしてゆく…</b>ということもザラにあった．永遠に買えないので取引は<b>事実上停止</b>する．

苦肉の策として注文に制限時間をつけ，その時間が経過しても注文が残っているようなら注文を取り消して再注文するように修正した．

しかしここでも問題が起こり，上述のように10のうち7約定して3残った状態で制限時間を過ぎると，3の分の約定を取り消して<b>再び10の注文をする</b>事態に．注文合計は13となり，これもうわかんねえな．

---
以上のような問題点に見舞われ，最初の結果は芳しかったものの(取引時間に対して割に合わなかったかもしれないが)，徐々にマイナス面を原因とする損失が見え始め，最終的には-20,000円ほどの結果となった．

このままのシステムでは効果が見られないと判断し，本稿のようにソースを含めて試行報告することに決めた．

#まとめ
* 日本円と仮想通貨を用いた自動三角裁定システムを作った
* 先駆者と比べると，三角裁定である＆同じ取引所内で行うという新規性があった
* やってみた所，最初は少し儲かったが最後は大損した