PolyClaw 是一个为 OpenClaw 提供的、支持交易的 Polymarket 技能。它可以浏览市场、管理钱包、执行交易并跟踪持仓。
用途
PolyClaw 面向希望在 Polymarket 预测市场上进行交易的用户,提供从市场浏览、钱包管理、下单执行到持仓跟踪的完整流程,并额外提供基于 LLM 的对冲组合发现能力。交易运行在 Polygon 主网上。
主要能力
- 市场浏览:搜索和浏览 Polymarket 预测市场。
- 钱包管理:基于环境变量的钱包配置。
- 交易:通过 split + CLOB 执行方式买入 YES/NO 头寸。
- 持仓跟踪:跟踪入场价格、当前价格和盈亏(P&L)。
- 对冲发现:通过逻辑蕴含关系,由 LLM 驱动的覆盖组合发现。
使用方式
安装依赖
在技能目录下执行:
cd {baseDir}
uv sync
首次设置(交易必需)
首次交易前,需设置 Polymarket 合约授权(一次性,消耗约 0.01 POL 的 gas):
uv run python scripts/polyclaw.py wallet approve
这会向 Polygon 提交 6 笔授权交易。每个钱包只需执行一次。
浏览市场
# 按交易量查看热门市场
uv run python scripts/polyclaw.py markets trending
# 搜索市场
uv run python scripts/polyclaw.py markets search "election"
# 市场详情(返回包含所有字段的完整 JSON)
uv run python scripts/polyclaw.py market <market_id>
输出选项:默认输出为格式化表格(适合展示);使用 --full 标志显示完整问题文本而不截断;通过 scripts/markets.py --json trending 使用 --json 标志获取结构化 JSON 输出。
钱包管理
# 查看钱包状态(地址、余额)
uv run python scripts/polyclaw.py wallet status
# 设置合约授权(一次性)
uv run python scripts/polyclaw.py wallet approve
钱包通过 POLYCLAW_PRIVATE_KEY 环境变量配置。
交易
# 买入 50 美元的 YES 头寸
uv run python scripts/polyclaw.py buy <market_id> YES 50
# 买入 25 美元的 NO 头寸
uv run python scripts/polyclaw.py buy <market_id> NO 25
持仓
# 列出所有持仓及盈亏
uv run python scripts/polyclaw.py positions
对冲发现
查找覆盖组合——通过逆否逻辑相互对冲的市场头寸对。
# 扫描热门市场寻找对冲
uv run python scripts/polyclaw.py hedge scan
# 扫描匹配查询的市场
uv run python scripts/polyclaw.py hedge scan --query "election"
# 分析特定市场之间的对冲关系
uv run python scripts/polyclaw.py hedge analyze <market_id_1> <market_id_2>
输出选项:默认输出为格式化表格,显示 Tier、Coverage、Cost、Target 和 Cover;使用 --json 标志获取结构化 JSON 输出;使用 --min-coverage 0.90 按最低覆盖率过滤(默认 0.85);使用 --tier 1 按层级过滤(1=最佳,默认 2)。
覆盖率层级:
- Tier 1(HIGH):>=95% 覆盖率——接近套利机会
- Tier 2(GOOD):90-95%——强对冲
- Tier 3(MODERATE):85-90%——尚可但风险明显
- Tier 4(LOW):<85%——投机性(默认被过滤)
LLM 模型:通过 OpenRouter 使用 nvidia/nemotron-nano-9b-v2:free。模型选择很重要——有些模型会找到虚假相关性,而其他模型(如 DeepSeek R1)存在输出格式问题。如有需要,可用 --model <model_id> 覆盖。
安全
MVP 阶段,私钥存储在环境变量中,以简化操作并兼容 Claude Code。
安全警告:此钱包中只保留少量资金。定期提现到安全钱包。
环境变量
| 变量 | 必需 | 描述 |
|---|---|---|
| CHAINSTACK_NODE | 是(交易) | Polygon RPC URL |
| OPENROUTER_API_KEY | 是(对冲) | 用于 LLM 对冲发现的 OpenRouter API 密钥 |
| POLYCLAW_PRIVATE_KEY | 是(交易) | EVM 私钥(十六进制,带或不带 0x 前缀) |
| HTTPS_PROXY | 推荐 | 用于 CLOB 的轮换住宅代理(例如 IPRoyal) |
| CLOB_MAX_RETRIES | 否 | 带 IP 轮换的 CLOB 最大重试次数(默认:5) |
安全警告:此钱包中只保留少量资金。定期提现到安全钱包。环境变量中的私钥便于自动化,但安全性低于加密存储。
交易流程
- 拆分头寸——USDC.e 通过 CTF 合约拆分为 YES + NO 代币
- 卖出不需要的一侧——不需要的一侧通过 CLOB 订单簿卖出
- 结果——你持有想要的头寸,并从卖出不需要的一侧收回部分成本
示例:以 0.70 美元买入 YES
- 拆分 100 USDC.e → 100 YES + 100 NO 代币
- 以约 0.30 美元卖出 100 NO 代币 → 收回约 27 USDC.e
- 净成本:约 73 美元获得 100 YES 代币(入场价:0.73 美元)
Polymarket 合约(Polygon 主网)
- USDC.e:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174
- CTF(Conditional Tokens):0x4D97DCd97eC945f40cF65F87097ACe5EA0476045
- CTF Exchange:0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E
依赖
使用 uv 安装(在技能目录下):
cd {baseDir}
uv sync
限制
- 交易需要钱包授权设置(一次性)
- 如果流动性不足,CLOB 卖出可能失败
- CLOB Cloudflare 封锁
Polymarket 的 CLOB API 使用 Cloudflare 保护,会阻止来自许多 IP 的 POST 请求,包括数据中心 IP 和部分住宅 ISP。这会影响“卖出不需要的代币”步骤。
解决方案:带重试逻辑的住宅代理
推荐设置使用轮换住宅代理(例如 IPRoyal、BrightData)。CLOB 客户端会自动用新 IP 重试,直到成功:
export HTTPS_PROXY="http://user:pass@geo.iproyal.com:12321"
export CLOB_MAX_RETRIES=10 # 默认是 5
使用此设置,CLOB 订单通常会在 5-10 次重试内成功,因为代理会轮换 IP 直到找到未被封锁的 IP。
替代方案:
- 使用
--skip-sell——保留 YES 和 NO 代币,在 polymarket.com 上手动卖出 - 不使用代理——拆分仍然有效;只有 CLOB 卖出受影响
如果 CLOB 在所有重试后仍失败,你的拆分仍然成功。输出会告诉你需要手动卖出多少代币。
故障排除
“No wallet available”
设置 POLYCLAW_PRIVATE_KEY 环境变量:
export POLYCLAW_PRIVATE_KEY="0x..."
“Insufficient USDC.e”
使用 uv run python scripts/polyclaw.py wallet status 检查余额。你需要在 Polygon 上拥有 USDC.e(桥接 USDC)。
“CLOB order failed”
CLOB 卖出可能因以下原因失败:
- 卖出价格处流动性不足
- IP 被 Cloudflare 封锁(尝试代理)
你的拆分仍然成功——你拥有代币,只是无法卖出不需要的一侧。
“Approvals not set”
首次交易需要合约授权。运行:
uv run python scripts/polyclaw.py wallet approve
许可证
MIT