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

100行でHyperliquidに予測市場ボットを構築する

予測市場のチュートリアルのほとんどは「SDKをインストールして注文を出す」で止まる。それは簡単な部分だ。難しいのは、どの市場を取引するか、そしていつ価格が間違っているかを知ることだ。HyperliquidのHIP-4アウトカム市場はパープスやスポットと同じマッチングエンジン上で動作するため、純粋な予測市場トレーダーには見えないミスプライシングを捉えるために、バイナリアウトカム取引の上にコホートポジショニングデータを重ねることができる。

このガイドでは、HIP-4市場を発見し、オーダーブックを読み、原資産でSmart Moneyが何をしているかを確認し、シグナルが一致したときに取引を行うPythonボットの構築方法を解説する。全体が約100行の動作するコードに収まる。

HIP-4アウトカム市場の実際の仕組み

HIP-4は2026年5月2日にHyperliquidメインネットでローンチした。各市場はバイナリの問いを立てる: BTCは特定の期限までにターゲット価格を超えるか? トレーダーはUSDCを担保としてYESまたはNOのポジションを購入する。期限が来ると、勝利側は1ユニットあたり1 USDCに決済され、敗北側は0に決済される。

任意の時点でのYESトークンの価格は、イベントが発生する市場の暗示確率を表す。YESが$0.65で取引されているなら、市場はそのイベントが起こる確率を65%と見積もっている。補完的なNOトークンは$0.35近くで取引されるはずだ。YESの価格pでの買いが1-pでのNO売りを反映するマージされたオーダーブックを両サイドが共有しているからだ。

HIP-4がPolymarketと異なる点は三つある。第一に、決済が決定論的であること: Hyperliquidのバリデータセットが事前に指定された客観的なデータソースに対して各コントラクトを解決し、紛争ウィンドウもトークン投票もない。第二に、レバレッジがなく清算リスクがない。ポジションはオープン時に完全担保される。第三に、ポジションのオープンに対する手数料は現在ゼロだが、フィルに対してビルダーコードは依然として適用される。

Settlement Flow

正確に理解すべきエンコーディングシステム

HIP-4は、あらゆるビルダーが最初に躓く三フォーマットのエンコーディングシステムを使用する。各アウトカムにはIDがあり、各サイド(YES = 0、NO = 1)はencoding = 10 * outcome_id + sideという式を使って数値エンコーディングを生成する。

ただし、使用するフォーマットはコンテキストによって異なる。注文配置とオーダーブッククエリには#をプレフィックスとして付けるため、アウトカム2のYESは#20になる。残高照会には+をプレフィックスとして付けるため、同じポジションは+20になる。SDK内部のアセットIDには、エンコーディングに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、パイプ区切りの説明(クラス、原資産、期限日、ターゲット価格)、サイド仕様を含む、アクティブおよび決済済みのすべてのアウトカムを返す。

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市場は、BTCマーク価格に対して毎日06:00 UTCに決済される。

オーダーブックの読み取りと暗示確率

各アウトカムサイドには独自のオーダーブックがある。スポットブックをクエリするのと同じ方法で、#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ミッド + NOミッドはおよそ1.0になるはずだ。持続的な乖離は手数料の影響か、調査する価値のあるミスプライシングのどちらかだ。両サイドのスプレッドが最初のシグナルになる。

アウトカム価格へのコホートシグナルの重ね合わせ

ここが予測市場ボットの面白いところだ。純粋な予測市場トレーダーはオーダーブックと外部ニュースを見る。コホートデータにアクセスできるビルダーは別のものを見ることができる: Hyperliquidで最も利益を上げているウォレットが原資産で実際に何をしているかだ。

BTCアウトカム市場がBTCが期限までにターゲット価格を超える確率を55%と見積もっているとしよう。それが市場の最良の推測だ。しかし我々のコホートデータは、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はHyperTrackerの16セグメント分類システムから来ている: パープスエクイティサイズによる8セグメント(Shrimp〜Leviathan)と全時間PnLによる8セグメント(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をフェッチし、すべてのアウトカムのエンコーディングをSDKのcoin_to_assetname_to_coinマップに注入する必要がある。このパッチなしでは、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クレジットが自動的にアカウントに入金される。ガス代も、クレームトランザクションも不要だ。

ビルダーコードもここで機能する

HIP-4の上にフロントエンドを構築しているなら、ビルダーコードはスポット取引と同じ方法で売り注文の手数料を獲得する。これは、Hyperliquid上に構築されたすべての予測市場プラットフォームが、ユーザーに直接課金せずにビルダーコードを通じて収益化できることを意味する。

コホートインテリジェンスを予測市場ボットに追加する

HyperTrackerのAPIは、汎用の予測市場ボットをSmart Moneyを認識したシステムに変えるコホートポジショニングデータを提供する。16の行動セグメント、5分ごとに更新、1回のAPIコールでアクセス可能。

HyperTrackerで構築を始める

予測市場のランドスケープはまだ初期段階だ。HIP-4はHyperliquidのパープスやスポット市場と同じマッチングエンジン、アカウントモデル、APIサーフェスを共有しているため、Hyperliquid上での構築についてすでに知っていることがすべてそのまま活用できる。新しい概念はエンコーディングスキーム、整数サイジング、そしてポジションが清算されないという事実だけだ。コホートデータですでに作業しているビルダーにとって、予測市場はシグナルを重ねるもう一つの手段に過ぎない。優位性は予測市場そのものにあるのではない。アウトカム市場がそれを価格に織り込む前に、Smart Moneyが原資産で何をしているかを知ることにある。