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, добавив ставки финансирования как индикатор рыночного сентимента.




