Polymarket Bot Tutorial · 第32章中の第10章

ボットビルダー向けにPolymarketの注文タイプを解説:Fill-or-Kill(FOK)、Fill-and-Kill(FAK)、Good-til-Cancelled(GTC)、そして指値 vs 成行のトレードオフ。実運用レベルの判断ルール付き。

この章で扱う内容

注文タイプの混乱は、新しいボット開発者にとって最も高くつくバグの一種です。GTCが必要なのにFOKを送るとエントリーを逃し、FOKが必要なのにGTCを送ると、あとでひどい価格で約定する待機注文が残ってしまいます。この章では、その判断ツリーと、数千件の注文を通じて機能してきた本番デフォルトをまとめます。

  • クイック判断ツリー
  • FOK:必ず約定するか、しないなら見送る場合
  • FAK:部分約定を許容できる場合
  • GTC:板に置いて待ちたい場合
  • 指値 vs 成行とスプレッド税
  • 本番デフォルト(FOK買い、GTC売り]
  • コード:各注文タイプの出し方

クイック判断ツリー

すべての注文発注は、3つの質問で決まります。

  1. 今すぐに約定が必要で、今取れないならまったく不要ですか? → FOK
  2. 今取れる分をできるだけ取り、部分約定を許容し、待機注文は不要ですか? → FAK
  3. 希望価格で板に置いて、相手が来るのを待ちたいですか? → GTC

それだけです。注文タイプまわりのボットバグの大半は、#1を選ぶべきところで#3を選んだ場合(「買い」が「スプレッドが広すぎてポジションなし」になる)、または#3を選ぶべきところで#1を選んだ場合(「買い」が、何時間も後に誤ったタイミングで約定する待機注文になる)に起こります。

FOK:必ず約定するか、しないなら見送る場合

Fill-or-Killは、指定価格以下で注文全体を即時に約定させます。全数量を即時に約定できない場合、注文は拒否され、何も起こりません。待機も部分約定もありません。

FOKの用途:ニュース・アービトラージのエントリー(ニュース価格でだけ入りたいのであり、30秒後の市場価格では入りたくない);部分約定だと管理が煩雑になる、特定ターゲットでの利確;戦略が原子的な実行を前提にしているあらゆる場面。

トレードオフ:FOKは他の注文タイプより失敗しやすく、特に流動性の低い板で顕著です。必ずフォールバック経路を用意しましょう。戦略条件を再評価してまだ有効なら再試行する、または次に進む、などです。

FAK:部分約定を許容できる場合

Fill-and-Kill("immediate or cancel" とも呼ばれます)は、今すぐ取れる分だけを約定し、未約定分をキャンセルします。全数量が取れることもあれば、部分約定もあれば、ゼロのこともあります。

FOKの用途:特定の価格上限を伴う成行買い(ミッドからNセント上までアスクを引き上げる);在庫を急いで減らすための板なめ売り;「何もないより一部でもポジションがある方が良い」戦略全般。

運用上はFOKよりやや厄介です。次のステップを決める前に、ボットが100%約定したのか30%だけなのかを把握する必要があるからです。約定レスポンスには filled_size フィールドが含まれるので、必ず読み取りましょう。

GTC:板に置いて待ちたい場合

Good-til-Cancelledは、約定するかキャンセルするまで希望価格で板に残ります。タイムアウトはありません(v2 APIの他の注文タイプには、有効期限付きのGTDがあります)。

GTCの用途:エントリー価格から+Ncの利確売り;-Nc下の損切り売り(ただし注意点あり-下記参照);両側の気配を出すマーケットメイキング;より良い価格を待つ意思があるポジション全般。

厳格なルール:GTCは5シェア以上が必要です。5シェア未満の注文は、CLOBで Size (X) lower than the minimum: 5 として拒否されます。4シェアのGTC売りを出すボットは、出口設定に失敗したままポジションを決済まで持ち続けることになります。GTCを出す前に、必ず在庫が5以上あることを確認してください。少ない場合はFAKに切り替えるか、決済まで保有します。

指値 vs 成行とスプレッド税

Polymarketの注文は技術的にはすべて指値注文です。ボットが「成行買い」と呼ぶものでも、実際には価格上限を指定しています。違いは、その価格が最良売り気配であるか(実質的には成行注文で、板にぶつかって約定する)どうか、あるいはそれより低くて板に残るかです。

スプレッド税とは、気配を跨ぐコストです。たとえば、bid 0.45、ask 0.47、mid 0.46。買いでaskに当たり、売りでbidに当たる往復取引では、1シェアあたり2セントを払うことになります。勝率60%で+3c/-4cの戦略では、この2cのスプレッドが損益分岐を左右します。

