アルゴリざむらい

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

損が出にくい設定について

注文が滑って損が出る

市場が大きいと取引所間の鞘も小さくなりがちですが、市場が小さい場合は、おそらく競合者の存在によって価格が大きく動き、損が出る場合があります。

現在、成行注文がAPIでできない取引所では、実質成行注文になる「絶対買える、売れるレンジの価格設定の指値注文」を行っています。普段は板の真上での約定に成功するものの、注文が滑ると、成行注文化するために設定した不利な価格で取引されてしまいます。
また、成行注文ができる取引所でも同様のことは発生し得ます。

対策① 競合を避ける

競合者がいなければこういうことは起こりにくいので、ちょっとマイナーな通貨ペアを選ぶのは戦略のひとつです。ただし、取引量が少なすぎると板が動かないので注意が必要です。

対策② 最大取引量を設定する

片方の取引所のみに大きな注文が入って大きな鞘が発生するとき、この鞘は速やかに解消されます。このチャンスにうまく約定できる場合は利益をあげられますが、注文が滑るリスクはかなり大きいです。

そこで、取引に最大量を設定する(現行のアルゴリズムでは鞘に対して「できるだけ利益をあげるため、残高めいっぱいまで注文をいれる」挙動をします)ことで、こうした板の大きな変動時のリスクを軽減し、パフォーマンスを安定させることができます。

具体的にはたとえば

trade_val = np.round(min(val_up*0.8, tradable_value), ex.amount_prec)

となっているところを

trade_val = np.round(min(val_up*0.8, tradable_value, 0.1), ex.amount_prec)

と「0.1」を書き加えることで、一度の取引で0.1(なんらかのアルトコイン)以上の取引をしなくなる、というわけです。

BinanceのAPIキー更新

一週間ほど前にBinanceがセキュリティ上の理由でAPIキーを更新したようです。 これが理由でアルゴリズムが動かなくなった人がいるかと思います。 古いものは使用不可になっていて、新しくつくる必要があるので注意してください。

Bit-ZもAPIまわりを更新したようですが、引き続き現行の認証のままで取引が可能なことを確認しています。

アービトラージアルゴリズムの解説2(板から裁定取引が可能な量を計算)

概要

取引所間の裁定取引を行うために、アービトラージアルゴリズムでは二つの取引所の「買い板」と「売り板」を監視し、「取引所1でのask(買うときの値段)が取引所2でのbid(売るときの値段)より安い」あるいは「取引所2でのaskが取引所1でのbidより安い」状況を発見次第、安い方で買って高いほうで売ることで利益を確定します。

ここで、板に乗っている情報というのは「取引できる価格」と「その価格で取引できる量」、の二つということになります。 今回は板から裁定取引ができる量を計算する部分について概説します。

板を具体的に見てみよう

取引所のAPIを叩いて板を取得すると、次のような値が得られます。(DASH/BTCの例)

取引所①
{"ask":[
[ 0.0534 0.134 ]
[ 0.0535 0.151 ]
[ 0.053562 0.3 ]
[ 0.053563 0.501 ]
[ 0.053564 0.449 ]],
"bid":
[[ 0.053397 0.028 ]
[ 0.053396 9.348 ]
[ 0.053366 0.63 ]
[ 0.053365 0.394 ]
[ 0.053364 0.075 ]]}

これは、askのほうでは「DASH を 0.0534 BTC/DASHで売ります」が 0.134 DASH、「DASH を 0.0535 BTC/DASHで売ります」が 0.151 DASH……という注文が並んでおり、bidのほうでは「DASH を 0.053397 BTC/DASH で買います」が 0.028 DASH、「DASH を 0.053396 BTC/DASH で買います」が 9.348 DASH……という注文が並んでいる、ということになります。別の取引所の板も見てみましょう。

取引所②
{"ask":[
[ 0.053609 0.046 ]
[ 0.053770 0.033 ]
[ 0.053772 0.179 ]
[ 0.053777 0.061 ]
[ 0.053802 0.001 ]],
"bid":
[[ 0.053607 0.076 ]
[ 0.053606 0.101 ]
[ 0.053595 1.083 ]
[ 0.053582 0.139 ]
[ 0.053551 0.14 ]]}

取引所②では、ask、bidともにさきほどの取引所より高い値がついています。 ここで、取引所①のbest ask、「DASH を 0.0534 BTC/DASHで売ります」でDASHを買って、取引所②のbest bid「DASH を 0.053609 BTC/DASHで買います」に売ることで、0.053609/0.0534 = 1.004、つまり0.4%の利益が出る、というわけです。

