Сбор данных 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 в месяц. Получите консультацию — свяжитесь с нами.







