Есть множество решений как загрузить исторические данные по криптовалютным парам. Одно из таких решений, которое эффективно использую сейчас - хочу здесь и выложить. Оно быстрое и простое.

Потребуется небольшой код на 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:

  1. Регистрируемся на Binance

  2. Переходим в раздел "Управление API"

  3. Берём "Создать API" и "Сгенерированный системой"

  4. Если хотите еще и торговать, то в "Ограничения API" включите "Включить спотовую и маржинальную торговлю".

  5. Скопируйте и вставьте в файл ConfigBinance\Config.py полученные "Ключ API" и "Секретный ключ"

Теперь можно запустить код.

Вот загруженные автоматом исторические данные по биткоин (Bitcoin|BTC/USDT):

загруженные исторические данные по Bitcoin
загруженные исторические данные по Bitcoin

В строке 92 происходит выгрузка в формате pandas.dataframe загруженных исторических данных по выбранной крипте (строка 64-65) в csv файл.

    # save to file
    df.to_csv(f"{symbol}_{tf}.csv", index=False)

Всем хорошего дня. Надеюсь это вам оказалось полезным.

что с хвостом)? когда много программируешь - хвост отваливается)))
что с хвостом)? когда много программируешь - хвост отваливается)))

Комментарии (1)