JavaScript(node.js)を使った仮想通貨アービトラージ(裁定取引)のやり方

JavaScript(node.js)を使った仮想通貨アービトラージ(裁定取引)のやり方 サムネイル

「 アービトラージをやって見たいけどJavaScript(nodeJS)でサクッとできないのかなあ 」 という人へ向けてまずは各取引所の板から価格を取得して、そこから価格差を導き出すプログラムをアービトラージの基礎として解説しました。

「Pythonの方がいいなあ」という人は【Python】 仮想通貨アービトラージ自動売買botの基本 【価格差の取得】へどうぞ。

 

こちらの記事から始めても大丈夫ですが、この記事で利用するccxtライブラリなどについて分からなければ、前回の記事【 JavaScript(node.js) 】 bitFlyerからAPIで売買注文を入れる方法 【コピペ】を参考にしてみてください。

bitFlyerからAPIで売買注文を入れる方法 JavaScript編 サムネイル

【 JavaScript(node.js) 】 bitFlyerからAPIで売買注文を入れる方法 【コピペ】

2019年6月28日

 

この記事はアービトラージについての解説であるのと同時に、初心者向けが足掛かりとなるための解説にもなっています。

実践的なアービトラージができるプログラムが欲しい人はnoteで買える仮想通貨の自動売買botや関連noteをまとめてみたを参考にして見てください。

 

この記事を読めば JavaScript(node.js)を使った仮想通貨アービトラージ(裁定取引)のやり方 の基礎を身に付けることが出来ます。

 

nodeJSでのアービトラージのロジック

いうまでもないですが「安い価格で買い、高い価格で売る」これを取引所に置き換えるだけですね。

転売と全く変わりません。

 

しかし、物と違ってリアルタイムで価格が変わっていきます。

したがって、リアルタイムで取得していき、安い価格と高い価格の取引所を見つけて売買するロジックとします。

 

今回の記事で考慮しないポイント

・手数料(送金手数料や売買手数料)

・送金時間

・空売りを交えた売買(クロス取引)

・ビットコイン以外の通貨

・買い数量の調整

他にも精度を高めるための視点は色々ありますが、上記5つのポイントなどを考慮しつつ利益を出せるようにする実践的な部分は話が分岐して細かくなってしまうためここでは無視しています。

 

実際に利益を出していこうとするといくらくらいの価格差から実行するべきかどうかは、過去データを使って仮の送金時間などを考慮に入れてバックテストした方が良いでしょうね。

 

ですがその前にまずは動かせるようになりたいところです。

 

ターゲットとなる取引所の板情報を取得しよう

今回はテストとして5つの国内取引所(bitbank・bitflyer・coincheck・liquid・zaif)を対象にしました。

ですがまずは一つの取引所の板情報を取得してみましょう。

 

(UdemyのNode.jsの基礎から学ぶ、ビットコイン自動売買プログラムで紹介されているとても分かりやすいコードを途中まで参考にさせてもらいました。この記事読んでも微妙だったという人はぜひ講座を購入してみてください。0から分かります。

また、後半は自分用のカスタマイズしたコードを載せています)

上記のコードを実行すると以下の結果を得ることができます。

およそ2秒毎にbitflyerの買いと売りを取得して出力されていきます。

 

ccxtライブラリのインストールがまだ終わってないという人は以下のコードをVScodeなどのターミナル(コマンドプロンプト)に入力しましょう

もしインストールできない場合は、npmパッケージをインストールしていない場合も考えられます。npm入門 – Qiitaの記事通りにインストールしてみてください。

 

コード解説

ここでccxtライブラリのbitflyerへ命令を送るためのデータを取得しています。
bitflyer.fetchTickerで板情報を取得して、results配列へ格納しています。

results配列の[0]の中にTickerデータが入っているのでconsole.logでbitflyerTicker.askのコマンドで買い気配値を取得しています。

 

2秒間隔で実行されるコード

↓↓↓↓↓で引数intervalの値(2000)を受け取ってstopTerm関数が実行されます
上記のように、一通りの処理が終わったらawait stopTerm()関数がinterval引数をtimer変数として受け取り、2秒間、処理を止めてくれているので、2秒後に再び処理が実行されます。

 

while(true)というのは処理が真である間は処理を延々と続けるという意味になります。

偽になる条件を処理の中に入れていないためwhile(true)はずっと適用され続けることになります。

しかし繰り返しのインターバルは決まっていないため、interval = 2000(2000ミリ秒つまり2秒)でストップ期間を入れています。

 

データを受け取るタイミング調整を行うための非同期処理(async / await)

ここではbitflyerの板情報のみを取得するための解説ですが、次の項では複数のデータを呼び出します。

