Home>Blog>Ship a Prediction Market Bot on Hyperliquid in 100 Lines
Ship a Prediction Market Bot on Hyperliquid in 100 Lines

Ship a Prediction Market Bot on Hyperliquid in 100 Lines

By @CoinMarketMan - 14-Jul-2026

Создайте бота для рынка прогнозов на Hyperliquid за 100 строк

Большинство туториалов по рынкам прогнозов останавливаются на "установите SDK и разместите ордер". Это простая часть. Сложная часть — знать, какими рынками торговать и когда цена неверна. HIP-4 рынки результатов на Hyperliquid работают на том же движке матчинга, что и перпы и спот, а значит, вы можете наложить данные о позиционировании когорт поверх бинарных сделок по результатам, чтобы поймать неправильное ценообразование, которое чистые трейдеры рынков прогнозов не видят.

Это руководство проведёт вас через создание Python-бота, который обнаруживает HIP-4 рынки, читает стаканы ордеров, проверяет действия Smart Money на базовом активе и размещает сделки при совпадении сигналов. Всё это укладывается примерно в 100 строк рабочего кода.

Как на самом деле работают HIP-4 рынки результатов

HIP-4 был запущен на мейннете Hyperliquid 2 мая 2026 года. Каждый рынок ставит бинарный вопрос: превысит ли BTC целевую цену к определённой дате истечения? Трейдеры покупают позиции YES или NO, используя USDC в качестве залога. По истечении срока выигравшая сторона получает 1 USDC за единицу, проигравшая — 0.

Цена YES-токена в любой момент отражает подразумеваемую вероятность наступления события согласно рынку. Если YES торгуется по $0.65, рынок закладывает 65%-ную вероятность того, что событие произойдёт. Дополняющий NO-токен должен торговаться около $0.35, поскольку обе стороны делят один объединённый стакан ордеров, где покупка YES по цене p зеркально отражает продажу NO по 1-p.

Три вещи отличают HIP-4 от Polymarket. Первое, расчёт детерминирован: набор валидаторов Hyperliquid исполняет каждый контракт по заранее указанному объективному источнику данных без окна для споров и без голосования токенами. Второе, нет кредитного плеча и риска ликвидации. Позиции полностью обеспечены залогом при открытии. Третье, комиссии на открытие позиций сейчас нулевые, хотя builder codes по-прежнему применяются при исполнении.

Settlement Flow

Система кодирования, которую нужно правильно понять

HIP-4 использует систему кодирования из трёх форматов, которая ставит в тупик каждого разработчика с первого раза. Каждый результат имеет ID, и каждая сторона (YES = 0, NO = 1) создаёт числовое кодирование по формуле: encoding = 10 * outcome_id + side.

Но используемый формат зависит от контекста. Для размещения ордеров и запросов стакана ордеров добавляется префикс #, поэтому outcome 2 YES становится #20. Для запросов баланса добавляется префикс +, и та же позиция становится +20. Для внутренних asset ID SDK прибавляете кодирование к 100,000,000.

Эти форматы не взаимозаменяемы. Использование #20 для запроса баланса или +20 для ордера завершится молчаливой ошибкой без сообщения. Вот вспомогательные функции:

def encode_coin(outcome_id: int, side: int) -> str:
    """Order placement and book queries."""
    return f"#{10 * outcome_id + side}"

def encode_balance_coin(outcome_id: int, side: int) -> str:
    """Balance lookups only."""
    return f"+{10 * outcome_id + side}"

def encode_asset_id(outcome_id: int, side: int) -> int:
    """SDK internal mapping."""
    return 100_000_000 + 10 * outcome_id + side

Hip4 Asset Encoding

Требуется патч SDK: Официальный hyperliquid-python-sdk не поддерживает HIP-4 нативно. Его карта coin_to_asset строится только из spot_meta, поэтому кодирования результатов начиная с 100,000,000 неизвестны резолверу. Вам нужно получить outcomeMeta и вручную внедрить маппинги. Код ниже это обрабатывает.

Обнаружение активных рынков

Первое, что нужно сделать боту, — найти, какие рынки существуют. Эндпоинт outcomeMeta возвращает все активные и исполненные результаты, включая ID результата, описание через символ pipe (класс, базовый актив, дата истечения, целевая цена) и спецификации сторон.

import httpx

BASE_URL = "https://api.hyperliquid.xyz"

def fetch_outcome_meta():
    r = httpx.post(
        f"{BASE_URL}/info",
        json={"type": "outcomeMeta"},
        timeout=10.0,
    )
    return r.json()

def parse_active_markets(meta):
    markets = []
    for o in meta.get("outcomes", []):
        desc = o.get("description", "")
        parts = desc.split("|")
        if len(parts) >= 4:
            markets.append({
                "outcome_id": o["outcome"],
                "underlying": parts[1].strip(),
                "expiry": parts[2].strip(),
                "target": parts[3].strip(),
            })
    return markets

