Polymarket Bot Tutorial · 32章中20章
Polymarketのクジラウォレットを追跡し、トップパフォーマーをプログラムでコピートレードします。リーダーボードとオンチェーン分析を使って収益性の高いウォレットを特定し、サイズとタイミングのルールに従ってその取引をミラーリングします。
この章で扱う内容
勝っているPolymarketウォレットをコピーするのは魅力的な考えですが、実際のPolymarket上のクジラの多くは、方向性のあるベットではなく、決済済みマーケットでの遅い時間帯のarbを行っています。本章では、オンチェーン分析に基づく率直な調査を紹介します。実際にコピーすべきウォレットはどれか、なぜ多くはコピーする価値がないのか、そしてポジションサイズの計算方法です。
- 収益性の高いウォレットの特定
- オンチェーン取引の検出
- クジラに対するポジションサイズの決定
- レイテンシー:どこまで遅いと手遅れか
- フィルター:検証済みの優位性があるウォレットだけを追う
- コード:クジラの買いイベントを検出し、サイズ指定のコピー注文を出す
収益性の高いウォレットの特定
クジラをコピーするという前提は、いくつかのウォレットは一貫して利益を出しており、それらのエントリーをコピーすれば優位性の一部を取り込める、というものです。2025〜26年のPolymarket上位ウォレットのオンチェーン分析では、少し厳しい結果が出ました。目に見えるクジラの多くは、方向性トレードではなく、決済済みマーケットでの遅い時間帯の裁定取引をしているだけでした。
測定した3つの候補クジラウォレットのプロファイル:
- "hhhhhh6"(勝率98.5%、$n Mの出来高)-エントリーの88%が0.95以上の価格、中央値のエントリー時刻は300秒ウィンドウ中226秒。純粋なtail-yield arbで、方向性はなし。
- "anonymous"(勝率20%)-破滅的なギャンブラー。コピーすると損をします。
- "Jkim123"(勝率53.5%)-ほぼコイントス。コピーする価値のあるシグナルではない。
これらクジラの取引の0%が、5分ウィンドウの最初の120秒以内に発生していました。予測シグナルがあるとすれば、EARLY-windowの大口エントリーから生まれるはずですが、そうしたウォレットは難しいため、リーダーボードの上位には出てきません。
オンチェーン取引の検出
対象ウォレットの取引を検出するには、Polymarketのdata-apiをポーリングするか、オンチェーンのCTF transferイベントをサブスクライブする方法があります。data-apiの方が簡単です。
def watch_wallet(wallet_addr, last_seen_ts=0):
while True:
url = f"https://data-api.polymarket.com/activity?user={wallet_addr}&limit=100"
events = requests.get(url).json()
for ev in events:
ts = int(ev.get("timestamp", 0))
if ts <= last_seen_ts: continue
if ev["type"] == "TRADE":
process_whale_trade(ev)
last_seen_ts = max(last_seen_ts, ts)
time.sleep(5)
data-apiで実用的な下限は5秒ポーリングです。これより短くするとレート制限に引っかかります。1秒未満で検出したい場合は、CTFコントラクトからクジラのproxy addressに絞ったオンチェーンERC-1155のTransferSingleイベントをサブスクライブしてください。
クジラに対するポジションサイズ
コピーのサイズをクジラの取引の一定割合にすると、彼らのリスクプロファイルをそのまま引き継ぐことになります。現実的な代替案は2つあります。
- 上限ベース: クジラのサイズに関係なく、各コピーを固定のドル額($10〜50)にする。複利は遅いですが、1回あたりの損失は限定されます。
- 勝率加重: クジラの直近勝率に応じてコピーサイズを決める。勝率60%以上 → フルサイズでコピー、40〜60% → 半分、40%未満 → スキップ。
最初の本番投入としては、上限ベースの方が安全です。勝率加重に移行するのは、自分のコピーでのクジラの実際の勝率を測定してからにしてください(到着が遅いため、見出しの数字より普通は悪くなります)。
レイテンシー:どこまで遅いと手遅れか
クジラの取引は、実行後1〜2秒以内に公開されて見えるようになります。これをコピーするには、読み取り側でそれより速いレイテンシーに加えて、自分の注文送信レイテンシーも必要です。
典型的なコピーbotのエンドツーエンドは、5〜10秒のポーリング + 200msの注文送信 = 合計5〜15秒です。コピーが発火する頃には、クジラのシグナルは価格に織り込まれています。
Polymarketの狭いマーケットでは、99%のコピーにとってこれは遅すぎます。クジラのエントリーでmidが1〜2セント動いており、あなたはその1〜2セント分のプレミアムを、クジラより不利な価格で払うことになります。もし彼らの優位性が3cなら、到着時点でその半分はすでに消えています。
うまく機能するコピーbotは、(a) 30秒のレイテンシーが問題にならない動きの遅いマーケットを狙うか、(b) オンチェーンイベントサブスクリプションを使って1秒未満で反応します。
フィルター:検証済みの優位性があるウォレットだけを追う
コピーリストに追加する前に、各ウォレットに対して3つのフィルターをかけます。
- 30件以上のクローズ済み取引がウォレットの履歴にあること。サンプルが小さいとノイズです。
- 生涯勝率が60%超、またはエントリー価格に基づく1取引あたりの期待値がプラスであること。どちらか一方でよく、両方ならなお良いです。
- 遅い時間帯のarbではないこと。エントリー時の決済までの残り秒数の中央値を確認してください。0に近いなら、そのウォレットは再現できないtail-yield arbをしています。
候補クジラの多くは、この3条件のどれかで落ちます。実際にコピー可能なウォレットの母数は小さいです。リストの維持には定期的な再チェックが必要です。先月収益性があったウォレットが今月もそうとは限りません。
コード:クジラの買いイベントを検出し、サイズ指定のコピーを置く
参考:監視対象のクジラに対するCTF TransferSingleイベントを検出し、サイズ指定のコピー買いを実行します。
from web3 import Web3
w3 = Web3(Web3.WebsocketProvider(POLYGON_WSS))
ctf = w3.eth.contract(address=CTF_ADDR, abi=CTF_ABI)
WHALES = {"0xabc...": {"fraction": 0.05, "cap": 50}}
def on_transfer(event):
to = event.args["to"].lower()
if to not in WHALES: return
cfg = WHALES[to]
token_id = event.args.id
whale_size = event.args.value / 1e6
copy_size = min(cfg["cap"], whale_size * cfg["fraction"])
if copy_size < 5: return # not worth fees
book = fetch_book(str(token_id))
if book.best_ask:
place_fok(str(token_id), "BUY", book.best_ask + 0.01, copy_size)
# subscribe to ERC-1155 TransferSingle events from CTF
filt = ctf.events.TransferSingle.create_filter(fromBlock="latest")
while True:
for ev in filt.get_new_entries(): on_transfer(ev)
time.sleep(0.5)
from(ゼロアドレス = mint = クジラが買った)とto(ゼロアドレス = burn = 売却した)を確認して、買いと売りを区別します。