それでは、どれだけの量を取引所①で買って取引所②で売るのがよいのでしょうか?

best ask / best bid のみでの取引をすることを考えると、答えは 0.076 DASH ということになります。取引所①の best ask では 0.134 DASH を購入することができますが、この買いのうち取引所②の best bid で売って相殺できるのが 0.076 DASH しかないためです。

このように単純なアービトラージの機会検出モデルでは、取引できる量が best ask / best bid の小さいほうで決定されてしまうわけですが、もちろんこれはあまりいい解釈ではありません。取引所②のbest bidの次のbidの価格はbest bidに近いため、実質的には2番目のbidのことも考えると、いい bid の価格で捌けるのは0.076 + 0.101 = 0.176 で、best askの全量 0.134 をすべて捌けそうだからです。 もちろん ask のほうでも同様なことが言えるので、ここで「どこまでの量がお得な利益率で捌けるか」ということを考える必要があります。(公開したコードでこれはtool.pyのrate_cで実装しています)

実際のところ、best ask/ best bid 付近には、自動取引によるごく小額の量が乗り続けるということもよくあるため、一番上だけを監視していると実際には利益を出せる状況を取り逃がしてしまうことがありそうです。

取引可能な量の計算法

具体的な計算としては、まずは取引所①のask

取引所①のask
[ 0.0534 0.134 ]
[ 0.0535 0.151 ]
[ 0.053562 0.3 ]
[ 0.053563 0.501 ]
[ 0.053564 0.449 ]

の取引できる量について、その価格までの総和をとってみることにします。

取引所①のask その価格までの量の和をとったもの
[ 0.0534 0.134 ]
[ 0.0535 0.285 ]
[ 0.053562 0.585 ]
[ 0.053563 1.086 ]
[ 0.053564 1.575 ]

これで、たとえば最終行をみれば「少なくとも 1.575 DASHぶんは 0.053564 DASH/BTC より安く買える」ということがわかります。
取引所②のbidについても同様にします。

取引所②のbid その価格までの量の和をとったもの
[ 0.053607 0.076 ]
[ 0.053606 0.177 ]
[ 0.053595 1.260 ]
[ 0.053582 1.399 ]
[ 0.053551 1.539 ]

こうして作った列を、量の順にソートしてみましょう。

[ 0.053607 0.076 ] bid
[ 0.0534 0.134 ] ask
[ 0.053606 0.177 ] bid
[ 0.0535 0.285 ] ask
[ 0.053562 0.585 ] ask
[ 0.053563 1.086 ] ask
[ 0.053595 1.260 ] bid
[ 0.053582 1.399 ] bid
[ 0.053551 1.539 ] bid
[ 0.053564 1.575 ] ask

これによって、上2行をみると「少なくとも 0.076 DASH は 0.0534 で買って 0.053607 で売れる」こと、上三行から「少なくとも 0.0134 DASH は 0.0534 で買って 0.053606 で売れる」、上四行から「少なくとも 0.177 DASH は 0.0535 で買って 0.053606 で売れる」……と、量ごとの取引の条件がわかることになります。

公開したアルゴリズムでは、この取引条件が指定した期待利益率の閾値以上になる量を計算し、取引量を決定しています。

板情報の他の活用法

スリッページのリスクがどの程度あるか」なども板からある程度推測することができるはず(板の価格が飛び飛びの値をとっているときは、bestに近い注文とマッチングできないと条件の悪い注文をつかまされることになる)ので、機会があったら考えてみたいと思います。

アービトラージアルゴリズムの解説1(板の取得・売買と並列処理)

概要

以下で公開しているアルゴリズムの仕組みについて簡単に解説します。 algorisamurai.hateblo.jp

今回は板の取得・注文に並列処理を使うメリットについての話です。

板の取得

アービトラージは、「取引所Aの買値」のほうが「取引所Bの売値」より安い、というような状況を見つけてきて注文を投げてAで買ってBで売る投資手法であるため、「買値と売値がいくらか」の情報を取引所から入手してくる必要があります。
取引所には、人々が「〇〇円なら売りますよ」(askと呼びます)「△△円なら買いますよ」(bidと呼びます)という提案が並んでいて、これをと言います。 各板における一番安い「〇〇円なら売りますよ」はbest ask、と一番高い「△△円なら買いますよ」はbest bidと呼ばれています。