Это даёт список всех рынков результатов на платформе. Фильтруйте по дате истечения, чтобы сосредоточиться на рынках, которые ещё не исполнились. Ежедневный повторяющийся рынок BTC, например, исполняется в 06:00 UTC каждый день по цене метки BTC.

Чтение стакана ордеров и подразумеваемой вероятности

Каждая сторона результата имеет свой стакан ордеров. Вы запрашиваете его так же, как и спот-стакан, только с форматом монеты #N:

def fetch_book(coin: str):
    r = httpx.post(
        f"{BASE_URL}/info",
        json={"type": "l2Book", "coin": coin},
        timeout=10.0,
    )
    levels = r.json().get("levels", [[], []])
    bids = [(float(p), float(s)) for p, s in levels[0]]
    asks = [(float(p), float(s)) for p, s in levels[1]]
    return bids, asks

def get_mid_price(coin: str) -> float:
    bids, asks = fetch_book(coin)
    if bids and asks:
        return (bids[0][0] + asks[0][0]) / 2
    return 0.0

# Example: outcome 2
yes_mid = get_mid_price("#20")
no_mid = get_mid_price("#21")
print(f"YES: {yes_mid:.4f}, NO: {no_mid:.4f}, sum: {yes_mid + no_mid:.4f}")

На справедливом рынке YES mid + NO mid должны равняться примерно 1.0. Любое устойчивое отклонение — это либо артефакт комиссии, либо неправильное ценообразование, заслуживающее внимания. Спред между двумя сторонами — ваш первый сигнал.

Наложение сигналов когорт поверх цен результатов

Вот где боты для рынков прогнозов становятся интересными. Чистый трейдер рынка прогнозов смотрит на стакан ордеров и, возможно, на внешние новости. Разработчик с доступом к данным когорт видит кое-что другое: что на самом деле делают самые прибыльные кошельки на Hyperliquid с базовым активом.

Представьте рынок результатов BTC, который оценивает 55%-ную вероятность того, что BTC превысит целевую цену к истечению. Это лучшая оценка рынка. Но наши данные когорт показывают, что кошельки Money Printer (с более чем $1M всей прибыли за всё время) сильно нетто-лонг по перпам BTC, тогда как кошельки Giga-Rekt (с более чем $1M всех убытков за всё время) нетто-шорт. Когда трейдеры с лучшим историческим результатом расходятся с подразумеваемой вероятностью рынка прогнозов, это расхождение — сигнал, на который стоит реагировать.

import requests

HT_BASE = "https://ht-api.coinmarketman.com/api/external"
HT_TOKEN = "your_hypertracker_jwt"

def get_cohort_bias(coin: str = "BTC"):
    """Fetch Money Printer and Giga-Rekt positioning."""
    headers = {"Authorization": f"Bearer {HT_TOKEN}"}
    r = requests.get(
        f"{HT_BASE}/cohort/metrics",
        params={"coin": coin},
        headers=headers,
    )
    data = r.json()
    # Extract cohort-level long/short ratio
    money_printer = next(
        (c for c in data if c.get("cohortId") == 8), None
    )
    giga_rekt = next(
        (c for c in data if c.get("cohortId") == 15), None
    )
    return money_printer, giga_rekt

ID когорт берутся из 16-сегментной классификационной системы HyperTracker: 8 сегментов по размеру перп-капитала (от Shrimp до Leviathan) и 8 по историческому PnL (от Money Printer до Giga-Rekt). Money Printer — это когорта 8, Giga-Rekt — когорта 15. Когда вы видите, что Money Printer загружается на одну сторону, тогда как рынок результатов оценивает противоположную, именно этот разрыв и эксплуатирует ваш бот.

Bot Architecture

Размещение ордеров на HIP-4 рынках

Размещение ордеров следует той же схеме, что и спот-торговля, с несколькими ограничениями, специфичными для HIP-4. Размеры должны быть целыми числами (дробные единицы недопустимы). Минимальный номинал составляет $10 USDC, то есть size * price >= 10. Цены варьируются от 0.001 до 0.999.

from hyperliquid.exchange import Exchange
from eth_account import Account

def place_outcome_order(exchange, outcome_id, side, is_buy, price, size):
    coin = encode_coin(outcome_id, side)
    result = exchange.order(
        coin,
        is_buy=is_buy,
        sz=size,
        limit_px=price,
        order_type={"limit": {"tif": "Gtc"}},
    )
    return result

# Example: buy 25 YES on outcome 2 at $0.45
# Cost: 25 * 0.45 = $11.25 (above $10 min)
# If YES wins: receive 25 * $1 = $25, profit = $13.75
result = place_outcome_order(exchange, 2, 0, True, 0.45, 25)

Помните: HIP-4 позиции полностью обеспечены залогом. Нет кредитного плеча и ликвидаций. Ваш максимальный убыток по любой сделке — ровно столько, сколько вы заплатили за её открытие. Это делает боты для рынков прогнозов проще в осмыслении, чем боты для перпов, поскольку вам никогда не нужно беспокоиться о поддержании маржи или принудительных закрытиях.

