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

仮想通貨自動取引ツール


投資効率を高める自動取引

仮想通貨の売買を行う場合、普通はアプリやサイトを通じて注文を発注する必要があります。

前のページのビットコイン売買補助ツールも、ビットフライヤーの取引所サイトをベースに、表示されたページから情報を取得し、手作業で発注するという流れを想定していました。

ここからは、よりプログラムを使用するメリットを生かして『APIを利用した自動取引』を行うためのツール開発を考えてみます。

目指すところは仮想通貨自動取引プログラムの完成と運用です。

一度作ってみれば同じ流れでいろいろな取引所で使用できる自動取引ツールを作ることができるはずです。

取引にあたってある情報を参考に同じ判断基準で同じ売買決定をして注文しているとしたら、それらの作業をコンピュータに任せることができれば、人為的なミスを排除し、時間を有効に使うことができます。


自動売買ツール作成にあたっての注意点

実際のところ、ビットフライヤー等の取引所が提供しているAPIを利用してビットコイン等仮想通貨の自動売買を行うプログラムをVBAで作ること自体は、そこまで難しいことではありません。

重要な問題は、①どのようなロジックで発注を行うか、②リスクの予測と対策がしっかりできているか、③セキュリティに対する認識と管理は大丈夫か、の三点です。

一点目のロジックについてですが、売買補助ツールの説明で触れたように、値動きと売買判断の結果の累積からロジックの成績を判定することができます。

良い売買ロジックができたと思ってもすぐに実際の売買を実行せず、バックテストを重ねて統計的な裏付けを取ることが大切です。

判定さえ優れていれば手動による発注でも十分な利益を得ることができますが、自動化することで取引可能な機会が大幅に増加し、より大きな利益を見込むことができます。

その一方で、期待値がマイナスになるような売買判定ロジックを元に自動取引を行えば、一時的には偶然プラスになることはあるかもしれませんが、長期的に見て必ず、それも手動での取引よりも速いペースでマイナスになります。

二点目のリスクですが、自動売買を行う場合、誤発注でとんでもない損失を発生させる可能性があります。

もちろん手動でも誤発注の可能性はありますが、自動の場合は完全に目を離している間にも売買が実行されてしまうわけですから、何が起こるかわからないという恐ろしさは十分に認識しなければなりません。

正常に動作していたとしても、例えば下落トレンドの中で延々と逆張りで買いを繰り返すようなロジックのツールに売買を行わせていれば、わずかな時間でも取り返しのつかない額の損失に膨れ上がることがあります。

単純にロスカットを組み込むだけではなく、資金のマイナス変動が一定以上になったら様子を見るなど、資産を守るための事前の対策は必ず行ってください。

いくら判定ロジックが優秀だったとしても、プログラムが誤動作する可能性は考えておくべきです。

三点目のセキュリティに関してですが、たびたび仮想通貨の流出事件が起こっています。100%安心という保証はありませんが、信頼できる取引所を選ぶところからアカウント、パスワードの管理を厳重にすることが最低限必要です。

さらにプログラムを作成して自動取引を行う場合、APIのキーやパスワードを使用する必要がありますが、それらの情報が流出する可能性を忘れてはいけません。

これについてはビットフライヤーのAPI解説ページでも注意喚起されています

念のためbitFlyer Lightning API Playgroundに記載されている注意事項を引用しておきますので、熟読したうえで慎重に取り扱うようにしてください。

API はプログラム等で自動取引等を行うためのサービスです。プログラムおよびセキュリティーについて十分な知識がある方向けのサービスです。

※ API Secret を第三者に漏洩した場合は、第三者によりお客様の資金の操作・取引等が行われ、損害が発生する危険があります。

API Key および API Secret はお客様の責任で厳格に管理及び保管願います。
当社では、二段階認証の設定を非常に強く推奨しております。
API のご利用においても二段階認証を設定しない場合等のお客様の管理不十分、使用上の過誤、 API Key を含むログイン情報の漏洩等によるいかなる損害について当社は一切の責任を負いません。

プログラムで使用の際は、API Secret はお客様で暗号化してご使用ください。
この暗号化するための鍵は、お客様の自己責任で管理ください。画面入力等で入力するなど鍵をプログラム、テキスト、データベース等に保管しないことを強く推奨します。
お客様のプログラム上で使用した API Secret は、必要がなくなり次第メモリより削除ください。
API Secret を平文のままプログラムに記入、テキスト、データベース等、または Git などのバージョン管理システムに絶対に保管しないでください。
二段階認証をしていても、ブラウザのハッキングや、不正なプラグイン、トロイ、肩越しに見られる等のリスクがあり、これらを含む一切のリスクに対する責任はお客様にあります。

