Есть множество решений как загрузить исторические данные по криптовалютным парам. Одно из таких решений, которое эффективно использую сейчас - хочу здесь и выложить. Оно быстрое и простое.
Потребуется небольшой код на Python, библиотеки backtrader_binance, backtrader и API ключ полученный с биржи Binance.
Создаем новый проект в вашем любимом редакторе кода и устанавливаем необходимые библиотеки:
1) для интеграции Binance API с Backtrader:
pip install backtrader_binance
2) для тестирования торговых стратегий сам Backtrader:
pip install git+https://github.com/WISEPLAT/backtrader.git
3) + некоторые нужные доп. пакеты:
pip install python-binance pandas matplotlib
Небольшой код для получения исторических данных по крипте, берем по этой ссылке (файл 02 - Symbol data to DF.py), он лежит прямо в проекте библиотеки backtrader_binance.
На всякий случай дублирую сюда код:
import datetime as dt
import backtrader as bt
import pandas as pd
from backtrader_binance import BinanceStore
from ConfigBinance.Config import Config # Файл конфигурации
# Торговая система
class StrategySaveOHLCVToDF(bt.Strategy):
"""Сохраняет OHLCV в DF"""
params = ( # Параметры торговой системы
('coin_target', ''), #
)
def __init__(self):
self.df = {}
self.df_tf = {}
def start(self):
for data in self.datas: # Пробегаемся по всем запрошенным тикерам
ticker = data._name
self.df[ticker] = []
self.df_tf[ticker] = self.broker._store.get_interval(data._timeframe, data._compression)
def next(self):
"""Приход нового бара тикера"""
for data in self.datas: # Пробегаемся по всем запрошенным тикерам
ticker = data._name
try:
status = data._state # 0 - Live data, 1 - History data, 2 - None
_interval = data.interval
except Exception as e:
if data.resampling == 1:
status = 22
_interval = self.broker._store.get_interval(data._timeframe, data._compression)
_interval = f"_{_interval}"
else:
print("Error:", e)
if status == 1:
_state = "Resampled Data"
if status == 1: _state = "False - History data"
if status == 0: _state = "True - Live data"
self.df[ticker].append([bt.num2date(data.datetime[0]), data.open[0], data.high[0], data.low[0], data.close[0], data.volume[0]])
print('{} / {} [{}] - Open: {}, High: {}, Low: {}, Close: {}, Volume: {} - Live: {}'.format(
bt.num2date(data.datetime[0]),
data._name,
_interval, # таймфрейм тикера
data.open[0],
data.high[0],
data.low[0],
data.close[0],
data.volume[0],
_state,
))
# Исторические/новые бары тикера
if __name__ == '__main__': # Точка входа при запуске этого скрипта
cerebro = bt.Cerebro(quicknotify=True)
coin_target = 'USDT' # базовый тикер, в котором будут осуществляться расчеты
symbol = 'BTC' + coin_target # тикер, по которому будем получать данные в формате <КодТикераБазовыйТикер>
store = BinanceStore(
api_key=Config.BINANCE_API_KEY,
api_secret=Config.BINANCE_API_SECRET,
coin_target=coin_target,
testnet=False) # Хранилище Binance
broker = store.getbroker()
cerebro.setbroker(broker)
# 1. Исторические D1 бары за 365 дней + График т.к. оффлайн/ таймфрейм D1
from_date = dt.datetime.utcnow() - dt.timedelta(days=365) # берем данные за 365 дней от текущего времени
data = store.getdata(timeframe=bt.TimeFrame.Days, compression=1, dataname=symbol, start_date=from_date, LiveBars=False)
cerebro.adddata(data) # Добавляем данные
cerebro.addstrategy(StrategySaveOHLCVToDF, coin_target=coin_target) # Добавляем торговую систему
results = cerebro.run() # Запуск торговой системы
print(results[0].df)
df = pd.DataFrame(results[0].df[symbol], columns=["datetime", "open", "high", "low", "close", "volume"])
print(df)
tf = results[0].df_tf[symbol]
# save to file
df.to_csv(f"{symbol}_{tf}.csv", index=False)
# save to file
df[:-5].to_csv(f"{symbol}_{tf}_minus_5_days.csv", index=False)
cerebro.plot() # Рисуем график
Перед запуском загрузки данных по криптовалютам, необходимо получить свой API ключ и Secret ключ, и прописать их в файле ConfigBinance\Config.py:
# content of ConfigBinance\Config.py
class Config:
BINANCE_API_KEY = "YOUR_API_KEY"
BINANCE_API_SECRET = "YOUR_SECRET_KEY"
Получаем токен для Binance API:
Регистрируемся на Binance
Переходим в раздел "Управление API"
Берём "Создать API" и "Сгенерированный системой"
Если хотите еще и торговать, то в "Ограничения API" включите "Включить спотовую и маржинальную торговлю".
Скопируйте и вставьте в файл ConfigBinance\Config.py полученные "Ключ API" и "Секретный ключ"
Теперь можно запустить код.
Вот загруженные автоматом исторические данные по биткоин (Bitcoin|BTC/USDT):
![загруженные исторические данные по Bitcoin загруженные исторические данные по Bitcoin](https://habrastorage.org/getpro/habr/upload_files/d27/4fa/698/d274fa69885166c65efe439fdf11ec82.png)
В строке 92 происходит выгрузка в формате pandas.dataframe загруженных исторических данных по выбранной крипте (строка 64-65) в csv файл.
# save to file
df.to_csv(f"{symbol}_{tf}.csv", index=False)
Получаем такие данные:
datetime,open,high,low,close,volume
...
2023-03-20,27972.87,28472.0,27124.47,27717.01,477378.23373
2023-03-21,27717.01,28438.55,27303.1,28105.47,420929.7422
2023-03-22,28107.81,28868.05,26601.8,27250.97,224113.41296
2023-03-23,27250.97,28750.0,27105.0,28295.41,128649.60818
2023-03-24,28295.42,28374.3,27000.0,27454.47,86242.06544
2023-03-25,27454.46,27787.33,27156.09,27462.95,50844.08102
2023-03-26,27462.96,28194.4,27417.76,27968.05,49671.70353
2023-03-27,27968.05,28023.86,26508.14,27124.91,88039.46898
2023-03-28,27124.9,27520.0,26631.78,27261.07,78602.44341
2023-03-29,27261.06,28650.0,27240.1,28348.6,89486.16008
2023-03-30,28348.6,29184.68,27686.0,28028.53,98865.43256
Надеюсь этот код вам оказался полезным: +1.