Python×ビットコイン自動売買

#12 Python×ビットコイン自動売買 | リアルタイムでビットコイン価格を取得し続けよう!

keep-getting-ticker-by-coincheck

こんにちは、はやたす(@hayatasuuu )です。

この記事では、リアルタイムでビットコインの最新価格を取得し続ける方法を紹介していきます。

実は、以前にもビットコインの最新価格を取得するAPIは紹介しました。

»以前の記事 : #4 Python×ビットコイン自動売買 | Coincheck APIを使って最新価格を取得しよう!

 

以前と違うのは、今回紹介するAPIでは「ビットコインの最新価格を取得し続ける」という点です。

つまり1回のアクセスで、1つの最新価格を返すのではなく、ずっと最新価格を返し続けます。

第4回目で紹介したAPIを使えば、以下のようなコードを書くことで、物理的に最新価格を取得し続けることは可能です。

import requests

BASE_URL = 'https://coincheck.com'
url = BASE_URL + '/api/ticker'

while True:
    r = requests.get(url)
    print(r.json())

 

でも、これだとAPIにかなりの負荷をかけてしまいます。

スクレイピングするときは、リクエスト後にsleep()を挟むことで、この過度なリクエストを避けていました。リアルタイムで取得する必要もないので、小休憩を入れても問題ないですよね。

一方でビットコインの価格は、常に変動し続けています。さらに自動売買となると、価格によって売買を判定するので、リアルタイムで取得する必要性が出てきます。

こんなとき、毎回のリクエストを避けて「1回のリクエストをしたあとに、更新があったらデータを送ってもらう」のが、今回紹介していくWebSocket APIになります。

 

ただ、コインチェックの場合だと、このWebSocket APIがβ版になっています。また今回の自動売買では、そこまで厳密なロジックを組む予定はありません。

それゆえ自動売買では使わないのですが、もしコインチェックで正式にリリースされたときは、いつでも変更できるようにWebSocket APIを紹介しておきます。

 

リアルタイムでビットコイン価格を取得し続けよう!

今回は新しくファイルを作成しましょう。

ファイル名はlesson.pyにしておきたいと思います。

STEP① : ライブラリのインストールとインポート

WebSocketを使うには、新しくライブラリをインストールする必要があります。

まずは、すでにインストールされているライブラリを確認しましょう。ライブラリ一覧を確認するにはpip listでした。

keep-getting-ticker-by-coincheck1

バージョンは多少異なるかもしれませんが、おそらく同じライブラリが入っているかと思います。

そうしたら、以下のコマンドをターミナルで入力してwebsocket-clientライブラリをインストールしましょう。

# &マークを外してコピペしてください!
$ pip install websocket-client

 

おそらく以下のような画面になるはずです。

keep-getting-ticker-by-coincheck2

ここまで問題なければ、ライブラリをインポートしていきましょう。そのためには、以下のコードを追加します。

import json
from websocket import create_connection

 

STEP② : WebSocketの接続先を設定する

コインチェックの公式ドキュメントを確認すると、WebSocket APIを使うのに必要な情報が書かれています。

keep-getting-ticker-by-coincheck3

WebSocketの接続先はwss://ws-api.coincheck.com/です。また、JavaScriptのサンプルコードが書かれているので、これをPythonバージョンに変更していきましょう。

先ほどインポートしておいたライブラリを使って以下のように書きます。

socket = create_connection('wss://ws-api.coincheck.com/')

 

STEP③ : WebSocketの利用準備

あとはWebSocketを使うための準備をしていきましょう。

公式ドキュメントを見ると、以下の情報をサーバーに送信する必要があると書かれています。

{
  "type": "subscribe",
  "channel": "[pair]-trades"
}

 

[pair]には通貨ペアが入ります。今回はビットコインの価格を取得したいので、btc_jpyを選択しましょう。

JavaScriptのサンプルコードも参照すると、最終的には以下のようなコードになります。

import json
from websocket import create_connection

socket = create_connection('wss://ws-api.coincheck.com/')

socket.send(json.dumps({
    'type': 'subscribe',
    'channel': 'btc_jpy-trades'
}))

while True:
    print(socket.recv())

 

socket.send()でWebSocket APIを使うのに必要な情報を送信し、socket.recv()で最新価格を取得し続けるってことですね。

STEP④ : Pythonファイルの実行

というわけで、いま作成したlesson.pyを実行してみましょう。

そうすると、以下のようにビットコインの最新価格を取得し続けるはずです。

※動作を止めるときはctrl+cです!

keep-getting-ticker-by-coincheck4

取得したデータだけ取り出すと、以下のようになっています。

[171371526,"btc_jpy","5232410.0","0.01","sell"]
[171371527,"btc_jpy","5233974.0","0.011129","buy"]
[171371528,"btc_jpy","5232410.0","0.01","sell"]
[171371529,"btc_jpy","5232410.0","0.01","sell"]
[171371530,"btc_jpy","5232409.0","0.01","sell"]
[171371531,"btc_jpy","5231796.0","0.00996075","sell"]
[171371532,"btc_jpy","5231455.0","0.00000025","sell"]
[171371533,"btc_jpy","5231455.0","0.009961","sell"]
[171371534,"btc_jpy","5233924.0","0.0011129","buy"]
[171371535,"btc_jpy","5232505.0","0.06311298","buy"]
[171371536,"btc_jpy","5232505.0","0.00092747","buy"]
[171371537,"btc_jpy","5232505.0","0.00018549","buy"]

 

Pythonのリスト型になっていて、3列目にビットコインの価格が記載されていますね。

あとは4列目で取引量も取得できているので「日本円でどれだけ取引されたのか」を簡単に計算できそうですね。

 

まとめ | リアルタイムでビットコイン価格を取得し続けよう!

というわけで、今回はリアルタイムでビットコインの価格を取得し続ける方法を紹介していきました。

この記事を書いている時点ではβ版ですが、そのうち正式リリースされることを待ちましょう!

 

今回までの範囲で、Coincheck APIの紹介はおしまいです。次回からは、いよいよ自動売買を組んでいきたいと思います。

いよいよ応用編に突入するので、これまでの内容を復習しつつ頑張っていきましょう!