Граббінг даних Open Interest з бірж

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Граббінг даних Open Interest з бірж
Середній
від 1 дня до 3 днів
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1308
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1222
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    921
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1151
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    614
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    886

Парсинг даних Open Interest з бірж

Open Interest (OI) — суммарний обсяг відкритих фьючерсних/опціонних позицій. Це один з ключових індикаторів для аналітики дериватів: різкий ріст OI при падінні ціни означає відкриття нових шортів, ріст OI при зростанні ціни — набір лонгів. Але щоб це рахувати, потрібні надійні дані, а у кожної біржі свій API зі своїми quirks.

Джерела даних: Де брати OI

Централізовані біржі дериватів публікують OI через REST та WebSocket API:

Біржа Endpoint Особливість
Binance GET /fapi/v1/openInterest (perp), /futures/data/openInterestHist (історія) Історія тільки за 30 днів, гранулярність 5 хв/15 хв/1 год
Bybit GET /v5/market/open-interest Параметр intervalTime: 5min, 15min, 30min, 1h, 4h, 1d
OKX GET /api/v5/rubric/open-interest Підтримує futures, swap, options
dYdX v4 GraphQL API або Indexer REST On-chain, дані публічні без ключів
GMX v2 On-chain через контракт Reader Немає централізованого API

Для агрегованої картини ринку потрібні всі крупні платформи. Dominance однієї біржи смішує картину: у 2022 році FTX давав ~30% OI ринку, після його краху метрики по всіх індексах просели.

Архітектура колектора

Ключове рішення: polling vs WebSocket. Більшість бірж надають OI тільки через REST (не WebSocket — OI не такий high-frequency сигнал як ціна). Оптимальний підхід — scheduled polling кожні 1-5 хвилин.

import asyncio
import aiohttp
from datetime import datetime
from decimal import Decimal

class OICollector:
    def __init__(self, db, symbols: list[str]):
        self.db = db
        self.symbols = symbols
        self.session: aiohttp.ClientSession = None

    async def collect_binance_oi(self, symbol: str) -> dict:
        url = f"https://fapi.binance.com/fapi/v1/openInterest"
        async with self.session.get(url, params={"symbol": symbol}) as resp:
            data = await resp.json()
            return {
                "exchange": "binance",
                "symbol": symbol,
                "oi_value": Decimal(data["openInterest"]),
                "oi_usd": Decimal(data["openInterest"]) * await self.get_price(symbol),
                "timestamp": datetime.utcfromtimestamp(data["time"] / 1000),
            }

    async def collect_bybit_oi(self, symbol: str) -> dict:
        url = "https://api.bybit.com/v5/market/open-interest"
        async with self.session.get(url, params={
            "category": "linear",
            "symbol": symbol,
            "intervalTime": "5min",
            "limit": 1,
        }) as resp:
            data = await resp.json()
            item = data["result"]["list"][0]
            return {
                "exchange": "bybit",
                "symbol": symbol,
                "oi_value": Decimal(item["openInterest"]),
                "timestamp": datetime.utcfromtimestamp(int(item["timestamp"]) / 1000),
            }

    async def collect_all(self):
        tasks = []
        for symbol in self.symbols:
            tasks.extend([
                self.collect_binance_oi(symbol),
                self.collect_bybit_oi(symbol),
            ])
        results = await asyncio.gather(*tasks, return_exceptions=True)
        valid = [r for r in results if not isinstance(r, Exception)]
        await self.db.bulk_insert(valid)

Rate limits та стратегії обходу

Кожна біржа має rate limits на API. Binance fapi: 2400 weight/хвилину, openInterest = 1 weight. Bybit: 600 req/5 сек. При 50+ парах polling кожну хвилину легко впирається в лімітів.

Стратегії:

Пріоритизація символів. BTC та ETH — кожну хвилину, топ-20 по обсягу — кожні 5 хвилин, інші — кожні 15-30 хвилин.

Паралельний збір з rate limit guard:

from asyncio import Semaphore

