Как читать ленту aggregate-trade на Binance
Если вы никогда не читали ленту aggTrade, вы торгуете по графикам. Графики — это агрегации решений. Лента aggTrade и ЕСТЬ сами решения: каждая исполненная сделка, кто был тейкером, в какую сторону, какого размера, по какой цене, в какую миллисекунду. Это данные микроструктуры. Они бесплатны. Доступны через WebSocket. И дают информацию, которую ценовые свечи попросту не способны вместить.
Что такое лента aggTrade
Каждый раз, когда кто-то выставляет рыночный ордер на Binance Futures, он забирает ликвидность из стакана. Сделка записывается с полями: цена, количество, таймстамп и флаг, указывающий, кто был мейкером (стоящий ордер), а кто тейкером (агрессивный ордер).
Слово «aggregate» (агрегированная) означает вот что: если один рыночный ордер проедает 5 разных ценовых уровней, эти 5 филлов сливаются в ОДНУ запись aggTrade со средневзвешенной по объёму ценой и общим количеством. То есть aggTrade — это данные «на уровне сделки»: одна запись на рыночный ордер, а не на ценовой уровень.
Доступ к ним через WebSocket: wss://fstream.binance.com/stream?streams=btcusdt@aggTrade. Подпишитесь, и сообщения начнут приходить за секунды. На активном символе вроде BTCUSDT ждите 50-200 сообщений в секунду в обычные часы, гораздо больше при волатильности.
Поля и что они значат
Типичный payload aggTrade:
{
"e": "aggTrade",
"E": 1714867234000, // event time
"s": "BTCUSDT", // symbol
"a": 5933014, // aggregate trade ID
"p": "100012.50", // price
"q": "0.025", // quantity
"f": 100928146, // first trade ID in aggregate
"l": 100928150, // last trade ID in aggregate
"T": 1714867234123, // trade time
"m": false // isBuyerMaker
}
Самое важное поле из всех — это m, флаг «isBuyerMaker».
m: false— покупатель был ТЕЙКЕРОМ. Он выставил рыночный ордер на ПОКУПКУ, агрессивно снимая офер. Это выражает бычью убеждённость.m: true— продавец был ТЕЙКЕРОМ. Он выставил рыночный ордер на ПРОДАЖУ, агрессивно ударяя по биду. Это выражает медвежью убеждённость.
Переверните флаг в голове: если m равно FALSE, сделка — это «taker buy», покупательское давление. Название сбивает с толку, но так уж повелось.
Почему это важнее свечей
Минутная свеча с объёмом $50M, максимумом $100,150 и минимумом $99,950 говорит вам, что сделки прошли в этом диапазоне. Она не говорит:
- Были ли 80% этих сделок агрессивными покупками или всё было 50/50 вперемешку
- Пришёл ли объём от 5 000 сделок ритейл-размера или от 5 сделок размера кита
- Сгустился ли объём в 3-секундном всплеске или растянулся равномерно на 60 секунд
Лента aggTrade сохраняет все три вещи. Графики их схлопывают. Решения, которые вы принимаете по графикам, слепы к базовой реальности: кто покупает или продаёт и насколько агрессивно.
Паттерны, которые стоит узнавать на ленте
После достаточного времени за экраном определённые паттерны ленты становятся узнаваемыми. Они не проприетарные: их хорошо знают на институциональных торговых столах.
Устойчивый taker-buy с ростом цены
Каждый новый aggTrade показывает m: false (taker buys). Цена тикает вверх постепенно. Это «поглощение предложения»: покупатели съедают оферы быстрее, чем мейкеры их пополняют. Бычий сигнал.
Всплеск taker-buys БЕЗ движения цены
20-30 taker-buys за 10 секунд, но цена держится плоско. Это значит, что большая лимитная стена на продажу поглощает спрос. Кто-то агрессивно скидывает аски по низким ценам; покупатели их съедают, но у продавца ещё есть запас. Обычно продавец побеждает (цена падает, когда покупатели иссякают). Отойдите в сторону.
Пустая лента с расширяющимся спредом
Внезапно очень мало aggTrades. Ранее узкий спред bid-ask расширяется. Маркетмейкеры убрали ликвидность. Идёт волатильность. Отсутствие сделок само по себе несёт информацию.
Распределение размеров с длинным хвостом
Большинство сделок $500-5 000. И вдруг единственный агрегат $500K+. Эта одна крупная сделка обычно информированная: участник готов заплатить за проскальзывание, чтобы войти быстро, потому что у него есть тезис. Следите за направлением.
Паттерн айсберг
Один и тот же ценовой уровень снова наполняется на биде (или аске) после того, как его съели. Там стоит крупный скрытый ордер. Часто держится во время откатов, подсказывает направление.
Каскад стопов
Внезапный всплеск taker-sells (m=true), затем более глубокие падения цены, затем ещё всплеск, ещё падение и так далее. Стопы летят каскадом. Когда каскад иссякает (обычно 20-90 секунд), цена часто резко разворачивается, потому что предложение закончилось.
Метрика taker-ratio
Самая базовая систематическая фича, выведенная из aggTrade:
taker_buy_ratio = sum(quantity × price) where m=false
/ sum(quantity × price) all aggTrades
Computed over a window (5min, 30min, 1h, etc).
Выше 0.55: устойчивое покупательское давление. Ниже 0.45: давление на продажу. Метрика полезнее всего В КОНТЕКСТЕ:
- Высокий taker-buy ratio НА дне диапазона: накопление, бычий сигнал
- Высокий taker-buy ratio НА вершине движения: опоздавшие догоняют, часто медвежий (идёт разворот)
- Низкий taker-buy ratio во время нисходящего тренда: капитуляция продолжается
- Низкий taker-buy ratio НА дне: истощение продавцов, часто бычий сигнал
В одиночку она шумная. В связке с данными позиционирования (открытый интерес, long/short-соотношения топ-трейдеров) она становится реальным компонентом сигнала.
Китовые принты
Определите «китовый принт» как любой aggTrade выше некоторого номинального порога, скажем $50 000 или $100 000. Считайте китовые принты в минуту и по сторонам (покупки против продаж).
Полезные паттерны:
- 3+ китовых покупки за 5 минут без китовых продаж: реальный спрос
- Одна китовая покупка, затем 30 минут дрейфа в taker-sell: кто-то вышел из лонга, который ему больше не нужен
- Китовые покупки, кучкующиеся у конкретных ценовых уровней: защищают поддержку
Порог ($50K против $100K против $500K) зависит от ликвидности монеты. Для BTC «кит» — это $1M+. Для средних альтов $50K уже значимо. Калибруйте под каждую монету.
Реализация подписчика WebSocket
Скелет на Node.js продакшн-качества:
const WebSocket = require('ws');
const trades = new Map(); // sym → rolling array of {ts, usd, isBuy}
const MAX_PER_SYM = 5000;
function connect(symbols) {
const streams = symbols.map(s => s.toLowerCase() + '@aggTrade').join('/');
const url = 'wss://fstream.binance.com/stream?streams=' + streams;
const ws = new WebSocket(url);
ws.on('message', (buf) => {
const msg = JSON.parse(buf.toString());
const d = msg && msg.data;
if (!d || d.e !== 'aggTrade') return;
handleTrade(d);
});
ws.on('close', () => {
setTimeout(() => connect(symbols), 5000); // reconnect with backoff
});
}
function handleTrade(d) {
const sym = d.s;
const px = parseFloat(d.p);
const qty = parseFloat(d.q);
if (!px || !qty) return;
const usd = px * qty;
const isBuy = d.m === false; // m=true means seller was taker
const ts = d.T || Date.now();
let arr = trades.get(sym);
if (!arr) { arr = []; trades.set(sym, arr); }
arr.push({ ts, usd, isBuy });
if (arr.length > MAX_PER_SYM) arr.splice(0, arr.length - MAX_PER_SYM);
}
// Example: compute taker-buy ratio for BTCUSDT in last 5 min
function takerBuyRatio(sym, windowMs) {
const arr = trades.get(sym);
if (!arr) return null;
const now = Date.now();
const cutoff = now - windowMs;
let buyUsd = 0, totalUsd = 0;
for (let i = arr.length - 1; i >= 0; i--) {
const t = arr[i];
if (t.ts < cutoff) break;
if (t.isBuy) buyUsd += t.usd;
totalUsd += t.usd;
}
return totalUsd > 0 ? buyUsd / totalUsd : null;
}
connect(['BTCUSDT', 'ETHUSDT', 'SOLUSDT']);
Заметки:
- Одно WebSocket-соединение тянет до 1024 стримов. Для 100+ символов разбейте на 2-3 соединения.
- Всегда обрабатывайте переподключения: Binance разрывает связь каждые 24ч или после сетевых сбоев.
- Если ваш обработчик медленный, сообщения копятся внутри. Толкайте их в очередь и обрабатывайте в отдельном тике, чтобы избежать крашей от backpressure.
Реальность объёма данных
Подписка на aggTrade по 50 активным альтам даёт 5 000-30 000 сообщений в минуту в обычные часы. Во время новостных событий или флеш-крашей можно увидеть 100 000+ в минуту.
Что из этого следует:
- Не храните каждый aggTrade в базе. Агрегируйте в поминутные или по-5-минутные сводки.
- Память: ~50 байт на aggTrade × 100K/час × 50 символов = ~25GB/день, если хранить всё. Держите скользящие окна только в памяти.
- CPU: незначительно, пока вы не делаете тяжёлую работу в обработчике сообщения. Толкайте в очередь обработки.
Для исследований можно записать несколько часов aggTrade в файл и разобрать офлайн: вот правильное место для глубокой статистики, а не циклы реального времени.
Чем aggTrade НЕ является
Две важные оговорки:
1. aggTrade — это пост-исполнение. К моменту, когда вы его видите, сделка уже произошла. Опередить её нельзя. Вы можете использовать АГРЕГИРОВАННЫЙ паттерн, чтобы информировать решения о БУДУЩЕМ поведении, но не можете торговать по какой-либо отдельной записи aggTrade как таковой.
2. aggTrade не показывает отложенные ордера. В стакане есть и исполненные сделки (aggTrade), И стоящие ордера (стримы depth/depth20). Для полной картины нужны оба. aggTrade показывает только то, что случилось; depth показывает то, что стоит в очереди на исполнение.
Как это используют институциональные столы
На настоящем систематическом торговом столе лента aggTrade питает несколько разных типов стратегий:
- Детекция токсичности order flow. Сильный направленный тейкерский поток указывает на информированных участников. Провайдеры ликвидности в ответ расширяют спреды или отходят в сторону.
- Детекция айсбергов. Алгоритмы следят, не бьют ли и не наполняют ли один и тот же ценовой уровень раз за разом: признак крупного скрытого ордера. Одни фирмы опережают его, другие пристраиваются следом.
- Предсказание каскадов. Внезапные всплески taker-sell часто предшествуют более глубоким падениям. Алгоритмы сбрасывают экспозицию или открывают шорты.
- Исполнение Volume Profile / VWAP. Взвешенные по времени алгоритмы исполнения следят, чтобы собственные крупные ордера фирмы шли в такт активности рынка, минимизируя влияние на цену.
Для ритейл-систематических стратегий самые полезные применения такие: инженерия фич (taker-buy ratio, счётчик китовых принтов) и детекция событий (паттерны внезапных всплесков). Их проще извлечь и провалидировать, чем более изощрённые институциональные приёмы.
Как начать этим пользоваться
Три нарастающих уровня вовлечённости:
1. Понаблюдайте за потоком час. Подпишитесь на aggTrade по BTCUSDT, логируйте в консоль, смотрите. Паттерны начнёте видеть за 30-60 минут: всплески, китовые принты, затишья. Это обязательно перед любой количественной работой.
2. Реализуйте базовые фичи. Taker-buy ratio на окнах 5мин и 30мин. Счётчик китовых принтов. Объём в секунду.
3. Прогоните бэктест фич против будущих доходностей. If your features have predictive power (AUC > 0.55 против, скажем, направления доходности следующих 30мин), они реальны. Большинство ритейл-«чтецов ленты» это не валидируют и в итоге читают паттерны, которые на деле ничего не предсказывают.
Частые ошибки
Пытаться читать отдельные сделки. Один агрегат на $300K не говорит вам ничего. Сигнал — это паттерны во множестве сделок во времени.
Забыть про инверсию флага m. «isBuyerMaker = false» означает, что купил ТЕЙКЕР. Многие понимают это наоборот и переворачивают свой анализ.
Использовать aggTrade для высокочастотных, чувствительных к латентности игр. К моменту доставки по WebSocket сделке уже 50-300мс. Настоящий HFT использует прямые фиды биржи с колокацией. Ритейл-aggTrade годится для среднечастотного анализа.
Хранить каждое сообщение. Забьёте диск. Агрегируйте в поминутные или по-5-минутные, а потом храните сводки.
Читать ленту во время новостей. Объём во время новостных событий аномален. Паттерны, которые «работают» на нормальных рынках, растворяются. Событийным стратегиям нужен свой отдельный каркас.
Куда двигаться дальше
Если этот вводный разбор полезен, естественные следующие шаги такие:
- Подпишитесь на aggTrade по 5-10 символам, которыми торгуете. Понаблюдайте неделю.
- Посчитайте и постройте график taker-buy ratio и счётчика китовых принтов во времени. Посмотрите, коррелируют ли паттерны визуально с ценовым движением.
- Начните бэктестить эти фичи как предикторы будущих доходностей. Используйте AUC-анализ на выборке в 30 дней (минимум 200+ событий для статистической значимости).
- Как только у вас появятся фичи с реальным эджем, встройте их в полноценный пайплайн генерации сигналов.
Если вам нужна структурированная программа, которая проведёт вас от «я только что прочитал этот пост» до «у меня развёрнута систематическая стратегия на фичах order flow», наш Crypto Quant Pro буткемп покрывает весь путь, включая инфраструктуру, исследование факторов, бэктестинг и живое исполнение. 30-дневный курс включает более строгий разбор фич микроструктуры в дни 7-12.
А если вы предпочитаете подписаться на сервис, который уже гоняет стратегии на таких данных, наш сигнальный продукт использует фичи позиционирования + микроструктуры, чтобы выдавать pre-pump алерты по USDT-margined альтам на Binance Futures. Живой референс-счёт; проверьте нашу работу перед подпиской.
Любой из путей, DIY или подписка, начинается с того, чтобы час почитать поток. Обходного пути мимо привыкания к сырым данным нет.