※これらの注意事項はご参考までに一例を示したものであり、全てを網羅しているわけではありません。

API Playground は本番環境です。お客様の責任の下 API Secret を利用してください。
当社及び当社提携先以外のサービスでは、絶対に API Secret を提供しないでください。


自動取引ツールの作成と運用の方針

プログラムの作成にあたり、使用するAPIと、どのような取引をどの市場で行うのかを検討しましょう。


ツールで利用するAPIの決定

ここでは、取引所が提供しているAPIの使い勝手がよく、取引所としても国内の仮想通貨取引所として初のアメリカ、欧州進出を果たし、世界140の仮想通貨取引所の中でも世界最高レベルのセキュリティであると評価されるなど、信頼という点で優れているビットフライヤーが提供しているAPIを利用します。

他の取引所APIを使ってはいけないわけではもちろんありませんが、自分の失敗以外で損失を被るリスクを可能な限り最小限に抑えるという観点からも、ビットフライヤーをおすすめします。

ビットフライヤーのprivateAPIを使用して取引を行うためにはAPIKey及びAPISecretの発行を受ける必要がありますので、まず最初に口座を開設してください。

bitFlyer ビットコインを始めるなら安心・安全な取引所で


取引の対象とするサービスの検討

bitFlyerLightningではBTC_FXの取引手数料が無料(※キャンペーン)なので、これを利用することにします。

取引手数料が無料というのは投資家にとって有利な条件です。

一応キャンペーンですからいつか終わりが来るとは考えられますが、これを利用できるうちに利用しない理由はありません。

API自体についても過去に株やFXのAPIを公開してきた証券会社は数多くありますが、様々な理由で提供を終了しています。取引APIの提供を続けているのは大手証券会社ではカブドットコム証券のみです。

その意味ではAPIを使用したツールというものは永続的に使用できるとは限らないため、最新の情報に乗り遅れないよう常にアンテナを張り、それをいち早く利用することができるように備えておくことが大切です。

また、bitFlyerLightningを使うメリットとして特殊注文が充実していることが挙げられます。

ツールによる自動取引を行うに当たり、その中でもIFDOCO注文を利用します。

買いでエントリーした場合、通常の取引なら値動きをみて十分に上がれば利確、下がりすぎれば損切といった具合に、適当なタイミングで反対売買(決済)注文を行う必要がありますが、IFDOCO注文の場合、最初の発注(親発注)時にこれらの注文を予約することができます。

結果として利確になるか損切になるかは分かりませんが、親発注の時点である意味では売買注文作業が完結し、後のことを考える必要がなくなるため、常に次の発注に集中することができ、シンプルで効率的な処理を行うことが可能になります。

マイナス手数料について

取引所を介して取引を行う場合、取引手数料がかかるのが一般的ですが、ビットフライヤーの取引手数料無料キャンペーンのように、投資家にとって有利な条件で取引を行うことができる場合もあります。

例えばbitbankbitbankではアルトコインのメイカー及びテイカ―取引に対してマイナス手数料(所定の取引を行うことで投資家側が手数料を得ることができる)キャンペーンを実施していました。

マイナス手数料キャンペーン

※マイナス手数料はすでに終了

マイナス手数料キャンペーン終了後も手数料無料キャンペーンを実施しており、取引を行うためのAPIも公開されていますから今後自動取引ツールの開発を進めていくうえで口座は用意しておいた方がよいでしょう。

特に自動売買を行う場合には売買回数が多くなることが予想されますので、手数料について有利な条件の取引所を調べておくことはとても大切です。


自動取引ツール作成・APIを使う準備

それでは実際にAPIを通して売買を行うツールの開発を始めましょう。

なお、この先はAPIに関する説明(API Documentation)を適宜参照しながら作業を進めてください

まずはログインし、bitFlyerLightningのページからAPI画面へ移動し、APIKeyおよびAPISecretを発行します。前述のように、取り扱いには十分に注意してください。

次に、自動取引ツールに必要なAPIを確認します。

APIKeyには制限を設けることができますので、流出時のリスクを軽減する意味でも使用する機能のみをチェックするべきですが、テストとしてはシンプルに①レートを取得する機能、②自分の口座残高を取得する機能、③特殊注文を行う機能があれば十分でしょう。

なお、BTC-FXでは証拠金取引を行う必要があるため、事前に十分な資金を円口座に入金し他たのち、FX口座へ送金しておいてください。口座間の資金の移動は簡単に行うことができます。

ビットフライヤーのFXでは15倍までのレバレッジをかけることができますが、ビットコインのボラティリティを考えると最初から安易に倍率を上げず、最初はせいぜい3倍程度にしておくのが無難です。


