Сбор данных Long/Short Ratio с криптобирж: технический разбор
Трейдеру нужна годовая история Long/Short Ratio по 50+ инструментам для бэктестинга стратегий. Биржи хранят максимум месяц данных — Binance отдаёт только последние 500 записей (около 30 дней с максимальной детализацией 5-минутных свечей), Bybit — 200, OKX — 100. Собирать вручную через UI — сотни человеко-часов, а один пропуск данных разрушает backtest. Мы построили систему на async Python, которая непрерывно стягивает данные с трёх бирж одновременно, нормализует и складывает в TimescaleDB. Теперь история доступна за любой период, а добавление нового символа занимает 5 минут — достаточно прописать его в конфиге. В итоге трейдер получает непрерывный поток данных с задержкой менее минуты, пригодный для real-time индикаторов и сентимент-анализа криптовалют. Ниже — архитектура, подводные камни и готовое решение.
Официальные API для L/S ratio
Начинать нужно с официальных endpoints — они стабильны и не требуют браузерной автоматизации. Вот доступные источники:
| Биржа | Эндпоинт | Данные | Лимит истории | Аутентификация |
|---|---|---|---|---|
| Binance Futures | /futures/data/topLongShortAccountRatio |
Top trader account ratio | 500 записей, ~30 дней | Нет (public) |
| Binance Futures | /futures/data/globalLongShortAccountRatio |
Все аккаунты | 500 записей | Нет |
| Bybit | /v5/market/account-ratio |
Account ratio | 200 записей | Нет |
| OKX | /api/v5/rubik/stat/contracts/long-short-account-ratio |
Account ratio | 100 записей | Нет |
| CoinGlass (агрегатор) | /api/v1/longShort |
Агрегированные с 4+ бирж | Зависит от подписки | API key (платный) |
Согласно документации Binance Futures API, данные доступны только за последние 30 дней. Для долгосрочного анализа необходим постоянный сбор.
Binance Futures — наиболее полные данные, несколько эндпоинтов:
# Top trader long/short account ratio
GET https://fapi.binance.com/futures/data/topLongShortAccountRatio?symbol=BTCUSDT&period=5m&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 сек.
Почему без своей базы не обойтись?
Данные нужно собирать регулярно — биржи хранят историю ограниченно, поэтому собственная база данных необходима для анализа длинных периодов. PostgreSQL с расширением TimescaleDB — оптимальный выбор для time-series данных: она даёт автоматическое партиционирование по времени и continuous aggregates, ускоряющие range-запросы в 3 раза по сравнению с обычным PostgreSQL. InfluxDB быстрее на запись, но проигрывает в гибкости JOIN. Плоские CSV-файлы дешевы, но не поддерживают индексы и не защищают от дубликатов. Именно поэтому мы остановились на TimescaleDB — гарантия уникальности через ON CONFLICT и скорость вставки до 1000 записей/сек на одном узле.
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).
Как быть, если биржа не даёт API?
Некоторые биржи (Gate.io, Bitfinex) не публикуют L/S ratio через официальный API, но показывают его на веб-странице. Для таких случаев используем headless браузер через 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")Официальное API в 10 раз стабильнее, чем headless-парсинг. Браузерный парсинг нестабилен: верстка меняется, появляются 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 строку.
Как мы строим систему сбора
Наш процесс включает:
- Аналитика: выявляем все необходимые символы и периоды. Определяем, какие биржи дают L/S ratio через API, а где нужен парсинг.
- Проектирование архитектуры: выбираем стек (async Python, httpx, asyncpg) и схему хранения в TimescaleDB.
- Разработка парсеров: пишем асинхронные функции для каждой биржи с учётом rate limiter.
- Интеграция с БД: создаём гипертаблицу с партиционированием по дням и continuous aggregates для ускорения запросов.
- Мониторинг и алерты: настраиваем оповещения при падении успешности сбора ниже 95%.
Каждый этап тестируем на небольшом наборе данных, затем масштабируем.
Что входит в наше решение под ключ
Мы предлагаем готовую систему сбора и хранения L/S данных:
- Настройка парсеров под 3+ биржи (Binance, Bybit, OKX) с возможностью добавления новых.
- Хранение в TimescaleDB с автоматическим партиционированием и retention policy.
- Мониторинг сбора с алертами при падении успешности ниже 95%.
- API для доступа к собранным данным (фильтрация по бирже, символу, периоду).
- Документация и обучение команды.
Оценим ваш проект за 2 рабочих дня — напишите нам. Гарантируем доставку данных с момента запуска. Стоимость решения — от $1500 до $5000 в зависимости от количества символов и бирж. Экономия на инфраструктуре хранения может достигать $2000 в месяц. Уже реализовали для 10+ проектов с общим объёмом хранения более 500 млн записей. Свяжитесь с нами для консультации — обсудим вашу задачу без обязательств.
Почему стоит доверить сбор нам?
5 лет опыта в блокчейн-разработке, десятки проектов по парсингу и анализу данных. Используем production-стек: async Python, httpx, asyncpg, TimescaleDB. Все решения покрыты мониторингом и имеют резервные каналы сбора. Средняя экономия для наших клиентов — $1000-3000 в месяц. Получите консультацию — свяжитесь с нами.







