読者です 読者をやめる 読者になる 読者になる

Pythonと機械学習

Pythonも機械学習も初心者ですが、頑張ってこのブログで勉強してこうと思います。

PoloniexのAPIを使ってBitcoin価格データの取得

Bitcoin

Poloniexは仮想通貨の取引所です。かなり規模が大きく色々な仮想通貨を取り扱っています。
Python用のAPIを公開しているので、Python上からPoloniexにアクセスしていろいろな事ができるみたいです。
PoloniexのサイトでAPIの使い方を調べてみましたがよくわからないのでWeb上を検索していたら、PoloniexへのアクセスをまるごとPythonのモジュール化してくれるコードをGithubで見つけました。

インストール方法や使い方など丁寧に書かれてあるので、すごくわかりやすいです。
f:id:darden:20160731191625p:plain

ページ右上のClone or downloadタブよりDownload ZIPでzipファイルをダウンロードします。
ダウンロードしたpython-poloniex-master.zipを解凍し、解凍されたフォルダ内でsetup.pyを実行します。

python setup.py install

Bitcoin価格データの取得

早速Bitcoin価格データの取得を試してみましょう。
returnChartDataという関数で取得できます。
Pythonコンソール上で下記のように打つとBitcoin価格データを取得できます。
USドルで500日分の日足データを取得しています。

import poloniex
import time

polo = poloniex.Poloniex()
polo.timeout = 2
chartUSDT_BTC = polo.returnChartData('USDT_BTC', period=polo.DAY, start=time.time()-polo.DAY*500, end=time.time())

各日足データがディクショナリの中に入っており、日付ごとのディクショナリがリスト化されています。chartUSDT_BTC[-1]が今日のデータでchartUSDT_BTC[0]が取得した最後のデータになります。
chartUSDT_BTC[-1]とするとリスト内の最後の要素を取得できます。

>>> chartUSDT_BTC[-1]
{u'volume': 211134.30088071, u'quoteVolume': 332.46873883, u'high': 656.74701, u'low': 629, u'date': 1469923200, u'close': 631, u'weightedAverage': 635.05008508, u'open': 656.42000519}

試しに日付を確認してみましょう。

>>> chartUSDT_BTC[-1]['date']
1469923200

この1469923200という数字は、UNIX時間で1970/1/1 00:00:00からの経過秒数を表しています。
使いづらいので、datetimeモジュールのfromtimestamp関数で日付に直してやります。

>>> import datetime
>>> datetime.datetime.fromtimestamp(chartUSDT_BTC[-1][u'date'])
datetime.datetime(2016, 7, 31, 9, 0)

2016年7月31日9時0分が表示されました。
時間が9時なのは、Poloniexのサーバー内の時間が、時差のため日本時間と9時間ずれているためです。まあ、あまり気にしないようにしましょう。

今日のオープンデータは下記のようにして取得します。

>>> chartUSDT_BTC[-1]['open']
656.42000519

$656.42000519ということです。

ちなみに、Poloniexから取得した当日のcloseデータはまだ確定していません。現在値がそのまま入ってきます。

matplotlibを使ってBitcoin価格をグラフ化

PoloniexからBitcoin価格を取得してグラフを描いてやります。
グラフの描写にはmatplotlibモジュールを使用します。
Bitcoin価格の取得をgetDataPoloniex()という関数にしました。
グラフの描写はmain()関数内で記述しています。
慣例的にif __name__ == "__main__":以下にmain()を記述してやるみたいですね。慣れてないと不思議な感じがしますが、慣れると使いやすいかもしれないですね。

# -*- coding: utf-8 -*-
import poloniex
import time
import datetime
import numpy as np
import matplotlib.pyplot as plt

def main():
    date, data = getDataPoloniex()
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(date, data)
    ax.set_title("BTC Price")
    ax.set_xlabel("Day")
    ax.set_ylabel("BTC Price[$]")
    plt.grid(fig)
    plt.show(fig)

def getDataPoloniex():
    polo = poloniex.Poloniex()
    polo.timeout = 2
    chartUSDT_BTC = polo.returnChartData('USDT_BTC', period=polo.DAY, start=time.time() - polo.DAY * 500, end=time.time())
    tmpDate = [chartUSDT_BTC[i]['date'] for i in range(len(chartUSDT_BTC))]
    date = [datetime.datetime.fromtimestamp(tmpDate[i]).date() for i in range(len(tmpDate))]
    data = [float(chartUSDT_BTC[i]['open']) for i in range(len(chartUSDT_BTC))]
    return date ,data

if __name__ == "__main__":
    main()

このコードを実行すると下記のようにグラフが描かれます。
f:id:darden:20160731203748p:plain