Парсинг данных Long/Short Ratio с бирж
Long/Short ratio — соотношение количества трейдеров или объёма позиций, открытых в long vs short на perpetual futures. Это один из ключевых индикаторов для сентимент-анализа рынка: экстремально высокий long ratio исторически совпадал с local tops, перегруженный short ratio — с short squeeze. Проблема: каждая биржа публикует эти данные в своём формате, с разной частотой, и не все предоставляют исторические данные через официальный API.
Официальные API: где данные уже есть
Начинать нужно с официальных endpoints — они стабильны и не требуют браузерной автоматизации.
Binance Futures — наиболее полные данные, несколько эндпоинтов:
# Top trader long/short account ratio
GET https://fapi.binance.com/futures/data/topLongShortAccountRatio?symbol=BTCUSDT&period=5m&limit=30
# Top trader long/short position ratio
GET https://fapi.binance.com/futures/data/topLongShortPositionRatio?symbol=BTCUSDT&period=1h&limit=30
# All accounts ratio (retail sentiment)
GET https://fapi.binance.com/futures/data/globalLongShortAccountRatio?symbol=BTCUSDT&period=1h&limit=30
Ответ: массив [{symbol, longShortRatio, longAccount, shortAccount, timestamp}]. Исторические данные ограничены: limit=500 максимум, period от 5m до 1d. Данные старше ~30 дней недоступны через API — нужно собирать самостоятельно.
Bybit — endpoint /v5/market/account-ratio:
GET https://api.bybit.com/v5/market/account-ratio?category=linear&symbol=BTCUSDT&period=1h&limit=50
OKX — /api/v5/rubik/stat/contracts/long-short-account-ratio:
GET https://www.okx.com/api/v5/rubik/stat/contracts/long-short-account-ratio?ccy=BTC&period=1H
OKX не требует аутентификации для публичных market data endpoints. Rate limit: 20 req/2 сек.
CoinGlass API — агрегирует L/S данные с Binance, OKX, Bybit, Bitget одним запросом. Платный (от $29/мес), но сильно упрощает работу с несколькими биржами.
Сбор и хранение
Данные нужно собирать регулярно — биржи хранят историю ограниченно, поэтому собственная база данных необходима для анализа длинных периодов.
import httpx
import asyncio
from datetime import datetime
import asyncpg
ENDPOINTS = {
"binance_top_account": "https://fapi.binance.com/futures/data/topLongShortAccountRatio",
"binance_global": "https://fapi.binance.com/futures/data/globalLongShortAccountRatio",
"bybit": "https://api.bybit.com/v5/market/account-ratio",
}
async def collect_ls_ratio(symbol: str, period: str, db: asyncpg.Connection):
async with httpx.AsyncClient() as client:
resp = await client.get(
ENDPOINTS["binance_global"],
params={"symbol": symbol, "period": period, "limit": 1},
timeout=10.0,
)
data = resp.json()[0]
await db.execute("""
INSERT INTO ls_ratio (exchange, symbol, period, long_ratio, short_ratio, ts)
VALUES ($1, $2, $3, $4, $5, $6)
ON CONFLICT (exchange, symbol, period, ts) DO NOTHING
""", "binance", symbol, period, float(data["longAccount"]),
float(data["shortAccount"]),
datetime.fromtimestamp(data["timestamp"] / 1000))
ON CONFLICT DO NOTHING — защита от дубликатов при повторном сборе. Уникальный индекс по (exchange, symbol, period, ts).
Для хранения time-series данных оптимален TimescaleDB (расширение PostgreSQL): автоматическая партиционирование по времени, эффективные range-запросы, continuous aggregates для downsampling.
Парсинг данных, недоступных через API
Некоторые биржи (Gate.io, Bitfinex) не публикуют L/S ratio через официальный API, но показывают его на веб-странице. Для таких случаев — headless browser парсинг через Playwright:
from playwright.async_api import async_playwright
async def scrape_gateio_ls(symbol: str) -> float:
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
# Перехватываем XHR запросы к internal API
ls_data = {}
page.on("response", lambda r: capture_ls_response(r, ls_data))
await page.goto(f"https://www.gate.io/futures/{symbol}")
await page.wait_for_timeout(3000)
await browser.close()
return ls_data.get("longShortRatio")
Но браузерный парсинг нестабилен: верстка меняется, появляются anti-bot меры (Cloudflare, PerimeterX). Для production использовать только как fallback, с мониторингом успешности сбора.
Практические замечания
Rate limiting: при сборе данных по 20+ символам с нескольких бирж легко получить HTTP 429. Используйте asyncio.Semaphore для ограничения одновременных запросов и exponential backoff при ошибках. Binance Futures: 1200 weight в минуту, каждый запрос = 1 weight для market data.
Нормализация данных: Binance возвращает longAccount как долю (0.65 = 65% long), OKX — как ratio (1.86 = 1.86:1 long/short). Нормализуйте к единому формату перед записью в БД.
Временные зоны: все timestamps конвертировать в UTC. Binance возвращает Unix milliseconds, Bybit тоже, OKX — ISO 8601 строку.







