仮想通貨のアービトラージアルゴリズム
こちらに紹介しているものです.
pythonで仮想通貨の取引所間アービトラージ
(ブログの記述と食い違う場合、このREADMEが最新版なのでこちらを参照してください.)
仮想通貨取引所を二つ用意して入金し, アルゴリズムを走らせることで, 二つの取引所に価格差が生じた機会を自動的に見つけて取引し, 利益を生み出します. 現物取引のみに対応しています.
python3で開発しています.(たぶんpython2でも動きます).
パッケージとして
- pandas(データ処理)
- numpy(数値処理)
- requests(HTTPライブラリ)
- docopt(コマンドライン引数処理)
- ccxt(仮想通貨取引所のAPIをまとめたライブラリ)
を用いているので, pipでinstallしてください.
取引所のAPIが変わったとき, ccxtを更新する必要がある場合があるので, 注意してください.
後述のconfig.iniを記入して, 各取引所に同額程度の基軸通貨とペアにした通貨を入金し,
python arb.py
とすることで, 自動的に取引を行います.
また,
python arb.py demo
とするとデモモードで起動し, 取引は行わずに取引所間の裁定機会を見つけるたびに表示します.
両方のモードともに, コードを実行するとはじめに
Trade mode # Trade と Demo のどちらのモードか
BTC/DASH # アービトラージに用いる通貨ペアは何か
binance/hitbtc2 # アービトラージに用いる取引所はどこか
minsize:0.001 # 取引の最小値はいくらか
というようなテキストが出力されます.
Trade modeでは,
authentication success(balance) # API経由で残高の取得が可能か確認
のメッセージが出た後,
Mar 30 00:20:58 [0.103475, 1.4030] ch:0.000 BNB:1.1487
のように現在の状況を示す出力が表示され, 待機状態に入って裁定の機会を窺います.
裁定機会が来たとき, 裁定取引を行えるBalanceを持っているなら直ちに取引を実行し, 取引後のBalanceを出力します.
平常運転時の出力は次のようなものになります.
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
これらの出力は左から
- Mar 30 03:46:47 :日時
- [0.103529, 1.4060] :[基軸通貨, ペアにした通貨]の残高(両取引所の合計)
- ch:-1.0670 :取引した量(取引所1で売って2で買う場合 +, 取引所2で売って1で買う場合 -の符号がつく)
- BNB:1.1108 :取引手数料に使う取引所トークンの残高(optional, 後述のBNBBUYフラグをONにした場合)
を表しています.
authentication success(balance)
のテキストが出ず何らかのエラーで止まった場合, config.iniや取引所でのAPIのアクセス許可に問題がある可能性があります. (ccxtがそれぞれの取引所に対して十分整備されていないせいで発生するエラーがも多いため, そうしたエラーが出た場合は報告していただけると助かります).
また, ここまでで, 取引所の選択によってはCaution:の表示が出る場合があります. そのままで動く可能性もありますが, この警告が出た場合はコードの実行を停止して, buffer.pyやccxt_extrainfo.pyを追記したり, ブログやここで報告していただければできるだけ対応します.
特殊なエラーの例としては, Biboxという取引所ではそれぞれの仮想通貨について, balanceを一度0でない状態にして口座をactivateしないと残高が取得できない, といった仕様がありました. (この場合, アービトラージに用いる通貨を事前に手で少しだけ購入しておけばOKです.)
Demo modeでは,
Demo mode start
のメッセージの後, 裁定機会が観測されるたび, 仮にその機会に取引できたときの利益を表示します.
表示する内容は, 左から, 時間, 取引できる量(取引所1で売って2で買う場合 +, 取引所2で売って1で買う場合 -の符号がつく), 取引を行ったときの倍率, となっています(倍率については, best bid / ask を使っているため, 評価は甘め.)
本番を実行する前にその取引所/通貨ペアにどの程度の鞘があるか見積もるのに使ってください.
configファイルに, 取引する通貨の組み合わせや取引所, 取引を行う価格差の条件などを記入します.
[settings]
BASE = BTC
ALT = XRP
threshold_up = 1.0025
threshold_down = 1.0025
BASEとALTによってアービトラージを行う通貨のペアを指定します.この例では, Bitcoin(BTC)とRipple(XRP)が指定されています. BASEにはその取引所で基軸通貨と扱われている通貨を, ALTにはその通貨で購入する形になっている通貨を指定してください. 大抵の場合, BASEとしてはBTCやETH, JPY, USDTなどが指定されることになるかと思います. また, この通貨ペアは後で指定する二つの取引所の両方で取り扱われている必要があります.
次は閾値(売値が買値の何倍になったら取引を行うかの値)の設定を行います.
この設定には, threshold_upとthreshold_downという二つの値を指定します.
それぞれ「取引所1での売値が取引所2での買値の何倍になったら取引するか」「取引所2での売値が取引所1での買値の何倍になったら取引するか」を意味しています.
ここで, up と down を別々に設定するのは, 取引所ごとに高くなりやすい傾向, 安くなりやすい傾向がある場合があるからです.
具体的には,
threshold_up = 1.003
は, 「取引所1の方が取引所2より1.003倍以上高くなったら, 取引所2で買って取引所1で売る」設定,
threshold_down = 1.004
は, 「取引所2の方が取引所1より1.004倍以上高くなったら, 取引所1で買って取引所2で売る」設定ということになります.
Binanceの取引手数料は0.05%, HitBTCの取引手数料は0.1%なので, 閾値の設定が1.0015(0.05% + 0.10% = 0.15%に対応する)より小さいような値になってくると, 期待利益率が手数料に負けるようになってしまいます. 取引所の手数料率の合計より0.1%程度以上高い値に設定することをお勧めします.
デフォルトでは1.003(0.3%)を指定しています. 選んだ通貨ペアや市場の状況にもよりますが、この付近の値であれば安定したパフォーマンスが期待できるかと思います.
[TOKENS]
BNBBUY = 1
BIXBUY = 0
Binanceという取引所では, BNBという取引所の独自トークンで手数料を支払うと手数料が割引される(半額になる)ため, このトークンを自動的に購入する機能を実装しています.
BNBBUYを1にすると, 所持BNBが1BNB以下になったとき1BNBの自動購入が行われます. Binanceを用いない場合, またBinanceでBNBを自動購入しない場合はBNBBUY=0を指定してください. BiboxでのBIXについても同様にしています.
Binanceを使用しないのにBNBBUY = 1を指定したり, Biboxを使用しないのにBIXBUY = 1を指定するとアルゴリズムが止まるので注意してください.
[EXCHANGE1]
NAME = binance
APIKEY = dummy_foobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobar
SECRET = dummy_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
[EXCHANGE2]
NAME = hitbtc2
APIKEY = dummy_foobarfoobarfoobarfoobarfoo
SECRET = dummy_abcdefghijklmnopqrstuvwxyz
取引に用いる取引所を指定します. また, このプログラムで取引所にアクセスできるように, APIキーとSECRETキーを各取引所のWebサイトで取得し, ここに記入します. APIキーの取得時, 情報閲覧の許可やTradeの許可を設定するのを忘れないようにしてください. このとき, セキュリティ上, APIからはWithdrawalできないよう設定することをお勧めします.
取引所名はccxtの内部コードの
_1broker, _1btcxe, acx, allcoin, anxpro, bibox, binance, bit2c, bitbay, bitcoincoid, bitfinex, bitfinex2, bitflyer, bithumb, bitlish, bitmarket, bitmex, bitso, bitstamp, bitstamp1, bittrex, bitz, bl3p, bleutrade, braziliex, btcbox, btcchina, btcexchange, btcmarkets, btctradeim, btctradeua, btcturk, btcx, bxinth, ccex, cex, chbtc, chilebit, cobinhood, coincheck, coinegg, coinexchange, coinfloor, coingi, coinmarketcap, coinmate, coinsecure, coinspot, coolcoin, cryptopia, dsx, exmo, flowbtc, foxbit, fybse, fybsg, gatecoin, gateio, gdax, gemini, getbtc, hitbtc, hitbtc2, huobi, huobicny, huobipro, independentreserve, itbit, jubi, kraken, kucoin, kuna, lakebtc, liqui, livecoin, luno, lykke, mercado, mixcoins, nova, okcoincny, okcoinusd, okex, paymium, poloniex, qryptos, quadrigacx, quoinex, southxchange, surbitcoin, therock, tidex, urdubit, vaultoro, vbtc, virwox, wex, xbtce, yobit, yunbi, zaif, zb
の中にある文字列からを指定してください. 大手の取引所は大抵この中にあるかと思います.
手数料が安い取引所については以下の記事を参考にしてください.
アービトラージに適した仮想通貨取引所(取引手数料0.1%以下)
(HitBTCを用いる場合, バージョンアップしたAPIであるhitbtc2を指定するようにしてください.)
2018/06/04追記: 2018年6月なかばごろから, 金融庁の施策の関係で日本からのHitBTCの使用が一時的に(公式ブログによると, おそらく秋ごろまで)できなくなるようです. 他の取引所への移行をおすすめします.
取引所によっては, 取引の際にパスワードを入力する必要がある場合(Bit-Zなど)があります. この場合は, Trade Passwordとして設定した文字列を
PASS = dummy_password
の形で追記します.(現在, Bit-Zのみ取引パスワードの設定に対応しています. Trade Password の設定が必要な他の取引所があれば連絡いただければ対応します.)
configの[SLACK][LINE][FILE_LOGGING]のそれぞれのFLAGを1にしてURLやトークン、ファイル名を入力することで,
- [SLACK] SLACKの Incoming Webhooks に投稿
- [LINE] LINE Notify に投稿
- [FILE_LOGGING] 指定したファイル名のファイルに保存
という形でログを出力することができます.
ccxtを用いているとはいえ, 取引所ごとの特徴の違いなどから様々なエラーが発生することが予想されます. 現在, BinanceとHitBTC, Bit-Zでは正常動作することを確認しています. また, Bibox, Zaifについては残高取得ができるところまでは確認しています.
こんなエラーが出たよ, という報告や, その対策など投げていただけると嬉しく思います.
実験段階ですが, 三点アービトラージ(同じ取引所内で三通貨をぐるぐる交換して利益を出すやつ)の機会を検出するコードを/tri_arb以下に置いています。簡単な解説をブログに書いています.
pythonで三点アービトラージ
質問やご意見, 改善案などがあれば, 上記ブログのコメント欄や, GitHubのissues, またメールアドレス algorisamurai[at]gmail.com ([at]は@に変えてください)までお気軽にご連絡ください.
儲かったら投げ銭していただけると光栄です.
Rippleアドレス:
rNvTpTCNZvaFFoBEj2Ba3PA28Pz22Mzzrv
BTCアドレス:
1P1Y1JTkPWhExsxJbgibEvRsBPj5RN8hqk