class RateLimitedCollector:
    def __init__(self, max_concurrent: int = 10):
        self.semaphore = Semaphore(max_concurrent)
        self.last_request_times = {}  # exchange -> deque of timestamps

    async def throttled_request(self, exchange: str, coro):
        async with self.semaphore:
            await self.enforce_rate_limit(exchange)
            return await coro

IP ротація — якщо обсяг даних потребує > 1 інстансу колектора, кожен працює з окремим IP. Використовуйте residential proxies або різні VPS для різних бірж.

WebSocket бірж для цін — беріть ціну з WebSocket (висока частота), OI — з REST за розписанням. Уникайте зайвих REST-запитів для цін.

Нормалізація даних

Різні біржи повертають OI в різних одиницях:

  • Binance BTCUSDT perp — в BTC (число контрактів × 1 BTC за контракт)
  • Bybit BTCUSDT — в USD (base currency × price)
  • OKX BTC-USDT-SWAP — в контрактах (1 контракт = 0.01 BTC)
  • CME Bitcoin Futures — в контрактах (1 контракт = 5 BTC)

Для сопоставимого агрегату все приводимо до USD-номіналу:

def normalize_to_usd(oi_value: Decimal, unit: str, btc_price: Decimal) -> Decimal:
    match unit:
        case "BTC":
            return oi_value * btc_price
        case "USD" | "USDT":
            return oi_value
        case "contracts_0.01BTC":
            return oi_value * Decimal("0.01") * btc_price
        case "contracts_5BTC":  # CME
            return oi_value * Decimal("5") * btc_price
        case _:
            raise ValueError(f"Unknown OI unit: {unit}")

Зберігання та агрегація

TimescaleDB — оптимально для time-series OI даних:

CREATE TABLE open_interest (
    time       TIMESTAMPTZ NOT NULL,
    exchange   TEXT NOT NULL,
    symbol     TEXT NOT NULL,
    oi_contracts NUMERIC(30, 8),
    oi_usd     NUMERIC(30, 2),
    PRIMARY KEY (time, exchange, symbol)
);

SELECT create_hypertable('open_interest', 'time');

-- Continuous aggregate: агрегований OI по всіх біржах
CREATE MATERIALIZED VIEW oi_aggregate_5m
WITH (timescaledb.continuous) AS
SELECT
    time_bucket('5 minutes', time) AS bucket,
    symbol,
    SUM(oi_usd) AS total_oi_usd,
    jsonb_object_agg(exchange, oi_usd) AS by_exchange
FROM open_interest
GROUP BY bucket, symbol;

OI change alerts: Торгові сигнали

Різка зміна OI — торговий сигнал. Стандартні пороги:

  • OI виріс > 5% за 1 годину — значне відкриття позицій
  • OI впав > 10% за 1 годину — ліквідації або масове закриття
-- Поточна зміна OI за останні 1 та 4 години
SELECT
    symbol,
    total_oi_usd AS current_oi,
    LAG(total_oi_usd, 12) OVER (PARTITION BY symbol ORDER BY bucket) AS oi_1h_ago,
    (total_oi_usd - LAG(total_oi_usd, 12) OVER (PARTITION BY symbol ORDER BY bucket))
      / LAG(total_oi_usd, 12) OVER (PARTITION BY symbol ORDER BY bucket) * 100 AS change_1h_pct
FROM oi_aggregate_5m
WHERE bucket = (SELECT MAX(bucket) FROM oi_aggregate_5m)
ORDER BY ABS(change_1h_pct) DESC NULLS LAST;

Додаткові метрики

OI у зв'язці з іншими даними дає більш повну картину:

Long/Short ratio — доступний на Binance (/futures/data/globalLongShortAccountRatio), Bybit. Показує позиціонування трейдерів.

Funding rate — вартість утримання перпетуальної позиції. Високий positive funding + високий OI = перегрітий лонг.

OI-weighted funding — середній funding по всіх біржах взважений по їх OI. Більш точний агрегат ніж просте середнє.

Розробка колектора для 5-7 бірж з нормалізацією та базовими агрегатами — 1-2 тижні. Повний analytics pipeline з алертами, API та дашбордом — 3-4 тижні.