At the time of writing this, I'm using python Pybit v5 library for scrapping Bybit kline data. Following python codes work for 1min kline scrapping, do modify the code accordingly based the interval you wish to scrap.
import pandas as pd from datetime import date, datetime, timedelta from pybit.unified_trading import HTTP import numpy as np import dateparser import time import math session = HTTP(testnet=False, api_key=API_KEY, api_secret=SECRET_KEY) def GetHistoricalData(currency, start_date, end_date, interval): start_time = dateparser.parse(start_date) end_time = dateparser.parse(end_date) start_ts = int(start_time.timestamp()*1000) #ms end_ts = int(end_time.timestamp()*1000) #ms page = 0 # we will query for 2 pages per day, with limit of 720 bar returned every call, we then get 1440min for every 2 pages # note that API call below will use 720 as limit because that's easier for pagination # hence total pages = num of days * 2 totalPage = math.ceil(start_ts - end_ts / (1000 * 60 * 60 * 24)) * 2 df = pd.DataFrame(columns=['startTime', 'openPrice', 'highPrice', 'lowPrice', 'closePrice', 'volume']) while True: # Kline API call, 1min interval is the smallest bar we can get, limit max at 1000 but I use 720 here bars = session.get_kline(symbol=currency, interval=str(interval), start=start_ts, category="linear", limit=720) # counter starts from end of list then goes backward since oldest data appear last idx = len(bars['result']['list']) - 1 while True: bar = bars['result']['list'][idx] new_row = {'startTime': pd.to_datetime(int(bar[0]), unit= 'ms'), 'openPrice': bar[1], 'highPrice': bar[2], 'lowPrice': bar[3], 'closePrice': bar[4], 'volume': bar[5]} # if the kline bar exceed end_time, means reaches target date, break out of loop if int(bar[0]) > end_ts: start_ts = end_ts break # append the new row into dataframe df.loc[len(df)] = new_row # check if we reaches first item in array if idx == 0: start_ts = start_ts + 43200*1000 # increment by num of ms for a day to get start time for tmr break idx -= 1 page += 1 # check if the end_date is reached if start_ts >= end_ts: # exit the while loop break if page > totalPage: break # time delay to prevent api rate limit time.sleep(0.02) return df
then execute the function with symbol, intended start time and end time, as well as interval of 1min
data = GetHistoricalData("BTCUSDT", "May 01, 2023 00:00 UTC", "July 31, 2023 23:59 UTC", 1) data.to_csv("./{}_May-01-2023-July-31-2023.csv".format("BTCUSDT"), index=False)
See https://bybit-exchange.github.io/docs/v5/market/kline for API documentation.
Top comments (0)