265 lines
9.0 KiB
Markdown
265 lines
9.0 KiB
Markdown
# Polymarket模拟交易
|
||
|
||
`量化交易` `AI代理` `模拟交易` `预测市场` `MCP`
|
||
|
||
# polymarket-paper-trader
|
||
|
||
[](https://pypi.org/project/polymarket-paper-trader/)
|
||
[](https://github.com/agent-next/polymarket-paper-trader/actions/workflows/test.yml)
|
||
[](https://clawhub.com/robotlearning123/polymarket-paper-trader)
|
||
[](https://github.com/agent-next/polymarket-paper-trader/blob/main/LICENSE)
|
||
|
||
**你的 AI 代理现在成为了 Polymarket 交易员。**
|
||
|
||
安装 → 代理获得 $10,000 虚拟资金 → 在真实 Polymarket 订单簿上交易 → 追踪盈亏 → 参与公开排行榜竞争。零风险,真实价格。
|
||
|
||
> "我的 AI 代理在 Polymarket 一周内实现了 +18% 的投资回报率。零风险,真实订单簿。"
|
||
|
||
隶属于 [agent-next](https://github.com/agent-next) —— 自主进化智能代理开源研究实验室。
|
||
|
||
## 60 秒演示
|
||
|
||
```bash
|
||
npx clawhub install polymarket-paper-trader # 通过 ClawHub 安装
|
||
pm-trader init --balance 10000 # $10k 虚拟资金
|
||
pm-trader markets search "bitcoin" # 搜索市场
|
||
pm-trader buy will-bitcoin-hit-100k yes 500 # 买入 $500 的 YES
|
||
pm-trader stats --card # 生成可分享的统计卡片
|
||
```
|
||
|
||
就这些。你的 AI 代理现在可以零风险地在 Polymarket 上交易了。
|
||
|
||
## 安装
|
||
|
||
```bash
|
||
# 通过 pip
|
||
pip install polymarket-paper-trader
|
||
|
||
# 通过 ClawHub(适用于 OpenClaw 代理)
|
||
npx clawhub install polymarket-paper-trader
|
||
|
||
# 从源码安装(开发模式)
|
||
uv pip install -e ".[dev]"
|
||
```
|
||
|
||
需要 Python 3.10+。
|
||
|
||
## 不是玩具——这是真实的交易所模拟器
|
||
|
||
其他工具使用模拟价格或随机数。我们模拟真实交易所:
|
||
|
||
- **逐档订单簿撮合** —— 你的订单逐档消耗真实 Polymarket 买/卖盘的流动性,与真实交易完全一致
|
||
- **精确手续费模型** —— `bps/10000 × min(价格, 1-价格) × 份数` —— 与 Polymarket 官方公式相同
|
||
- **滑点追踪** —— 每笔交易记录实际成交价与中间价的偏差(以基点计)
|
||
- **限价单状态机** —— 支持 GTC(长期有效)和 GTD(定期有效)的完整生命周期管理
|
||
- **策略回测** —— 将策略在历史价格快照上重放验证
|
||
- **多结果市场** —— 不仅限于 YES/NO 二元,支持任意数量的结果
|
||
|
||
你的虚拟盈亏与真实盈亏的差距不超过买卖价差。这正是本工具的意义所在。
|
||
|
||
## 快速开始
|
||
|
||
```bash
|
||
# 初始化 $10k 虚拟账户
|
||
pm-trader init --balance 10000
|
||
|
||
# 浏览市场
|
||
pm-trader markets list --sort liquidity
|
||
pm-trader markets search "bitcoin"
|
||
|
||
# 交易
|
||
pm-trader buy will-bitcoin-hit-100k yes 100 # 买入 $100 的 YES
|
||
pm-trader sell will-bitcoin-hit-100k yes 50 # 卖出 50 份
|
||
|
||
# 查看持仓和盈亏
|
||
pm-trader portfolio
|
||
pm-trader stats
|
||
```
|
||
|
||
## CLI 命令
|
||
|
||
| 命令 | 说明 |
|
||
|---------|-------------|
|
||
| `init [--balance N]` | 创建虚拟交易账户 |
|
||
| `balance` | 显示现金、持仓价值和总盈亏 |
|
||
| `reset --confirm` | 清除所有数据 |
|
||
| `markets list [--limit N] [--sort volume\|liquidity]` | 浏览活跃市场 |
|
||
| `markets search QUERY` | 全文搜索市场 |
|
||
| `markets get SLUG` | 查看市场详情 |
|
||
| `price SLUG` | YES/NO 中间价和价差 |
|
||
| `book SLUG [--depth N]` | 订单簿快照 |
|
||
| `watch SLUG [SLUG...] [--outcome yes\|no]` | 监控实时价格 |
|
||
| `buy SLUG OUTCOME AMOUNT [--type fok\|fak]` | 以市价买入 |
|
||
| `sell SLUG OUTCOME SHARES [--type fok\|fak]` | 以市价卖出 |
|
||
| `portfolio` | 含实时价格的持仓列表 |
|
||
| `history [--limit N]` | 交易历史 |
|
||
| `orders place SLUG OUTCOME SIDE AMOUNT PRICE` | 下限价单 |
|
||
| `orders list` | 待成交限价单 |
|
||
| `orders cancel ID` | 取消限价单 |
|
||
| `orders check` | 对照实时价格撮合限价单 |
|
||
| `stats [--card\|--tweet\|--plain]` | 胜率、ROI、利润、最大回撤 |
|
||
| `leaderboard` | 本地账户排行榜 |
|
||
| `pk ACCOUNT_A ACCOUNT_B` | 对战:谁是更好的交易员? |
|
||
| `export trades [--format csv\|json]` | 导出交易历史 |
|
||
| `export positions [--format csv\|json]` | 导出持仓 |
|
||
| `benchmark run MODULE.FUNC` | 运行交易策略 |
|
||
| `benchmark compare ACCT1 ACCT2` | 对比账户表现 |
|
||
| `benchmark pk STRAT_A STRAT_B` | 对战:谁的策略更强? |
|
||
| `accounts list` | 列出所有命名账户 |
|
||
| `accounts create NAME` | 创建用于 A/B 测试的账户 |
|
||
| `mcp` | 启动 MCP 服务器(stdio 传输) |
|
||
|
||
全局参数:`--data-dir PATH`、`--account NAME`(或环境变量 `PM_TRADER_DATA_DIR`、`PM_TRADER_ACCOUNT`)。
|
||
|
||
## MCP 服务器——你的代理能做什么
|
||
|
||
你的代理通过 [Model Context Protocol](https://modelcontextprotocol.io) 获得 26 个工具:
|
||
|
||
```bash
|
||
pm-trader-mcp # 在 stdio 上启动
|
||
```
|
||
|
||
添加到你的 Claude Code 配置:
|
||
|
||
```json
|
||
{
|
||
"mcpServers": {
|
||
"polymarket-paper-trader": {
|
||
"command": "pm-trader-mcp"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### MCP 工具
|
||
|
||
| 工具 | 功能说明 |
|
||
|------|---------|
|
||
| `init_account` | 创建虚拟账户并设置初始余额 |
|
||
| `get_balance` | 现金、持仓价值和总盈亏 |
|
||
| `reset_account` | 清除所有数据,重新开始 |
|
||
| `search_markets` | 按关键词搜索市场 |
|
||
| `list_markets` | 按交易量/流动性排序浏览市场 |
|
||
| `get_market` | 含结果和价格的市场详情 |
|
||
| `get_order_book` | 实时订单簿快照(买盘+卖盘) |
|
||
| `watch_prices` | 监控多个市场的价格 |
|
||
| `buy` | 以最优价格买入份额 |
|
||
| `sell` | 以最优价格卖出份额 |
|
||
| `portfolio` | 含实时估值和盈亏的持仓列表 |
|
||
| `history` | 含执行详情的近期交易记录 |
|
||
| `place_limit_order` | 限价单——保持挂单直至成交、取消或到期 |
|
||
| `list_orders` | 待成交限价单 |
|
||
| `cancel_order` | 取消待成交订单 |
|
||
| `check_orders` | 对照实时价格执行待成交订单 |
|
||
| `stats` | 胜率、ROI、利润、最大回撤 |
|
||
| `resolve` | 结算已关闭市场(获胜方每份获 $1) |
|
||
| `resolve_all` | 结算所有已关闭市场 |
|
||
| `backtest` | 在历史快照上回测策略 |
|
||
| `stats_card` | 可分享的统计卡片(推文/Markdown/纯文本) |
|
||
| `share_content` | 平台专属内容(Twitter/Telegram/Discord) |
|
||
| `leaderboard_entry` | 生成可验证的排行榜提交记录 |
|
||
| `leaderboard_card` | 所有本地账户的 Top 10 排行卡片 |
|
||
| `pk_card` | 两个账户的头对头对比 |
|
||
| `pk_battle` | 两个策略头对头运行并自动对比 |
|
||
|
||
## 策略示例
|
||
|
||
`examples/` 目录中提供三个即用策略:
|
||
|
||
### 动量策略(`examples/momentum.py`)
|
||
|
||
当 YES 价格突破 0.55 时买入,0.70 时止盈,0.35 时止损。
|
||
|
||
```bash
|
||
pm-trader benchmark run examples.momentum.run
|
||
```
|
||
|
||
### 均值回归策略(`examples/mean_reversion.py`)
|
||
|
||
当 YES 价格跌至公允价值 0.50 以下 12+ 美分时买入,回归时卖出。
|
||
|
||
```bash
|
||
pm-trader benchmark run examples.mean_reversion.run
|
||
```
|
||
|
||
### 网格限价策略(`examples/limit_grid.py`)
|
||
|
||
在当前价格下方布置网格限价买单,并在上方设置止盈卖单。
|
||
|
||
```bash
|
||
pm-trader benchmark run examples.limit_grid.run
|
||
```
|
||
|
||
### 编写自己的策略
|
||
|
||
```python
|
||
# my_strategy.py
|
||
from pm_trader.engine import Engine
|
||
|
||
def run(engine: Engine) -> None:
|
||
"""你的策略接收一个完全初始化的 Engine 对象。"""
|
||
markets = engine.api.search_markets("crypto")
|
||
for market in markets:
|
||
if market.closed or market.yes_price < 0.3:
|
||
continue
|
||
engine.buy(market.slug, "yes", 100.0)
|
||
```
|
||
|
||
```bash
|
||
pm-trader benchmark run my_strategy.run
|
||
```
|
||
|
||
使用历史数据进行回测:
|
||
|
||
```python
|
||
def backtest_strategy(engine, snapshot, prices):
|
||
"""每个历史价格快照调用一次。"""
|
||
if snapshot.midpoint > 0.6:
|
||
engine.buy(snapshot.market_slug, snapshot.outcome, 50.0)
|
||
```
|
||
|
||
## 多账户支持
|
||
|
||
使用隔离账户并行运行多个策略:
|
||
|
||
```bash
|
||
pm-trader --account aggressive init --balance 5000
|
||
pm-trader --account conservative init --balance 5000
|
||
|
||
pm-trader --account aggressive buy some-market yes 500
|
||
pm-trader --account conservative buy some-market yes 100
|
||
|
||
pm-trader benchmark compare aggressive conservative
|
||
```
|
||
|
||
## 分享你的成绩
|
||
|
||
生成可分享的统计卡片并发布到 X/Twitter:
|
||
|
||
```bash
|
||
pm-trader stats --tweet # X/Twitter 优化格式
|
||
pm-trader stats --card # Telegram/Discord 的 Markdown 格式
|
||
pm-trader stats --plain # 纯文本格式
|
||
```
|
||
|
||
AI 代理可使用 `stats_card` MCP 工具自动生成并分享卡片。
|
||
|
||
## OpenClaw / ClawHub
|
||
|
||
已在 [ClawHub](https://clawhub.com) 上以 `polymarket-paper-trader` 名称发布:
|
||
|
||
```bash
|
||
npx clawhub install polymarket-paper-trader
|
||
```
|
||
|
||
## 测试
|
||
|
||
```bash
|
||
pytest -m "not live" # 单元测试 + 集成测试(跳过实时 API 测试)
|
||
pytest # 完整测试套件(需要网络)
|
||
pytest tests/test_e2e_live.py # 仅实时 API 集成测试
|
||
```
|
||
|
||
## 许可证
|
||
|
||
MIT |