Как получить исторические данные Hyperliquid через API
-
hyperliquid historical data
-
hyperliquid data api
-
hyperliquid исторические данные
-
hyperliquid свечные данные
-
hyperliquid история funding rate
Данные — база любого квантового исследования. Если ты бэктестишь торговую стратегию, анализируешь закономерности funding rate или изучаешь микроструктуру рынка, тебе нужны надежные и достаточно полные исторические данные. Hyperliquid как ончейн-биржа бессрочных контрактов предоставляет через REST API набор исторических эндпоинтов: свечи OHLCV, историю фондирования, сделки, пользовательские исполнения ордеров и ликвидации.
Ниже разберем, как получать разные типы исторических данных, какие параметры использовать, как делать пагинацию и как лучше хранить данные локально. Для сценариев, где нужны приватные пользовательские данные и подпись, аппаратный кошелек OneKey может помочь безопасно подписывать запросы: приватный ключ не должен попадать в скрипты сбора данных.
Обзор Hyperliquid Historical Data API
Согласно официальной документации Hyperliquid, большинство исторических данных запрашивается через endpoint POST /info. Тип данных выбирается полем type в теле запроса.
Все timestamp в API используются в формате Unix timestamp в миллисекундах, то есть 13-значное целое число.
Получение свечей K-line / OHLCV
Формат запроса
import requests
BASE_URL = "https://api.hyperliquid.xyz"
def fetch_candles(coin, interval, start_ms, end_ms):
"""
coin : торговый инструмент, например "BTC"
interval : таймфрейм, например "1m", "5m", "1h", "1d"
start_ms : начало периода, timestamp в миллисекундах
end_ms : конец периода, timestamp в миллисекундах
"""
payload = {
"type": "candleSnapshot",
"req": {
"coin": coin,
"interval": interval,
"startTime": start_ms,
"endTime": end_ms
}
}
resp = requests.post(f"{BASE_URL}/info", json=payload)
resp.raise_for_status()
return resp.json()
# Пример: получить 1-часовые свечи BTC за последние 7 дней
import time
end_ms = int(time.time() * 1000)
start_ms = end_ms - 7 * 24 * 3600 * 1000
candles = fetch_candles("BTC", "1h", start_ms, end_ms)
Поля в ответе
Каждая свеча содержит поля, названия которых стоит сверять с актуальной официальной документацией:
t: время начала свечи, timestamp в миллисекундахo: цена открытия, openh: максимум, highl: минимум, lowc: цена закрытия, closev: объем, volumen: количество сделок
Пагинация
У одного запроса обычно есть лимит на количество возвращаемых записей. Если тебе нужен длинный период, данные лучше тянуть частями:
def fetch_candles_paginated(coin, interval, start_ms, end_ms, page_size_ms):
"""
Делит временной диапазон на отрезки, последовательно забирает данные и объединяет результат.
page_size_ms: размер одного отрезка в миллисекундах.
Подбирай его с учетом interval.
"""
all_candles = []
cursor = start_ms
while cursor < end_ms:
batch_end = min(cursor + page_size_ms, end_ms)
batch = fetch_candles(coin, interval, cursor, batch_end)
all_candles.extend(batch)
if not batch:
break
# Следующая страница начинается с timestamp последней свечи + 1 мс
cursor = batch[-1]["t"] + 1
time.sleep(0.2) # чтобы не упереться в rate limit
return all_candles
История funding rate
Funding rate — один из ключевых механизмов бессрочников. Исторические ставки фондирования полезны для анализа настроений рынка, оценки стоимости удержания позиции и исследования арбитражных идей.
def fetch_funding_history(coin, start_ms, end_ms):
payload = {
"type": "fundingHistory",
"req": {
"coin": coin,
"startTime": start_ms,
"endTime": end_ms
}
}
resp = requests.post(f"{BASE_URL}/info", json=payload)
resp.raise_for_status()
return resp.json()
В ответе обычно есть значение funding rate для каждого расчетного периода и соответствующий timestamp. Эти данные можно использовать, чтобы:
- анализировать изменение баланса лонгов и шортов;
- искать экстремальные сигналы рыночных настроений;
- рассчитывать стоимость удержания позиции во времени.
Пользовательские сделки и история ордеров
Интерфейсы, связанные с приватными пользовательскими данными, требуют адрес кошелька, а в некоторых случаях — подпись. OneKey аппаратный кошелек может безопасно подписывать такие запросы: приватный ключ остается внутри защищенного элемента устройства и не раскрывается серверу или Python-скрипту.
def fetch_user_fills(address, start_ms, end_ms):
payload = {
"type": "userFills",
"req": {
"user": address,
"startTime": start_ms,
"endTime": end_ms
}
}
resp = requests.post(f"{BASE_URL}/info", json=payload)
resp.raise_for_status()
return resp.json()
История исполнений обычно включает ID ордера, направление, цену исполнения, объем, комиссии и другие поля. Это основа для расчета фактического PnL, оценки проскальзывания и проверки качества исполнения стратегии.
Ликвидации
Рыночные данные по ликвидациям помогают изучать структуру рынка и поведение участников в экстремальных движениях:
def fetch_liquidations(start_ms, end_ms):
payload = {
"type": "liquidations",
"req": {
"startTime": start_ms,
"endTime": end_ms
}
}
resp = requests.post(f"{BASE_URL}/info", json=payload)
resp.raise_for_status()
return resp.json()
Хранение данных: CSV и база данных
Сохранение в CSV
На этапе быстрого прототипирования CSV — самый простой вариант:
import csv
def save_candles_to_csv(candles, filepath):
if not candles:
return
fieldnames = ["t", "o", "h", "l", "c", "v", "n"]
with open(filepath, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for candle in candles:
writer.writerow({k: candle.get(k, "") for k in fieldnames})
Сохранение в базу данных
Если данных много или тебе нужны быстрые запросы, лучше использовать SQLite для локального сценария или PostgreSQL для продакшена:
import sqlite3
def init_db(db_path):
conn = sqlite3.connect(db_path)
conn.execute("""
CREATE TABLE IF NOT EXISTS candles (
coin TEXT,
interval TEXT,
t INTEGER,
o REAL,
h REAL,
l REAL,
c REAL,
v REAL,
n INTEGER,
PRIMARY KEY (coin, interval, t)
)
""")
conn.commit()
return conn
def insert_candles(conn, coin, interval, candles):
rows = [
(coin, interval, c["t"], c["o"], c["h"], c["l"], c["c"], c["v"], c["n"])
for c in candles
]
conn.executemany(
"INSERT OR IGNORE INTO candles VALUES (?,?,?,?,?,?,?,?,?)",
rows
)
conn.commit()
PRIMARY KEY (coin, interval, t) защищает от дублирования при повторной загрузке одного и того же периода и упрощает инкрементальное обновление.
Rate limits и практические замечания
У Hyperliquid API есть ограничения по частоте запросов. На момент чтения ориентируйся на актуальную официальную документацию. На практике полезно:
- добавлять задержку между запросами в цикле, например 200–500 мс;
- реализовать retry с exponential backoff;
- при HTTP 429 автоматически ждать и пробовать снова;
- большие исторические выгрузки запускать вне пиковых периодов;
- кэшировать уже загруженные диапазоны локально, чтобы не дергать API повторно.
Сравнение с другими источниками данных
Плюс нативного Hyperliquid API в том, что данные идут из первичного источника и обычно имеют минимальную задержку. Если тебе нужен ресерч сразу по нескольким биржам или протоколам, можно комбинировать Hyperliquid с другими источниками. Документация dYdX и документация GMX также описывают свои исторические API. Дизайн интерфейсов отличается, но базовые идеи похожи: endpoint, тип данных, временной диапазон, пагинация и хранение результата.
Частые вопросы
Q1: Какой минимальный таймфрейм доступен для свечей?
Смотри описание candleSnapshot в официальной документации Hyperliquid. Поддерживаются разные интервалы, включая минутные, часовые и дневные. Конкретные значения interval лучше проверять по актуальной документации: при некорректном параметре API вернет ошибку.
Q2: Насколько далеко назад можно получить исторические данные?
В принципе, данные с момента запуска соответствующего рынка на Hyperliquid должны быть доступны через API. Фактическая глубина зависит от даты запуска конкретного инструмента и результата запроса. Если в выбранном диапазоне данных нет, API может вернуть пустой массив.
Q3: Сколько времени занимает загрузка большого объема истории?
Зависит от диапазона, таймфрейма и пагинации. Например, для 1-часовых свечей за всю доступную историю с учетом rate limits загрузка может занять от нескольких минут до десятков минут. Лучше один раз положить данные в базу и дальше обновлять их инкрементально.
Q4: Зачем здесь OneKey кошелек?
Публичные рыночные данные — свечи, funding rate и похожие наборы — обычно доступны без аутентификации. Но приватные пользовательские данные, например история сделок и ордеров, могут требовать подпись. OneKey аппаратный кошелек помогает подписывать такие запросы безопасно: приватный ключ не попадает на сервер или в скрипт сбора данных.
Q5: Как обрабатывать пропуски в данных?
Сетевые ошибки, сбои API или неудачные retry могут оставить gaps в истории. Хорошая практика — логировать каждый загруженный временной диапазон, периодически сканировать базу на пропуски и отдельно дозагружать недостающие участки. Для бэктестов это критично: gaps могут исказить сигналы и результаты стратегии.
Итог
Hyperliquid historical data API дает хорошую основу для квантового ресерча: свечи, funding rate, пользовательские исполнения и ликвидации можно собрать сравнительно небольшим Python-скриптом. Если тебе нужны приватные данные и подписи, аппаратный кошелек OneKey помогает не выносить приватный ключ в среду, где работает сборщик данных.
А если после анализа ты хочешь перейти к практической торговле бессрочниками, удобный рабочий процесс — использовать OneKey Perps внутри экосистемы OneKey. Попробуй или скачай OneKey, подключи кошелек и используй OneKey Perps как более безопасный и понятный путь от данных и гипотез к реальным действиям на рынке.
Риск-предупреждение: исторические данные отражают только прошлое состояние рынка и не говорят, что будет дальше. Квантовые стратегии на истории подвержены переобучению, а результаты в реальной торговле могут сильно отличаться от бэктеста. Торговля бессрочными контрактами и использование плеча несут высокий риск и могут привести к потере средств. Этот материал предназначен для технического обучения и не является инвестиционной, финансовой или юридической рекомендацией.



