# 策略理论依据

一句话：**用气象集合预报估计每个温度 bucket 的真实概率，与市场隐含概率对比，
只在差值超过阈值时下注，分数 Kelly 控仓。** 赚"概率估计比市场准"的钱，不是"预测天气"的钱。

## 逻辑链与文献出处

### 1. 市场价格 = 隐含概率

二元合约赢付 $1，价格 0.44 即市场给该结果 44% 概率（Wolfers & Zitzewitz 2004,
*Prediction Markets*, JEP）。若真实概率 q > 价格 p，以 p 买入期望收益 q−p > 0。

### 2. 集合预报 = 预报不确定性分布的蒙特卡洛采样（策略核心）

大气是混沌系统（Lorenz 1963），单次确定性预报误差随 lead time 指数增长。
集合预报对初始条件加扰动跑 N 次（ECMWF EPS 51 成员，Molteni et al. 1996；
思想源于 Leith 1974），成员散布即预报不确定性的采样：

> P(bucket) ≈ 落入该 bucket 的成员数 / 总成员数

这是气象学界验证三十年的标准做法，以 Brier score / CRPS 度量概率预报质量。
实现见 src/prob.rs（换算市场单位 → 按结算源规则取整 → 归桶计数）。

### 3. Kelly 仓位（Kelly 1956, *A New Interpretation of Information Rate*）

概率 q、含入场协议费的每股有效价格 p_eff 时，最大化长期对数增长的近似下注比例
f* = (q−p_eff)/(1−p_eff)。
全 Kelly 对 q 的估计误差极敏感（高估 → 过度下注 → 破产风险），
实践用分数 Kelly（MacLean & Ziemba 的分析；Thorp 的实践），本项目取 0.25×，
另加单笔上限、总敞口上限、盘口深度约束（src/edge.rs）。

### 4. Edge 阈值 = 交易成本 + 估计误差的缓冲带

