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により、同じシグナルでの過剰発火を防ぎます。フィルタ(ニュース確認、取引速度)が実際の取引をゲートします。





