# weatherbot — Polymarket 每日温度市场交易 bot

Rust 单 crate。Phase 1（纸面交易验证）已完成并部署在 AWS 上 7×24 运行。
理论依据见 docs/STRATEGY.md（必读）；服务器/部署/备份见 docs/OPS.md。

**生产实例在服务器上**：本机的 weatherbot.db 只是测试残留，真实数据在
AWS ~/predit-bot/weatherbot.db（每 6h 备份到 GitHub data 分支）。
改代码后要 rsync + 重编译 + restart 才生效（流程见 OPS.md），别只在本机改完就以为上线了。

## 核心设计原则（违反任何一条 = 策略失效）

1. **预报必须对准结算站**：结算源是市场 description 里指定的 Wunderground/NOAA 站点页
   （站点码解析见 src/station.rs），不是城市坐标。stations.toml 是坐标/时区映射。
2. **原始 ensemble 有偏且过度自信**：粗网格对特定站点有系统偏差（实测东京偏暖 2-6°C），
   概率输出 1.00 是欠散布假象。Phase 2 校正前，纸面 edge 不可信为真实 edge。
3. **只交易 edge ≥ 阈值 + 次日盘**：当日盘由实测温度驱动（METAR），预报无优势；
   吃单成本下 edge 阈值必须覆盖点差。
4. **每个新预报都落库**（forecasts 表）：这是 Phase 2 偏差校正的原料，删库 = 重头攒。

## 阶段门槛（不可跳）

- Phase 1（当前）：纸面循环跑 2-4 周，结算 ≥100 单且净收益率 ≥3% 才进 Phase 2
- Phase 2：按（站点 × lead time）偏差校正（EMOS/MOS 思路），用 historical-forecast API +
  METAR 回测；中国站点重点验证 CMA 权重
- Phase 3（仅当 edge 为正）：真实下单。maker 限价单管理；EIP-712 签名用 alloy 自实现或
  逐行审计过的 SDK（小众 crate 有供应链风险）；绝不把私钥交给未审计代码

## 常用命令

```bash
cargo run --release -- scan            # 列出活跃市场（滤僵尸后）
cargo run --release -- edge --city X   # 概率 vs 盘口报告（只读）
cargo run --release -- paper           # 常驻纸面循环（10 分钟/轮）
cargo run --release -- settle          # 结算已 resolve 市场
cargo run --release -- report          # 纸面战绩
cargo run --release -- web --port 8080 # 只读状态看板
sqlite3 weatherbot.db                  # forecasts/snapshots/paper_orders/settlements
```

## 数据源速查

- 市场/盘口：Gamma API（分页必须 order=id，endDate 排序会漂移）+ CLOB book（深度）
- 预报：Open-Meteo ensemble 端点（ECMWF 51m/GEFS 31m/ICON 40m）+ forecast 端点
  （CMA GRAPES，确定性 1m，ensemble 端点无 CMA 数据只返回 null）
- 结算实时上游：NOAA aviationweather.gov METAR（ZSPD 半小时级），整数 °C
- 历史预报归档：historical-forecast-api.open-meteo.com（偏差回测用，含 CMA/ECMWF）

## 已知近似（改动时别"顺手修复"，它们是有意的）

- 纸面成交按 taker（吃 ask）模拟 → 测得 edge 是下界
- 小时级预报取日极值系统性低估极值 ~0.2-0.4°C → 归入 Phase 2 校正
- 香港天文台结算精度 0.1°C，按整数近似
- bucket 标签变体：or below/lower/above/higher 都存在（src/prob.rs）
