Парсинг истории фандинга OKX на Python Asyncio: Гайд

Парсинг истории фандинга OKX на Python Asyncio: Гайд Python & API
Пошаговое руководство по асинхронному парсингу истории ставок финансирования (Funding Rates) с биржи OKX V5 API с использованием Python asyncio и aiohttp.
Суть: Эффективный сбор исторических ставок финансирования (Funding Rates) с OKX V5 API реализуется через асинхронные HTTP-запросы с помощью библиотеки aiohttp. Пагинация осуществляется в обратном хронологическом порядке с использованием параметра after, куда передается временная метка fundingTime последнего полученного элемента.

Исходный код

Для эффективного сбора исторических данных на финансовых рынках критически важна скорость и отказоустойчивость. Использование асинхронного подхода на Python позволяет параллельно опрашивать эндпоинты биржи без блокировки основного потока выполнения.

При работе с высокочастотными запросами к биржам часто возникает проблема лимитов. Если вы планируете масштабировать сбор данных на несколько сотен инструментов, вам обязательно пригодится Настройка ротации API-ключей Binance для HFT на Python, принципы которой легко адаптировать и под OKX.

Ниже представлен готовый к продакшену асинхронный класс OKXFundingParser, который скачивает историю фандинга для любого SWAP-инструмента, обрабатывает лимиты запросов (Rate Limits) и корректно пагинирует данные.

import asyncio
import aiohttp
import logging
from typing import List, Dict, Any

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

class OKXFundingParser:
    def __init__(self, inst_id: str, limit: int = 100):
        self.inst_id = inst_id
        self.limit = limit
        self.base_url = "https://www.okx.com"
        self.endpoint = "/api/v5/public/funding-rate-history"

    async def fetch_page(self, session: aiohttp.ClientSession, after: str = "") -> List[Dict[str, Any]]:
        params = {
            "instId": self.inst_id,
            "limit": str(self.limit)
        }
        if after:
            params["after"] = after

        url = f"{self.base_url}{self.endpoint}"
        try:
            async with session.get(url, params=params) as response:
                if response.status == 200:
                    data = await response.json()
                    if data.get("code") == "0":
                        return data.get("data", [])
                    else:
                        logging.error(f"API Error: {data.get('msg')}")
                elif response.status == 429:
                    logging.warning("Rate limit hit. Sleeping for 2 seconds...")
                    await asyncio.sleep(2)
                else:
                    logging.error(f"HTTP Error: {response.status}")
        except Exception as e:
            logging.error(f"Request failed: {e}")
        return []

    async def get_history(self, target_count: int = 500) -> List[Dict[str, Any]]:
        all_rates = []
        after = ""
        async with aiohttp.ClientSession() as session:
            while len(all_rates) < target_count:
                logging.info(f"Fetching funding rates for {self.inst_id}, collected: {len(all_rates)}")
                page = await self.fetch_page(session, after)
                if not page:
                    break
                all_rates.extend(page)
                # OKX pagination: 'after' points to the older records
                after = page[-1]["fundingTime"]
                # Polite sleep to respect rate limits
                await asyncio.sleep(0.1)
        return all_rates[:target_count]

async def main():
    parser = OKXFundingParser(inst_id="BTC-USDT-SWAP")
    rates = await parser.get_history(target_count=300)
    for rate in rates[:5]:
        print(f"Time: {rate['fundingTime']}, Rate: {rate['fundingRate']}, Realized Rate: {rate['realizedRate']}")

if __name__ == '__main__':
    asyncio.run(main())

Разбор параметров

Для успешной работы с API OKX V5 крайне важно понимать структуру запроса и ответа. Ниже приведены ключевые параметры, используемые в нашем скрипте:

  • instId: Уникальный идентификатор торгового инструмента на бирже OKX. Например, BTC-USDT-SWAP. Обратите внимание, что ставки финансирования рассчитываются исключительно для бессрочных контрактов (SWAP).
  • after: Параметр пагинации, указывающий временную метку (в миллисекундах), до которой (то есть хронологически раньше) необходимо получить данные. Мы передаем туда fundingTime последнего элемента текущей страницы.
  • limit: Количество возвращаемых записей за один запрос. Максимально допустимое значение для эндпоинта истории фандинга в OKX V5 составляет 100.
  • fundingRate: Прогнозируемая или расчетная ставка финансирования для следующего периода.
  • realizedRate: Фактически выплаченная (реализованная) ставка финансирования за прошедший период. Именно этот параметр чаще всего используется в бэктестах.

Как запустить

Для запуска этого скрипта вам понадобится установленный интерпретатор Python версии 3.8 или выше, а также библиотека aiohttp для выполнения асинхронных HTTP-запросов.

Установите необходимую зависимость с помощью пакетного менеджера pip:

pip install aiohttp

Сохраните приведенный выше исходный код в файл с именем okx_funding.py и запустите его из терминала:

python okx_funding.py

Для получения данных в реальном времени (например, для маркетмейкинга опционов) REST API может быть медленным. В таких случаях лучше использовать вебсокеты, как описано в статье Deribit WebSocket: Получение Греков Опционов в Реальном Времени с Asyncio.

Собранные исторические данные по фандингу можно использовать в качестве фичей для обучения моделей машинного обучения. Например, вы можете обучить CatBoost для Классификации Ложных Пробоев в Торговом Боте на Python, добавив ставки финансирования как индикатор рыночного сентимента.

Оцените статью
FinFluct