Polymarket Bot 教程 · 第 20 章,共 32 章
通过程序化方式跟踪 Polymarket 鲸鱼钱包并复制交易顶级表现者:通过排行榜和链上分析识别有盈利能力的钱包,按照仓位大小和时机规则镜像他们的交易。
本章内容
复制表现最好的 Polymarket 钱包是一个很受欢迎的想法,但 Polymarket 上真正的鲸鱼,大多数是在已结算市场上做窗口末期 arb,而不是方向性交易。本章基于链上分析给出诚实的研究结果:哪些钱包真的值得复制,为什么大多数不值得复制,以及仓位管理的数学。
- 识别有盈利能力的钱包
- 链上交易检测
- 相对于鲸鱼的仓位大小
- Latency:多晚算太晚
- 筛选:只跟随经过验证有 edge 的钱包
- 代码:检测鲸鱼买入事件,执行按仓位复制
识别有盈利能力的钱包
鲸鱼复制的前提是某些钱包持续盈利,复制它们的入场可以捕捉到一部分 edge。对 2025-26 年 Polymarket 顶级钱包进行的链上分析给出了一个令人清醒的结果:大多数可见鲸鱼都在已结算市场上做 late-window arbitrage,而不是方向性交易。
我们对三个候选鲸鱼钱包测得的画像:
- "hhhhhh6"(98.5% 胜率,$n M 成交量)-88% 的入场价格 ≥0.95,中位入场时间为 300 秒窗口中的第 226 秒。纯粹的尾部收益 arb,不是方向性交易。
- "anonymous"(20% 胜率)-纯粹的赌博者。复制会亏钱。
- "Jkim123"(53.5% 胜率)-抛硬币水平。不是值得复制的信号。
这些鲸鱼的交易中,有 0% 发生在任意 5 分钟窗口的前 120 秒内。可预测信号(如果有的话)会来自早期窗口的大额入场-但排在榜首的并不是这些钱包,因为这很难做到。
链上交易检测
检测目标钱包的交易,需要轮询 Polymarket 的 data-api,或者订阅链上的 CTF transfer events。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)
5 秒轮询是 data-api 的实际下限。更低的话就会触发 rate limits。若要亚秒级检测,请订阅来自 CTF 合约、按鲸鱼 proxy 地址过滤的链上 ERC-1155 TransferSingle events。
相对于鲸鱼的仓位大小
如果你把复制仓位设为鲸鱼交易的固定比例,你就会继承它们的风险结构。这里有两个更实用的替代方案。
- 基于上限:无论鲸鱼有多大,每笔复制都固定为一个美元金额($10-50)。复利较慢,但单笔亏损有上限。
- 按胜率加权:把复制仓位设为鲸鱼近期胜率的函数。胜率 60%+ → 全仓复制;40-60% → 半仓;低于 40% → 跳过。
基于上限的方法更适合首次上线。只有在你测量了鲸鱼在“你的复制交易”上的实际胜率之后,才把策略切换到按胜率加权(通常会比他们的 headline 数字更差,因为你到得更晚)。
Latency:多晚算太晚
鲸鱼的交易通常会在执行后的 1-2 秒内公开可见。要复制它,你在读取侧需要比这个更快的 latency,再加上你自己的下单 latency。
典型 copy bot 的端到端:5-10 秒轮询 + 200ms 下单 = 总计 5-15 秒。等到你的复制单触发时,鲸鱼的信号已经体现在价格里了。
对于 99% 的复制单来说,在 Polymarket 这种窄市场里这已经太晚了。鲸鱼入场把 mid 推动了 1-2 美分;相对于他们的进场价,你要多付这 1-2 美分的溢价。如果他们的 edge 是 3c,那么你到达时其中一半已经没了。
真正能工作的 copy bot 要么 (a) 目标是慢速变化的市场,在那里 30s latency 无所谓;要么 (b) 使用链上 event subscription,以亚秒级时间框架响应。
筛选:只跟随经过验证有 edge 的钱包
在把任何钱包加入复制列表之前,先过这三个筛选条件。
- 30+ 笔已平仓交易:钱包历史里至少要有这么多。更小的样本只是噪音。
- 终身胜率 > 60%,或者基于入场价格计算出的每笔交易正期望值。满足任一条件即可;两个都满足更好。
- 模式不是 late-window arb。检查入场时距离结算的中位秒数;如果接近 0,这个钱包做的是你无法复现的尾部收益 arb。
大多数候选鲸鱼会在这三个条件中的某一个上失败。真正可复制的钱包池很小。维护列表需要定期复查-上个月有盈利的钱包,这个月未必还行。
代码:检测鲸鱼买入事件,执行按仓位复制
参考实现:检测一个被关注鲸鱼的 CTF TransferSingle event,发出一个按仓位大小的复制买单。
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 = 卖出)。





