【ITニュース解説】Polymarket Market Scanner in Python: Build One
2026年08月22日に「Dev.to」が公開したITニュース「Polymarket Market Scanner in Python: Build One」について初心者にもわかりやすく解説しています。
ITニュース概要
Polymarketの膨大な予測市場から有望なものを効率的に見つけるPython製マーケットスキャナーの構築方法を紹介。Gamma APIで市場を発見し、流動性や出来高などの条件で候補を絞り込む。自動取引システムの土台となる読み取り専用ツールだ。
ITニュース解説
Polymarket市場スキャナーは、予測市場Polymarketで取引機会を探すための自動化されたツールの出発点だ。これは、取引ボットがいきなり注文を出すのではなく、まず「今、どのPolymarket市場に注目すべきか」という基本的な問いに答えることを目的としている。市場スキャナーの主な役割は、膨大な数の予測市場の中から、特定の条件に合致する、より少数の市場候補を絞り込むことにある。例えば、市場がアクティブであるか、十分な流動性があるか、取引量が多いか、期限が近いか、価格帯やカテゴリが適切か、といった条件を使ってフィルタリングを行う。
Polymarketは、市場発見のためのGamma APIと、価格やオーダーブック(買い注文と売り注文のリスト)データのためのCLOB APIという二つの主要なAPIを通じて、公開市場データを提供している。これらの公開データは認証なしでアクセスできるため、初心者でも比較的簡単に読み取り専用のスキャナーを構築できる。このチュートリアルで学ぶのは、Pythonを使ってアクティブな市場を発見し、定量的なフィルターを適用して、後の取引戦略や実行エンジンが評価できる候補リストを作成する方法だ。ただし、スキャナーはあくまで条件に合う市場を特定するものであり、それらの市場で取引が必ずしも利益を生むとは限らない点には注意が必要だ。スプレッド、流動性、手数料、スリッページ、遅延などの要素も考慮する必要がある。
スキャナーを設計する上で最も重要な決定は、市場の「発見」と「評価」のプロセスを明確に分離することだ。すべての市場に対して毎回オーダーブックをダウンロードするような設計は、不必要なネットワークトラフィックを生み出し、システムのスケーリングを難しくする。より良いアーキテクチャでは、まずGamma APIを使って市場のメタデータ(市場ID、質問内容、カテゴリなど)を広範囲に発見し、「市場ユニバース」を形成する。次に、これらの市場に対して基本的なフィルター(アクティブであるか、流動性が十分かなど)を適用し、「候補市場」のセットを生成する。その後、これらの候補市場に対してのみCLOB APIを使用して詳細な価格やオーダーブック情報を取得し、さらに定量的なフィルターやランク付けを行い、最終的に取引戦略エンジンや実行エンジンに渡す、という流れになる。このように発見と評価を分けるのは、メタデータはオーダーブックの状態ほど頻繁に変化しないため、効率が良いからだ。
広範囲な市場発見には、PolymarketのGamma APIが提供するkeysetページネーションエンドポイント(https://gamma-api.polymarket.com/markets/keyset)が適している。このエンドポイントは、limit、closed、ascendingといったフィルターをサポートしており、前のリクエストで返されるnext_cursorという不透明な値を次のリクエストのafter_cursorとして使用することで、大量の市場データを効率的に取得できる。これは、任意のリクエストオフセットを繰り返し使うよりも、大規模なスキャナーにとって望ましい方法だ。市場の買い注文、売り注文、中間価格といったオーダーブック情報が必要になった場合に、CLOB APIを利用する。公開市場データへのアクセスには認証が不要であるため、このスキャナーは秘密鍵や取引資格情報を必要としない。
Pythonでスキャナーを構築する際は、httpxのような標準的なHTTPライブラリで十分だ。まず、仮想環境を設定し、httpxをインストールする。コードの最初のステップは、keysetページネーションを使って市場データを取得するクライアントを作成することだ。fetch_markets関数では、httpx.Clientを使ってGamma APIにリクエストを送り、レスポンスからnext_cursorを取得して次のページのリクエストに含めるループを回す。このcursorはシステム内部の仕組みなので、その内容を自分で解釈したり構築したりしようとせず、そのまま使うのが重要だ。
次に、取得した生データに対して基本的な市場フィルターを追加する。例えば、市場がクローズされていないこと、アクティブであること、そして設定した最低流動性や最低取引量を満たしていることを確認する。これらのフィルターを通過しない市場は候補から除外される。流動性や取引量などの数値は設定値であり、本番環境では設定ファイルなどで簡単に変更できるようにするべきだ。また、PolymarketのAPIは市場の結果(outcomes)とその価格(outcomePrices)をJSON文字列として提供することがあるため、これらのデータをjson.loads()を使って安全にパースし、適切なデータ型(文字列と浮動小数点数)に変換する処理も重要になる。これにより、スキャナーは市場の質問内容を直接解釈することなく、価格レベルについて判断できるようになる。
これらのコンポーネントを組み合わせることで、基本的な読み取り専用のスキャナーが完成する。このスキャナーは、市場のID、質問内容、スラッグ、流動性、取引量、そしてパースされた結果と価格情報を含む候補リストを生成する。発見のプロセスと実際の取引の許可を分離することは、システム設計上の有用な境界線だ。発見の段階では、取引を行う権限を持つべきではない。
メタデータによるフィルタリングは、市場選定の第一段階に過ぎない。例えば、5,000の市場があったとしても、基本的な流動性や取引量の基準を満たすのは100程度かもしれない。この100の候補に対してのみ、詳細なオーダーブックを問い合わせることで、不必要なリクエストを削減できる。CLOB APIは個別の市場やバッチでのオーダーブックおよび価格クエリを提供し、リアルタイムで市場の状態に反応する必要がある場合にはWebSocket市場チャンネルも利用できる。これにより、研究や定期的なスクリーニングに適した「バッチスキャナー」と、市場状態の変化に即座に反応する「ストリーミングスキャナー」という、異なるスキャナーモードが可能になる。
市場をフィルタリングした後、次に「どの市場に最も注目すべきか」という問いに答えるために、候補市場をランク付けする機能を追加できる。シンプルなランク付け関数としては、正規化された流動性や取引量を組み合わせてスコアを計算する方法がある。これはあくまで優先順位付けのメカニズムであり、直接的な取引シグナルではない。より高度なスキャナーは、買いと売りのスプレッド、表示されている深度、最近の取引量、期限までの時間、モデル推定からの価格差、ボラティリティなど、様々な要素に基づいてランク付けすることも可能だ。重要な原則は、市場の選択と取引の予測を切り離し、スキャナーは戦略エンジンに「どこを見るべきか」を伝える役割に徹することだ。
本番環境でスキャナーを運用する際には、いくつかの重要な考慮事項がある。まず、PolymarketのAPIにはレート制限があるため、無制限にリクエストを送り続けるような設計は避けるべきだ。並行処理の制限、バッチ処理の利用、キャッシング、エラー時の指数バックオフ、増分更新、そして継続的に変化するデータにはWebSocketを利用するなどの対策が必要となる。また、大規模な市場スキャンには常にkeysetページネーションを利用し、オフセットベースのページネーションは避けるべきだ。Polymarketが提供している統一Python SDK(polymarket-client)の利用も検討できるが、小規模なスキャナーであれば、直接HTTP呼び出しを行うのも有効な選択肢である。
よくある失敗としては、すべての市場のオーダーブックをスキャンしようとすること、古いAPIの仮定に基づいてシステムを構築すること、APIから得られる流動性データをそのまま実行可能な流動性とみなしてしまうこと、そして表示されている確率をそのまま取引の優位性だと信じ込んでしまうことなどがある。特に、市場の発見と取引の実行機能を一つのコンポーネントに混ぜてしまうと、運用上のリスクが大幅に増加する。これらを分離することで、セキュリティと堅牢性を高めることができる。
パフォーマンスを最適化する際には、まず不必要なリクエストを減らすことに注力すべきだ。市場のメタデータ(ID、質問、カテゴリ、流動性、取引量、終了日など)と、より頻繁に変化する市場の状態データ(最良買い気配、最良売り気配、中間価格、深度、タイムスタンプなど)を分離して管理し、比較的静的なメタデータはキャッシュする。継続的に変化するデータにはWebSocketを使用し、ネットワークのレイテンシと処理時間を測定してボトルネックを特定することが重要となる。
セキュリティ面では、市場スキャナーは秘密鍵を必要としない読み取り専用で設計することが推奨される。もし将来的にスキャナーが取引エンジンに接続することになった場合でも、秘密鍵をソースコード外に、環境変数やシークレットマネージャーで管理し、最小限の必要な権限のみを付与することが極めて重要だ。研究環境と本番環境を分離し、秘密情報をログに残したり、バージョン管理システムにコミットしたりしないなどの基本的なセキュリティ対策を徹底すべきである。
テスト戦略としては、ネットワークアクセスとフィルタリングロジックを分離し、ライブAPIに接続することなくスキャナーの主要な部分をテストできるようにすることが望ましい。合成データを用いて、想定される正常なシナリオだけでなく、フィールドの欠落、不正なJSON、HTTPエラー、空のページ、期限切れのカーソルなど、様々な異常なケースもテストする必要がある。
本番スキャナーは、どれだけの市場が発見され、それぞれのフィルターをどれだけ通過したか、発見にどれだけの時間がかかったか、APIリクエスト数、エラー数、スキャンサイクルの期間、各候補が最後に更新された日時など、システムの動作状況を常に監視し、可視化できるべきだ。特に、各フィルターによって拒否された候補の数をログに記録することは、市場の変化やAPIパースの問題を早期に発見するために非常に価値がある。
結論として、優れたPolymarket市場スキャナーは、Pythonのコード行数が多いから複雑なのではない。市場発見、リアルタイムデータ処理、定量的フィルタリング、そして最終的な実行という、複数の異なる機能の境界に位置するために複雑なのだ。最も強力なアーキテクチャは、「発見 → フィルター → 強化 → ランク付け → 評価 → 実行」というモジュール化されたアプローチだ。まずは公開市場データに焦点を当て、keysetページネーションを使って広範囲な市場を発見する。高コストなリアルタイムデータをリクエストする前に、市場ユニバースを絞り込む。データパイプラインが信頼できるものになるまでは、スキャナーを読み取り専用に保つ。その後、オーダーブックの状態、定量モデル、リスク管理、そして実行といった独立したコンポーネントを段階的に追加していく。このアプローチにより、シンプルな研究スクリプトから、堅牢な自動取引システムへと進化できるインフラを構築できる。