VBAによる仮想通貨ビットコイン自動売買入門

取引所間価格差の取得


取引所間の価格差について

仮想通貨は同一の通貨が複数の取引所で取引されていますが、先に紹介したとおり取引所間で価格差が存在します。

同一の仮想通貨といっても、その取引価格は各市場での注文状況によって決まり、一つの取引所で大きな売り注文があれば他の取引所と比較して一時的に価格は下がりますし、逆もあります。大きな注文がなくとも、取引所が異なる以上、常に同じ価格で取引が執行されているわけではないということは理解しておく必要があります。

当然のことながら開いた価格差は取引所間で小さくなる方向に動きますが、乖離が大きい場合は特に乖離が修正されて市場価格が安定するには時間がかかります。

例えば1ビットコインがビットフライヤーで100万円で取引されている時にzaifでは70万円で取引されているとして、このタイミングでzaifで1ビットコインを購入し、ビットフライヤーで売却すれば30万円の利益を得ることが可能で、このように価格差を利用して利益を得る手法は『アービトラージ』と呼ばれています。

もっとも、大きな価格差が生まれる場合、主にロスカットの連鎖が原因であることが多く、この状況で乖離を確認してから暴落した通貨に買い注文を入れようとしてもほとんど通りません。

予め約定しなさそうな安い値段に指値で買い注文を入れておけば価格が大きく変動した時に約定しますが、効率は良くありませんし、そもそも乖離ではなく全市場で暴落している時にも買えても意味はありません。

かといって、ただでお金が拾えるといっても過言ではないような状況に何もしないようではそもそも仮想通貨で利益をあげようという目的に反し、合理的ではありません。


複数の取引所の価格を同時に取得して一覧を作成する

それぞれの取引所にアクセスして価格をチェックするのは簡単ですが、実際に人の目で確認しているようでは時間がかかりすぎてしまい、取引のチャンスを逃すリスクが大きくなります。

ここではAPIを利用して仮想通貨の価格を取得し、一覧を作成するプログラムを作ってみましょう。

目視による確認とはいっても一見して把握しやすいようにまとめることには意味がありますし、一覧を作成できる時点ですでにプログラムからそれらの情報を扱うことができているわけですから、そのまま発注作業までを自動化することが容易です。

ティッカーの取得自体はほとんどの場合PublicAPIですから、簡単に扱うことができます。

ただし、取得した情報を利用して実際に注文を行うにはPrivateAPIを使用する必要があるため、アービトラージを行いたい場合はアービトラージの対象とする複数の取引所の口座を開設しておく必要があります。


価格の比較に使用する仮想通貨取扱業者と仮想通貨

比較というからには同一の仮想通貨である必要があるため、ここでは以下の6社のAPIを利用してビットコイン価格を比較してみることにします。


ビットフライヤー
ビットフライヤーのtickerAPI
Zaif
ザイフのtickerAPI
bitbank
ビットバンクのtickerAPI
コインチェック
コインチェックのtickerAPI
QUOINEX
QUOINEXのtickerAPI

実際のサンプルコード

ビットコインの価格を取得すること方法は基本的に同じですが、戻り値の形式が異なるため、そこから必要な情報だけを取り出してセル上に整理してみます。

さらに、一目でわかりやすくするため、最低の売り気配と最大の買い気配が入力されたセルの色を変化させています。

