【Pythonで仮想通貨データ分析】第1回:取引所からビットコインの値段を取得し、チャートを書いてみよう!

 

こんにちは、higoxです。

今回から何回かに分けてPythonを使って仮想通貨(ビットコイン)のデータ分析を行っていきたいと思います。

その、第1回となる今回は、ビットコイン価格の「見える化」(チャート作成)をしてみます。

 

f:id:higox:20180110211138j:plain

 

 

プログラム

今回作成するプログラムの実行結果がこちらです。(gifアニメになっています。)一定の周期(例では3秒)毎にcoincheckと、zaifから最終取引価格(Last Price)を取得し、取得したデータから折れ線グラフを描画・更新するプログラムです。

f:id:higox:20180110211634g:plain

以下がソースコードです。見にくくてすみません。

import requests
import json
import time
import numpy as np
import matplotlib.pyplot as plt

def getCoincheckTicker():
    #coincheckのtickerを取得する関数です。
    url = 'https://coincheck.jp/api/ticker'
    ticker = json.loads(requests.get(url).text)
    return ticker

def getZaifTicker():
    #zaifのtickerを取得する関数です。
    url = 'https://api.zaif.jp/api/1/ticker/btc_jpy'
    ticker = json.loads(requests.get(url).text)
    return ticker

coincheckLastPriceList = []
zaifLastPriceList = []
listLength = 0
maxlength = 100 #チャートx方向最大値です。
frequency = 3 #データ取得周期です。

while True:

    #coincheck,zaifからそれぞれ'last price'を取得します。
    coincheckLastPrice = getCoincheckTicker()['last']
    zaifLastPrice = getZaifTicker()['last']


    if listLength<maxlength:

        coincheckLastPriceList.append(coincheckLastPrice)
        zaifLastPriceList.append(zaifLastPrice)

    else:
        #list内の要素がmaxlengthを超えたら、
        #先頭の1要素を削除し、最後尾に追加します。
        coincheckLastPriceList.pop(0)
        zaifLastPriceList.pop(0)
        coincheckLastPriceList.append(coincheckLastPrice)
        zaifLastPriceList.append(zaifLastPrice)

    #チャート用データの作成をします。
    coincheck = np.array(coincheckLastPriceList)
    zaif = np.array(zaifLastPriceList)
    listLength = len(coincheckLastPriceList)
    x = np.linspace(0,listLength,listLength)

    #ここからチャート作成です  
    plt.figure(1)
    plt.plot(x,coincheck, label = 'coincheck')
    plt.plot(x,zaif, label = 'zaif')
    plt.legend()
    plt.pause(.01)
    plt.clf()

    time.sleep(frequency)

 

プログラム解説

相変わらず稚拙なプログラムですが、それなりに動作していますので、解説していきたいと思います。

 

動作環境

・python3で作成しています。

・pythonのディストリビューションである「Anaconda」をインストールした際に一緒にインストールされたライブラリ(モジュール)のみで作成しました。

・ビットコインの価格の取得には各取引所のアクセスキー・シークレットキーが不要な公開APIを使用しました。

 

設定値

・maxlength

チャートx方向の最大値です。デフォルトでは100を設定しています。より長い期間のチャートを作成したい場合、この数字を大きくしてください。

 

・frequency

データ取得周期(秒)です。デフォルトでは3秒と設定しています。より細かくデータ取得を行いたい場合や、もっと長いスパンでデータ取得を行いたい場合はこちらを変更してください。

 

悩んでいるところ

・エラーが発生します

プログラムは動作するのですが、実行時に「MatplotlibDeprecationWarning: Using default event loop until function specific to this GUI is implemented」というエラーが発生します。動いているので、とりあえず良しとしています。(良くない!)

 

・zaifのサーバが重いときには止まってしまいます

今回値を取得しているzaif取引所は、ビットコイン価格の変動が大きいときなど、アクセス数が増えたときに重くなり、落ちやすいという特徴(?)があります。今回作成しているプログラムもその影響を受けるため、ザイフサーバが不調なとき、一緒に不調になってしまいます。

 

応用編

上記のプログラムを応用すると、以下のようにcoincheckとzaif取引所の価格差(coincheckのlast price - zaifのlast price)を表すチャートを書くことができます。(よかったらチャレンジしてみてねっ)

f:id:higox:20180111210318g:plain

このチャートはビットコインの価格がcoincheckとzaifの2つの取引所間で1万円以上の差があったことを表しています。この差額を利用する取引手法が「アービトラージ(裁定取引)」と呼ばれるものです。これは具体的にいえば、上のチャートのように価格差があれば、安い方の取引所(上のチャートではCoinCheck)で1BTCを買い、瞬間的に高い方の取引所(上のチャートではZaif)に送り、売ることができれば、それだけで差額(上のチャートでは1万円以上)分の利益をあげることができるという取引手法です。実際にはもう少し工夫が必要なのですが…。この工夫の部分も含めて、アービトラージに関して以前まとめたことがありますので、この取引手法に興味が湧いた方は是非以下の記事でご確認ください。 

 

arbitrage.hatenablog.com

arbitrage.hatenablog.com

 

まとめ

 

今回はpythonを使ったデータ分析の第1回として、ビットコインの価格を取得し、チャートにしてみました。次回はこのチャートに移動平均線を引いていきたいと思います。お楽しみにっ!