要は取引所1のbest askが取引所2のbest bidより安かったら1で買って2で売れば得できる、というわけです。 アービトラージでは、まずこの機会を発見するため、常時板を監視する必要があります。

板を取得するためには、各取引所が公開しているAPIと呼ばれる仕組みを使います。取引所のURLに「板の情報がほしい」というリクエストを送って、かえってきた結果を使って取引のチャンスかどうかを判断します。

並列化

特に何も考えずにコードを書くと自然に

取引所1にリクエス

取引所1から結果が返ってくる

取引所2にリクエス

取引所2から結果が返ってくる

分析

という流れになるのですが、実はこれは効率的ではありません。通信にかかる時間&向こうのサーバー内での処理時間のために、リクエストを送ってから結果が返ってくるまでの間には50ミリ秒~200ミリ秒ほどの時間がかかるのです。そのぶん、先に取得した取引所1の板のほうが後に取得した取引所2の情報より「古い」ので、この時間差の間に変化してしまっている可能性があるわけです。
そこで登場するのが「処理の並列化」です。

並列処理では、簡単に言うと

取引所1にリクエス

取引所2にリクエス

取引所1と2の結果が返って揃うのを待つ

分析

という手続きをとります。これによって、板の取得にかかっていた時間が (取引所1との通信時間+取引所2との通信時間)から(取引所1との通信時間 と 取引所2との通信時間 の大きい方)
まで削減され、所要時間を減じると同時に板の情報の時間ラグも軽減することができるわけです。

これは注文時の処理にも有効で、こちらでは「板を取得してからなるべく早く注文のリクエストを投げる」のに非常に有効に作用します。

処理の所要時間

アービトラージで時間的に重要なのは「いかに時間ラグの少ない二つの取引所の板を取得できるか」と「いかに板を取得してから短期間で取引ができるか」です。

ここで、アルゴリズムが使っている時間の内訳をみてみると、通信時間がほぼ100パーセントを占めていることがわかります。内部の計算は1ミリ秒以下で、比較するとぜんぜん時間を使っていません。

並列化は上のソースコードに実装していて有効に働いていますし、それ以前の話として、多少効率は落ちるものの現在の仮想通貨市場は並列化の実装がなくても十分アービトラージでプラスを出すことが可能な状況です。
今の段階ではまだ不必要かもしれませんが、時間の問題をさらに推し進められるとすれば、コードを実行するサーバを取引所のサーバの近くに用意する、ということ程度でしょうか。 レンタルサーバをうまくすれば現実的に可能なような気もします。

pythonで仮想通貨の三点アービトラージ

概要

一般にアービトラージ戦略といえば、取引所Aと取引所Bで発生する価格差があるとき、高いほうで売り注文、安いほうで買い注文を約定させることで、その差額を利益として確定させる投資手法です。
こちらの自動取引アルゴリズムは以下のページで公開・解説しています。   algorisamurai.hateblo.jp

アービトラージには他にTriangular arbitrage/三点アービトラージ・取引所内アービトラージと呼ばれる手法があって、こちらは同じ取引所において、三つの通貨を順番に交換することによって利益を生み出すアルゴリズムです。
三点アービトラージの裁定機会を発見するコード(python)を以下のページの/tri_arbで公開しています。
github.com

ここからは三点アービトラージについて、具体例を使って説明します。

具体例

簡単のため、取引所Binance内部での、Bitcoin, Ethereum, Ripple (BTC, ETH, XRP)の相場について考えてみましょう。 この三つの通貨を相互に取引できる市場は、

  • ETH / BTC板
  • XRP / ETH板
  • XRP / BTC板

の三つです。 ここで、

  • ETH / BTC板 で ETH を BTC で購入
  • XRP / ETH板 で XRP を ETH で購入
  • XRP / BTC板 で XRP を売却して BTC にする

という一連の取引を行うことで、BTC→ETH→XRP→BTC、という流れで通貨が交換され、もとのBTCに帰ってきます。(逆ルートである BTC→XRP→ETH→BTC も同様です)。

たとえば板を見て、

  • 0.05BTC で 1ETH 買える
  • 0.001ETH で 1XRP 買える
  • 1XRP が 0.000051BTC で売れる

という状況があったとき、0.05BTC→1ETH→1000XRP→0.0505BTC と交換することで0.0005BTC増える、というのが具体的な三点アービトラージの流れです。

要するに

  • BTCで(ETHを介して)XRPを購入

する価格より

  • BTCでXRPを売却

する価格のほうが高い、という状況を裁定機会として捉え、取引を行うことになります。

