noteのタイトル画像

[アービトラージ] アービトラージに魅せられて

久しぶりのnote記述になります。

プライベートで色々と忙しかったのと、全然別のプログラムを作っていて、noteにまで時間が回せませんでした。

最近はbotの改良・拡張を続けながらも、テクニカル分析ツールを組み合わせるだけでは思った成果が上がらないことに悩んでいました。

時間だけが過ぎていく中、あれよあれよという間にBTCが40万円を切る展開。
うーん。かなり痛い。(いや、それほど多くのBTCは保有していないので、金銭的な痛手というよりも、精神的なものですね)

そんな中で「アービトラージ」という言葉をちらほらと聞くようになります。

うん、何か面白そうな匂いがする。

試しに「アービトラージ」でnote内を検索すると

などなど、かなりの数に登ります。

今から思うと、てょんやらさんのbotはずいぶん前に自分でnode.jsで書き起こしていたのを思い出しました。

いやはや、物忘れが酷いにもほどがありますね。
当時はそれほどアービトラージ(略して「アビトラ」)に強烈は興味はなかったのだと思います。
当時はテクニカル分析が楽しくて、いろいろ試行していた時期ですし。

一番上に紹介した「はぐ」さんのnoteをみて、higoxさんのアビトラbotを知りました。

多くの方のbotをみていると次の2つに分類されると思いました。

① 2つ取引所の間で同一通貨ペアの取引を行う。

② 1つの取引所内の他の通貨ペアと取引を行う。

です。

てょんやらさんのbotはbitflyerの現物とFXの間で取引を行うので、①と②の折衷案みたいなものでしょうか。

①の場合は、価格差が片方の取引所側に偏った場合、交互に取引を繰り返すのは難しそうです。
ずっと片方から買い続け、もう片方に売り続けていたら、そのうちに資産が枯渇します。取引所間の送金が発生し、その手数料や時間差を考えたら、どれだけ差益が生まれるか疑問です。

②の場合は、一つの取引所内で完結できるだけの多くの通貨ペアを持っている取引所が必要です。
例えば、BTC, BCH, ETHで売り買いするのであれば、最低
 ・BTC/BCH
 ・BCH/ETH
 ・ETH/BTC
の3つの組み合わせは必要です。(3×2÷2=3組み合わせ)
binanceは多くの通貨ペアを用意しているので、お好みの通貨ペアを設定することはそう難しくないと思います。

海外の取引所はかなり多くの通貨ペアを用意しているので、有望そうに見えますが、海外の取引所は売買手数料を取るところがほとんど、売買回数が増えても手数料で削り取られるんだったら、そもそも薄い利益がさらに薄くなってしまいそう。(手数料は0.1%ってところが多かったですね)

とすれば、日本の取引所で手数料無料なところ(期間限定なところもあるので、永久ってわけではないですが)で実践したい。

ただし、2取引所間だけでやってたら、売買機会が1日に何回あるかわかったものじゃない。

とうことは、やるべきことは

① 取引所を2つに限らず、複数(少なくとも3つか、4つ)の取引所を同時にアビトラをする。仮に4つの取引所(A, B, C, Dとしましょう)で相互に取引をすれば、
 ・A - B
 ・A - C
 ・A - D
 ・B - C
 ・B - D
 ・C - D
の取引所間が取引が行えることになります。多数を「たすき掛け」すれば、それだけ取引機会が増える可能性が高まります。

また、②の方法も同時に導入すれば、さらに取引機会は増えるでしょう。(方法としては①の取引が一定時間発生しない状態では、②の取引を模索する)

難点としては、資産管理が結構面倒になることです。下手をすれば一つの取引所に「買い」が集中してしまい、資産が枯渇して「売買できるだけの資産がない」って状況も考えられます。

ざっと①の部分だけ作って見ました。

