今回は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')
以下の画像のようになっていれば成功です。
##チャートに描画する
最後にローソク足チャートを作っていきます。
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()
実行します。
画像のように表示されたら成功です。