Pull to refresh

Как загрузить исторические данные по криптовалютам

Level of difficultyEasy
Reading time4 min
Views7.4K

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

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

Получаем такие данные:

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.

Tags:
Hubs:
Total votes 7: ↑1 and ↓6-5
Comments6

Articles