Polymarket Bot Tutorial · 第32章中17章

Polymarketのオーダーブックの不均衡を短期の価格シグナルとして使う方法: bid-ask出来高比、micropriceの計算、シグナルの半減期、そして不均衡ボットがランダム執行に勝てる条件。

この章で扱う内容

オーダーブックの不均衡とは、リミットオーダーブック上の買い側の厚みと売り側の厚みの比率です。Polymarketでは実際に意味のある、ただし短命な予測優位があり、通常はミッドが動く5〜30秒前に現れます。この章では、その計算パターンと、シグナルが外れる条件を説明します。

  • オーダーブックの不均衡とは何か
  • micropriceの計算
  • 方向性シグナルとしての不均衡
  • Polymarketでのシグナル半減期
  • 不均衡シグナルが外れる条件
  • コード: 各WSティックで不均衡を計算する

オーダーブックの不均衡とは何か

オーダーブックの不均衡とは、リミットオーダーブック上の買い側の総厚みと売り側の総厚みの比率です。トップNレベルで計算すると(一般的にはN=5)、まだミッド価格に反映されていないトレーダーの総合的な圧力を捉えられます。

式: imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). 範囲は-1〜+1で、正なら買い圧力が強く、負なら売り圧力が強いことを意味します。

このシグナルはPolymarket上で実際に有効ですが、ノイズも多いです。1人の大口参加者が30〜60秒ほど見せかけの不均衡を作り、その後アービトラージで打ち消されることがあります。複数の特徴量のうちの1つとして使うのは有用ですが、単独トリガーとして使うのは危険です。

micropriceの計算

micropriceは単純なmidの改良版で、最良bidと最良askをそれぞれのサイズで重み付けした加重平均です。

microprice = (best_bid × ask_size + best_ask × bid_size) / (bid_size + ask_size)

bid側のキューがask側よりかなり大きい場合、micropriceはaskに近づきます。直感的には、待機中の買い手が多いほど次の約定でaskが叩かれやすく、フェアバリューはask寄りになるということです。

micropriceは、実際のmidが動く5〜30秒前の先行指標です。本番ボットでは、素朴なmidの代わりに、利確判断の基準価格としてこれを使います。

方向性シグナルとしての不均衡

本番運用での観察によると、ニュースイベントを伴わずに不均衡が10秒で-0.3から+0.5へ反転した場合、その後30〜60秒以内にmidが1〜2セント上昇する確率は約65%です。

これは実際の優位性ですが、手数料後の小さなポジションサイズでは消えてしまいます。収益化するには、手数料を差し引いた値動きを取れるだけのサイズが必要ですが、同時に自分で板を動かさない程度の小ささに抑える必要があります。Polymarketの板は通常かなり薄く、50 sharesを超えると市場を動かしがちです。

不均衡は他の特徴量と組み合わせます: 取引速度(取引が多いほど本物のシグナル)、best bidの実際の上昇(単に厚みが移動しているだけではない)、市場がニュース主導モードではないこと。

Polymarketでのシグナル半減期

不均衡シグナルは減衰します。自社トレーダーの本番データでは、不均衡 > 0.6 のとき、60秒以内に1.2cのmid上昇が期待でき、半減期は約30秒です。90秒を過ぎると予測価値はゼロになります。

ボット設計への示唆: すぐ反応するか、見送るかです。判断に15秒かかるボットは、注文を出す前に優位性の半分を消費しています。不均衡戦略のレイテンシ予算は、シグナル発生からFOK発行まで5秒未満にすべきです。

半減期(1〜2分)より長くポジションを保有する戦略は、現在のシグナルではなく次のシグナルに賭けているのと同じです。ここは明確にしておくべきで、不均衡起因のポジションを誤って決着まで保有しないようにしてください。

不均衡シグナルが外れる条件

