この記事ではbitbankのAPIを使ったローソク足の取得方法を備忘録を兼ねて解説します。
ローソク足とは何なのかということを説明した後にAPIを使ってそのデータを取得する方法を説明します。
ローソク足
ローソク足(あし)は値動きを表したもので、ある一定期間における「始値(はじめね)」・「高値(たかね)」・「安値(やすね)」・「終値(おわりね)」を確認することができます。
下図はローソク足のイメージです。
画像には2色のローソクが並んでいますが、緑色のローソクは前の期間より値段が上がっていることを表し、陽線(ようせん)と呼びます。一方で赤色のローソクは前の期間より値段が下がったことを表し、陰線(いんせん)と呼びます。
1本のローソク足から読み取れる情報を見てみましょう。
各用語の意味は次の通りです。
始値 | 終値 | 安値 | 高値 |
---|---|---|---|
集計期間開始時点の値段 | 集計期間終了時点の値段 | 集計期間で最も低かった値段 | 集計期間で最も高かった値段 |
注意するべきは陽線と陰線で始値と終値を意味する場所が異なることです。
ローソク足の太い部分を実体と呼び、上に伸びている細い線を上ひげ(うわひげ)、下に伸びている細い線を下ひげ(したひげ)と呼びます。
このローソク足は次の図のように一定期間の値動きを圧縮して表したイメージです。
また、ローソク足はその集計期間によって呼び方が変わり、集計期間が1日なら日足(ひあし)、1時間なら時間足、同様に分足や週足などがあります。
bitbankのページでは分足・5分足・15分足・時間足・日足を確認することができます。
APIを使ったローソク足の取得
ここからbitbankのAPIを使ってローソク足を取得して、始値・終値・安値・高値などの情報を確認しましょう。
そのためにはAPIライブラリをインストールする必要がありますので、導入していない場合はコンソールにて次を実行してインストールしてください。
$ pip install git+https://github.com/bitbankinc/python-bitbankcc.git
特定の日付におけるビットコインの時間足を出力しよう
2021/4/9のビットコインの時間足を取得して出力してみましょう。
# bitbank APIをインポート import python_bitbankcc # bitbankのパブリックAPIの呼び出し pub = python_bitbankcc.public() # 通貨ペア(ビットコイン/日本円) pair = "btc_jpy" # 期間(時間足) candle_type = "1hour" # 取得対象日付(YYYYMMDD) target_day = "20210409" # ロウソク足の取得 candle_data = pub.get_candlestick(pair, candle_type, target_day) print(candle_data)
通貨ペアや期間はここに示した値の他にも指定することができます。詳しくは公式ドキュメントのCandlestickの項目をご覧ください。
このプログラムを実行するとpythonの辞書型データとして次のように出力されます。(出力結果が長いので途中省略して、階層構造がわかりやすいように一部編集しています。)
{'candlestick': [{'type': '1hour', 'ohlcv': [['6350007', '6388086', '6350007', '6374134', '17.6226', 1617926400000], ['6374523', '6386322', '6340001', '6341152', '9.2949', 1617930000000], ...., ['6375001', '6391202', '6358000', '6384017', '10.7268', 1618009200000]] }], 'timestamp': 1618012788340}
この出力結果のcandlestickの中のohlcvの中にある1つ1つのリストがローソク足になります。
今回の例では時間足を取得しているので、2021/4/9の9:00から2021/4/10の8:00までの1時間ごとの情報が表示されます。
各リストの要素については次のようなことを意味します。
['始値', '高値', '安値', '終値', '出来高', '対象日時(UNIX TIME)']
例えば1つ目のリストについて見てみると次のような値が入っています。
['6350007', '6388086', '6350007', '6374134', '17.6226', 1617926400000]
このことから、2021/4/9の9:00からの1時間について以下のことがわかります。(対象日時の処理については後程解説します。)
始値 | 高値 | 安値 | 終値 | 出来高 |
---|---|---|---|---|
6,350,007円/BTC | 6,388,086円/BTC | 6,350,007円/BTC | 6,374,134円/BTC | 17.6226BTC |
もう少し見やすく出力しよう
前節ではローソク足を取得して出力しましたが、どれが何を表す値なのか分かりにくい状態でした。
そこで今回は取得したデータを整形して見やすくしてみましょう。
先ほどのプログラムと比べて少し長くなるので分割して紹介します。
モジュールのインポート
import python_bitbankcc from datetime import datetime # 時間データの整形用
先ほどのプログラムではbitbank APIのモジュールだけをインポートしていましたが、今回はUNIX TIMEの整形をしますのでdatetimeのインポートも行います。
ローソク足の取得
pub = python_bitbankcc.public() pair = "btc_jpy" candle_type = "1hour" target_day = "20210409" candle_data = pub.get_candlestick(pair, candle_type, target_day) candles = candle_data["candlestick"][0]["ohlcv"]
ここでは、通貨ペアと期間、そして取得対象日を宣言してAPIに渡しています。
また、最後の一行ではAPIが返した辞書型データからローソク足のリストを取得してます。
データの整形と出力
# ヘッダ print("始値", "\t\t", "高値", "\t", "安値", "\t", "終値", "\t", "出来高", "\t", "時間") # ローソク足を1つずつ取り出す for candle in candles: opening = candle[0] # 始値 high = candle[1] # 高値 low = candle[2] # 安値 closing = candle[3] # 終値 volume = candle[4] # 出来高 # 時間情報の整形 time = datetime.fromtimestamp(candle[5]/1000) time = time.strftime("%Y/%m/%d %H:%M:%S") # データの出力 print(opening, "\t", high, "\t", low, "\t", closing, "\t", volume, "\t", time)
ここではまず、出力したデータが何を表すデータかわかりやすくするためにヘッダを出力しています。
次にfor構文により、取得したローソク足のリストから1つずつ取り出し、始値などの値を取り出しています。
candle[5]は上で紹介した通り対象日時が格納されているのですがUNIX TIMEになっているので、最初にインポートしたdatetimeを使って変換しています。
UNIX TIMEは1970年1月1日0時0分0秒からの経過時間を表しているのですが、私はこの値を見ても日時がわからないのでYYYY/MM/DD HH:MM:SSの形式に変換することにしました。
datetime.fromtimestamp()にUNIX TIMEを1000で割った値を入れるとpythonのdatetime型に変換されます。そして、次の行でYYYY/MM/DD HH:MM:SSの形に整形しています。
もし、日付と時間を別の変数に格納したい場合は、この整形部分を次のように書き換えると実現できます。
date_data = time.strftime("%Y/%m/%d") time_data = time.strftime("%H:%M:%S")
これらの一連のソースコードを実行すると次のような出力結果が得られます。
始値 高値 安値 終値 出来高 時間 6350007 6388086 6350007 6374134 17.6226 2021/04/09 09:00:00 6374523 6386322 6340001 6341152 9.2949 2021/04/09 10:00:00 [中略] 6402669 6402669 6375000 6375000 10.9655 2021/04/10 07:00:00 6375001 6391202 6358000 6384017 10.7268 2021/04/10 08:00:00
APIが返す辞書型データをそのまま出力するよりもだいぶ見やすくなりましたね。