VBAからAPIを利用して取引を行う

APIKeyおよびAPISecretが準備できたら、実際にVBAでプログラムを作成していきます。


BTC-FXのレートを取得する~PublicAPI

まずは①のレートを取得するAPIを使ってBTC-FXのレートを取得してみましょう。

gettickerAPIを使用します。

tickerapiの説明

ここではXMLHttpRequestを利用してデータの送受信を行うのにMSXML2.XMLHTTPを参照するため、Microsoft XMLの環境に応じたバージョンを参照設定で追加しておいてください。

また、Dictionaryを使用するため、参照設定でMicrosoft Scripting Runtimeを追加してください。

vbeの参照設定画面

なお、「Microsoft XML」への参照を設定をする際、Windows7以前であれば"Microsoft XML, v6.0"を、Windows8以降であれば"Microsoft XML, v3.0"を設定するようにしてください。

"Microsoft XML, v6.0"を使用してエラーが発生する場合には、サンプルの"MSXML2.XMLHTTP"の部分を"MSXML2.XMLHTTP60"に変更してみてください。


サンプルコードと実行結果は以下のようになります。

Sub getticker()
    Dim response As String
    Dim http As New MSXML2.XMLHTTP
    http.Open "GET", "https://api.bitflyer.jp/v1/getticker", False
    http.send Null 'リクエストを送信
    response = http.responseText 'レスポンスを取得
    MsgBox response 'レスポンスを表示
    
    Dim result As Object
    Set result = JsonConverter.ParseJson(response) 'レスポンスをディクショナリに変換
    Dim i As Integer
    i = 1
    For Each key In result 'レスポンスをシートに出力
        Cells(i, 1) = key 'キー
        Cells(i, 2) = result(key) '値
        i = i + 1
    Next
    Set result = Nothing
End Sub

以下は上記のmsgboxでレスポンスの内容を表示したところです。

json形式で受信したレスポンス

正しくtickerを取得することができますが、返ってくる値がJSON形式の文字列になっているため、ここから注文のもとになる情報を取り出しやすいように整形する必要があります。

受信だけではなく、送信の際にもJSON形式を使用してデータのやり取りをする必要がありますが、独自に解析して変換するのは大変なので、ここではTim Hall氏が公開しているVBA-JSONを使わせてもらいます。ダウンロードしたらJsonConverter.basをインポートします。

先ほど見たレスポンスはJsonConverter.ParseJson()を使って簡単にディクショナリ形式にパースすることができ、サンプルのように簡単なコードで値を取り出すことができます。

ディクショナリに変換したレスポンス

このように、webAPIを利用するとブラウザからサイトにアクセスしていなくても情報を簡単に取得することができます。

XMLHttpRequestはビットフライヤーのAPIに限らず、他のAPIを利用する際にも使用しますので、汎用的に使えるようにまとめておくと便利です。

なお、実行してみればわかると思いますが、timestampは協定世界時 (UTC)です。必要に応じて日本標準時 (JST)に変換して使ってください。


口座残高を取得する~PrivateAPI

次に、PrivateAPIを利用する練習を兼ねて口座残高を取得してみましょう。

getbalanceAPIを使用します。

getbalanceAPIの説明

先ほど取得したAPIKeyおよびAPISecretを使用し、APIに渡すための情報を生成する必要があります。

具体的な生成方法は先に挙げたビットフライヤーのAPI Documentationに記載してあるので、確認してください。

その中でSHA256によるハッシュの生成HMACの算出を行う必要があります。

なお下記のコード中、HMACSHA256に該当する関数はここでは用意していないため、WindowsのExcel VBAから.NET Frameworkの暗号サービスを呼び出す方法 などを参考にして作成し、実際にAPIKeyおよびAPISecretを使って試してみてください。

再三の注意になりますが、プログラムを作成する際や実行する際、APIKeyやAPISecretを絶対に他人に見られたりしない環境で作業を行うようにお願いします。

keyとsecretは自分で取得したものを使ってください。
なお、下記はあくまでHTTPリクエストを実行するためのサンプルコードであり、keyとsecretをこのように暗号化せずに用いることは前述したbitflyerの注意事項でも推奨されていませんのでご注意ください。

Option Explicit