メイカー型(bidかそれ以下でGTCを置き、ヒットされるのを待つ)では、スプレッドを支払う代わりに受け取ります。コストは約定不確実性です。まったくヒットされない可能性があります。確信度の高いトレードではスプレッドを払います。受動的な積み上げでは、板を使いましょう。

本番デフォルト(FOK買い、GTC売り]

本番ボットの多くが収束するパターンは次の通りです。

  • エントリー:ask + 0〜2セントでFOK。ボットが買うと判断したなら、今買うか見送るべきです。エントリー注文を板に置いて待つ価値は、たいていありません。買い判断を引き起こした状況は、注文が待機している間に変わってしまうからです。
  • 利確エグジット:ターゲット価格でGTC。エントリー約定直後に出します。市場がこちらに来るのを待ち、bidを追いかけません。5シェア以上が必要です。
  • 損切り:ケースバイケース。価格変動が限定的な遅い戦略ではGTCが有効です。値動きの速い市場では、GTCの損切りは価格が突き抜けると約定しないことがあります。その場合は、option-D方式で決済まで保有します(メモ:trader-gtc-sell.md)。

このパターンは保守的で、約定は少ないですが、スリッページも少なくなります。より積極的な変種では、FOKエントリーとFAKエグジットを使い、部分約定を受け入れます。どちらかを選んで一貫させてください。トレードごとに判断を混ぜると、混乱を招きます。

コード:各注文タイプの出し方

py-clob-client(v0.34.6)を使ったPythonでの注文発注の参照例です。

from py_clob_client.client import ClobClient
from py_clob_client.clob_types import OrderArgs, OrderType
c = ClobClient(host="https://clob.polymarket.com", chain_id=137,
               key=PRIVATE_KEY, signature_type=2, funder=PROXY)
c.set_api_creds(creds)

# FOK buy: fill 10 shares at price 0.45 or skip
args = OrderArgs(token_id=TOKEN, price=0.45, size=10, side="BUY")
resp = c.create_and_post_order(args, OrderType.FOK)

# FAK buy: take as much as you can at 0.45 or below
resp = c.create_and_post_order(args, OrderType.FAK)

# GTC sell: rest a sell at 0.85 for 10 shares
sell_args = OrderArgs(token_id=TOKEN, price=0.85, size=10, side="SELL")
resp = c.create_and_post_order(sell_args, OrderType.GTC)

@polymarket/clob-client-v2 を使ったNodeでの同様の処理では、OrderType.FOKclob.OrderType.GTC などに置き換えてください。メソッドは createAndPostOrder です。negRiskフラグ(第11章)はマルチアウトカム市場では第2引数に設定する必要があります。設定し忘れると、誤った取引所コントラクトにルーティングされます。

よくある質問

PolymarketのFOKとは何ですか?
Fill-or-Killです。注文は即時に全額約定するか、キャンセルされます。部分約定も板への待機もありません。本番トレーダーでは、約定の見かけ上の不一致(phantom-fill)をなくせるため、買いのデフォルトとしてFOKを使っています。注文は完全約定するか完全に消えるかのどちらかで、半端に残ることはありません。
PolymarketのFAKとは何ですか?
Fill-and-Killです(IOC、Immediate-or-Cancelとも呼ばれます)。注文は今すぐ利用可能な流動性をすべて取り、未約定分をキャンセルします。部分約定を許容するが、待機はしたくない場合に有用です。断片化した板ではFOKより速いです。
PolymarketのGTCとは何ですか?
Good-til-Cancelledです。注文は約定するか、あなたがキャンセルするまで板に残ります。GTCはメイカーになる(流動性を提供する)、リベートを得る、テイカー手数料を避けるために使います。私たちの本番構成では、売りにGTCを使っており、エグジットでスプレッドを取っています。
ボットは指値注文と成行注文のどちらを使うべきですか?
ほぼ常に指値注文です。成行注文はテイカー手数料(0.75%〜1.80%)とスプレッドを支払います。指値注文はメイカーリベート(テイカー手数料の20〜25%)を得られます。成行注文を使う正当な理由は、ニュースが出て、指値が約定する前に価格がスプレッドを超えて動きそうなときだけです。
Polymarketはネイティブの損切り注文に対応していますか?
いいえ。損切りはクライアント側の概念です。ボットが価格を監視し、トリガー条件に達したら、成行またはFAKの売り注文を出します。取引所にネイティブのストップ機能はないため、ロジックをボット側で実装する必要があります。
注文の最小数量は?
成行注文:最低1 USDのノーション。指値注文:最低5シェア。薄い市場では非常に小さい注文が拒否されることがあります。SDKは、検出可能な特定のエラーコードを返すので、それに応じてサイズを再設定できます。