この場合は売値0.0000505/買値(0.05 × 0.001) = 1.01 なので、利益は1%、またBinanceの場合は手数料が0.05%のため、0.05 × 3(取引回数)=0.15%を引いた、0.85%が正味の利益ということになります。
実際の市場は1%が拾えるほど大きく歪むことは少なく、小数点以下の期待値の取引を繰り返して利益を生み出していくことになります。

また、BTC・ETH・XRPのようなメジャーな通貨間では板が厚く、歪みが手数料のレンジを超えることはほとんどありません。たとえばBinanceだと、選べる基軸通貨(BTC, BNB, ETH, USDT)の中から二つ選ぶほかは、板が薄めの適当な仮想通貨を選んでくることをおすすめします。

三点アービトラージの注意点

三点アービトラージに重要になってくるのが、取引手数料とサーバーの反応にかかる時間です。板が薄いために比較的大きな歪みが生じやすい一方で、一回の手続きでの取引回数が通常のアービトラージの3倍のため、通常のアービトラージ以上に手数料の安さが重要になってきます。

また、取引所の板は刻一刻と変化するため、スリッページを避けるためなるべく「直前の」データを得たうえで「瞬時に」注文を行う必要があります。そのため、レスポンスの速い取引所を選ぶことも重要です。

裁定機会の検出

上のリンクのコードを使用して、BinanceでBTC・BNB・LSKの組み合わせを対象に三点アービトラージの機会を検出してみました。
0.15%の手数料に0.05%を上乗せした、利益率0.20%を超える機会を検出してみます。

結果、約12時間の間にあった23回の裁定機会のうち、10回は即座に解消されていたものの、13回については歪みがなくなるまで0.2〜4.0秒程度の猶予期間があることが検出されました。さらに、この13回のうち9回は1.0秒以上の猶予期間を持っていました。 (板の取得中に既に取得した板が変動することを考えると、10回の中には誤検出も含まれていると考えられます)

取引三つ(BTC→BNB→LSK→BTC or BTC→LSK→BNB→BTC)を行うのに0.2秒かかると考えると、利益率が閾値を上回った0.2秒後に新たに取得した板でも利益率が大きいまま(猶予期間内にある)なら、取引が可能だった、と判断できることになります。

今回のコードでは自動取引までは実装していませんが、条件をうまく設定することでプラスを出すことは十分可能かと思います。

今後の展開

改善案としては

  • BNB/BTC板・LSK/BNB板・LSK/BTC板をシーケンシャルに取得するのではなく、同時に取ってくるようにする

こと、また

  • 組み合わせに使う通貨それぞれに分割して入金しておき、取引を同時に行うようにする

ことで手続きの高速化がはかれるのではないか、という感じです。

試しに並列処理で書いてみたんですが、ネットワークの問題か現状と比べて別にはやくならなかったので、我こそはという人はget_orderbooks()をいかに早くできるか挑んでみてください。

現状のシーケンシャルな処理だけでも、数ヶ月前試した原始的なコード(裁定機会を見つけたら一番小さなロットで取引してみる)では微妙なプラスが出ていたので、三点アービトラージで稼ぐのは無理、ということも決してなさそうです。通貨を基本的に一種類しか持たなくていいこと、裁定機会自体はけっこう多いことなど、取引所間のアービトラージと違った利点もあるので、私も気が向いたときにまた挑んでみるつもりです。

18//04/23追記:並列処理による同時の板取得を実装しました。

アービトラージに適した仮想通貨取引所(取引手数料0.1%以下)

概要

前回の記事で2つの取引所間でのアービトラージの実装を公開しました。
algorisamurai.hateblo.jp

ccxt(仮想通貨取引所を横断的に扱えるライブラリ)で様々な取引所を扱える中、取引手数料が安い取引所を一覧にしています。(アービトラージでは取引手数料の安さがかなり重要)。

実行環境と適用方法

自動取引を行うアルゴリズムは前回と同じこのpythonのコードです(適宜更新中)。 github.com
setting.iniの[EXCHANGE1]か[EXCHANGE2]のNAMEの欄に、各取引所のccxtコード(後述)とその取引所でのAPIキーを入力することで、ccxtが対応している取引所間でのアービトラージが可能になります。

(※取引所の対応についてはコードのREADMEを参照。まだ完全には対応できていないと思うので、エラーで止まったら報告ください。できるだけ修正します)

手数料0.1%以下の取引所リスト