'ビットフライヤーのAPIテスト用サンプルプログラム
Sub apiTest()
    Const endPoint As String = "https://api.bitflyer.jp" 'エンドポイントURL
    Dim method As String 'HTTPメソッド
    Dim path As String 'APIパス
    Dim query As String 'パラメータ
    Dim url As String 'リクエストアドレス
    Dim timestamp As String 'UNIXタイムスタンプ
    Dim body As String 'リクエストボディ
    Dim response As String 'レスポンス
    
    Dim key As String 'Apikey※取り扱い注意
        key = ""
        
    Dim secret As String 'Apisecret※取り扱い注意
        secret = ""
    
    method = "GET" 'メソッドを指定
    path = "/v1/me/getbalance" 'APIパスを指定
    query = "" 'クエリを指定
    timestamp = DateDiff("s", "1970/1/1 9:00", Now) 'タイムスタンプを取得
    
    Dim data As String '送信データを生成
    data = timestamp & method & path & query
    
    Dim hash As String '
    hash = HMACSHA256(data, secret)
    
    url = endPoint & path
    
    Dim headers As New Collection 'ヘッダー
    headers.Add key, "ACCESS-KEY"
    headers.Add timestamp, "ACCESS-TIMESTAMP"
    headers.Add hash, "ACCESS-SIGN"
        
    response = HttpRequest(method, url, headers) 'API呼び出し
    Dim collections As Object '複数のディクショナリを格納するコレクション
    Set collections = JsonConverter.ParseJson(response)
    Dim i As Integer
    Dim dict As Variant
    Dim dickey
    i = 1
    For Each dict In collections 'レスポンスをシートに出力
        For Each dickey In dict 'レスポンスをシートに出力
            Cells(i, 1) = dickey 'キー
            Cells(i, 2) = dict(dickey) '値
            i = i + 1
        Next
    Next
    Set collections = Nothing
End Sub

注.以前掲載していたサンプルでbitflyerのprivateAPIを呼び出すことはできていましたが、HMACの算出コードが怪しかったため削除しました。

また、bitbankのAPIでは使用時には上記UNIXタイムスタンプの1000倍の値が使用されているようです。


'Httpリクエストの送信
Public Function HttpRequest(method, url, headers) As String
 
    Dim http As New MSXML2.XMLHTTP
    http.Open method, url, False 'Httpリクエスト
    If headers.Count > 0 Then 'ヘッダを追加
        http.setRequestHeader "ACCESS-KEY", headers("ACCESS-KEY")
        http.setRequestHeader "ACCESS-TIMESTAMP", headers("ACCESS-TIMESTAMP")
        http.setRequestHeader "ACCESS-SIGN", headers("ACCESS-SIGN")
    End If
    http.send Null 'リクエストを送信
    If http.Status <> 200 Then
        Stop 'エラー
    End If
    HttpRequest = http.responseText '結果を受信
 
End Function

これを実行して以下のように口座残高情報がシートに出力されれば成功です。

ディクショナリに変換したレスポンス

tickerでの戻り値はdictionaryでしたが、getbalanceではdictinaryのcollectionになっているため、シートへ出力する部分を変更しています。

レスポンスの詳細は各リクエストの説明を見れば分かるので、それぞれのレスポンスに応じた処理を実装してください。

なお、上記HttpRequest内でヘッダーのラベルを直接指定していますが、これはbitflyerのAPIに必要なラベルなので、別の取引所のAPIを使用するときには必要に応じてカスタマイズしやすいようにしておくとよいでしょう。


特殊注文の親注文発注処理を作成するする~PrivateAPI

それではいよいよ③の特殊注文発注処理を作成します。

ただ、ここまでと違う点としてはHTTPメソッドがGETからPOSTに変わるくらいです。

②までが動くプログラムが作成できていれば問題なく進められるはずなので、サンプルコードは省略します。

ある程度の経験を積むという意味でも自分なりにデバッグを繰り返しながらプログラミングを進めてみてください。


スケジュールを組んで自動売買処理を実行させる

さて、これで部品が揃いました。

あとはAPIで取得したレートから発注時点で買いなのか売りなのかを判断するロジックを考えてバックテストを行ってください。

納得のいく売買判断ロジックができたら、それを組み込んで発注を繰り返すようにスケジュールをセットするだけです。

ただし、以下のようにAPIには利用制限が設けられているため、よく確認してください。

bitflyerapiの利用制限

スケジュールのセットについてはビットコイン売買補助ツールのサンプルプログラムにもありますので、参考にしてください。

プログラムが完成したらエクセルを起動し、実行するだけで自動で売買が繰り返されます。

優れた売買判断ロジックであれば、わずかな時間で莫大な利益を上げることができるでしょう。

もちろんその逆になる可能性もありますので、自動売買ができるようになったからといって油断は禁物です。

研究を重ね、資産を勝手に増やしてくれる自動取引ツールが完成することを願っています。

ビットコイン売買補助ツール

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