■■■ time:[2018-12-09 01:43:35] event.emit(EV_TICKERS) ■■■ ticker read time: 153 [msec]
time:[2018-12-09 01:43:35], id:[liquid_coincheck], 差額: [liquid.bid-coincheck.ask]: -1258.35, [coincheck.bid-liquid.ask]: 810.41
time:[2018-12-09 01:43:35], id:[liquid_bitbank], 差額: [liquid.bid-bitbank.ask]: -1651.35, [bitbank.bid-liquid.ask]: 318.41
time:[2018-12-09 01:43:35], id:[liquid_qryptos], 差額: [liquid.bid-qryptos.ask]: -97.94, [qryptos.bid-liquid.ask]: -97.94
time:[2018-12-09 01:43:35], id:[liquid_btcbox], 差額: [liquid.bid-btcbox.ask]: -1927.35, [btcbox.bid-liquid.ask]: 940.41
time:[2018-12-09 01:43:35], id:[coincheck_bitbank], 差額: [coincheck.bid-bitbank.ask]: -743, [bitbank.bid-coincheck.ask]: -842
time:[2018-12-09 01:43:35], id:[coincheck_qryptos], 差額: [coincheck.bid-qryptos.ask]: 810.41, [qryptos.bid-coincheck.ask]: -1258.35
time:[2018-12-09 01:43:35], id:[coincheck_btcbox], 差額: [coincheck.bid-btcbox.ask]: -1019, [btcbox.bid-coincheck.ask]: -220
time:[2018-12-09 01:43:35], id:[bitbank_qryptos], 差額: [bitbank.bid-qryptos.ask]: 318.41, [qryptos.bid-bitbank.ask]: -1651.35
time:[2018-12-09 01:43:35], id:[bitbank_btcbox], 差額: [bitbank.bid-btcbox.ask]: -1511, [btcbox.bid-bitbank.ask]: -613
time:[2018-12-09 01:43:35], id:[qryptos_btcbox], 差額: [qryptos.bid-btcbox.ask]: -1927.35, [btcbox.bid-qryptos.ask]: 940.41

■■■ time:[2018-12-09 01:43:40] event.emit(EV_TICKERS) ■■■ ticker read time: 149 [msec]
time:[2018-12-09 01:43:40], id:[liquid_coincheck], 差額: [liquid.bid-coincheck.ask]: -1288.49, [coincheck.bid-liquid.ask]: 834.95
time:[2018-12-09 01:43:40], id:[liquid_bitbank], 差額: [liquid.bid-bitbank.ask]: -1226.49, [bitbank.bid-liquid.ask]: 399.95
time:[2018-12-09 01:43:40], id:[liquid_qryptos], 差額: [liquid.bid-qryptos.ask]: -71.54, [qryptos.bid-liquid.ask]: -71.54
time:[2018-12-09 01:43:40], id:[liquid_btcbox], 差額: [liquid.bid-btcbox.ask]: -1658.49, [btcbox.bid-liquid.ask]: 1006.95
time:[2018-12-09 01:43:40], id:[coincheck_bitbank], 差額: [coincheck.bid-bitbank.ask]: -320, [bitbank.bid-coincheck.ask]: -817
time:[2018-12-09 01:43:40], id:[coincheck_qryptos], 差額: [coincheck.bid-qryptos.ask]: 834.95, [qryptos.bid-coincheck.ask]: -1288.49
time:[2018-12-09 01:43:40], id:[coincheck_btcbox], 差額: [coincheck.bid-btcbox.ask]: -752, [btcbox.bid-coincheck.ask]: -210
time:[2018-12-09 01:43:40], id:[bitbank_qryptos], 差額: [bitbank.bid-qryptos.ask]: 399.95, [qryptos.bid-bitbank.ask]: -1226.49
time:[2018-12-09 01:43:40], id:[bitbank_btcbox], 差額: [bitbank.bid-btcbox.ask]: -1187, [btcbox.bid-bitbank.ask]: -148
time:[2018-12-09 01:43:40], id:[qryptos_btcbox], 差額: [qryptos.bid-btcbox.ask]: -1658.49, [btcbox.bid-qryptos.ask]: 1006.95

上記は5つの取引所(liquid, coincheck, bitbank, qryptos, btcbox) の取引所を組み合わせ(5×4÷2 = 10組み合わせ)て、
 取引所1.bid - 取引所2.ask
の値を表示しているところです。(周期は5秒、対象通貨ペアはBTC/JPY)
取引所のオブジェクトはみなさまご存知のccxtを使用しました。
複数の取引所を統一的なAPIでアクセスできるので、非常に便利です。

定義ファイルをJSONにしたので、取引所IDと通貨ペアさえ設定すれば、いつでも取引所を変更可能です。(もちろん、そこに資産がないと取引できませんが)

上記はapiKey,secret等を一切設定しないで単にぐるぐる回しているだけですが、骨格はできてきました。

これがうまくいったら、②の機能追加を行なっていきたいと思っています。

現在、成り行き注文にしか対応していないのですが、指値化することも簡単です。(指値が刺さらなかった場合の処理は追加になりますが)

まだ完成もしていないのに、もうこのbotに名前をつけました。
多数の取引所オブジェクトを起動(launch)していることから

多数・起動(ランチャー) → タ・ランチャー → タランチュラ

で、「タランチュラ」です(笑)

誰かが描いた漫画からのパクリ(?)的な命名ではありますが。

また報告したいと思います。

ソフトウェア・エンジニアを40年以上やってます。 「Botを作りたいけど敷居が高い」と思われている方にも「わかる」「できる」を感じてもらえるように頑張ります。 よろしくお願い致します。