取引手数料(taker fee)が安くて(0.1%以下)ある程度以上大きな取引所は、

  • Bit-z 0.1%

  • HitBTC 0.1%

  • Kucoin 0.1%

  • Coinegg 0.1%

  • Zaif 0.1% (BCHのみ0.3%)

  • Bibox 0.1% (BIXトークンで支払うと0.05%)

  • Binance 0.1% (BNBトークンで支払うと0.05%)

などが挙げられます。以下、取引所の規模(volume、2018/04/12時点)と、それぞれの取引所でよく取引されていて使えそうなペアを適当にピックアップしています。

各取引所の傾向

Bit-z

https://u.bit-z.com/register?invite_code=1485453
Bit-z
taker fee 0.1%
volume 20,234 BTC
中国の大手取引所。
BTCに対してETH, TRX, EOS, BCH, LTC, DASH, LSKなど。サーバーのレスポンスも速め。
ccxtでのコードはbitz

HitBTC

https://hitbtc.com/?ref_id=5a74c2369b641
HitBTC
taker fee 0.1%
volume 19,895 BTC
イギリスの取引所。
BTC, USDTに対しての ETH, BCH, XMR, DASH, XRP, EOS, LSK, TRXなど多くのメジャーな通貨ペアを持っている。 ccxtでのコードはhitbtc2

Zaif

https://zaif.jp?ac=9oejqzcm93
Zaif
taker fee 0.1% (BCHのみ0.3%)
volume 12,372 BTC
日本の取引所。扱っている通貨ペアこそ少ないが規模はそこそこある。BTC/JPY、XEM/JPY、MONA/JPY、XEM/BTC、ETH/BTCなど。

BTC/JPYに限ってはtaker feeが-0.01%でわずかながらキャッシュバックまであるので、USD/JPYの為替レートを参考にBTC/JPYとBTC/USDTでアービトラージを組んでみるのもいいかも。
サーバの品質が悪いらしいので注意が必要。
ccxtでのコードはzaif

Coinegg

https://www.coinegg.com/user/register?inv=113e21
Coinegg
taker fee 0.1%
volume 7,698 BTC
メジャーどころがそろっている感じ。ETH/BTC、NEO/BTC、TRX/BTC、BCH/BTC、LSK/BTC、XRP/BTC、LTC/BTCなど。
ccxtでのコードはcoinegg

Kucoin

https://www.kucoin.com/
Kucoin
taker fee 0.1%
volume 4,705 BTC
時期Binanceとか呼ばれてる?割には規模が小さい。メジャーどころでは ETH/BTC、BTC/USDT、ETH/USDT、NEO/BTCなど。
ccxtでのコードはkucoin

Bibox

https://www.bibox.com/login/register?id=11318118&lang=en
Bibox
taker fee 0.1% (BIXトークンで支払うと0.05%)
volume 7,424 BTC
手数料が仮想通貨取引所最安値の0.05%(Binanceと同じ)の取引所。かなりマイナーな草コインが多く板があんまり動かないので、よく取引されているUSDT/BTCやUSDT/ETHで使うのがいいかも。三点アービトラージができる可能性あり。サーバーのレスポンスも速め。
ccxtでのコードはbibox

Binance

https://www.binance.com/?ref=17182835
Binance
taker fee 0.1% (BNBトークンで支払うと0.05%)
volume 187,382 BTC
前回の記事でも紹介した超巨大取引所。レスポンスもいいし手数料も安いので片方はこれにするといいと思う。BCHはないけど主要なコインはだいたいある感じ。
ccxtでのコードはbinance

2018/04/27追記:BinanceでのBitcoin CashはBCHではなくBCCの名前で扱っていたようです。(config.iniで通貨を指定するときはBCHと書いてください)

取引所の選定

取引所ごとに市場にあるそれぞれの仮想通貨の総量はかなり違っていて、他の取引所では大量に取引されている通貨ペアが他の取引所ではぜんぜん取引されていない、ということもままあるようです。
板が薄すぎると注文がスリップしやすくなるのと板が動かないので裁定機会が減りそうなことには気をつける必要がありそうですが、厚ければいいかというと、今度は鞘があんまりなかったりして、なかなか一概には言えそうにありません。
手数料が高い取引所間では大きな鞘が発生している可能性もありますが、とりあえずは手数料が安くて試しやすいこのリストから選んで試してみてはいかがでしょうか。
アフィリエイトプログラムがあるので、上のリンク経由でアカウントを作っていただけると非常に助かります。)

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

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