实测 next-day 盘点差 ~6 美分（相对中间价 ~15%），概率估计自身有噪声。
决策理论的"不交易区间"：估计不确定时提高行动门槛。默认阈值 8%（config.toml）。
2026-07-20 起阈值作用于 **net edge = q − ask − entry_fee/share**，Kelly 也用同一
有效价格；不是先按 gross edge 下单、报告时才补费用。费率不写死：每个 condition 从
CLOB `GET /clob-markets/{condition_id}` 的 `fd` 读取。当前 Weather 返回
`r=0.05,e=1,to=true`，即 taker fee = shares × r × p × (1−p)；无 `fd` 为零费，
未知 exponent 直接拒单。官方依据：[Fees](https://docs.polymarket.com/trading/fees)、
[Get CLOB market info](https://docs.polymarket.com/api-reference/markets/get-clob-market-info)。

### 5. 对手盘假设（为什么市场会定错价）

- **Favorite-longshot bias**（Thaler & Ziemba 1988, JEP）：博彩市场系统性高估
  小概率事件。尾部 bucket 被买贵 → 本策略大量 NO 交易在收这个偏差。
- 天气市场吸引本地情绪盘/彩票型买家，非专业气象玩家。
- 模型更新窗口（ECMWF 00/12Z 等发布后市场反应滞后）提供信息时差。

### 6. Shadow C 趋势实验：有理论假设，不等于已有收益证明

预测市场在异质信念和有限资金下可能先对新信息反应不足、随后出现价格动量
（Ottaviani & Sørensen, *Aggregation of Information and Beliefs*）；跨资产的时间序列动量
研究也证明“自身过去收益方向预测后续方向”是可检验现象（Moskowitz, Ooi & Pedersen
2012）。这些文献只支撑**提出趋势假设**，不能把月度期货结论直接外推为天气合约的
小时级盈利证据，因此 C3 必须作为独立 forward shadow 验证。

C3 在 `shadow_c_start` 预注册以下对称规则：

- 信号只读 Gamma YES bid/ask 中价；30/60/180 分钟变化必须同号，且 |60m|≥3¢、
  |180m|≥5¢。正号买 YES，负号买 NO；用 logit 变化只做同事件 bucket 强弱排序。
- 每事件只取最强 bucket；当前 CLOB spread≤4¢，方向买价 10–90¢，顶档深度足够一次
  成交固定含费成本 $5，且 60 分钟价格移动至少覆盖当前点差和双边 taker fee 才开仓。
- YES 用 ask 买、bid 卖；NO 用 `1−bid` 买、`1−ask` 卖。30m 与 60m 同时反向且
  |60m 反向|≥3¢ 时一次全平；测量已数学击穿 bucket 时仍由 METAR knockout 全平。
- 不做 C1/C2、分批止盈或参数网格。Gamma 参考价与 CLOB 执行价分列落库，避免数据源
  切换产生假趋势。边界前数据不回填，先自然积累 180 分钟，防止引入事后选择。

C4 在独立的 `shadow_c4_start` 边界预注册循环趋势实验，不改写 C3：

- 首轮入场、每事件最强 bucket、点差/深度/动态双边费用门禁及反转/METAR 退出全部沿用 C3。
- 每事件同时最多一仓、累计最多两轮。首轮退出后必须连续 30 分钟没有任何 bucket 满足
  C3 入场趋势，才重新武装；重新出现完整 30/60/180 分钟信号后才允许第二轮。
- 任一趋势信号在中性等待期出现都会把 30 分钟计时清零，禁止平仓后下一轮立即反手。
- 每笔交易独立记录，但主要归因同时报告事件数与重复入场数，不能把同一天气事件的两轮
  当成两个独立结算样本。C4 仍按 taker 模拟，是循环交易可行性的成本下界。

**2026-07-21 前瞻暂停**：首日 C3/C4 的 48 笔反转退出净收益为 -$36.30
（-15.4% ROI，且未扣费的价格 P&L 也为负），因此
`enable_trend_entries=false`，C3/C4 不再新增仓位。已有仓位仍按原预注册规则反转退出、
METAR knockout 或等待结算，禁止遗弃或改写；未来若验证模型同向、仅 D+1 等变体，必须
使用新的实验名和边界，不能恢复 C3/C4 后混入原样本。

Polymarket 官方说明中价只是 bid/ask 平均值，真实买入支付 ask、卖出获得 bid；因此
C3 的趋势信号不能当作成交价，点差、深度和 fee 门禁不可省略。参考：
[prediction-market underreaction paper](https://www.economics.ku.dk/research/publications/wp/dp_2009/0914.pdf)、
[time-series momentum paper](https://w4.stern.nyu.edu/facdir/lpederse/papers/TimeSeriesMomentum.pdf)、
[Polymarket prices & orderbook](https://docs.polymarket.com/concepts/prices-orderbook)。

## 已知薄弱环节（诚实清单）

### A. 原始 ensemble 有偏且欠散布 —— 最大缺口，Phase 2 的存在理由

粗网格（0.25°）模型对特定站点有系统偏差：实测东京 RJTT（海岸格点）ensemble
均值比高分辨率确定性预报偏暖 2-6°C；上海 CMA 与 ECMWF 分歧可达 3.7°C。
且成员散布普遍低估真实不确定性 → bot 输出 "prob 1.00" 是过度自信假象。

气象学标准解法 = 统计后处理（本项目 Phase 2 的学术依据）：
- MOS：Glahn & Lowry 1972
- EMOS / NGR：Gneiting et al. 2005, *Calibrated Probabilistic Forecasting*
- 贝叶斯模型平均：Raftery et al. 2005

最简可行版：按（站点 × lead time）滚动均值偏差修正 + 散布放大系数，
原料 = forecasts 表（每次新预报落库）+ METAR/Wunderground 实测。

**2026-07-17 实现口径**：影子校准不再用 Historical Forecast 的短时拼接序列冒充
固定 lead。`calibrate` 从 Open-Meteo Previous Runs 读取每个有效时刻前 24/48/72 小时
的 D+1/D+2/D+3 预报，与 IEM 的结算站 METAR 日极值配对；每个站点×kind×lead×目标日
只记一条样本，30 日滚动拟合，并用只看此前日期的 walk-forward MAE 评估。精确 lead
行不足 15 日时只回退 D+1 站点偏差。

**corr_gate_v1（2026-07-28 起）**：`model_prob_corr` 从影子转入决策，同时用于开仓门槛
和 Kelly 定仓。依据是 384 单已结算前瞻样本上的校准检验——raw ensemble 在每个概率分箱
都过度自信（0.99 分箱实际胜率 0.789），而 Kelly 按 edge 定仓，把最大仓位压在模型最错
的区间（0.90–0.99 分箱吃掉 $630 本金、亏 $109）。反事实：换成 corr 门槛后保留组 +9.4%
／拒掉组 -27.3%／不筛 -3.6%，两组胜率 0.682 vs 0.694 基本相同——**改善来自不在过度自信
处下重注，不是选中更多赢家**。对照组「只提高 raw 门槛拒掉同样多的单」为 -4.8%（方向相反），
置换检验 p = 0.0006。

三条设计约束：

1. corr 门槛**叠加**在 raw band 之上而非替换。上述估计只测得「raw 放行的单里 corr 会
   拒掉哪些」，raw 拒掉的单从未进入样本；保持 raw 为必要条件，前瞻测的才是同一件事。
2. 排序仍按 raw edge（`priority_edge_cap` 是在 raw 上拟合的 8–20% band），避免同时改动
   排序与门槛。
3. `paper_orders.model_prob` / `.edge` 继续存 raw，分界点 `corr_gate_v1_start` 写入
   `bot_meta`；前后 ROI 不得合并。

前视核对：`calibration_observations` 16281 行中 `target_date >= verified_ts` 当天者为 0，
最小滞后 1 天；bias 用 ≤D-1 拟合、作用于 ≥D+1，间隔至少 2 天。

**F1 模型家族影子（2026-07-23 起）**：raw 概率按 ensemble 成员池计数，模型权重会随
成员数变化。F1 只使用必需 ensemble，先在 ECMWF、NCEP/GFS、DWD/ICON 等独立家族内
计算 bucket 概率，再对家族等权；另生成应用同一站点×lead bias 与 spread inflation 的
`model_prob_family_corr`。两者只落入 snapshots/订单元数据并计算前瞻 Brier，不参与
候选排序、Kelly、敞口或开仓（注意区别：转入决策的是 `model_prob_corr`，见 corr_gate_v1；
F1 家族口径仍是纯影子）。至少 100 个带市场中价的已结算 Hold 样本后，才按
`docs/MODEL_FAMILY_MAKER_UI_PLAN.md` 的预注册条件裁定。

自 forecast provenance v1 起，每次完整预报写入先生成不可变 `forecast_batches.id`，
同批 `forecasts`、据此计算的 `snapshots` 和最终 `paper_orders` 保存同一个
`forecast_batch_id`。旧数据保持 NULL，不按相近时间猜测回填；历史回测只能把明确关联
的样本作为主口径。这避免 10 分钟快照错误匹配到前一/后一轮预报而产生虚假提升。

**校正维度扩展（外部实证）**：竞品 huskyweather.com（即 huskyvs 的分析终端，
Polymarket 天气盘 ~$22k 累计盈利者）公开页面显示，其"call"明确区别于
model consensus——在原始共识之上做一层校正，方法是**状态条件化经验气候学**，
而非全局偏差。RJTT 页面暴露的条件维度：
- 分桶键不止 lead time，还含 **当前时刻 + 风向**（"wind E · new high later on 0% · n=28"）
- 每条修正都带样本量 n → 纯历史频率查表，不是模型二次拟合
- 首页 "Wind stall — 强风扼杀午后升温" 说明风向/风速是其验证过的物理预测因子

据此我方 Phase 2 把校正键从（站点 × lead time）扩为
**（站点 × lead time × 风向档）**，并单独回测"午后升温 vs 风速/风向"。
另可低成本引入 **TAF**（机场级预报电文，aviationweather.gov 与现有 METAR 同源），
作当日盘辅助信号。回测原料齐全：forecasts 表 + historical-forecast API + METAR。

**外部实证补充（2026-07-10，Grok 深搜 X/论文，78 源）**：

- EMOS 实践参数（Gneiting 2005 及后续）：滚动窗口 **30–45 天**，站点级 daily Tmax
  校正后 MAE 1.0–2.0°C。我方 3 天数据（bias -1.0，去均值后 MAE 0.95）已在此区间。
- **信息论警告**（Wenth 论文，即 §B 引的 562 笔实盘研究）：其失败核心是
  forecast MAE ≈ bucket 宽度 → 概率 edge 无法稳定变现。我方去均值后 MAE 0.95°C
  仍 ≈ 1°C 桶宽——**全局修正只够到及格线，站点级/条件化校正才可能把 MAE 压到
  桶宽以下**，这是 Phase 2 成败的定量判据。
- **纸面→实盘落差**（同论文）：其 paper 482 笔 +$172（71% 胜率），live 509 笔
  全部策略亏损（-$401）。原因：taker 点差、adverse selection、crowding。
  我方 Phase 1 纸面结果都要按此打折；论文还提出 "profit-lock paradox"——实盘中
  提前退出破坏持有价值。2026-07-20 用 761 单累计快照重跑后，我方也出现同样结论：
  最接近 Shadow B 的 122 个历史事件在扣费后 hold +$50.32，5%–30% 固定止盈全部更差；
  移动止盈此前也已证伪。因此不把止盈固化进生产，只保留严格按首次触发 bid 的回放。
- 头部玩家的真实 edge（同论文 on-chain 分析）：**resolution latency arbitrage**
  （盯 METAR/WU 刷新抢在重定价前），不是更好的预报。这解释我方输家的
  "午后跳空"——对手盘就是 latency 玩家。当日盘 METAR 抢跑是已被验证的
  edge 来源，但属 Phase 3+ 议题（与预报无关，是基础设施竞赛）。
- 同行参数参考（polymarketweather.com 自述，未验证）：4 模型 ensemble spread
  建分布，**edge ≥8% 且 z-score ≥1.5 才交易**，fractional Kelly + 硬上限。
  对照我方发现"名义 edge ≥0.2 反而亏"，方向一致：小而稳的 edge 才可信。
- 社区：Weather Olympus Discord（husky 推荐）；husky 的站点档案含
  机场 vs 周边 PWS 温差利用(microclimate)。

### B. 竞争假设未经验证

Open-Meteo 人人可用。已有研究（562 笔实盘）显示无校正的朴素策略 live edge ≈ 0。
本项目的差异化赌注：**中国城市 + CMA 模型 + 结算站级校正**，欧美开源 bot
（参考实现全部只校准美国站点）大概率未覆盖。此假设只能靠纸面数据证伪/证实。

**2026-07-10 裁定：假设大幅削弱**（证据见 FINDINGS 发现 9-11）：
① 130 天回测显示中国站校正后 MAE 普遍偏差（广州/重庆剔除，北京/成都边缘），
校正最干净的是欧美主流站；② CMA 消融显示其对共识无增量；③ X 上实锤盈利的
中国盘玩家用的是当日盘实测打法而非预报，且 bot 已覆盖 50+ 城。
预报流的主战场调整为：**站点白名单（校正后 MAE ≤0.8）+ 次日盘**，
中国站仅保留白名单内的（深圳/郑州/上海），并盯结算源风险（见 §C）。

### C. 结算单点风险

结算依赖单一物理站点（巴黎 CDG 曾发生传感器异常引发争议）。缓解：临近结算用
METAR 实时监控 + 不留超额尾部敞口。

实锤案例（2026-07 Grok 核实）：深圳 ZGSZ 曾发生 Wunderground feed 错拉
香港流浮山站数据（与宝安站 METAR 差 2°C），交易者 99.8¢ 的 NO 被结算
反杀亏 $7.8K；Polymarket 多次在 WU↔NOAA 之间切换结算源且只改规则页。
→ 入场前核对市场 rules 当前指定源；对结算源近期变更过的市场降权或跳过。

## 范围边界

本策略的 edge 依赖两个同时成立的条件：**结算对象物理可预报**（最强工具 ECMWF
集合预报公开免费）且**边际定价者是业余盘**（favorite-longshot bias 可收割）。
只做同时满足这两条的市场；任一条不成立的场景不属于本项目范围。

## 验证协议

**2026-08-10 状态**：完整候选流已以事件 bootstrap 证伪当前 Hold（corr gate + $20 cap
ROI -5.12%，95% CI [-6.99%,-3.19%]），故 `enable_hold_entries=false`。这不是晋级
Phase 3；只停止新增负期望纸面风险，已有仓位继续管理，候选/预报/maker 影子数据继续采集。
WeatherNext 2 的 64 成员仅作 shadow forecast 落库，不进入交易概率。

纸面循环 2-4 周（cargo run --release -- paper），判定标准见 README：
- `fee_accounting_v1_start` 后实现收益 ≥100 单，扣可成交点差和动态协议费后净收益率
  ≥3%，且 Brier 不差于同时点市场中价 → 才允许进入下一阶段
- 按城市/模型分组归因：edge 集中在中国城市吗？CMA 分歧日的胜率更高吗？
- 亏损或持平 → taker 成本下无 edge，Phase 3 必须 maker 化或放弃

执行层面：市场发现仍来自 Gamma API，但纸面成交价与持仓现价以 CLOB top-of-book
为准；Gamma bestBid/bestAsk 只作为低成本预筛。报告/看板中的 raw edge 是未校正
ensemble 概率与当前可成交价的差值，不代表 Phase 2 校正后的真实 edge。

额度分配不能依赖 Gamma 返回顺序：每轮先完成全市场扫描并记录 snapshots，再按
Phase 1 的 raw edge 从高到低统一分配剩余额度。这个排序只消除分页/城市顺序偏差，
**不代表大 raw edge 已被验证更赚钱**；发现 5/14 恰好显示 raw edge ≥20% 表现更差，
所以基线全量记录不变，另以前瞻影子组合 A（只做 NO、8%≤raw edge<20%）验证。
2026-07-20 曾新增独立记账的 Shadow B；随后它停止新增，只保留历史行用于结算和审计，
避免同时跑多条事后筛选的小样本规则。当前主动前瞻实验为原策略 Hold、单次趋势 Shadow C
与预注册循环扩展 C4，分别独立记账；C4 与 C3 高度相关，只能验证重复入场的增量，不能把
两者当作独立证据。概率质量同时保存 raw、corrected 与当时市场中价，结算后比较 Brier；
市场中价是必须击败的基线，不再只看 ROI。

maker 执行研究独立于策略收益口径：公共 WebSocket market channel 采集完整 book、
price_change 与 last_trade_price；虚拟买单以当时最优 bid 和可见同价队列初始化，撤单
不减少 queue ahead，只有 SELL 成交量清空队列和整单或交易穿价才记 full fill。该回放
是可成交概率的保守下界，不计入 Phase 1 P&L；最终仍需真实 user channel 的
`size_matched` 用极小额订单校准，且只能在 Phase 3 门槛通过后进行。

目标日已过去但 Polymarket 尚未 resolve 的仓位仍占用敞口（模拟真实资金锁定），
状态记为 pending resolution；此时只轮询结算，不再请求已经无可用小时的历史预报。

首个天然实验（2026-07-07 上海高温结算）：市场定价接近 CMA（36°C），
我们的欧美系 ensemble 说 ≤3%。谁对，直接决定中国站点的模型权重设计。