ccxtライブラリで各取引所にあるAPIサーバーへ「データが欲しい」と伝える訳ですが、APIサーバーによって反応スピードが異なります。

 

そのため、取得できるタイミングがバラバラになり出力もバラバラになります。

そこで、バラバラになるタイミングだけ非同期処理(asyncのawait)を挟み込み、非同期処理の処理が終わり次第、次の処理を実行できるようにしています。

順番に処理が進むことは同期処理と言います。

草猫店長
非同期処理とは一言でいえば、いつ終わるか分からない処理のことだにゃあ

 

全体をasync function()とasync関数にします。async関数の中でのみawaitを使うことができます。

awaitで処理される内容は、処理が完了するまで次の処理へ進みません。

 

次に通常通りの、いつ処理が終了するのか関係なく処理していきます。同期処理です。

 

最後にawait sleep (interval)でstopTerm関数の処理が終了するまで待ちます。

 

asyncの外ではawaitは使えません。await stopTerm()で処理をasyncの外側で行うためにnew Promise()と呼ばれる別の非同期処理メソッドを使っています。

resolve()とは処理が成功した際に呼び出します。

reject()とは処理が失敗した際に呼び出します。(このコードでは書いてません)

 

もっともお得な組み合わせで価格差を出力して見よう

ここまでで処理の基本が理解できたと思うので、実際に先ほどのコードに少し手を加えて最高値の買い価格と、最安値の売り価格を見つけて差益を出してみましょう。

このコードでは、単純にccxtで呼び出す取引所の数を5種類にまで増やしました。

fetchTicker(板情報の取得)もそれぞれ5回を行います。

しかし、5回ともデータを取得できるタイミングは異なりますのでawait Promise.all()メソッド内で非同期処理を待ち、それから価格を出力しています。以下が結果です。

およそ2秒毎に呼び出されるようになっています。

 

for文で最高値と最安値を取得しつつresults配列の何番目が該当するのかaskIndex、bidIndexで格納しておきます。

fetchTickerの各取引所のデータを保有しているresults配列に、{ name: 取引所の名前 }のプロパティを追加します。

例えばresults[0]の中身は{ fetchTickerデータ, name: bitbank }のようになっており、nameキーと取引所の名前が追加されています。

 

そして結果を出力しました。

 

もう少し実践向けに拡張性のあるコード例

※あくまで初心者層を想定して公開しています。より良いコードは知り合いのエンジニアか質問サービスか何かでコードのレビューを尋ねて見てください。

 

先ほどのコードでもアービトラージの仕組みを作っていくこともできますが、比較する取引所が増えると面倒です。

先の項では足し算式にccxtライブラリを増やして、処理をしています。

 

しかし、実際に注文などを交える場合は、apiキーを取得して引っ張ってきたり、取引所名を色々な場所から引っ張ってきたり、データの流れがごちゃごちゃしていきます。

ですので一つにデータをまとめる形で処理した場合のあくまで一例として下のコードを作ってみました。

そのままコピペして出力すると以下のような結果が帰ってきます。

targets配列の中にオブジェクトを作り、targetsをバケツリレーのようにデータを追加しながら回していきました。

targets以降の処理では実際にtargetsのオブジェクトのプロパティに、キーと値を追加していきどこからでもデータを引っ張りやすくしています。

 

コードではccxtキーとその値、tickerキーをその値を追加していって必要に応じて引っ張っています。

また、targetsに別の取引所を追加するだけで比較対象を増やせるので先のコードよりも拡張性は高いと言えます。

 

JavaScript(node.js)を使った仮想通貨アービトラージ(裁定取引)のやり方 まとめ

JavaScript(node.js)を使った仮想通貨アービトラージ(裁定取引)のやり方 まとめ

非同期処理ならnodeJSが得意とすることです。この点においては他の自動売買で人気なPythonにも引けを取らないかなと思います。

 

この記事を読んでccxtのことがよく分からなかった人はまずはccxtにフォーカスしてAPIを使って注文を行うことを解説した前記事である【 JavaScript(node.js) 】 bitFlyerからAPIで売買注文を入れる方法 【コピペ】を読んでみてください。

bitFlyerからAPIで売買注文を入れる方法 JavaScript編 サムネイル

【 JavaScript(node.js) 】 bitFlyerからAPIで売買注文を入れる方法 【コピペ】

2019年6月28日

 

最近は自動売買botをプログラミング知識なしでもできるWebサービスのQUOREAなんかがあります。

QUOREA内で自作botを作って人気になれば十分なお小遣いは得られるので興味があればQUOREA(クオレア)とは 実際に使って理解したメリットとデメリットを読んでみてください。

QUOREA(クオレア)とは サムネイル

QUOREA(クオレア)とは 実際に使って理解したメリットとデメリット

2018年9月6日