'取引所間価格差の取得サンプル
Sub rateDifferenceCheck()
    Dim apiurl As New Dictionary 'アクセス先URLのディクショナリ
        apiurl.Add "bf", "https://api.bitflyer.jp/v1/ticker"
        apiurl.Add "zf", "https://api.zaif.jp/api/1/ticker/btc_jpy"
        apiurl.Add "cc", "https://coincheck.com/api/ticker"
        apiurl.Add "bb", "https://public.bitbank.cc/btc_jpy/ticker"
        apiurl.Add "qe", "https://api.quoine.com/products/5"
    
    Dim response As String 'レスポンス
    Dim http As New MSXML2.XMLHTTP 'XMLHttpRequest
    Dim cullency '繰り返し用の変数
    Dim num As Integer
        num = 1
    Dim minask As Double, maxask As Double
        
    Range(Cells(1, 1), Cells(4, 8)).Clear
    Cells(1, 1) = "BTCJPY"
    Cells(2, 1) = "最終取引価格"
    Cells(3, 1) = "売り気配"
    Cells(4, 1) = "買い気配"
    Cells(1, 7) = "最大価格差"
    Cells(1, 8) = "最大転売利益"
    Cells(2, 7) = "=MAX(RC[-5]:RC[-1])-MIN(RC[-5]:RC[-1])"
    Cells(2, 8) = "=-MIN(R[1]C[-6]:R[1]C[-2])+MAX(R[2]C[-6]:R[2]C[-2])"
    For Each cullency In apiurl
        num = num + 1
        http.Open "GET", apiurl(cullency), False 'リクエスト
        http.send Null '送信
        response = http.responseText '受信メッセージ
        
        Dim result As Object 'JSON形式の文字列を解析して格納するdictionary
        Set result = JsonConverter.ParseJson(response) 'JSON形式のレスポンスをパース
        
        If cullency = "bb" Then 'bitbank用
            Set result = result("data")
        End If

        Dim dict As Variant
        Dim dickey
        Cells(1, num) = cullency '通貨名表示
        For Each dict In result 'レスポンスをシートに出力
            Select Case dict
                Case "ltp", "last", "last_traded_price"
                    Cells(2, num) = result(dict) '最終価格
                Case "best_ask", "ask", "sell", "market_ask"
                    Cells(3, num) = result(dict) 'ask
                Case "best_bid", "bid", "buy", "market_bid"
                    Cells(4, num) = result(dict) 'bid
            End Select
        Next
        
        Set result = Nothing
    Next
    Dim low As Integer, high As Integer
    low = 2
    high = 2
    For num = 2 To 5
        If Cells(3, low) > Cells(3, num + 1) Then
            low = num + 1 '最安値更新
        End If
        If Cells(4, high) < Cells(4, num + 1) Then
            high = num + 1 '最高値更新
        End If
    Next
    Cells(3, low).Interior.Color = 49407
    Cells(4, high).Interior.Color = 15773696
End Sub
	 	

実行結果と考察

上記を実行すると以下のように各社のビットコインの価格、気配値、最終取引価格の最大価格差、及びこの瞬間に最良の条件で1単位の売買を行った場合に得られる利益が表示されます。

ビットコイン価格差一覧

画像のタイミングだと、最も安い売り気配はザイフ、高い買い気配はコインチェックで、この瞬間にザイフの821270円を買い、コインチェックの823001円で売れば1981円の利益が得られることになります。

上記のような価格差の取得プログラム実行時に売買を実行することもPrivateAPIを使えば可能ですし、これをスケジュールに組み込み、利益が見込めるタイミングで実際に取引を行うようにすれば、理論上は放置しておいても自動的に取引所間の価格差が利益となって積み重なっていくはずです。

そして何より取引に着手する瞬間にすでに結果が見えているため、「ポジションを持つ」というリスクを完全に排除し、短時間で取引を完結することができることが最大の魅力です。
もちろん、タイムラグなしで理想的な条件で取引が執行されれば、の話ですが。


アービトラージの注意点

一見してアービトラージには負ける要素がないようにも思えるかもしれませんが、実際に購入と売却を同時に実行するためには各取引所にビットコインと購入資金を十分に保有しておく必要があります(※証拠金取引の場合はビットコイン現物は不要)し、資金を回転させようとしても途中で送金や現金化を行う必要があるため、リアルタイム性は損なわれますし理論値通りにはなかなかいきません。

売買及び送金にかかる手数料も取引所によって異なり、単純に価格差がそのまま利益になるわけではないことには留意する必要があります。

また、上記の例では、説明を簡単にするために数量を省略しているため、必ずしもこの価格で1単位のビットコインが約定できるとは限らない点にも注意が必要です。

しかしそれでもなおこの手法は比較的リスクが小さい割に強力なものであり、せっかくAPIを利用して自動取引ツールを作成することができるのですから、取り組んでみる価値は十分にあるでしょう。

応用的な取引手法について

アービトラージ(補足)