[Python numpy Cryptowatch] BTC-FX の OHLCV データの取得

環境


コード

# -*- Coding: utf-8 -*-
import requests
import json
import numpy as np
import talib as ta
from datetime import datetime

# Main Logics
if __name__ == "__main__":

  #ローソク足の時間を指定
  periods = ["60", "300"]  # 60sec, 5min

  #クエリパラメータを指定
  query = {"periods": ','.join(periods), "before": "", "after": ""}

  #ローソク足取得
  rspJson = json.loads(requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc", params=query).text)
  ohlcvs = rspJson["result"]

  for period in periods:
    ohlcv_data = ohlcvs[period]
    ohlcv_ary = np.asarray(ohlcv_data) # Numpy で行列取得
    ohlcv_aryT = ohlcv_ary.T # 転置して各要素に分解

    # OHLCV を取得
    ts  = ohlcv_aryT[0] # Timestamp
    op  = ohlcv_aryT[1] # Open
    hi  = ohlcv_aryT[2] # High
    lo  = ohlcv_aryT[3] # Low
    cl  = ohlcv_aryT[4] # Close
    vol = ohlcv_aryT[5] # Volume

    # 各要素を出力
    for i in range(0, len(ts)):
      print("{0},{1},{2},{3},{4},{5}".format(datetime.fromtimestamp(ts[i]), op[i], hi[i], lo[i], cl[i], vol[i]))


実行結果

一部を抜粋。API を叩くと、古い順にデータが返ってくるので、そのまま出力するとこんな感じ。前半が1分足のデータ、後半が5分足のデータ。

2018-06-28 03:15:00,691417.0,691664.0,691166.0,691288.0,77.20204
2018-06-28 03:16:00,691288.0,691638.0,691150.0,691217.0,78.61124
2018-06-28 03:17:00,691217.0,691430.0,691121.0,691121.0,275.3402
2018-06-28 03:18:00,691121.0,691599.0,690222.0,690560.0,259.07922
2018-06-28 03:19:00,690590.0,691388.0,690522.0,691164.0,122.231026
...
2018-06-26 18:00:00,699366.0,699799.0,698700.0,699549.0,427.6545
2018-06-26 18:05:00,699549.0,699573.0,698119.0,698292.0,524.62415
2018-06-26 18:10:00,698258.0,698799.0,698120.0,698598.0,490.64014
2018-06-26 18:15:00,698609.0,699200.0,698465.0,698984.0,370.0118
2018-06-26 18:20:00,699019.0,699205.0,698323.0,698430.0,310.3954
...


解説

ざっくりとした全体の流れ

・"どの足(1分足、5分足、1時間足、日足、etc)" で、"いつ" から "いつ" までのデータが欲しいかを指定して、OHLCV データを Cryptowatch の API から取得
・指定した足のデータごとに処理を実施
 - 取得した OHLCV データを Numpy で扱えるようにして、T メソッドで転置(Open, High, ... などの各要素に分解)
 - 取得したデータを出力


Cryptowatch GET OHLC について

データの格納形式はこちら。


指定可能な時間足はこちら、1分足が最小、1週足が最大。


Cryptowatch の API(GET OHLC) は古い順にデータが格納されているので、逆順(新しい順)にしたいなら、どこかで slice なり reverse なり reversed なりする必要がある。

  #ローソク足取得
  rspJson = json.loads(requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc", params=query).text)
  ohlcvs = rspJson["result"]

  for period in periods:
    ohlcv_data = ohlcvs[period][::-1] # 逆順


また、timestamp は UNIX Timestamp なので、出力する際には datetime などで変換する方が良いだろう。

datetime.fromtimestamp(ts[i])


Cryptowatch の API ドキュメントはこちら


Numpy による各要素の抽出

[Timestamp, Open, High, Low, Close, Volume] の形式で1つのデータになっている(つまり、ある時間足におけるデータで1セットとなっている)ため、TA-lib などで取り回しやすいように各要素に分解しておきたい。

T メソッドで行列の転置が可能なので、それを用いる。

    ohlcv_ary = np.asarray(ohlcv_data) # Numpy で行列取得
    ohlcv_aryT = ohlcv_ary.T # 転置して各要素に分解

    # OHLCV を取得
    ts  = ohlcv_aryT[0]
    op  = ohlcv_aryT[1]
    hi  = ohlcv_aryT[2]
    lo  = ohlcv_aryT[3]
    cl  = ohlcv_aryT[4]
    vol = ohlcv_aryT[5]


おわりに

有料(¥100)にしてるけど、これで内容は全部です。募金してくれる人がいれば、ジュース代としていただけると嬉しい。Pine スクリプトは、インデントくずれが起きるようなので、コピペ時には注意してください。


マガジン


コメント用note(未購入者向け)


干し芋


ここから先は

0字

¥ 100

サポート頂けると励みになります BTC,BCH: 39kcicufyycWVf8gcGxgsFn2B8Nd7reNUA LTC: LUFGHgdx1qqashDw4WxDcSYQPzd9w9f3iL MONA: MJXExiB7T7FFXKYf9SLqykrtGYDFn3gnaM