ビットコインのアービトラージを(半)自動で行うアプリを作った

アービトラージで一儲けしようぜ!!」

という夫の誘い文句に乗って、半年前くらいに半自動取引アプリを作りました。

cronで5分毎に市場の状況を確認して、アービトラージの取引チャンスがあったらSlackで通知を飛ばし、取引OKと返答すると注文を入れてくれます。 (Slackのログのスクショがあればもう少し分かりやすかったのですが、無料プランで使っているため古すぎて参照できませんでした。。。)

この記事ではこのアプリの取引の仕組みについて書きます。

雑な実装でつくったわりには、チリツモですが利益を出すことができました。

ただし、ビットコイン自体の価格変動により発生する損得のほうが圧倒的に大きいです😇
下記のようなリスクを許容できる方のみお試しください。

アービトラージとは?

裁定取引/アービトラージ│初めてでもわかりやすい用語集│SMBC日興証券を見ると

裁定取引アービトラージ)とは、同一の価値を持つ商品の一時的な価格差(歪み)が生じた際に、割高なほうを売り、割安なほうを買い、その後、両者の価格差が縮小した時点でそれぞれの反対売買を行うことで利益を獲得しようとする取引のこと。

と書いてあります。

なるほどわかりません。

簡単な例で見てみましょう。
古本屋がA店・B店と2つあったとします。 ある本がA店では100円で売られており、B店では200円で買い取られている場合、その本をAで100円で買って、Bで200円で売れば100円儲けることができます。
これがアービトラージてす。

これと同様のことをビットコインで行います。

アプリの実装

実装はシンプルで

  • 現在の市場から取引すべきか判定を行う
  • 取引すべきと判断した場合は各取引所に注文を入れる

の2ステップです。

現在の市場から取引すべきか判定を行う

一定額以上の利益が出ると判断した場合に、取引すべきと判断します。
式で表すと下記の通りです。

(X)[アービトラージによる利益] - (Y)[取引手数料] > (Z)[閾値]

(Z)閾値
自分で適当に設定します。
今回は後述の (X) アービトラージによる利益 の計算方法がかなり雑なので余裕を持って大きめの値に設定しておきます。

(Y) 取引手数料
Aでビットコインを買うための手数料、Bでビッドコインを売るための手数料の2つかかります。 手数料は取引所によって異なりますが、取引量に応じて手数料も増えていくように設定されているところがほとんどです。

例: 手数料一覧・税 - ビットコイン(Bitcoin)の購入/販売所/取引所 【bitFlyer】

(X) アービトラージの取引による利益
大雑把に最良askと最良bidで計算します。 *1
最良askは他の人が出している買い注文の中で最も高い値段(=自分から見たら最高の売値)、最良bidは他の人が出している売り注文の中で最も安い値段(=自分から見たら最安の買値)です。

取引所がA・B2つあったとして、Aでビットコインを買い、Bでビットコインを売るとします。 仮にAで最良bidで1BTCを買い、Bで最良askで1BTCを売ることができた場合の利益は

[取引所Bの最良ask] - [取引所Aの最良bid]

となります。

しかし、実際取引できるのは自分の口座にある分だけなので、

([取引所Bの最良ask] - [取引所Aの最良bid]) * min([取引所Bにあるビットコイン], [取引所Aにある日本円] / [取引所Aの最良bid])

となります。

取引すべきと判断した場合は各取引所に注文を入れる

取引すべきか否かは最良bid、最良askを見て判断しましたが、実際この価格で注文を入れると取引の成功率がかなり低いです。
「安い値段で買いたい!」「高い値段で売りたい!」のは他の人も同じななので、すでに注文が成立してるケースが多々あります。

ということで、余裕を持たせて最良bidよりちょっと高い値段で買い注文を、最良askよりちょっと低い値段で売り注文を出し、ちょっとでも成果効率が上がるように小手先の調整をします。

ただ、どんなに調整したとしても注文が成立しないときはもちろんあるので、
その時は手動で注文キャンセルするか*2、しばらく待てば成立するだろうと高をくくって待つか、なにかしら対処しましょう。

今後の課題

実際に取引を行うトリガーや取引が成立しなかった場合の処理を人手でやっているので、まだまだ改善の余地がありそうです。時間があれば直したいです。

ただ、昨年8月ごろに稼働させていたときは bitFlyer と conicheck を使っていたのですが、conicheckどうなるんでしょうね。。。。。。
当時見た限りでは他の取引所だと取引数がかなり少なかったので、取引チャンスの判定や注文方法を改善してから出ないと厳しそうです。

*1:より正確に利益を予想するため、また、取引の成功率をあげるためには、板情報(どの価格にどれくらいの注文がはいっているのか)を見た方がいいですが、今回はかなり雑です。

*2:これも本当はbotでやれるといいですね。