Reading the aggregate-trade tape on Binance
If you've never read the aggTrade tape, you're trading from charts. Charts are aggregations of decisions. The aggTrade tape IS the decisions — every single executed trade, who was the taker, what direction, what size, at what price, at what millisecond. This is microstructure data. It's free. It's available via WebSocket. And it gives you information that price candles literally cannot contain.
What is the aggTrade tape
Every time someone places a market order on Binance Futures, they consume liquidity from the order book. The trade is recorded with: price, quantity, timestamp, and a flag indicating who was the maker (the resting order) vs the taker (the aggressing order).
The "aggregate" part means: if a single market order eats through 5 different price levels, those 5 fills are merged into ONE aggTrade record with the volume-weighted price and total quantity. So aggTrade is "trade-level" data — one record per market order, not per price level.
You access it via WebSocket: wss://fstream.binance.com/stream?streams=btcusdt@aggTrade. Subscribe and messages start arriving within seconds. On a busy symbol like BTCUSDT, expect 50-200 messages per second during normal hours, much more during volatility.
The fields and what they mean
A typical aggTrade payload:
{
"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
}
The single most important field is m, the "isBuyerMaker" flag.
m: false— buyer was the TAKER. They placed a market BUY, lifting an offer aggressively. This represents bullish conviction.m: true— seller was the TAKER. They placed a market SELL, hitting a bid aggressively. This represents bearish conviction.
Reverse the flag in your head: if m is FALSE, the trade is a "taker buy" — buying pressure. Confusing naming, but the convention sticks.
Why this matters more than candles
A 1-minute candle showing $50M volume with high $100,150 and low $99,950 tells you trades happened in that range. It doesn't tell you:
- Whether 80% of those trades were aggressive buys vs 50/50 mixed
- Whether the volume came from 5,000 retail-size trades or 5 whale-size trades
- Whether the volume clustered in a 3-second burst or spread evenly across 60 seconds
The aggTrade tape preserves all three pieces. Charts collapse them. The decisions you make from charts are blind to the underlying reality of who is buying or selling and how aggressively.
Patterns to recognize on the tape
After enough screen time, certain tape patterns become recognizable. These aren't proprietary — they're well-known across institutional trading desks.
Sustained taker-buy with rising price
Each new aggTrade shows m: false (taker buys). Price ticks up gradually. This is "supply absorption" — buyers are consuming offers faster than makers replenish them. Bullish.
Spike of taker-buys with NO price movement
20-30 taker-buys in 10 seconds, but price holds flat. This means a large limit-sell wall is absorbing the demand. Someone is unloading aggressively-priced asks; buyers are eating them but the seller has more inventory. Usually the seller wins (price drops once buyers exhaust). Step away.
Empty tape with widening spread
Suddenly very few aggTrades. The previously-tight bid-ask spread expands. Market makers pulled liquidity. Volatility incoming. The lack of trades is itself information.
Long-tail size distribution
Most trades $500-5,000. Then suddenly a single $500K+ aggregate. That single large trade is usually informed — a market participant willing to pay slippage to enter quickly because they have a thesis. Watch direction.
Iceberg pattern
Same price level keeps refilling on the bid (or ask) after being eaten. A large hidden order is committed there. Often holds during pullbacks; signals direction.
Stop-cascade
Sudden burst of taker-sells (m=true) followed by deeper price drops, followed by another burst, deeper drop, etc. Stop losses cascading. After the cascade exhausts (usually 20-90 seconds), price often reverses sharply as the supply is gone.
The taker-ratio metric
The most basic systematic feature derived from aggTrade:
taker_buy_ratio = sum(quantity × price) where m=false
/ sum(quantity × price) all aggTrades
Computed over a window (5min, 30min, 1h, etc).
Above 0.55 means sustained buying pressure. Below 0.45 means selling pressure. The metric is most useful in CONTEXT:
- High taker-buy ratio AT the bottom of a range — accumulation, bullish
- High taker-buy ratio AT the top of a move — late chasers, often bearish (reversal coming)
- Low taker-buy ratio during a downtrend — capitulation continuing
- Low taker-buy ratio AT the bottom — selling exhaustion, often bullish
Used alone it's noisy. Combined with positioning data (open interest, top trader long/short ratios) it becomes a real signal component.
Whale prints
Define a "whale print" as any aggTrade above some notional threshold — say $50,000 or $100,000. Count whale prints per minute and per side (buys vs sells).
Useful patterns:
- 3+ whale buys in 5 minutes with no whale sells: real demand
- Single whale buy followed by 30 minutes of taker-sell drift: someone exited a long they no longer wanted
- Whale buys clustering near specific price levels: support being defended
The threshold ($50K vs $100K vs $500K) depends on the coin's liquidity. For BTC: $1M+ is "whale." For mid-cap alts: $50K is significant. Calibrate per coin.
Implementing the WebSocket subscriber
Production-quality Node.js skeleton:
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']);
Notes:
- Each WebSocket connection can handle up to 1024 streams. For 100+ symbols, split across 2-3 connections.
- Always handle reconnects — Binance disconnects every 24h or after network blips.
- If your handler is slow, messages back up internally. Push to a queue and process in a separate tick to avoid backpressure crashes.
The data volume reality
Subscribing to aggTrade for 50 active alts produces 5,000-30,000 messages per minute during normal hours. During news events or flash crashes, you might see 100,000+ per minute.
Implications:
- Don't store every aggTrade in your database. Aggregate to per-minute or per-5-minute summaries.
- Memory usage: ~50 bytes per aggTrade × 100K/hour × 50 symbols = ~25GB/day if you keep all. Use rolling windows in memory only.
- CPU usage: minor as long as you don't do heavy work in the message handler. Push to processing queue.
For research purposes, you can capture a few hours of aggTrade to a file and analyze offline — that's the right place to do deep statistical work, not in real-time loops.
What aggTrade is NOT
Two important caveats:
1. aggTrade is post-execution. By the time you see it, the trade has already happened. You can't front-run it. You can use the AGGREGATE pattern to inform decisions about FUTURE behavior, but you can't trade off any individual aggTrade record itself.
2. aggTrade doesn't show pending orders. The order book has both filled trades (aggTrade) AND resting orders (depth/depth20 streams). For a complete picture, you need both. aggTrade alone shows what happened; depth shows what's queued to happen.
How institutional desks use this
At a real systematic trading desk, the aggTrade tape powers several distinct strategy types:
- Order-flow toxicity detection. Strong directional taker flow indicates informed participants. Liquidity providers widen spreads or step away in response.
- Iceberg detection. Algorithms watch for the same price level being repeatedly hit and refilled — sign of a large hidden order. Some firms front-run; some piggyback.
- Cascade prediction. Sudden taker-sell bursts often precede deeper drops. Algorithms unwind exposure or initiate shorts.
- Volume Profile / VWAP execution. Time-weighted execution algorithms ensure the firm's own large orders match market activity, minimizing impact.
For retail systematic strategies, the most useful applications are: feature engineering (taker-buy ratio, whale-print count) and event detection (sudden burst patterns). These are easier to extract and validate than the more sophisticated institutional uses.
How to start using it
Three escalating levels of engagement:
1. Watch a feed for an hour. Subscribe to BTCUSDT aggTrade, log to console, watch. You'll start seeing patterns within 30-60 minutes — bursts, whale prints, dead spots. This is mandatory before any quantitative work.
2. Implement basic features. taker-buy ratio over 5min and 30min windows. Whale-print count. Volume per second.
3. Backtest features against forward returns. If your features have predictive power (AUC > 0.55 against, say, next-30min return direction), they're real. Most retail "tape readers" don't validate this and end up reading patterns that don't actually predict.
Common mistakes
Trying to read individual trades. One $300K aggregate doesn't tell you anything. Patterns in many trades over time are the signal.
Forgetting the m flag inversion. "isBuyerMaker = false" means TAKER bought. Many people get this backward and reverse their analysis.
Using aggTrade for high-frequency latency-sensitive plays. By the time the WebSocket delivers, the trade is 50-300ms old. Real HFT uses direct exchange feeds with co-location. Retail aggTrade is for medium-frequency analysis.
Storing every message. You'll fill the disk. Aggregate to per-minute or per-5-minute, then store summaries.
Reading the tape during news. Volume during news events is anomalous. Patterns that "work" in normal markets dissolve. Event-driven strategies need their own framework.
Where to go next
If this primer is useful, the natural next steps are:
- Subscribe to aggTrade for 5-10 symbols you trade. Observe a week.
- Compute and plot taker-buy ratio and whale-print count over time. See if patterns visually correlate with price action.
- Start backtesting these features as predictors of forward returns. Use AUC analysis on a 30-day sample (minimum 200+ events for statistical relevance).
- Once you have features with real edge, integrate them into a proper signal-generation pipeline.
If you want a structured curriculum that takes you from "I just read this post" to "I have a deployed systematic strategy using order-flow features," our Crypto Quant Pro bootcamp covers the full path including infrastructure, factor research, backtesting, and live execution. The 30-day course includes a more rigorous treatment of microstructure features in Days 7-12.
And if you'd rather subscribe to a service that already runs strategies built on this kind of data, our signal product uses positioning + microstructure features to fire pre-pump alerts on Binance Futures USDT-margined alts. Live reference account; verify our work before subscribing.
Either path — DIY or subscribe — start with reading a feed for an hour. There's no shortcut around getting comfortable with the raw data.