52
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

CryptoWatchのAPIを用いたローソク足チャート生成

今回はPythonでCryptowatchのapiを叩き過去1時間のデータを取得、チャート描画までの過程をやってみます。機械学習モデルとして大量の約定データが必要となったので、おまけに取得したデータをCSVに記述して保存する過程もやってみます。

外部ライブラリ&使った環境

・Python 3.6.2 pip3
・requests(pip3 install requests)
・matplotlib(pip3 install matplotlib)
・mpl_finance(pip3 install git+https://github.com/matplotlib/mpl_finance)
・pandas(pip3 install pandas)

以前はmatplotlibにfinanceというメソッドが存在しましたがサポートされなくなった為にmpl_financeというもので代用します。

pandasはおまけのcsv出力用兼データ整形用です。

CryptoWatchAPIでデータを取得する

requestsでAPIを叩いて過去1時間のデータを取得してみます。apiの使い方はココ。

import requests,time
import pandas as pd
from datetime import datetime

def get_OHLC(before,after):
    url = 'https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc'
    query = {
        'periods':60,
        'before':before,
        'after':after,
        }
    res = requests.get(,params=query).json()['result']['60']
    return res

unixTime = lambda y,m,d,h: int(time.mktime(datetime(y,m,d,h).timetuple()))

now = datetime.now()
y,m,d,h = now.year, now.month, now.day, now.hour

data = get_OHLC(unixTime(y,m,d,h),unixTime(y,m,d,h-1))

Time,Open,High,Low,Close = [],[],[],[],[]
for i in data:
    Time.append(i[0])
    Open.append(i[1])
    High.append(i[2])
    Low.append(i[3])
    Close.append(i[4])

pd.DataFrame({'open':Open, 'high':High, 'low':Low, 'close':Close}).to_csv('price.csv')

今回使うパラメーターは3つで、periodsは時間を表していて1分足データが欲しいので60とします。before,afterは取得する範囲をunix時間で指定します。

例えば2018年3月28日の17時から18までの1時間を指定するなら、1522227600(18時)をbefore(前)に1522224000(17時)をafter(後)に入れます。

変数unixTimeは時間をunix時間に変換するものです。ラムダ式で作りました。引数にy,m,d,hを定義してそれぞれを年、月、日、時に対応させます。

unixTime = lambda y,m,d,t: int(time.mktime(datetime(y,m,d,h).timetuple()))

print(unixTime(2018,3,28,17))

以上を実行するとUNIX時間を得ることができます。

1522224000

現在時間を取得して変数y,m.d.hにそれぞれ代入します。分は指定しないので00分となります。

now = datetime.now()
y,m,d,h = now.year, now.month, now.day, now.hour

変数dataに関数get_OHLCの引数として現在時刻のunix時間とその1時間前の時刻を代入して取得したデータを格納します。

data = get_OHLC(unixTime(y,m,d,h),unixTime(y,m,d,h-1))

取得したデータを見てみます。

[[1522227600, 839200, 839342, 838326, 839303, 7.030089, 5896455], [1522227660, 838902, 839342, 838876, 839300, 1.1284219, 947056.06], [1522227720, 839299, 840929, 839156, 840929, 17.353899, 14579217], [1522227780, 840620, 841698, 840063, 841343, 11.973628, 10066623], [1522227840, 841222, 848426, 841222, 846864, 87.91499, 74249940], [1522227900, 846684, 847959, 845470, 845661, 27.833416, 23552682], [1522227960, 846168, 846168, 843700, 843700, 18.76452, 15859163].......

前から[unix時間, 始値, 高値, 安値, 終値, 出来高]で60個(60分ぶん)のリストが格納されています。unix時間、始値、高値、安値、終値をfor文で回してそれぞれ個別リストに格納します。

次にpandasモジュールを使ってCSVに書き込んでいきます。おまけなのでワンライナーですW

pd.DataFrame({'time':Time, 'open':Open, 'high':High, 'low':Low, 'close':Close}).to_csv('price.csv')

以下の画像のようになっていれば成功です。

sumole.png

チャートに描画する

最後にローソク足チャートを作っていきます。

Date = [datetime(y,m,d,h-1) + dt.timedelta(minutes=mi) for mi in range(60)]
ohlc = zip(mdates.date2num(Date),Open, High, Low, Close)
ax = plt.subplot()

#x軸の単位を指定(15分間隔で表示)
ax.xaxis.set_major_locator(mdates.MinuteLocator([0,15,30,45]))

#x軸の表示を指定(時:分)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))

#mpl_financeのメソッドを仕様(描画幅やチャートの色などを指定。デフォルトは赤黒)
candlestick_ohlc(ax, ohlc, width=(1/24/60)*0.7,colorup='g', colordown='r')

#チャート上部のテキスト
plt.title('BTC / JPY  by Cryptowatch API')

#チャートをpng形式で保存
plt.savefig('price.png')

#チャートを描画
plt.show()

コード全体像

import requests,time
from datetime import datetime
import datetime as dt
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib.dates as mdates
from mpl_finance import candlestick_ohlc

def get_OHLC(before,after):
    url = 'https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc'
    query = {
        'periods':60,
        'before':before,
        'after':after,
    }
    res = requests.get(url,params=query).json()['result']['60']
    return res

unixTime = lambda y,m,d,h: int(time.mktime(datetime(y,m,d,h).timetuple()))

now = datetime.today()
y,m,d,h = now.year,now.month,now.day,now.hour
text = str(y) + '-' + str(m) + '-' + str(d) + ' ' + str(h) + ':00'

data = get_OHLC(unixTime(y,m,d,h),unixTime(y,m,d,h-1))

Time,Open,High,Low,Close = [],[],[],[],[]
for i in data:
    Time.append(i[0])
    Open.append(i[1])
    High.append(i[2])
    Low.append(i[3])
    Close.append(i[4])

pd.DataFrame({'time':Time, 'open':Open, 'high':High, 'low':Low, 'close':Close}).to_csv('price.csv')

Date = [datetime(y,m,d,h-1) + dt.timedelta(minutes=mi) for mi in range(60)]
ohlc = zip(mdates.date2num(Date),Open, High, Low, Close)
ax = plt.subplot()
ax.xaxis.set_major_locator(mdates.MinuteLocator([0,15,30,45]))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
candlestick_ohlc(ax, ohlc, width=(1/24/60)*0.7,colorup='g', colordown='r')
plt.title(text + '  BTC / JPY  by Cryptowatch API')

plt.savefig('price.png')
plt.show()

実行します。

price.png

画像のように表示されたら成功です。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
52
Help us understand the problem. What are the problem?