はじめに
ビットコインの自動裁定取引システムのプロトタイプを開発しました。
以下の取引所に対し、3秒ごとに板情報を解析し、裁定機会があれば注文を送信します。
- Bitflyer
- Quoine
- Coincheck
目標とするスプレッドの広さ、注文数量、空売りの許可等は、設定ファイルで調整可能です。
ソースコードを以下に公開しました。
https://github.com/bitrinjani/rinjani
各取引所に口座開設をし、APIキーを取得すればだれでも実行可能です。
ライセンスはMITで、無償で無制限に利用可能です。
裁定取引で収益をあげられるのか?
ビットコインには、取引所間での価格差を利用した裁定機会が残っています。実際に各取引所で配信されている価格をみると、タイミングによってはかなりの価格差があります。
この価格差を利用して、ある取引所で安く買い、同時に他の取引所で高く売れば、Bitcoinの価格変動にかかわらずリスクなしに収益を得られることになります。
大半のBitcoin取引所はAPIを公開しており、理論的には一瞬の価格差を利用して、自動取引で継続的に収益を上げることが可能です。仮に価格差が非常に小さかったとしても、10秒単位で繰り返し取引を行うことで累積収益は十分に大きくなる可能性があります。
例えば、10秒に一度裁定機会をみつけ、10円の収益を上げる自動裁定システムを開発したとしましょう。一見たった10円に思えるかもしれませんが、秒速1円の収益です。このシステムを24時間一ヶ月間連続で作動させると60*60*24*30 = 2,592,000、つまり250万以上の収益となります。悪く見積もって1分に10円の収益であっても、月45万となります。
実際の実行結果
以下は実際にこの自動裁定取引システムを実行したときのスクリーン動画です。
約30秒で二回の裁定機会を捉え、66円の収益を上げています。取引所の手数料等を差し引いても、秒速1円以上の収益を上げています。
このことから、Bitcoin市場には十分な裁定機会がある、と結論付けることができます。
しかし、実際にしばらく運用した後、長期運用にはいくつかの現実的な手間とコストが発生することが判明しました。それについては後述します。
自動裁定取引システムの動作
裁定取引フロー
- 3秒ごとに、各取引所から板情報(価格・数量ペアのリスト)を取得する。
- 現在のBitcoinポジションのネットエクスポージャーが設定された最大値を超えていないかチェックする。超えている場合、システムを停止する。
- 各取引所から取得した板情報のうち、裁定取引の対象になりえないものを取り除く。例えば、Bitflyerで現在のポジションが0で、かつ空売りをしない設定の場合、Bitflyerからのビッド(売値)は取り除く。
- 最良ビッド(売値)、最良アスク(買値)を計算する。もしそのスプレッドが逆転してない場合(買値が売値より高い場合)、裁定機会は存在しないため、ステップ1に戻る。
- スプレッドが逆転しているとき、期待収益(仮に最良ビッド/最良アスクで売り買いできたときにどれだけの収益が得られるか)を計算する。その値が設定された目標収益を超えている場合、各取引所に指値注文を送信する。
- 注文送信後、3秒ごとに各注文が約定したかチェックする。
- もし売り買い注文両方が約定した場合、収益を表示しステップ1に戻る。
設定
設定はconfig.jsonファイルで行います。全体に影響する設定と、各取引所(ブローカー)に対する設定があります。
設定項目は、裁定取引システムの先駆者であるBlackbirdを参考にしています。
全体設定
Name | Values | Description |
---|---|---|
DemoMode | true or false | 真のとき、裁定機会の解析は行うが実際の注文は送らない。 |
PriceMergeSize | integer | 板情報の細かい価格を集約する。100に設定されているとき、100円刻みにクオートの数量を合計した板情報を再構成し、その板情報に対し裁定機会の計算を行う。 |
MaxSize | decimal | 取引所に送る注文数量の最大値。仮にこの値よりも大きい数量で裁定可能であっても、この設定値の注文を送信する。 |
MinSize | decimal | 取引所に送るオーダー数量の最小値。裁定機会がこの値より小さい数量の場合、取引を行わない。 |
MinTargetProfit | integer | 最小目標収益。裁定機会の期待収益がこの値より小さい場合、取引を行わない。 |
IterationInterval | Millisecond | 裁定プロセスのインターバル。この値が3000に設定されている場合、3秒に一回板情報を取得し裁定機会を探る。 |
PositionRefreshInterval | Millisecond | ポジション更新インターバル。 |
SleepAfterSend | Millisecond | 裁定取引完了後、このミリ秒だけ休止する。 |
MaxNetExposure | decimal | 最大ネットエクスポージャー*。取引所の合計ネットエクスポージャーがこの値を超える場合、システムを停止する。 |
MaxRetryCount | integer | 裁定取引のオーダーを送信後、注文の約定状態をチェックする最大回数。 |
OrderStatusCheckInterval | Millisecond | 裁定取引の注文を送信後、注文の約定状態をチェックするインターバル。 |
*ここでのネットエクスポージャーとは、各取引所のポジションを合計した"BTC数量"です。一般にはエクスポージャーには数量ではなく割合を指すが、簡略化のため数量としています。例えば、Bitflyerで0.1 BTC, Quoineで0.1 BTC, Coincheckでマイナス0.1 BTC(空売り)のとき、ネットエクスポージャーは 0.1 + 0.1 - 0.1 = 0.1 BTCとなります。仮にMaxNetExposure=0.05と設定されていた場合、0.1 > 0.05のためシステムは停止します。
取引所設定
Name | Values | Description |
---|---|---|
Broker | Bitflyer, Quoine or Coincheck | 取引所名 |
Enabled | true or false | 裁定取引の対象とするかどうかの設定 |
Key | string | 取引所APIのキーもしくはトークン |
Secret | string | 取引所APIのシークレット |
MaxLongPosition | decimal | 最大ロングポジション |
MaxShortPosition | decimal | 最大ショートポジション |
CashMarginType | Cash, MarginOpen, MarginClose or NetOut | オーダータイプ。現物、証拠金取引オープン、証拠金取引クローズ、ネットアウトのどれか。(取引所ごとにサポートしているタイプは異なる) |
問題点
取引所の証拠金取引(レバレッジ取引)の可否
取引所によっては、証拠金取引が行えないケースがあります。
例えば、Bitflyerは証拠金取引を「ビットコインFX」として提供していますが、ビットコイン現物とはまったく異なる価格帯で取引が行われています。ビットコインFXに対しては、シンプルな価格比較では裁定取引が行なえません。
そのため、Bitflyerに対しては、この自動裁定取引システムはビットコイン現物のみを裁定対象としています。
レバレッジがかけられないと、ショートポジションが取れない、多額の現金が必要になるなど、継続的な裁定取引の障害となります。
取引所のAPIのスピード、品質
取引所によっては、APIから指値注文を送信後、10秒以上実際の注文が作成されない場合があります。この現象は特にBitflyerで一時的に発生します。これがAPIインフラの遅延なのか、意図的なものなのかは不明ですが、10秒遅れると約定する見込みはほとんどなくなります。
また、取引所によってAPIの品質に非常に大きなばらつきがあります。今回使用した3社だけでなく、7社の口座を開設しAPIの使用感を確認しました。
使いやすさ、統一性という点では、Bitflyer, Quoineが非常に素晴らしいAPIを提供しています。(上記のようにBitflyerにはスピードの問題がありますが、それはAPI設計ではなくインフラの問題だと思われます)
それに対し、Bitbank, Bitpointなど、価格取得すら安定的にできないレベルのAPIを提供している取引所も多数あります。
より多くの取引所を対象にすれば、より多くの裁定機会を見つけられるはずですが、実際に裁定取引に耐える品質のAPIを提供している取引所は多くありません。
取引所ごとの価格の偏りから派生するポジションの偏り
取引所ごとに、価格の高低に偏りがあります。例えば、Bitflyerは安値になる傾向があり、Quoineは高値になる傾向があります。このとき、裁定取引はBitflyerに対し買いを出し、Quoineに対し売りをだすことになります。そして、この傾向が長期間続くとBitflyerではロングポジションが増大していき、Quoineではショートポジションが増大していきます。
各取引所でポジションが偏ると、その分だけ現金・証拠金が多く必要になります。また、偏りをならすために取引所間でBitcoinを移動する必要が出てきます。Bitcoinの移動の手数料は大きくありませんが、移動後の取引所内で売り買いの決済取引のコストが発生します。決済取引のコストは、その取引所のその時点のスプレッドとなり、1BTCあたり1000円以上になることがあります。
結論
自動裁定取引システムである程度の収益を上げることは十分可能です。今後さらに取引所API、取引所システムが洗練されていけば、より効率的に裁定が行えるようになっていくはずです。それに伴い、裁定取引への参入者が増え、各人の裁定収益は減っていくことも予想されます。
品質の悪いAPIを提供している取引所を逆に自分以外への参入障壁とみなし、あえてそこで裁定取引を行うことで独占的利益を得られるかもしれません。
はじめまして、プログラム勉強中の者です。
すみません、教えてくださいBitflyerのAPIは何を参照するのでしょうか?
公式サイトでは四つほどあるようですが、どれを利用されていますか?
bitFlyer Lightning API
chainFlyer API
bitiFlyer Lightning API Playground
bitiFlyer Echo API
はじめまして。コメントありがとうございます。
本アプリケーションでは、bitFlyer Lightning APIを利用しています。
ありがとうございます!