Парсинг данных ликвидаций с бирж
Данные о ликвидациях — один из наиболее ценных on-chain и off-chain сигналов для трейдеров. Резкий рост ликвидаций лонгов → потенциальное продолжение падения. Каскад ликвидаций шортов → возможный short squeeze. Проблема: биржи отдают эти данные по-разному, многие ограничивают историческую глубину, а REST и WebSocket API ведут себя непредсказуемо под нагрузкой.
Источники данных: CeFi vs DeFi
Централизованные биржи
Binance — самый ликвидный источник. WebSocket endpoint wss://fstream.binance.com/ws/!forceOrder@arr стримит все ликвидации по всем фьючерсным парам в реальном времени. Формат события:
{
"e": "forceOrder",
"E": 1704067200000,
"o": {
"s": "BTCUSDT",
"S": "SELL", // SELL = long liquidation
"o": "LIMIT",
"f": "IOC",
"q": "0.014", // quantity
"p": "41850.00", // price
"ap": "41800.00", // average price
"X": "FILLED",
"l": "0.014",
"z": "0.014",
"T": 1704067200000
}
}
Исторические данные доступны через REST только за последний час (/fapi/v1/forceOrders). Для более глубокой истории — нужно непрерывно пишет данные самостоятельно с момента запуска.
OKX — WebSocket channel liquidation-orders с фильтром по инструменту. Похожая структура, другие имена полей. REST история — 3 месяца через /api/v5/public/liquidation-orders.
Bybit — WebSocket topic liquidation.{symbol}. Исторические данные через /v5/market/recent-trade (ликвидации приходят как особый тип трейдов).
Bitmex — WebSocket liquidation channel. Один из старейших источников, данные с 2014 года через API.
Deribit — опционы и фьючерсы на BTC/ETH. WebSocket liquidations.{instrument}. Важен для понимания опционного рынка.
Децентрализованные биржи
DeFi perps ликвидации — это on-chain события, более надёжный источник:
GMX v2 — событие PositionLiquidated (или OrderCancelled с reason LIQUIDATION) в EventEmitter контракте на Arbitrum. Все данные on-chain, historical данные через The Graph subgraph или прямой парсинг.
dYdX v4 — Cosmos-based chain, ликвидации как on-chain транзакции. Парсинг через Cosmos RPC или Indexer API.
Hyperliquid — свой L1, API с полной историей ликвидаций.
Aave v3, Compound v3 — lending ликвидации через LiquidationCall / AbsorbCollateral события. Это не perps, но важный компонент общей картины ликвидаций.
Реализация WebSocket collector
import WebSocket from 'ws';
interface LiquidationEvent {
exchange: string;
symbol: string;
side: 'long' | 'short'; // какая сторона была ликвидирована
price: number;
quantity: number;
quantity_usd: number;
timestamp: number;
raw: Record<string, unknown>;
}
class BinanceLiquidationCollector {
private ws: WebSocket;
private reconnectDelay = 1000;
async connect(onEvent: (event: LiquidationEvent) => Promise<void>) {
this.ws = new WebSocket('wss://fstream.binance.com/ws/!forceOrder@arr');
this.ws.on('message', async (data) => {
const raw = JSON.parse(data.toString());
const event = this.normalize(raw);
await onEvent(event);
});
this.ws.on('close', () => {
// Exponential backoff reconnect
setTimeout(() => {
this.reconnectDelay = Math.min(this.reconnectDelay * 2, 30000);
this.connect(onEvent);
}, this.reconnectDelay);
});
this.ws.on('open', () => {
this.reconnectDelay = 1000; // reset on success
});
}
private normalize(raw: any): LiquidationEvent {
return {
exchange: 'binance',
symbol: raw.o.s,
side: raw.o.S === 'SELL' ? 'long' : 'short',
price: parseFloat(raw.o.ap),
quantity: parseFloat(raw.o.q),
quantity_usd: parseFloat(raw.o.ap) * parseFloat(raw.o.q),
timestamp: raw.E,
raw,
};
}
}
Для мультибиржевого коллектора — один интерфейс LiquidationCollector с реализациями per exchange. Нормализация в единый формат критична: у каждой биржи свои conventions для side, price, quantity.
Хранение и агрегация
Ликвидации — time-series данные. TimescaleDB — оптимальный выбор:
CREATE TABLE liquidations (
time TIMESTAMPTZ NOT NULL,
exchange TEXT NOT NULL,
symbol TEXT NOT NULL,
base_asset TEXT NOT NULL, -- BTC, ETH, SOL
side TEXT NOT NULL, -- 'long' | 'short'
price NUMERIC(20, 8),
quantity NUMERIC(20, 8),
quantity_usd NUMERIC(20, 2),
raw JSONB
);
SELECT create_hypertable('liquidations', 'time');
-- Индекс для быстрых запросов по активу
CREATE INDEX ON liquidations (base_asset, time DESC);
Continuous aggregates для аналитики:
-- Агрегат по минутам для каждого актива
CREATE MATERIALIZED VIEW liquidations_1m
WITH (timescaledb.continuous) AS
SELECT
time_bucket('1 minute', time) AS bucket,
base_asset,
exchange,
SUM(CASE WHEN side = 'long' THEN quantity_usd ELSE 0 END) AS long_liq_usd,
SUM(CASE WHEN side = 'short' THEN quantity_usd ELSE 0 END) AS short_liq_usd,
COUNT(*) AS count
FROM liquidations
GROUP BY bucket, base_asset, exchange;
Метрики и индикаторы
Полезные производные метрики из raw данных ликвидаций:
Cumulative liquidation volume — сумма ликвидаций за период. Резкий рост > 3 стандартных отклонения от скользящего среднего — сигнал каскада.
Long/Short ratio ликвидаций — если 80%+ ликвидаций одной стороны — направленный сигнал.
Liquidation clusters — ценовые уровни с высокой концентрацией ликвидаций. Используются как уровни поддержки/сопротивления (где находятся liquidation engines бирж).
import pandas as pd
import numpy as np
def detect_liquidation_cascade(
df: pd.DataFrame,
window_minutes: int = 5,
std_multiplier: float = 3.0,
) -> pd.Series:
"""
df: DataFrame с колонками ['time', 'quantity_usd']
Возвращает bool Series: True там где каскад ликвидаций
"""
rolling = df.set_index('time')['quantity_usd'].rolling(f'{window_minutes}T')
mean = rolling.mean()
std = rolling.std()
current = df.set_index('time')['quantity_usd']
return current > (mean + std_multiplier * std)
Ограничения и edge cases
Биржи не всегда отдают все данные. Некоторые биржи агрегируют мелкие ликвидации или вводят задержку. Исторические данные могут быть ревизированы.
Diffs в нормализации. У Binance S: "SELL" означает ликвидацию long позиции (принудительная продажа). У других бирж логика может быть обратной — всегда верифицировать логику side.
WebSocket message lag. Binance WS иногда доставляет события с задержкой 1-5 секунд при высокой нагрузке на рынке — именно когда данные наиболее важны. Timestamp в raw событии — это время ликвидации, а не доставки.
Cross-exchange deduplication. Одна крупная позиция может быть ликвидирована через несколько ордеров, которые придут как отдельные события.
Стек и сроки
| Компонент | Технология |
|---|---|
| Collectors | TypeScript/Node.js (одна нода для всех WS) |
| Очередь | Redis Streams / Kafka |
| БД | TimescaleDB |
| DeFi on-chain | viem + event subscription |
| API | FastAPI (Python) или Express |
| Дашборд | Grafana / кастомный React |
Коллектор для 5 бирж + on-chain GMX/Aave + TimescaleDB хранение + базовый API: 3-4 недели. Кастомный дашборд с liquidation heatmap и каскад-детектором — ещё 1-2 недели.







