polyclaw 是做什么的?
面向 OpenClaw 的 Polymarket 交易技能。浏览市场、管理钱包、执行交易、追踪持仓。
功能
- 市场浏览 - 搜索和浏览 Polymarket 预测市场
- 钱包管理 - 基于环境变量的钱包配置
- 交易 - 通过拆分 + CLOB 执行买入 YES/NO 头寸
- 持仓追踪 - 追踪入场价格、当前价格和盈亏 (P&L)
- 对冲发现 - 基于逻辑推论的 LLM 驱动覆盖性投资组合发现
快速开始
首先,安装依赖(从技能目录执行):
cd {baseDir}
uv sync
首次设置(交易必需)
在首次交易前,设置 Polymarket 合约授权(一次性操作,gas 费约 0.01 POL):
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标志可查看完整问题文本(不截断) - 使用
--json标志(如scripts/markets.py --json trending)输出结构化 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>
输出选项:
- 默认输出为格式化表格,显示层级、覆盖率、成本、目标和覆盖
- 使用
--json标志输出结构化 JSON - 使用
--min-coverage 0.90按最低覆盖率过滤(默认 0.85) - 使用
--tier 1按层级过滤(1=最佳,默认 2)
覆盖率层级:
- 层级 1(高): >=95% 覆盖率 - 近乎套利机会
- 层级 2(良好): 90-95% - 强对冲
- 层级 3(中等): 85-90% - 尚可但存在明显风险
- 层级 4(低): <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) |
POLY_BUILDER_CODE | 否 | 用于归因的 Bytes32 构建者代码(来自 polymarket.com/settings?tab=builder)。设置后将附加到每个订单。 |
安全警告: 请在此钱包中仅保留少量资金。定期将资金提现到安全钱包。将私钥放在环境变量中虽然便于自动化,但安全性低于加密存储。
交易流程
- 拆分头寸 - 通过 CTF 合约将 pUSD 拆分为 YES + NO 代币
- 卖出不需要的 - 通过 CLOB 订单簿(V2)卖出不需要的一方
- 结果 - 您持有想要的头寸,并通过卖出不需要的一方回收部分成本
示例:以 $0.70 买入 YES
- 拆分 $100 pUSD → 100 YES + 100 NO 代币
- 以 ~$0.30 卖出 100 NO 代币 → 回收 ~$27 pUSD
- 净成本:~$73 获得 100 YES 代币(入场价:$0.73)
如果您只有 USDC.e,交易前请通过 Collateral Onramp 的 wrap() 函数 1:1 包装为 pUSD。
Polymarket 合约(Polygon 主网,CLOB V2)
- pUSD(抵押品):
0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB - USDC.e(入金输入):
0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174 - Collateral Onramp:
0x93070a847efEf7F70739046A929D47a521F5B8ee - CTF(条件代币):
0x4D97DCd97eC945f40cF65F87097ACe5EA0476045 - CTF Exchange(V2):
0xE111180000d2663C0091e4f400237545B87B996B - Neg Risk CTF Exchange(V2):
0xe2222d279d744050d28e00520010520000310F59
依赖
使用 uv 安装(从技能目录执行):
cd {baseDir}
uv sync
限制
- 交易需要一次性钱包授权设置
- 如果流动性不足,CLOB 卖出可能失败
CLOB Cloudflare 拦截
Polymarket 的 CLOB API 使用 Cloudflare 防护,会阻止来自许多 IP 地址(包括数据中心 IP 和部分住宅 ISP)的 POST 请求。这会影响“卖出不需要的代币”步骤。
解决方案:带重试逻辑的住宅代理
推荐的设置使用轮换住宅代理(例如 IPRoyal、BrightData)。CLOB 客户端会自动使用新 IP 重试,直到成功:
export HTTPS_PROXY="http://user:[email protected]:12321"
export CLOB_MAX_RETRIES=10 # 默认为 5
使用此设置,CLOB 订单通常会在 5-10 次重试内成功,因为代理会轮换 IP 直到找到未被封锁的。
替代解决方案:
- 使用
--skip-sell— 保留 YES 和 NO 代币,手动在 polymarket.com 上卖出 - 不使用代理 — 拆分仍可正常工作;仅 CLOB 卖出受影响
如果 CLOB 在所有重试后仍然失败,您的拆分操作仍然成功。输出会告诉您需要手动卖出多少代币。
故障排除
“没有可用的钱包”
设置 POLYCLAW_PRIVATE_KEY 环境变量:
export POLYCLAW_PRIVATE_KEY="0x..."
“pUSD 不足”
使用 uv run python scripts/polyclaw.py wallet status 检查余额。交易需要 pUSD(Polymarket USD)。如果您有 USDC.e,通过 Collateral Onramp(0x9307...B8ee)1:1 包装——polymarket.com 界面会自动执行此操作;API 用户需手动包装。
“CLOB 订单失败”
CLOB 卖出可能因以下原因失败:
- 卖出价格处流动性不足
- IP 被 Cloudflare 拦截(请尝试代理)
您的拆分操作仍然成功——您已拥有代币,只是无法卖出不需要的一方。
“授权未设置”
首次交易需要合约授权。请运行:
uv run python scripts/polyclaw.py wallet approve
许可证
Apache 2.0