111 lines
5.5 KiB
Markdown
111 lines
5.5 KiB
Markdown
|
|
用户问的是一个非常核心的架构问题:这些被回测的钱包(backtest.json 里的 10 个钱包)是不是这个项目自己"发现"的?如果是,完整流程是怎样的?
|
|||
|
|
|
|||
|
|
这是一个端到端的选择链路问题。我需要梳理整个项目的核心流程链:
|
|||
|
|
|
|||
|
|
1. 从 Polymarket 上的全量交易者
|
|||
|
|
2. enumerate.py 怎么发现候选池
|
|||
|
|
3. trust.py 过滤可信数据
|
|||
|
|
4. skill.py 的 5 门漏斗(z-score 等)
|
|||
|
|
5. conviction_scan.py 信念交易扫描
|
|||
|
|
6. validate_timing.py fee-aware 复制复现
|
|||
|
|
7. sync_floors.py 同步信念门槛
|
|||
|
|
8. backtest.json/copybot.paper.json 到 portfolio.py 回测
|
|||
|
|
9. 再到 copybot.py 实时执行
|
|||
|
|
|
|||
|
|
让我快速看一下关键文件的入口,确保流程说的准确。
|
|||
|
|
|
|||
|
|
## 完整答案。是的,这 10 个钱包是这个项目自己**一步一步筛出来的**。不是手动选的。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 全流程:从"Polymarket 上所有交易者"→"backtest.json 的 10 个钱包"
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Polymarket 全部交易者(~百万级)
|
|||
|
|
│
|
|||
|
|
┌────────────────┴────────────────┐
|
|||
|
|
│ │
|
|||
|
|
enumerate.py(步骤 1) 其他来源(gamma/polymarket-ui)
|
|||
|
|
最近 180 天已结算且流动性 > $20,000 的市场
|
|||
|
|
每个市场取 Top 30 名义金额交易者(insider.market_traders)
|
|||
|
|
去重 → 候选池 ~3.5 万个钱包
|
|||
|
|
附加信号:按"出现在多少个不同市场中"倒序(熟练玩家会在多个市场出现)
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
collect.py(步骤 2)— DuckDB 缓存
|
|||
|
|
对候选池中每个钱包拉取 /positions 历史
|
|||
|
|
含每笔 bet:市场 slug、方向、入场价、stake、结算状态
|
|||
|
|
第一次:全量拉(几个小时),之后增量
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
trust.py(步骤 3)— "可信数据"过滤器
|
|||
|
|
防御做市商钱包把"卖出盈利"伪装成"结算胜利"
|
|||
|
|
只保留:有明确 res_t(结算时间戳) + resolved=True +
|
|||
|
|
跨钱包共识 winner 的条目
|
|||
|
|
(数据 API 的 cached 字段对高频做市商不可靠)
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
skill.py(步骤 4)— 5 门统计漏斗
|
|||
|
|
对每个钱包计算 z-score: z = (实际胜利数 - Σ入场价) / σ
|
|||
|
|
( Σ入场价 = 市场对胜率的估计,z=0 表示无优势 )
|
|||
|
|
门限:
|
|||
|
|
① n ≥ 15 已结算交易
|
|||
|
|
② z > 0
|
|||
|
|
③ Benjamini-Hochberg FDR @ 5%
|
|||
|
|
④ 前半 vs 后半样本外持续性 (z_oos > 0)
|
|||
|
|
⑤ 排除纯做市钱包(trade direction flips 太频繁)
|
|||
|
|
→ 输出 watch_skilled.json (~100-200 个候选)
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
conviction_scan.py(步骤 5)— 信念画像
|
|||
|
|
"信念 bet" = 该钱包自己下注金额 Top 20% 的那些 bet
|
|||
|
|
(小 bet 可能是随机玩,大 bet 才是认真的)
|
|||
|
|
p80 截止线只在 TRAIN 数据上计算
|
|||
|
|
过滤:
|
|||
|
|
• ≥ 12 个训练期信念 bet
|
|||
|
|
• 中位信念 stake ≥ $50(排除 $2-$6 小钱包)
|
|||
|
|
• 训练期 + 前瞻期 ROI 双正
|
|||
|
|
→ 输出 conviction_wallets.json (~20-40 个)
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
validate_timing.py(步骤 6)— fee-aware 复制复现
|
|||
|
|
用与实时 bot 完全相同的逻辑复现:
|
|||
|
|
• 按钱包的 p80 信念 stake 作为门槛
|
|||
|
|
• 每注 = 当前权益 × 4%,上限 ≤ 信号钱包自己下注
|
|||
|
|
• taker fee = shares × rate × price × (1-price)
|
|||
|
|
• 价格保护:比信号价高 0.05 以上才跳过
|
|||
|
|
• 价格带 0.00-0.95
|
|||
|
|
输出 watch_sharps.json (~10-20 个 fee 后仍盈利的钱包)
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
sync_floors.py(步骤 7)— 同步信念门槛到配置
|
|||
|
|
watch_sharps.json 里每个钱包的 p80 信念金额
|
|||
|
|
→ 写入 copybot.paper.json 的 floor 字段
|
|||
|
|
→ 写入 backtest.json(portfolio.py 用同样门槛)
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
portfolio.py(步骤 8)— 滚动回测
|
|||
|
|
$1000 起步,过去 30 天
|
|||
|
|
对每个钱包,按时间顺序"回放"每一笔符合条件的 bet
|
|||
|
|
用完全相同的 sizing / fee / 价格保护逻辑
|
|||
|
|
实时结算每个市场胜负
|
|||
|
|
→ 输出 portfolio.json(最终权益)
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
人工筛选 + git commit → backtest.json(10 个)
|
|||
|
|
│
|
|||
|
|
↓
|
|||
|
|
copybot.py / deploy_bot.sh(运行时)
|
|||
|
|
用 copybot.paper.json / copybot.paper.json 配置
|
|||
|
|
跟踪 Set E(5 个 volume 类 + 5 个 conviction 类)
|
|||
|
|
实时 paper 账本 wwf_state.json
|
|||
|
|
真实资金 ledger_live.json
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 一句话总结
|
|||
|
|
|
|||
|
|
> **这个项目从 Polymarket 近期流动市场的 Top 30 交易者中挖出 ~3.5 万个候选 → 用 z-score + FDR + 样本外持续性过滤做市者和运气 → 只保留"自己大金额下注时才跟"的信念 bet → 扣除 fee 复现后仍盈利的才进入 backtest.json → portfolio.py 做滚动回测 → 最终挑 10 个进 copybot 实时跟踪。**
|
|||
|
|
|
|||
|
|
所以答案是:**是的,这 10 个钱包全是这个项目自己用统计方法一步一步筛出来的**,不是作者随便挑的。
|