[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