--- ### 1. 回测的是哪些钱包? **默认**:`live/backtest.json` 里配置的 **10 个钱包**,比你 bot 跟踪的 5 个更多: | 钱包 | 昵称 | | ----------------- | -------------------- | | `0x41558102a...` | **LSB1** | | `0xd96750bf8d...` | **imwalkinghere** | | `0xe8ca3f758c...` | **Kruto2027** | | `0xbadaf31941...` | **0xbadaf319** | | `0xd7d36345c...` | **gkmgkldfmg** | | `0x921433c935...` | **AIcAIc** | | `0xa1d57d3292...` | **1kto1m** | | `0x2d462b2912...` | **Vahan88** | | `0x215adbb63b...` | **BikesAreTheBikes** | | `0x0c3e55cf50...` | **EdwardIN** | 参数:**30 天窗口**,**$1000 起始资金**,volume 类每注 4%。 **也可以手动指定钱包**(不走配置文件): ```powershell python portfolio.py --wallets 0xe8ca3f758c93f44f3ec210542ab78afb7c0bcccb,0xbadaf319415c17f28824a43ae0cd912b9d84d874 --days 30 --bank 1000 --out result.json ``` --- ### 2. 回测结果保存在哪? ``` live/portfolio.json ``` 结构大致是: ```json { "bank": 1000, "equity": 3456.78, // 最终权益 "realized": 2456.78, // 已结算盈亏 "deployed": 1000.00, // 当前持仓金额 "days": 30, "wallets": [ { "name": "Kruto2027", "bets": 23, ... }, ... ] } ``` 同时会在 `live/history/` 目录(如果你之前跑过 daily.sh)追加校准行。 --- ### 3. 全流程链 跑 `python portfolio.py` 时内部发生的完整链路: ``` ┌─────────────────────────────────────────────────────────────────────┐ │ 1. 读取配置 │ │ → live/backtest.json (10 个钱包 + 30 天窗口 + 4%/注) │ │ → live/copybot.paper.json (读取已 pin 的信念门槛) │ └─────────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────────────┐ │ 2. 拉取每钱包的历史 bets (data-api.polymarket.com) │ │ 每个钱包 → GET /positions?trader=0x...&closed=True │ │ 每笔 bet 含: 市场、方向、入场价、金额、结算状态 │ │ 新钱包首次会慢(全量拉取),后续缓存到本地无需重拉 │ └─────────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────────────┐ │ 3. 过滤"可信结算"的交易 │ │ - 跳过数据 API 无法判断结算时间的条目(高频做市商的"卖出即盈利" │ │ 伪装,这个项目专门用 trust.py 防御) │ │ - 只保留真正已结算(winner 已知)的 bets 参与盈亏计算 │ └─────────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────────────┐ │ 4. 按时间轴"回放"每一笔交易 —— 钱包入场时 bot 也入场 │ │ 对每个钱包的每笔 BUY: │ │ - 检查信念门槛(Kruto2027 是 $80,其他各不相同) │ │ - 检查入场价上限 0.95 │ │ - 计算 stake = 当时权益 × 4% │ │ - 扣除 taker fee(fee = shares × 0.03 × price × (1-price)) │ │ - 记录到 paper ledger │ │ 对钱包卖出/结算: │ │ - bot 以同样比例平仓 │ │ - 计算 exit 收益 - 再扣一次 taker fee │ └─────────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────────────┐ │ 5. 实时结算 │ │ 每次市场结算时(链上决定胜负),bot 以该时刻为准: │ │ - 标记 held position 为 WON/LOST │ │ - 释放成本 + 结算盈利 │ │ - 链上赎回免费(无 fee) │ └─────────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────────────┐ │ 6. 输出 portfolio.json │ │ { bank, equity, realized, deployed, per-wallet stats, misseds } │ └─────────────────────────────────────────────────────────────────────┘ ``` ### 一句话总结 > **读 `live/backtest.json` 的 10 个钱包 → 从 Polymarket 拉取他们过去 30 天的全部 bets → 用与真实 bot 完全相同的"4%/注 + 信念门槛 + taker fee + 价格保护"规则回放 → 结果写入 `live/portfolio.json`**。 所以,`portfolio.py` 的输出数字就是"如果过去 30 天你真的在用 copybot 跟踪这些钱包,你会赚到/亏掉多少钱"的最诚实估计。 现在可以直接跑: ```powershell cd live python portfolio.py ``` 首次跑需要几分钟拉数据,之后有缓存就快了。跑完后打开 `portfolio.json` 看 `equity` 字段。