記事の見出し
- 1 【2018/03/26最新版】Python製の自作ビットコインFX自動売買ツールで儲ける。実際に使ってみて仮想通貨取引所APIのメリットデメリットを比較してみた。
- 2 Zaif ビットコインAirFX:APIはPythonならラッパーもあり使い方は簡単だが、糞取引仕様+糞サーバ+糞EPSに泣くことになる。
- 3 bitFlyer Lightning FX:APIも便利で使いやすく、サーバ強度も良い。Pythonライブラリもあるので、最初に自動売買に着手すべき取引所。
- 4 QUOINEX:APIからの注文の柔軟性とセキュリティは最高。しかし、ドキュメントが日本語未対応、Pythonライブラリ無しと上級者向け。
- 5 自動売買を断念した、その他の仮想通貨取引所。これから検証したい海外取引所
【2018/03/26最新版】Python製の自作ビットコインFX自動売買ツールで儲ける。実際に使ってみて仮想通貨取引所APIのメリットデメリットを比較してみた。
仮想通貨取引所の多くは標準でAPIを公開しているところも多く、APIを活用することで簡単にビットコインの自作自動売買プログラムが作れるというのが仮想通貨投資(投機)の利点の1つです。
PythonなどでAPIをいじくり回せば、トラリピやループイフダンによる簡単な自動売買から、複雑なパターンインデックス・データ統計を用いた自動売買まで、自分の好きなトレードルールで好きなように自動売買を始めることができます。
感情任せのトレードで大損することも避けられますし、何より会社に行ったり他の事をしていても、ロボットが24時間365日全自動システムトレードでジャンジャン稼いでくれるのは有難いです^^。
ところが・・・。
仮想通貨取引所APIを実践レベルで使って検証しているようなサイト・ブログが検索してもなかなか見つけることができず、少ないネット情報を元に、独力で色々試さないと作れなかったりするのが現状です。結構、取引所毎にクセがあって苦戦するんですよねw。
実際にガチで作って、定常的に自動売買で運用している人は少ないのかもしれません。
というわけで、本記事では、私が実際にガチでビットコイン自動売買ツールをPythonで作って、実際に運用していて困った点などをふまえて、各社仮想通貨取引所APIを徹底比較したいと思います。
なお、システムトレード共通の注意事項(資金・リスク管理、フェールセーフ、取引所リスク等)はまた別途記事にしようと思います。今回は仮想通貨取引所APIの細かい特徴などの比較になります。
あと、Pythonで作る前提で書くので、他のプログラム言語の場合は知りませんよw。
本記事はあくまでビットコインFX自動売買をする前提での評価です。ビットコインFXや自動売買とかでなくて、普通に仮想通貨投資したい人はコチラの記事を参考にしてください。
「自動売買したいけど、検証用の過去データがないよ・・・」って人はコチラ。
「自動売買したいけど、Pythonとかプログラム書けないよ・・・」って人はコチラのオンラインブートキャンプ 無料体験。
余談ですが、もうプログラミングに対する苦手意識とか払拭して、ちゃんと勉強した方がいいです。システムトレードやビットコインに限った話ではなく、これからは自動化・人工知能の時代なので、出来るのと出来ないのじゃ、見える世界が全然違ってきますよ。
TECHACADEMYなら、わざわざスクールに通わなくても家や会社からオンライン学習できるし、メンターさんにも質問できます。ちょうど、Pythonの講座も追加されたし。。
Zaif ビットコインAirFX:APIはPythonならラッパーもあり使い方は簡単だが、糞取引仕様+糞サーバ+糞EPSに泣くことになる。
取引所 | ![]() 引用元:Zaif https://zaif.jp/
|
---|---|
総合評価 |
取引所比較の記事の方では、最高評価とさせていただいたZaifですが、「ビットコインFX」「自動売買」に限るならZaifは最低評価とせざるを得ないです。普通に仮想通貨投資するなら、オススメできる取引所ですが・・・。 |
レバレッジ | 最大25倍 |
APIドキュメント | 日本語 |
Pythonライブラリ | あり(zaifapi) |
IPホワイトリスト | あり |
ハッシュアルゴリズム | HMAC-SHA512 |
メッセージ | 文字列 |
サーバ強度 |
最弱うんちサーバ。仮想通貨取引所はどこも相場がヒートアップしてくると重くなってくるが、Zaifはその中でも最低レベルです。
|
注文方式 |
Zaif特有の注文方式。成り行き注文ができず、約定後にAPIから決済する方法も不明。
|
取引履歴CSV |
一応、確定申告用に取引履歴CSVを出力できる機能はあるようだが動いてない?。まあ「get_positions」でAPIから取れるようなので、最悪作るからいいっす。
|
その他、実装上の注意点 | EPS(Early Profit Settlement)により、勝手に自動決済・ロスカットされるので、その場合のリバランスが必要(しかし、サーバエラーにより、できないことが多い)。各トレードにて、スワップ手数料を収支期待値に加味する必要あり。 |
Zaifのサーバは弱すぎて繋がらない!エラーや取引失敗はプログラムでカバーできるが、それでも限界はある
Zaifのサーバは国内取引所の中でも最弱レベルでしょう。ウェブ画面からアクセスしようが、APIからアクセスしようが、相場がヒートアップしていると全く繋がらないです。15分くらいずっと全くつながらないこともあります。
APIのエラーは「ZaifServerException / return status code is 502」の場合と「ZaifApiError / trade temporarily unavailable.」の場合があります。
前者の場合は、ウェブ画面アクセス時に出る「502 Bad Gateway」と同じでしょう。一方、後者のケースはおそらく負荷軽減のためZaif側が意図的にブロックして繋がらないようにしているのではないかと思われます。
トレードが失敗したときのリカバリー・リバランスを自動売買プログラムに組み込むのは当然ですが、それは繋がらなくて良いというわけではないですので、サーバ強度の点においてZaifはかなりマイナスです。
Zaifは独特の注文方式。指値のみ親注文でSTOPとLIMITが属性として付いている。どうすれば・・?
Zaifの注文方式は独特です。指値のみ注文可能で、STOPとLIMITが属性値としてくっついています。成り行き注文はできません。
しかも、APIからの注文時、「①指値のみが刺さって、STOP/LIMIT待ちになっている(ポジションあり)」「②指値も刺さってない(ポジションなし)」の区別が簡単に出来ません(「active_positions」でこの2つが区別なく両方取れてくるので、中を見ないと判別できない)。
また、STOPとLIMITの値も制約が多く、ティッカー現在値より100円以上離れていたり、STOPのロスカット値が現在値に近すぎたり遠すぎたりすると、すぐにエラーになります。
さらに、「①指値のみが刺さって、STOP/LIMIT待ちになっている(ポジションあり)」の場合、キャンセルもできないので、APIからどのように決済すればいいのかわかりません。
仕方ないので、↓のように「change_position」でSTOP/LIMITの幅をティッカー現在値を中軸に狭めることで対応しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# ポジションのクローズ def close_exec(api, base_price): # 注文の取得と注文変更(limitとstopの幅を狭めて対応) positions = api.active_positions(type='futures',group_id=1) for row in positions: key = row data = positions[key] if (data['action'] == 'bid'): val_sonkiri = int(round(base_price - 1000, -1)) val_rikaku = int(round(base_price + 1000, -1)) if (data['action'] == 'ask'): val_sonkiri = int(round(base_price + 1000, -1)) val_rikaku = int(round(base_price - 1000, -1)) orderid = api.change_position(type='futures',group_id=1,leverage_id=int(key),price=int(data['price']),limit=val_rikaku,stop=val_sonkiri) |
カッコ悪っ!本当にこんな方法しかないのかな・・・。
なんで、こんなシステム設計にしてしまったのだろう・・。
通常IFDOCO注文の場合、STOPとLIMITは子注文の概念になります。Zaifの場合、親注文の1属性としてSTOP/LIMITがくっついてるので、こんな理不尽な状況になってしまいます。
たぶん、「IFDOCOとか投資初心者には、わかりにくいよね。だから、利確とストップロスを親注文にくっつけちゃえ」って設計なんだと思いますが・・。システム設計が正解がどうかは利用者が満足しているかどうかなので、一概に何が正しいとは言いませんけど、本当にこの仕組みでみんな満足して使ってるのかな?
EPS(追証が不要になる仕組み)の強制決済により、システムトレードが邪魔される。再注文したらエラーになるからリカバリーできない…
ZaifはEPSという追証が不要になる仕組みがあります。利用者が安心して使える仕組みと謳っていますが、実際はZaifが利用者から損金を回収する手間を省きたいがために実装された仕組みでしょう。
これは証拠金不足に陥りそうなポジションがある場合に、他の人の相対するポジションと同時に強制利益確定・ロスカットすることで、追証が発生する前に解消しちゃうというものです。
簡単に言っちゃと、「全力フルレバショート」とか「ストップロス無しフルレバ寝ロング」とか平気でやっちゃうようなリスク管理のできない3流トレーダーを、勝ってるトレーダーが懐を痛めて救うという、全く理不尽・意味不明な仕組みです。
通常、完全自動売買の場合、注文の発注・決済だけでなく資金管理・リスク管理もプログラムにより全自動で行うため、トラブル時以外はシステムトレードでは原理的に追証は発生しません(というか、資金ショートが発生しないトレードロジック・システム設計になっていなければ設計不備・不具合です)。そのため、ビットコイン自動売買ではEPSは何のメリットもありません。
なお、「EPSで自動決済されたとしても、建玉がなくなったことを自動検知して自動再注文すればいい」と思うかもしれませんが、EPSが発動するのは相場が大きく動いているケースが多く、前述したサーバ強度の問題から、自動再注文が通らずエラーになるケースが多いです(実際に、私はEPS→再注文→502エラー失敗を何度も経験しています)。
bitFlyer Lightning FX:APIも便利で使いやすく、サーバ強度も良い。Pythonライブラリもあるので、最初に自動売買に着手すべき取引所。
取引所 | ![]() 引用元:bitFlyer https://bitflyer.jp/
|
---|---|
総合評価 |
API自動売買に限るならbitFlyerは一番良いです。他の変な取引所のAPIで幻滅して、「ビットコインFXなんて、もう嫌だ…」ってなっちゃう前に、最初にbitFlyerで自動化を目指しましょうw。唯一の弱点はIPホワイトリストが無い点。APIの権限セキュリティには最大級注意。 |
レバレッジ | 最大15倍 |
APIドキュメント | 日本語 |
Pythonライブラリ | あり(pybitflyer) |
IPホワイトリスト | なし |
ハッシュアルゴリズム | HMAC-SHA256 |
メッセージ | 文字列 |
サーバ強度 |
画面からの注文はさておき、APIからの注文はほとんど通ります。また、サーバ状態を取得できるので、それを見つつ注文を出せばほぼ100%注文に成功します。
|
注文方式 |
通常の指値注文・成り行き注文はもちろん、IFDOCO注文もAPIから一発でできます。また、一発で注文全キャンセルのAPIもあります。唯一の弱点は基本的にネットアウトになる点です。両建てが必要なトレードロジックの場合は対応できません。
|
取引履歴CSV |
取引履歴CSVはbitFlyer Lightningの画面から簡単にダウンロードできます。確定申告も安心^^。
|
その他、実装上の注意点 | Lightning FX SFDを収支期待値に加味する必要あり。 |
bitFlyer Lightningのサーバは画面からはちょっと重いが、APIなら普通に使える。サーバ状態を見てトレードすれば、なお良し。
「bitFlyer Lightningは重い」「注文が遅れる」という話もありますが、API経由なら普通に使うことができます。さらにAPIの「gethealth」でサーバ状態を簡単に取得できるので、以下のようにサーバ状態を見ながら注文を出すようにプログラムを組めば、ほぼ100%注文を通すことができます。
1 2 3 4 5 6 7 8 9 10 |
healthwait = 0 health = api.gethealth(product_code="FX_BTC_JPY") while ((health['status'] == 'STOP') or (health['status'] == 'VERY BUSY')) and (healthwait < 20): time.sleep(10) healthwait = healthwait + 1 health = api.gethealth(product_code="FX_BTC_JPY") if ((health['status'] == 'STOP') or (health['status'] == 'VERY BUSY')): print('失敗') else: orderid = nariyuki_sell(api, size_vol) |
「gethealth」でステータスに「STOP」が返ってくると注文が通りません。「VERY BUSY」だと失敗の確率が上がります。
なので、10秒ごとにチェックして「STOP」「VERY BUSY」以外になったタイミングで注文を入れるようにしています。あまりにも「STOP」状態が長い場合は一旦中断にしてますが、何回か繰り返せばほぼ100%注文が通りますね。
画面でデイトレしている人たちはストレスもありそうですけど、API自動売買ならかなり確度の高い発注ができます(失敗時のリバランスが不要というわけではないので、注意!)。
便利なAPIが揃っているのがbitFlyerのAPIのメリット。超簡単に複雑な処理が組み込めます。
bitFlyerのAPIなら、IFDOCO注文も一発で発注できます。もちろん、Zaifみたいにクソ仕様ではないので、子注文の部分だけキャンセルすることもできます。便利!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# IFDOCO買い注文 def ifdoco_buy(api, size, rikaku, songiri): buy = api.sendparentorder (order_method = "IFDOCO", minute_to_expire = 10000, time_in_force="GTC", parameters = [ {"product_code":"FX_BTC_JPY", "condition_type":"MARKET", "side" : "BUY" , "size": size}, {"product_code":"FX_BTC_JPY", "condition_type":"LIMIT", "side" : "SELL", "price":rikaku, "size":size}, {"product_code":"FX_BTC_JPY", "condition_type":"STOP", "side" : "SELL", "trigger_price":songiri, "size": size} ]) |
注文のキャンセルも便利なAPIが用意してあります。「cancel = api.cancelallchildorders(product_code=”FX_BTC_JPY”)」で、発注している全ての注文を一括キャンセルできます。便利!
ちなみに、他の取引所の場合、このような一括キャンセル機能はないので、以下のように注文IDを取りながら1件づつキャンセルする必要があります。
1 2 3 4 5 |
def cancelorder(self): result_check = self.get_api_call('/orders').json() for row in result_check['models']: result = self.put_api_call('/orders/' + str(row['id']) + '/cancel').json() return result |
ただし、bitFlyerはネットアウトになるので両建ては出来ません。私はトレードロジック上、両建てをしないので特に問題ないですが、両建てしたい人はbitFlyerは使えないですね。
QUOINEX
:APIからの注文の柔軟性とセキュリティは最高。しかし、ドキュメントが日本語未対応、Pythonライブラリ無しと上級者向け。
取引所 | ![]() ![]() |
---|---|
総合評価 |
シンプルなAPI設計、レバレッジ25倍、柔軟な発注・建玉管理で自動売買に向いている取引所。APIドキュメントは日本語未対応、pythonライブラリ無しなので、それを苦にしないなら◎。 |
レバレッジ | 最大25倍 |
APIドキュメント | 英語 |
Pythonライブラリ | なし |
IPホワイトリスト | あり |
ハッシュアルゴリズム | HMAC-SHA256 |
メッセージ | JSON Web Token |
サーバ強度 |
QUOINEXも注文の失敗はほとんどありません。自動売買で安定して使える取引所だと思います(上述の2社に比べて利用者が少ないだけかもですがw)。ただし、間髪いれずに連続注文を入れると失敗するので、数秒ウェイトしてから後続の注文を入れること。
|
注文方式 |
建て玉タイプは「両建てなし」「両建てあり」「ネットアウト」から選択できます。注文タイプも「limit」「market」「market_with_range」から選択できます。なので、自分でプログラムで制御する必要はありますが、組み合わせで何でもできる柔軟性がQUOINEXの最大の利点です。
|
取引履歴CSV |
取引履歴CSVのダウンロード機能はないみたいです。APIからデータを取ることはできますが、ポジション料の情報が取れないです。画面では見れるのでスクレイピングで取るか…。
|
その他、実装上の注意点 | ポジション料を収支期待値に加味する必要あり。重要事項確認通知が出ていると、APIからの注文に失敗する?(詳細不明) |
QUOINEXが最もシンプルなAPI構成。便利機能はないが、自分で作れば何でできるのがQUOINEXのAPIの利点。
建て玉タイプは「両建てなし」「両建てあり」「ネットアウト」、注文タイプは「limit」「market」「market_with_range」から選択できますので、自分でプログラムで制御すれば一番色々できるのはQUOINEXでしょう。
本格的なトレードルールによる売買をしたいなら、QUOINEXの一択。
建て玉タイプの並列保持も可能です。例えば「両建てなし」の売りポジと「ネットアウト」の売りポジを持っているときに、「ネットアウト」の買いポジを入れると「ネットアウト」のポジションのみを相殺できます。つまり、複数の建て玉タイプを独立・並列してポジションすることも可能です。
jwt(JSON Web Token)を利用する必要があるが、pip installするライブラリに注意。
QUOINEXの場合はPythonのラッパーとかがないので、自分で作りこむ必要がありますが、注意すべきところはjwtで送る必要があるというところです。
ここで、「pip install JWT」でインストールすると、実行時にエラーになってハマるので、「pip install PyJWT」の方をインストールするようにしてください。ベース部分はこちらの記事を参考にさせていただきました。数少ないQUOINEX系記事。ありがたや~。
ちなみに、上記記事では「get_api_call」だけですけど、「put_api_call」「post_api_call」も必要ですし、必要な注文はクラスで一式作っておくと良いと思います。
重要事項確認通知に注意。放置すると、APIから一切注文を受け付けなくなる??
突然、QUOINEXのAPI注文が一切受け付けなくなり、何度やってもダメになったんですよ。
で、手動でログインしてみたら、規約の変更があったとかで、重要事項確認通知のメッセージがログイン後に出たんです。その確認作業を済ませたところ、API注文が通るようになりました。
こちらは詳細未確認ですけど、おそらく重要事項確認を放置しているとAPIが使えなくなるくさいですね…。
自動売買を断念した、その他の仮想通貨取引所。これから検証したい海外取引所
なお、以下の理由につき、自動売買を断念した仮想通貨取引所もまとめておきます。
APIはあるが、レバレッジ倍率が低いので見送り
coincheck
通常売買の方はAPIがあるが、レバレッジ口座(bitbanktrade)の方はAPIがない?
Bitbank
APIがない
DMM ビットコイン
GMOコイン
なお、海外系取引所の実装調査はこれから始める予定ですので、また追加情報があれば、本記事を更新する予定です。BitMEXとか面白そうだよねw。