次の3つの条件のいずれかがあると、シグナルは誤解を招きます。

  • ニュース主導の動き: 不均衡は、あなたがまだ見ていないニュースの結果である場合があります。それに逆らって取引すると負けます。順方向に取引するのはニュースアービトラージであり、別の戦略です。
  • 大口のspoofing: 大きな注文を置いてすぐ取り消すことで、その間だけ偽の不均衡が生まれます。トリガー前に不均衡が10秒以上持続しているかを確認してフィルタリングしてください。
  • 期間終盤のリバランス: マーケットメイカーが情報ではなく在庫都合で気配を引いているケースです。不均衡は、MMが再度クオートすると数分後に反転します。

複合フィルタは次の通りです: 不均衡 > 閾値 AND 取引速度 > ベースライン AND 直近5分にニュースイベントなし。各フィルタ単独では偽陽性が多すぎます。

コード: 各WSティックで不均衡を計算する

参照: WebSocketの板更新を購読し、各ティックで不均衡を再計算します。

def on_book_message(msg):
    bids = msg.get("bids", [])[:5]
    asks = msg.get("asks", [])[:5]
    bid_usd = sum(float(b["price"]) * float(b["size"]) for b in bids)
    ask_usd = sum(float(a["price"]) * float(a["size"]) for a in asks)
    total = bid_usd + ask_usd
    if total < 100: return  # illiquid
    imb = (bid_usd - ask_usd) / total
    state[msg["asset_id"]] = {
        "imb": imb,
        "best_bid": float(bids[0]["price"]) if bids else 0,
        "best_ask": float(asks[0]["price"]) if asks else 1,
        "ts": time.time()
    }
    # decision logic with cooldown + filters
    if imb > 0.6 and time.time() - last_fired.get(msg["asset_id"], 0) > 60:
        check_filters_and_maybe_fire(msg["asset_id"])

stateはトークンごとです。cooldownにより、同じシグナルでの過剰発火を防ぎます。フィルタ(ニュース確認、取引速度)が実際の取引をゲートします。

よくある質問

オーダーブックの不均衡とは何ですか?
板の上部におけるbid出来高とask出来高の比率です。買いが売りより大幅に厚い板(touch付近で買い手が売り手より多い状態)は、ごく短期的には上昇圧力を示唆します。このシグナルは暗号資産や株式ではよく知られていますが、Polymarketでは流動性の高い市場では機能し、薄い市場では消えます。
micropriceはどう計算しますか?
microprice = (best_ask * bid_size + best_bid * ask_size) / (bid_size + ask_size) です。これはmid-priceを出来高加重したもので、出来高が少ない側、つまり最初に「枯れそうな」側に寄ります。ボットは、不均衡を織り込んだフェアバリューの推定値としてこれを使います。
Polymarketでの不均衡シグナルの半減期はどれくらいですか?
活発な市場では5〜30秒です。薄い市場では、より長くなります(新規注文が不均衡を上書きするのに時間がかかるため)。ボットが1秒未満で反応できるなら、ある程度は取れます。5秒以上かかるなら、たいてい遅すぎます。
不均衡はいつ外れますか?
片側に1つの大きな注文が置かれ、ヒットされるのを待っているときです(大きな待機bidが1つあるが、他の活動がない)。不均衡自体は本物ですが、価格予測にはなりません。単に意欲のある買い手が1人いることを示しているだけです。出来高だけでなく注文数でフィルタしてください: 注文1個ごとに5倍の出来高より、N件対1件の不均衡の方が有益です。
オーダーブックの不均衡だけで取引するのに十分ですか?
通常はいいえです。単独シグナルとしては弱く、アービトラージされやすいです。別のシグナル(たとえばmacropriceの平均回帰、ニュースフラグ、スポーツの状態など)と組み合わせると、より持続的な優位性になります。不均衡単独では、手数料後にランダム執行を下回る傾向があります。
Polymarket WSから不均衡を計算できるPythonライブラリはありますか?
私たちの知る限り、すぐ使えるライブラリはありません。数十行のコードで実装できます。py-clob-client経由でマーケットの板を購読し、price_changeイベントごとにトップ・オブ・ブックのbid/askサイズを再計算して、不均衡メトリクスを出力します。最後の値をキャッシュし、意味のある変化があったときだけ再トリガーしてください。