Polymarket Bot Tutorial · 第32章中13章
Polymarketでのマーケットメイキング:bidとaskの提示方法、スプレッドの獲得、メイカーリベート(taker手数料の20〜25%)の収益化、在庫リスクの数式、そして予測市場でMMが機能する条件。
この章で扱う内容
Polymarketでのマーケットメイキングとは、マーケットの板の両側に継続的にクォートを出し、往復ごとにスプレッドを獲得することです。この戦略は伝統的な金融ではよく知られていますが、Polymarket特有の要素として、メイカーリベート制度と、CFD取引所よりも高い予測市場のアドバース・セレクション・プロファイルがあります。この章では、その実際の数式を率直に扱います。
- 平易な英語でいうマーケットメイキング
- スプレッド + リベートの優位性
- 在庫リスクとスキュー
- PolymarketでMMが機能する場面(しない場面)
- コード骨子:±Nセントで両側をクォートする
- ニュースフローに応じたクォート調整
- アドバース・セレクションが急増したときにボットを停止する
平易な英語でいうマーケットメイキング
マーケットメイカーは、売買両側の価格、つまりbuy価格(bid)とsell価格(ask)を継続的に提示し、ミッド価格から固定スプレッド分だけ離してクォートします。誰かがbidをヒットするとメイカーは安く買い、誰かがaskをリフトするとメイカーは高く売り、そのbidとaskの差が1往復あたりのメイカーの収益になります。
この戦略は方向性ではなく、注文フロー主導です。メイカーはYESが勝つかどうかに意見を持ちません。フローが継続し、スプレッドが支払われ続けるという前提を取ります。
リスクはアドバース・セレクションです。あなたのbidを叩く相手は、あなたの知らない情報を持っている可能性があります。長期的には、MMの利益は、スプレッドが情報優位なトレーダーによるスリッページを十分に吸収できるかどうかに左右されます。
スプレッド + リベートの優位性
Polymarketのメイカーには2つの収益源があります。
スプレッドの獲得: ミッド0.46の周辺でbid 0.45、ask 0.47を提示します。bidで約定したポジションを後でaskで手仕舞いできれば、1株あたり2セントの利益です。純粋な優位性は、約定の偏りと価格推移に依存します。
メイカーリベート: Polymarketの流動性報酬プログラムは、対象市場におけるメイカー約定に対して、1株あたりのリベートを支払います。数値は変動するため、現在値は公式の報酬ページで確認してください。リベートはpUSDで定期的に支払われ、取引そのものとは別に処理されます。
多くの市場では、スプレッドの獲得が主要な収益源です。選挙イヤーや主要スポーツのプレーオフのように、Polymarketが流動性を集めるためにリベートを強化する広い市場では、リベートの意味が大きくなります。
在庫リスクとスキュー
bid側で繰り返しヒットされるMMは、ロング在庫を積み上げます。リスクは、保有在庫がロングのままミッドが下落することです。メイカーはスプレッド収益を得ても、ポジションで損失を実現する可能性があります。
対策は、クォートのスキュー(ロングが大きいときはbidを下げ、ショートが大きいときはaskを上げて、一方向の約定を抑える)、在庫上限(すでにロング過多の側ではクォートを止める)、積極的なリバランス(在庫が上限に達したときに、たまにスプレッドを跨いでポジションを減らす)です。
数式的には、bidでの約定の60%が、その後価格が2セント不利に動く前に反対側で手仕舞いされないなら、その約定群だけで戦略は損失です。約定の偏りが65/35を超えたら、強めにスキューしましょう。
PolymarketでMMが機能する場面(しない場面)
PolymarketでMMが機能するのは、次の3条件が揃うときです。
- 流動性のある板: あなたのスプレッドが競争力を持ちつつ、ゼロにはならない程度にクォート競争があること。2024年の選挙市場、主要なNFL/NBAの試合、BTCの5分上下市場などは該当します。
- 両側のフロー: 買い手と売り手の両方が活発であること。一方向に偏った市場(0.95以上でほぼ解決済みのような市場)では、メイカーが取れるものがありません。
- 価格変動が限定的: スプレッドの取り分が5セント級のジャンプで消されないこと。0.40〜0.60の安定した中間帯の市場が最もやりやすいです。
MMが失敗するのは、ニュース主導でミッドがクォート更新より速く跳ぶ市場、あなたが唯一のクォートで次の約定が5段階先まで食い込む薄い板、解決直前で片側が0または1に収束している市場です。
コード骨子:±Nセントで両側をクォートする
最もシンプルに機能するメイカーの疑似コードです。
SPREAD_CENTS = 2
INVENTORY_CAP_SHARES = 50
def make_loop(token_id):
while True:
book = fetch_book(token_id)
mid = (book.best_bid + book.best_ask) / 2
inv = chain_balance(token_id)
# Skew: pull the side we are too long on
bid_px = mid - SPREAD_CENTS/200 - (0.005 if inv > INVENTORY_CAP_SHARES * 0.6 else 0)
ask_px = mid + SPREAD_CENTS/200 + (0.005 if inv < -INVENTORY_CAP_SHARES * 0.6 else 0)
cancel_my_existing_quotes(token_id)
if inv < INVENTORY_CAP_SHARES:
place_gtc(token_id, side="BUY", price=bid_px, size=5)
if inv > -INVENTORY_CAP_SHARES:
place_gtc(token_id, side="SELL", price=ask_px, size=min(5, inv))
time.sleep(2)
本番のメイカーでは、片側ごとの在庫追跡、place前のcancel順序、予測可能性を避けるための再クォート間隔のジッター、そしてアドバース・セレクション時のキルスイッチ(次のセクション)を追加します。
ニュースフローに応じたクォート調整
ニュースイベントが起きると、公正価値はあなたのクォートより先に動きます。ニュースフロー中にクォートを引かないMMは、簡単に狙い撃ちされます。
シグナルは、30秒以内に入ってくる約定のキャンセル率がベースラインの約3倍を超えること、またはより広いイベントストリームでの照合(PolymarketのTwitter/Discord、Bloombergのヘッドラインフィード)です。検知したら、メイカーは60〜120秒すべてのクォートを外し、新しいミッドが安定するのを待ってから、新しい中心価格の周辺で再クォートします。
最も簡単な実装は、対象トークンのlast-trade-priceストリームを監視する方法です。ローリングウィンドウ平均から2標準偏差を超えるジャンプがあれば一時停止します。価格が30秒以上安定したら、ボットは再開します。
アドバース・セレクションが急増したときにボットを停止する
強制終了です。直近50約定のfill PnLが急激にマイナス化したら、何かがおかしいということです。市場がニュース主導になっていてメイキングすべきではないか、あるいは現在のアドバース・セレクション水準に対してスプレッドが狭すぎるかのどちらかです。
実装すべき停止条件:
- 5回連続でbid約定があり、ask約定がなく、最初の約定以降でミッドが1c以上下落。
- 直近25回の往復約定における実現PnLが期待値の-25%を下回る。
- WebSocket切断、または古い板(stale book)を検知。
- どちらか一方の在庫が上限に達した状態が5分超継続。
発火したら、すべてをキャンセルし、在庫を成行でフラット化し、15分以上停止します。キルスイッチを持たないマーケットメイカーは、ボラティリティの高い局面で、トレーダーが手動で気づくまで損失を出し続けます。しかも、その気づくまでの時間は、いつも思っているより長いものです。





