見出し画像

[FTX][ohlc]まちゅけんさんのpybottersでヒストリカルデータを入手してみた

経緯:FTXのアカウントをおととい取得し開発コストを抑えるためにgithubやら探してみたらちょうどいいものが見つかったので紹介します。

まちゅけんさんのpybottersです。

まずはバックテスト用にヒストリカルデータが欲しいなと思ってたので早速使ってみました。

FTXのAPIドキュメントを見ながら書きました


FTXのアカウントがまだの人は↓のリンクからお願いします。

import pybotters
import time
import os
import pandas as pd
import sys
from datetime import datetime


def config():
   market_name = 'BTC-PERP'
   resolution = 900
   start_time_str = '2021-01-01 00:00:00'
   start_time_ux = datetime.strptime(start_time_str, '%Y-%m-%d %H:%M:%S').timestamp()
   params = dict(resolution=resolution, limit=5000, start_time=int(start_time_ux), end_time=int(time.time()))
   resolution_list = [15, 60, 300, 900, 3600, 14400, 86400]
   if resolution not in resolution_list:
       print("resolutionの値が異常です. {}の中から選んでください".format(resolution_list))
       sys.exit()
   get_historical_data(market_name, params)


def get_historical_data(market_name: str, params):
   base_url = 'https://ftx.com/api/'
   r = pybotters.get(base_url + f'markets/{market_name}/candles', params=params)
   data = r.json()
   df = pd.DataFrame(data['result'])
   last_time = int(data['result'][0]['time'] * 10 ** -3 - 1)
   while last_time >= params['start_time']:
       temp_r = pybotters.get(base_url + f'markets/{market_name}/candles', params={
           'resolution': params['resolution'],
           'limit': params['limit'],
           'start_time': params['start_time'],
           'end_time': last_time
       })
       temp_data = temp_r.json()
       try:
           last_time = int(temp_data['result'][0]['time'] * 10 ** -3 - 1)
       except IndexError:
           print("これ以上古いデータがないので終了します。")
           break
       temp_df = pd.DataFrame(temp_data['result'])
       df = pd.concat([temp_df, df])
   df['time'] = df['time'] * 10 ** -3
   df['time'] = pd.to_datetime(df['time'].astype(int), unit='s', utc=True, infer_datetime_format=True)
   df = df.set_index('time').reindex(columns=['open', 'high', 'low', 'close', 'volume'])
   df.index = df.index.tz_convert('Asia/Tokyo').tz_localize(None)
   df.to_csv("csv/{}-{}min.csv".format(market_name, int(params['resolution'] / 60)))


if __name__ == '__main__':
   start = time.time()
   if not os.path.isdir("csv"):
       os.makedirs("csv")
   config()
   print('{}sec'.format(round(time.time() - start, 2)))

config()の中にコンフィグが入ってます。

2021/05/11​ update

この記事が気に入ったらサポートをしてみませんか?