Собираем всё вместе: полный бот

Вот полный цикл. Бот обнаруживает активные рынки, читает стаканы ордеров, проверяет позиционирование когорт на базовом активе и размещает сделку, когда подразумеваемая вероятность рынка прогнозов расходится с тем, что реально делают самые прибыльные трейдеры.

import time

def run_bot(exchange, info):
    """Main loop: discover, price, signal, execute."""
    meta = fetch_outcome_meta()
    markets = parse_active_markets(meta)

    for market in markets:
        oid = market["outcome_id"]
        underlying = market["underlying"]

        # Step 1: Get implied probability
        yes_mid = get_mid_price(encode_coin(oid, 0))
        no_mid = get_mid_price(encode_coin(oid, 1))
        if yes_mid == 0 or no_mid == 0:
            continue

        # Step 2: Get cohort positioning
        mp, gr = get_cohort_bias(underlying)
        if not mp or not gr:
            continue

        # Step 3: Simple divergence check
        # Thresholds below are illustrative -- calibrate via backtesting
        mp_long_pct = mp.get("longPct", 50)
        if mp_long_pct > 70 and yes_mid < 0.50:  # example values
            # Example sizing to meet $10 minimum notional
            size = max(10, int(10 / yes_mid) + 1)
            print(f"Signal: {underlying} MP {mp_long_pct}% long, "
                  f"YES at {yes_mid:.2f}. Buying YES.")
            place_outcome_order(exchange, oid, 0, True, yes_mid, size)

    time.sleep(300)  # 5-minute cycle

# Patch SDK and run
info, exchange = make_clients(PRIVATE_KEY, ADDRESS, BASE_URL)
while True:
    run_bot(exchange, info)

Порог расхождения и логика определения размера позиции здесь носят иллюстративный характер. В продакшене вы будете калибровать их на основе бэктестинга и собственной терпимости к риску. Суть — в архитектуре: ценообразование рынка прогнозов + позиционирование когорт = сигнальный слой, недоступный самостоятельным трейдерам рынков прогнозов.

Граничные случаи и подводные камни

Патч SDK обязателен

Официальный hyperliquid-python-sdk не знает об активах HIP-4. Нужно получить outcomeMeta при запуске и внедрить кодирование каждого результата в карты coin_to_asset и name_to_coin SDK. Без этого патча SDK будет отклонять ваши ордера с непрозрачной ошибкой о неизвестных монетах.

def make_clients(private_key, address, base_url):
    account = Account.from_key(private_key)
    info = Info(base_url, skip_ws=True)
    exchange = Exchange(account, base_url, account_address=address)

    meta = fetch_outcome_meta()
    for o in meta.get("outcomes", []):
        for side in (0, 1):
            coin = encode_coin(o["outcome"], side)
            asset_id = encode_asset_id(o["outcome"], side)
            info.coin_to_asset[coin] = asset_id
            info.name_to_coin[coin] = coin
            exchange.info.coin_to_asset[coin] = asset_id
            exchange.info.name_to_coin[coin] = coin

    return info, exchange

Только целые размеры

В отличие от перп-позиций, где можно торговать дробными размерами монет, HIP-4 требует целых единиц. Если вычисленный размер равен 22.7, округляйте вверх до 23. Всегда проверяйте минимальный номинал: size * price >= 10 USDC.

Расчёт происходит автоматически

Вам не нужно вызывать функцию погашения. По истечении срока USDC автоматически зачисляется на ваш счёт в зависимости от выигравшей стороны. Никаких комиссий за газ, никаких транзакций для получения средств.

Builder Codes работают и здесь

Если вы строите фронтенд поверх HIP-4, builder codes зарабатывают комиссии на ордерах продажи так же, как при спот-торговле. Это значит, что каждая платформа рынка прогнозов, построенная на Hyperliquid, может монетизироваться через builder codes без прямых комиссий с пользователей.

Добавьте когортный интеллект в бота для рынка прогнозов

API HyperTracker даёт вам данные о позиционировании когорт, которые превращают обычных ботов для рынков прогнозов в системы с осознанием Smart Money. 16 поведенческих сегментов, обновляемых каждые 5 минут, доступных в одном API-вызове.

Начните строить с HyperTracker

Ландшафт рынков прогнозов ещё на раннем этапе. HIP-4 использует тот же движок матчинга, модель аккаунта и API-поверхность, что и перпы и спот Hyperliquid, а значит, всё, что вы уже знаете о разработке на Hyperliquid, переносится напрямую. Единственные новые концепции — схема кодирования, целые размеры и тот факт, что ваши позиции не могут быть ликвидированы. Для разработчиков, уже работающих с данными когорт, рынки прогнозов — просто ещё один инструмент для наложения сигналов. Преимущество не в самом рынке прогнозов. Оно в том, чтобы знать, что делает Smart Money с базовым активом, прежде чем рынок результатов это заложит в цену.