Skip to content

Instantly share code, notes, and snippets.

@sin32775
Created June 20, 2021 00:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sin32775/663f8f79c0301d61954791d46d46c6ca to your computer and use it in GitHub Desktop.
Save sin32775/663f8f79c0301d61954791d46d46c6ca to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# arbitrage_crypto\n",
"暗号資産(仮想通貨)のアービトラージアルゴリズム\n",
"\n",
"### 概要\n",
"\n",
"仮想通貨取引所を二つ用意して入金し, アルゴリズムを走らせることで, 二つの取引所に価格差が生じた機会を自動的に見つけて取引し, 利益を生み出します. 現物取引のみに対応しています.<br>\n",
"\n",
"python3で開発しています.<br><br>\n",
"パッケージとして<br>\n",
"* pandas(データ処理)<br>\n",
"* numpy(数値処理)<br>\n",
"* requests(HTTPライブラリ)<br>\n",
"* docopt(コマンドライン引数処理)<br>\n",
"* ccxt(仮想通貨取引所のAPIをまとめたライブラリ)<br>\n",
"\n",
"を用いているので, pipでinstallしてください.<br><br>\n",
"\n",
"### コードの実行\n",
"後述のconfig.iniを記入して, 各取引所に同額程度の基軸通貨とペアにした通貨を入金し, <br>\n",
"> python arb.py\n",
"\n",
"とすることで, 自動的に取引を行います.<br>\n",
"\n",
"また,<br>\n",
"> python arb.py demo\n",
"\n",
"とするとデモモードで起動し, 取引は行わずに取引所間の裁定機会を見つけるたびに表示します.<br>\n",
"\n",
"両方のモードともに, コードを実行するとはじめに<br>\n",
"> Trade mode # Trade と Demo のどちらのモードか<br>\n",
"> BTC/DASH # アービトラージに用いる通貨ペアは何か<br>\n",
"> binance/hitbtc2 # アービトラージに用いる取引所はどこか<br>\n",
"> minsize:0.001 # 取引の最小値はいくらか<br>\n",
"\n",
"というようなテキストが出力されます.<br><br>\n",
"\n",
"### Trade mode\n",
"Trade modeでは,<br>\n",
"> authentication success(balance) # API経由で残高の取得が可能か確認<br>\n",
"\n",
"のメッセージが出た後, <br>\n",
"> Mar 30 00:20:58 [0.103475, 1.4030] ch:0.000 BNB:1.1487\n",
"\n",
"のように現在の状況を示す出力が表示され, 待機状態に入って裁定の機会を窺います.<br>\n",
"\n",
"裁定機会が来たとき, 裁定取引を行えるBalanceを持っているなら直ちに取引を実行し, 取引後のBalanceを出力します.<br>\n",
"\n",
"平常運転時の出力は次のようなものになります.<br>\n",
"> Mar 30 00:28:38 [0.103477, 1.4030] ch:-0.0210 BNB:1.1484<br>\n",
"> Mar 30 00:28:43 [0.103477, 1.4030] ch:-0.0040 BNB:1.1483<br>\n",
"> Mar 30 00:28:47 [0.103477, 1.4030] ch:-0.0010 BNB:1.1483<br>\n",
"> Mar 30 03:45:34 [0.103490, 1.4050] ch:1.3320 BNB:1.1275<br>\n",
"> Mar 30 03:46:47 [0.103529, 1.4060] ch:-1.0670 BNB:1.1108<br>\n",
"\n",
"これらの出力は左から<br>\n",
"* Mar 30 03:46:47 :日時<br>\n",
"* [0.103529, 1.4060] :[基軸通貨, ペアにした通貨]の残高(両取引所の合計)<br>\n",
"* ch:-1.0670 :取引した量(取引所1で売って2で買う場合 +, 取引所2で売って1で買う場合 -の符号がつく)<br>\n",
"* BNB:1.1108 :取引手数料に使う取引所トークンの残高(optional, 後述のBNBBUYフラグをONにした場合)<br>\n",
"を表しています.<br><br>\n",
"\n",
"##### ここまででエラーが出た場合\n",
"> authentication success(balance)\n",
"\n",
"のテキストが出ず何らかのエラーで止まった場合, config.iniや取引所でのAPIのアクセス許可に問題がある可能性があります. (ccxtがそれぞれの取引所に対して十分整備されていないせいで発生するエラーがも多いため, そうしたエラーが出た場合は報告していただけると助かります).<br>\n",
"\n",
"また, ここまでで, 取引所の選択によってはCaution:の表示が出る場合があります. そのままで動く可能性もありますが, この警告が出た場合はコードの実行を停止して, buffer.pyやccxt_extrainfo.pyを追記したり, ブログやここで報告していただければできるだけ対応します.<br>\n",
"\n",
"特殊なエラーの例としては, Biboxという取引所ではそれぞれの仮想通貨について, balanceを一度0でない状態にして口座をactivateしないと残高が取得できない, といった仕様がありました. (この場合, アービトラージに用いる通貨を事前に手で少しだけ購入しておけばOKです.)<br><br>\n",
"\n",
"### Demo mode\n",
"Demo modeでは, <br>\n",
"> Demo mode start <br>\n",
"\n",
"のメッセージの後, 裁定機会が観測されるたび, 仮にその機会に取引できたときの利益を表示します.<br>\n",
"表示する内容は, 左から, 時間, 取引できる量(取引所1で売って2で買う場合 +, 取引所2で売って1で買う場合 -の符号がつく), 取引を行ったときの倍率, となっています(倍率については, best bid / ask を使っているため, 評価は甘め.)<br>\n",
"\n",
"本番を実行する前にその取引所/通貨ペアにどの程度の鞘があるか見積もるのに使ってください.<br><br>\n",
"\n",
"### config.ini の構成と見方\n",
"configファイルに, 取引する通貨の組み合わせや取引所, 取引を行う価格差の条件などを記入します.<br><br>\n",
"\n",
"##### [setting]\n",
"> [settings]<br>\n",
"> BASE = BTC<br>\n",
"> ALT = XRP<br>\n",
"> threshold_up = 1.0025<br>\n",
"> threshold_down = 1.0025<br>\n",
"\n",
"BASEとALTによってアービトラージを行う通貨のペアを指定します.この例では, Bitcoin(BTC)とRipple(XRP)が指定されています. BASEにはその取引所で基軸通貨と扱われている通貨を, ALTにはその通貨で購入する形になっている通貨を指定してください. 大抵の場合, BASEとしてはBTCやETH, JPY, USDTなどが指定されることになるかと思います. また, この通貨ペアは後で指定する二つの取引所の両方で取り扱われている必要があります.<br>\n",
"\n",
"次は閾値(売値が買値の何倍になったら取引を行うかの値)の設定を行います.<br>\n",
"この設定には, threshold_upとthreshold_downという二つの値を指定します.<br>\n",
"それぞれ「取引所1での売値が取引所2での買値の何倍になったら取引するか」「取引所2での売値が取引所1での買値の何倍になったら取引するか」を意味しています.<br>\n",
"ここで, up と down を別々に設定するのは, 取引所ごとに高くなりやすい傾向, 安くなりやすい傾向がある場合があるからです.<br>\n",
"具体的には,  \n",
"> threshold_up = 1.003\n",
"\n",
"は, 「取引所1の方が取引所2より1.003倍以上高くなったら, 取引所2で買って取引所1で売る」設定,<br>\n",
"> threshold_down = 1.004\n",
"\n",
"は, 「取引所2の方が取引所1より1.004倍以上高くなったら, 取引所1で買って取引所2で売る」設定ということになります.<br>\n",
"\n",
"Binanceの取引手数料は0.05%, HitBTCの取引手数料は0.1%なので, 閾値の設定が1.0015(0.05% + 0.10% = 0.15%に対応する)より小さいような値になってくると, 期待利益率が手数料に負けるようになってしまいます. 取引所の手数料率の合計より0.1%程度以上高い値に設定することをお勧めします.<br>\n",
"\n",
"デフォルトでは1.003(0.3%)を指定しています.  選んだ通貨ペアや市場の状況にもよりますが、この付近の値であれば安定したパフォーマンスが期待できるかと思います.\n",
"<br><br>\n",
"\n",
"##### [TOKENS]\n",
"> [TOKENS]<br>\n",
"> BNBBUY = 1<br>\n",
"> BIXBUY = 0<br>\n",
"\n",
"Binanceという取引所では, BNBという取引所の独自トークンで手数料を支払うと手数料が割引される(半額になる)ため, このトークンを自動的に購入する機能を実装しています.<br>\n",
"BNBBUYを1にすると, 所持BNBが1BNB以下になったとき1BNBの自動購入が行われます. Binanceを用いない場合, またBinanceでBNBを自動購入しない場合はBNBBUY=0を指定してください. BiboxでのBIXについても同様にしています.<br>\n",
"\n",
"Binanceを使用しないのにBNBBUY = 1を指定したり, Biboxを使用しないのにBIXBUY = 1を指定するとアルゴリズムが止まるので注意してください.<br><br>\n",
"\n",
"##### [EXCHANGE1]と[EXCHANGE2]\n",
"> [EXCHANGE1]<br>\n",
"> NAME = binance<br>\n",
"> APIKEY = dummy_foobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobar<br>\n",
"> SECRET = dummy_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz<br>\n",
"\n",
"> [EXCHANGE2]<br>\n",
"> NAME = hitbtc2<br>\n",
"> APIKEY = dummy_foobarfoobarfoobarfoobarfoo<br>\n",
"> SECRET = dummy_abcdefghijklmnopqrstuvwxyz<br>\n",
"\n",
"取引に用いる取引所を指定します. また, このプログラムで取引所にアクセスできるように, APIキーとSECRETキーを各取引所のWebサイトで取得し, ここに記入します. APIキーの取得時, 情報閲覧の許可やTradeの許可を設定するのを忘れないようにしてください. このとき, セキュリティ上, APIからはWithdrawalできないよう設定することをお勧めします.<br>\n",
"\n",
"\n",
"取引所名はccxtの内部コードの<br>\n",
"> _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<br>\n",
"\n",
"の中にある文字列からを指定してください. 大手の取引所は大抵この中にあるかと思います.<br><br>\n",
"\n",
"手数料が安い取引所については以下の記事を参考にしてください.<br>\n",
"[アービトラージに適した仮想通貨取引所(取引手数料0.1%以下)](https://belief-hf.com/arbitrage_crypto/)<br>\n",
"(HitBTCを用いる場合, バージョンアップしたAPIであるhitbtc2を指定するようにしてください.)<br><br>\n",
"<b>2018/06/04追記: 2018年6月なかばごろから, 金融庁の施策の関係で日本からのHitBTCの使用が一時的に(公式ブログによると, おそらく秋ごろまで)できなくなるようです. 他の取引所への移行をおすすめします.</b><br><br>\n",
"\n",
"取引所によっては, 取引の際にパスワードを入力する必要がある場合(Bit-Zなど)があります. この場合は, Trade Passwordとして設定した文字列を<br>\n",
"\n",
"> PASS = dummy_password<br>\n",
"\n",
"の形で追記します.(現在, Bit-Zのみ取引パスワードの設定に対応しています. Trade Password の設定が必要な他の取引所があれば連絡いただければ対応します.)<br><br>\n",
"\n",
"### ログ機能\n",
"configの[SLACK][LINE][FILE_LOGGING]のそれぞれのFLAGを1にしてURLやトークン、ファイル名を入力することで, <br>\n",
"* [SLACK] SLACKの Incoming Webhooks に投稿<br>\n",
"* [LINE] LINE Notify に投稿<br>\n",
"* [FILE_LOGGING] 指定したファイル名のファイルに保存<br>\n",
"\n",
"という形でログを出力することができます.<br><br>\n",
"\n",
"### 各取引所への適応\n",
"ccxtを用いているとはいえ, 取引所ごとの特徴の違いなどから様々なエラーが発生することが予想されます. 現在, BinanceとHitBTC, Bit-Zでは正常動作することを確認しています. また, Bibox, Zaifについては残高取得ができるところまでは確認しています.<br>\n",
"\n",
"参考:[ccxt](https://github.com/ccxt/ccxt)\n",
"\n",
"### Triangular Arbitrage\n",
"三点アービトラージ(同じ取引所内で三通貨をぐるぐる交換して利益を出します。)の機会を検出するコードは3points_arbになります。簡単な解説はこちら.<br>\n",
"[pythonで三点アービトラージ](https://belief-hf.com/3points_arb/)<br>\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment