[Python OHLCV] bitFlyer の過去の約定情報からオレオレOHLCVデータを作成する(その2)

前回のnote

Public APIで取れる約定履歴から、1秒足のOHLCVデータを作成した。


今回のnote

1秒足のOHLCVデータを元に、好きな解像度のOHLCVデータを作成する。

pandasの使い方をお勉強したので、メモ代わりみたいなもん。


コード

今回も「自分の環境で動けばいいや」のクソコードです。
・data/ohlcv/YYYYMMDD_1s.csv みたいなファイルが事前に格納されていること(入力ファイル名は inCsvPath を適宜変更)
・pandasでquery()を使うにはnumexprパッケージが必要(らしい、最初から入ってた)、pip install numexprでインストール要

import pandas as pd
from datetime import datetime

DATA_DIR = 'data/ohlcv/'
SINCE = datetime(2018, 6, 1)
UNTIL = datetime(2018, 7, 24)
RES_NUM = 30 # 解像度
RES_UNIT = "s" # 解像度
RES_SEC = RES_NUM * (1 if RES_UNIT == "s" else 60 if RES_UNIT == "m" else 60*60)

# Pandas Dataframe
inCsvPath = DATA_DIR + SINCE.strftime("%Y%m%d") + "_1s.csv"
df = pd.read_csv(inCsvPath, header=None, names=["T", "O", "H", "L", "C", "V"], parse_dates=["T"])

# 出力ファイル
outCsvPath = DATA_DIR + SINCE.strftime("%Y%m%d") + "_" + str(RES_NUM) + RES_UNIT + ".csv"
outCsv = open(outCsvPath, mode="w")

# 解像度範囲
rangeS = datetime.fromtimestamp(SINCE.timestamp())
rangeE = datetime.fromtimestamp(rangeS.timestamp() + RES_SEC)

# 終了日時までループ
while rangeE <= UNTIL:
  df_ = df.query('@rangeS <= T & T < @rangeE')
  if(not(df_.empty)):
    outCsv.write("{t},{o},{h},{l},{c},{v}\n".format(
      t=rangeS.strftime("%Y-%m-%d %H:%M:%S"),
      o=df_['O'].iloc[0],
      h=df_['H'].max(),
      l=df_['L'].min(),
      c=df_['C'].iloc[-1],
      v=df_['V'].sum(),
    ))

  # 日付変更(ファイル変更)
  if(rangeS.day != rangeE.day):
    print("{}: {} fin, next {}".format(datetime.now(), rangeS.strftime("%Y%m%d"), rangeE.strftime("%Y%m%d")))
    outCsv.close()

    # 入力ファイルがなければ終了
    inCsvPath = DATA_DIR + rangeE.strftime("%Y%m%d") + "_1s.csv"
    try:
      df = pd.read_csv(inCsvPath, header=None, names=["T", "O", "H", "L", "C", "V"], parse_dates=["T"])
    except Exception as e:
      print(e)
      break

    # 新規出力ファイル
    outCsvPath = DATA_DIR + rangeE.strftime("%Y%m%d") + "_" + str(RES_NUM) + RES_UNIT + ".csv"
    outCsv = open(outCsvPath, mode="w")

  # 解像度範囲 更新
  rangeS = rangeE
  rangeE = datetime.fromtimestamp(rangeS.timestamp() + RES_SEC)

if(not(outCsv.closed)):
  outCsv.close()


Pandasの勉強メモ


その他参考

queryでやったけど、resample使った方が早いかも(試してない


おわりに

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


マガジン


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


干し芋


ここから先は

0字

¥ 100

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