Данные по торгам криптовалютой с Binance для ML

Биржа Binance — одна из крупнейших площадок для торговли криптовалютами. Статистические данные с этой площадки одни из наиболее полных для ML. Поcмотрим какие данные имеются, в каком формате они представлены и как их получить оптимальным образом.

Данные с Binance доступны в запакованном ZIP файле. Например, для получения спотовых RAW Trades для биткойна ссылка будет следующая: https://data.binance.vision/?prefix=data/spot/monthly/trades/BTCUSDT/

Собственно, корневая ссылка для получения заархивированных данных: https://data.binance.vision/

Описание данных доступно здесь: https://github.com/binance/binance-public-data/

Разберем поподробнее формат для Trades и AggTrades.

Trades в Binance

Формат таблицы trades от Binance выглядит следующим образом:

trade IdpriceqtyquoteQtytimeisBuyerMakerisBestMatch
5117535817.801800005.69000000101.292242001583709433583TrueTrue

Получить результаты в JSON можно, набрав в браузере: https://api.binance.com/api/v1/trades?symbol=BTCUSDT.

Принимает параметры:

  • Обязательные:
    • symbol — пара 
  • Необязательные:
    • limit — кол-во возвращаемых записей (максимум 500, по умолчанию 500).

Пример результата выдачи raw trades:

{
    "id": 959699953,
    "price": "31504.61000000",
    "qty": "0.12039400",
    "quoteQty": "3792.96601634",
    "time": 1626627195399,
    "isBuyerMaker": false,
    "isBestMatch": true
  }
  • id — идентификатор сделки,
  • price — цена по которой состоялась сделка.
  • qty — количество в сделке,
  • quoteQty — сумма сделки, произведение price * qty.
  • time — время сделки в формате Unix TimeStamp.
  • isBuyerMaker — сделка по покупке или продаже,
  • isBestMatch — была ли встречная сделка. Этот параметр всегда true и его можно игнорировать

Флаг isBuyerMaker определяет строка в записи trade была продажа или покупка. Детальное объяснение есть здесь и здесь, но вообще:

  • isBuyerMaker = true -> SELL
  • isBuyerMaker = false -> BUY

AggTrades в Binance

Формат таблицы AggTrades выглядит следующим образом:

Aggregate tradeIdPriceQuantityFirst tradeIdLast tradeIdTimestampWas the buyer the makerWas the trade the best price match
00.2000000050.00000000001608872400000FalseTrue

Получить в JSON можно, вызывав API: https://api.binance.com/api/v1/aggTrades?symbol=BTCUSDT.

Принимает параметры:

  • Обязательные:
    • symbol — пара
  • Необязательные:
    • fromID — показывать начиная со сделки № (включительно)
    • startTime — начиная с какого времени (включительно)
    • endTime — заканчивая каким временем (включительно)
    • limit — Кол-во записей (максимум 500, по умолчанию 500)

Результат выполнения запроса получения aggTrades:

{
  "a": 848706820, // tradeId строки
  "p": "31628.13000000", // Цена
  "q": "0.19791500", // Количество
  "f": 959751237, // Первая tradeId
  "l": 959751237, // Последняя tradeId
  "T": 1626635052261, // Время сделки в формате Unix TimeStamp. 
  "m": true, // Was the buyer the maker?
  "M": true // Was the trade the best price match?
}

Ежедневные raw trades есть только за текущий месяц на каждый день, например, https://data.binance.vision/?prefix=data/spot/daily/aggTrades/BTCTUSD/.

По завершению месяца данные перемещаются в месячные, но там нет текущего (не закрытого) месяца. Например, https://data.binance.vision/?prefix=data/spot/monthly/aggTrades/BTCUSDT/.

Разница между Trades и AggTrades в Binance

Binance лимитирует не только количество запросов к API но и «вес» запросов. Собственно, поэтому не нужно грузить Binance историческими запросами, а нужно забирать их в виде zip файла отсюда.

api/v3/trades — запрос с весом 1 и используется для получения недавних raw trades. Максимальное количество = 1000. Отрабатывает очень быстро.

api/v3/historicalTrades — запрос с весом 5 для получения raw trades на любой временной интервал с момента, когда символ начал торговаться. Этот вызов может обращаться к очень старым данным, поэтому работает не быстро.

api/v3/aggTrades — запрос с весом 1 для получения aggregate trades по любому интервалу времени с момента начала торгов по символу. Этот вызов может обращаться к очень старым данным, поэтому работает не быстро.

Каждая запись в raw trade — это сделка между 1 покупателем (taker) и 1 продавцом (maker) по продаже некоторого количества по определенной цене.

Каждая запись в aggregate trade — это сделка между 1 покупателем и n продавцами, торгующими суммарным количеством индивидуальных raw trade-ов по некоторой цене.

Например, один пользователь размещает order на покупку 10 BNB по цене $16.50. Этот пользователь торгуется с 3-мя разными продавцами, предлагающими 2 шт., 5 шт. и 1 шт. BNB по цене $16.50 и ещё одним, предлагающим 2 шт. BNB по цене $16.51. Записи в raw trades по этой сделке будут следующими:

  1. 2 шт. BNB по цене $16.50
  2. 5 шт. BNB по цене $16.50
  3. 1 шт. BNB по цене $16.50
  4. 2 шт. BNB по цене $16.51

При этом aggregate trade будет:

  1. 8 шт. BNB по цене $16.50
  2. 2 шт. BNB по цене $16.51

Aggregate trades отображают ту-же информацию, что и raw trade в «сжатом» виде, что уменьшает объемы данных пересылаемых по сети и занимает меньше места в UI.

Полезные ссылки

Spread the love
Запись опубликована в рубрике IT рецепты. Добавьте в закладки постоянную ссылку.

Обсуждение закрыто.