🇭🇰 HKO 最高温度预测模型 v2
香港天文台 · Polymarket 天气合约 · 2026-05-14
1. 系统概述
HKO 最高温度预测器为 Polymarket 的「香港每日最高温度」合约生成实时概率分布。每 10 分钟通过 cron 运行一次,将 22 个独立信号(分为 4 大类)融合为加权集成预测。
🌡️
HKO 观测
(1分钟级)
(1分钟级)
→
🏔️
内陆站
(5个站)
(5个站)
→
🔮
NWP 集成
(6个模型)
(6个模型)
→
🧠
加权
集成
集成
→
📊
概率
分布
分布
→
🤖
LLM
分析
分析
核心设计原则:模型在天气体系转换(冷→热或热→冷)时优先信任基于实时观测的信号(内陆站、当前最高温、温度轨迹),而非基于预报的信号(NWP、ECMWF)。预报信号仅在稳定天气体系下获得更高权重。
| 指标 | 数值 |
|---|---|
| 更新频率 | 每 10 分钟(cron: */10 * * * *) |
| 数据来源 | HKO API(1分钟 JSON)、DuckDB(历史数据)、Open-Meteo(NWP)、Windy(ECMWF可视化) |
| 训练窗口 | 滚动 7 天 |
| 输出 | data/hko/hko_prediction.json → Web API → Polymarket 做市 |
| 回测 MAE(v2) | 0.63°C(7天,2026年5月5-11日) |
2. 架构与数据流
数据流
hko_data_fetcher.py
每 1 分钟拉取 HKO JSON API
→ DuckDB: hko_obs, hko_daily, hko_forecast
每 1 分钟拉取 HKO JSON API
→ DuckDB: hko_obs, hko_daily, hko_forecast
│ 每 10 分钟触发 │
▼
hko_predict.py
数据采集
→
信号计算
(22信号) → 加权集成
(22信号) → 加权集成
体系转换检测
→
概率分布 + 上下界约束
▼
data/hko/hko_prediction.json
▼
Web API(app.py)
/bracket
/live
/nwp-6h
/ecmwf
/backtest
核心脚本
| 文件 | 功能 | 调度 |
|---|---|---|
scripts/hko_data_fetcher.py | 拉取 HKO 观测数据,存入 DuckDB | 每 1 分钟 |
scripts/hko_predict.py | 核心预测引擎(22 信号 + 集成) | 每 10 分钟 |
scripts/hko_backtest_v2.py | 用历史日内数据回测 | 按需运行 |
src/mm/weather_signal.py | 做市商公平价格计算 | 每次扫描 |
src/web/app.py | Flask Web 仪表板 + API | 常驻(gunicorn) |
3. 信号目录(22 个活跃信号)
信号按数据源类型分为四类。每个信号产生一个温度估计值(°C)和一个自适应权重(0–100%)。加权平均即为集成预测值。
3.1 实时观测信号 实时观测
来自 HKO 和内陆站的直接测量数据。这些是最可靠的信号,在体系转换期间获得最高优先级。
| # | 信号 | 公式 | 权重范围 | 说明 |
|---|---|---|---|---|
| 1 | inland(内陆站) |
0.88×avg(内陆峰值) + 3.0 | 10%–49% | 内陆站回归(上水、大埔、石岗、打鼓岭、元朗公园)。领先指标:比天文台早 1-2 小时升温。 |
| 2 | current_max(当前最高) |
hko_max + 时段偏移 | 8%–55% | 硬下界:当天已观测到的最高温 + 预期进一步上升空间。偏移量随时间段递减(早间 +1.5°C,午后 +0°C)。 |
| 3 | temp_declining(温度回落) |
= 下界值 | 0%–22% | 温度回落信号:当前温度低于已观测最高温 ≥0.5°C 时激活,表示峰值已过。 |
| 4 | trajectory(温度轨迹) |
线性外推 + 日内进程 | 4%–14% | 升温速率外推至预期峰值时刻。由内陆站速率校准。受天气文本阻尼约束。 |
| 5 | diurnal_curve(日内曲线) |
EMA 日内曲线峰值 | 3%–8% | 7 天 EMA 逐时温度曲线。基于历史日内模式预测峰值。 |
| 6 | inland_gap_anomaly(内陆差距) |
hko_max + 差距×0.7 | 0%–12% | 内陆-HKO 温差:当内陆站 ≥1.8°C 高于天文台时生成上行信号。区分升温差距与结构性脱钩。 |
| 7 | early_aggressive(早间激进) |
条件触发 | 0%–8% | 早间激进信号:早上 8-10 点内陆站已经很高时激活,预示全天将显著偏热。 |
3.2 数值预报信号 数值预报
来自 Open-Meteo 的多模型数值天气预报(6 模型:ECMWF、GFS、JMA、ICON、GEM、Best Match)。偏差修正 +1.0°C(自适应 EMA)。
| # | 信号 | 公式 | 权重范围 | 说明 |
|---|---|---|---|---|
| 8 | nwp_ensemble(NWP集成) |
mean(各模型最高温) + bias | 2%–18% | 6 模型 NWP 日最高温集成。早间权重 18%(内陆站未升温前),午后降至 2-5%。 |
| 9 | nwp_tomorrow(明日NWP) |
mean(明日各模型最高温) + bias | 2% | 明日 NWP 最高温。用于体系趋势检测(明日 − 今日 > 1.5°C = 看涨加成最高 +0.5°C)。 |
| 10 | ecmwf_raw(ECMWF原始) |
ECMWF 最高温 + bias×0.6 | 1%–3% | ECMWF IFS 0.25° 原始预报。最保守的模型(通常低 1-2°C)。 |
| 11 | ecmwf_trend(ECMWF趋势) |
气候基准 + 趋势分数 | 2%–5% | ECMWF 多快照趋势分析:跟踪预报随时间的演变。预报上升 → 加热信心增强。 |
| 12 | shenzhen(深圳站) |
sz_max − 0.8 | 2%–10% | 深圳 NWP 领先指标。通常比香港高 0.5-1.5°C。 |
| 13 | cloud_cover(云量) |
下界 + wx_impact | 1%–3% | ECMWF 预测云量对最高温的影响。高云量 → 抑制升温。 |
| 14 | forecast_radiation(辐射预报) |
下界 + wx_impact | 1%–2% | 短波辐射预报:低辐射(<300 W/m²)→ 偏凉。 |
| 15 | rain_forecast(降雨预报) |
下界 + wx_impact | 1%–2% | 降雨概率:高降雨概率 → 降温压制。 |
| 16 | cape(对流潜势) |
下界 + wx_impact | 1% | CAPE(对流有效位能):高 CAPE → 雷暴 → 降温。 |
| 17 | forecast_humidity(湿度预报) |
下界 + wx_impact | 1% | 日间湿度预报:高湿度 → 降低加热效率。 |
3.3 天气文本信号 天气文本
基于 NLP 解析 HKO 天气描述文字和警告代码。
| # | 信号 | 公式 | 权重范围 | 说明 |
|---|---|---|---|---|
| 18 | weather_text(天气文本) |
气候基准 + wx_score×0.8 | 1%–3% | NLP 解析预报文字:"酷热"/"天晴" → +0.5-1.5°C,"有雨"/"多云" → -0.5-1.5°C。内陆站热度可覆盖"多云"分类。 |
| 19 | rain_cooling(降雨降温) |
气候基准 − psr_cooling | 1%–3% | PSR(显著降雨概率)降温效应。 |
| 20 | warning(天气警告) |
气候基准 + warning_boost | 2% | 天气警告代码:酷热 → +1-2°C 加成,暴雨/雷暴 → 抑制。 |
| 21 | humidity_potential(湿度潜力) |
下界 + hum_factor | 2% | 当前湿度 → 加热潜力:低湿度 = 温度上升空间更大。 |
| 22 | sunshine(日照指数) |
气候基准 + sunshine×3.0 | 1%–3% | HKO ForecastIcon → 日照指数映射(0=密云,1=晴天)。已映射 50+ 图标代码。 |
3.4 AI 分析信号 AI分析
| # | 信号 | 公式 | 权重范围 | 说明 |
|---|---|---|---|---|
| 23 | llm_reasoning(LLM推理) |
DeepSeek V4 Pro 预测 | 10%–25% | LLM 综合分析:接收全部信号值 + 输入数据,返回温度预测值、置信度和详细推理。缓存 30 分钟。 |
3.5 已禁用信号 已禁用
| 信号 | 禁用原因 | 日期 |
|---|---|---|
forecast(HKO官方预报) |
预报通常滞后 2-3 天,在冷暖体系转换时严重偏离实际。回测:仅 3/7 天 floor 正确,冷锋日(5月5日)拖累预测 +1.9°C。 | 2026-05-14 |
climatology(7日均值) |
7 天简单平均被异常冷/热日严重污染。已由体系感知的 avg_past_max_for_signals 替代。 |
2026-05-12 |
4. 体系转换检测
模型采用双向体系检测系统,处理会污染滚动 7 天均值和偏差修正的天气转换。
4.1 暖恢复(冷→热) 🔥
检测:从冷锋体系恢复到正常/炎热天气。
| 条件 | 阈值 |
|---|---|
| 预报过时/严重低估 | 下界 > 预报最高温 + 1.5°C |
| 或:超过气候正常值 | 下界 > 气候正常值 + 0.5°C |
| 且:内陆站确认 | 内陆最高 > 下界 + 1.0°C |
触发后效果:
- 7 天均值:排除冷锋日(<下界 − 3°C)
- 内陆权重:×1.2(10am前)或 ×1.4(10am–2pm)
- 权重再平衡:观测类信号 ×1.3,预报类信号 ×0.5
4.2 冷恢复(热→冷) ❄️
检测:从炎热体系降温。
| 条件 | 阈值 |
|---|---|
| 昨日显著降温 | 昨日最高 < 7日均 − 2.0°C |
| 今日未回升 | 当前最高 < 昨日最高 + 0.5°C |
触发后效果:
- 7 天均值:排除热异常日(>下界 + 2°C)
- 权重再平衡:预报类信号 ×1.5,内陆信号 ×0.6
4.3 停滞检测
检测 HKO 最高温已 ≥15 分钟未上升。根据内陆站是否确认继续升温来调整权重。
4.4 早间冷偏修正
当日中前内陆站 ≥2.5°C 高于 7 天均值时,内陆权重最高提升至 ×1.6,以补偿被冷日污染的历史数据。
5. 权重调度
权重按时间段自适应——模型识别到信号可靠性在一天中会变化:
| 时段 | 主导信号 | 原理 |
|---|---|---|
| 08:00–10:00 | 内陆(25%)、NWP(18%)、当前最高(12%) | 内陆站刚开始升温。NWP 提供前瞻指引。 |
| 10:00–12:00 | 内陆(35%+)、当前最高(15%) | 内陆快速升温,最强的领先指标。 |
| 12:00–14:00 | 当前最高(20%)、内陆(30%)、轨迹(14%) | 接近峰值。内陆仍领先,天文台在追赶。 |
| 14:00–16:00 | 当前最高(30%)、轨迹(10%) | 接近峰值。梯度压制(非二值锁定)。 |
| 16:00+ | 当前最高(55%)、温度回落(22%) | 峰值大概率已确认。软锁定,其他信号保留 25% 权重。 |
2026-05-14 修订:午后压制从二值锁定(16h 时其他信号×0.15)改为梯度压制(其他×0.25,内陆×0.3)。避免错过傍晚温度尖峰(如 5月8日:29.7→30.3°C)。
6. 加权集成与概率分布
6.1 加权平均
预测值 P = Σ(信号ᵢ × 权重ᵢ) / Σ(权重ᵢ)
其中:
信号ᵢ ∈ {inland, current_max, trajectory, nwp_ensemble, ...}(22个信号)
权重ᵢ ∈ [0, 1](自适应,归一化)
6.2 集成后处理
- 下界约束:
P = max(P, lower_bound)—— 预测值绝不能低于已观测到的最高温 - 上界封顶:仅在回落 ≥0.5°C 确认后或 16:00 后才启用
- NWP 趋势加成:如果明日 NWP 集成明显更高,加 +0.05-0.5°C
- 结算平滑:每 10 分钟周期最多 ±1°C 变化(防止数据毛刺导致的闪崩)
6.3 概率分布
从 predicted_max 用高斯核生成,均值 μ、自适应 σ:
σ = 0.15(基础不确定性)
if confidence == 'HIGH': σ *= 0.7
if confidence == 'LOW': σ *= 1.5
if hour < 10: σ *= 1.3(早晨:更宽)
if hour > 15: σ *= 0.8(傍晚:更窄)
# 温度回落时分布向已观测峰值偏移
if decline_detected:
μ += decline_shift(最大偏移 +0.5°C 朝向已观测峰值)
P(temp) = exp(−0.5 × ((temp − μ) / σ)²) / Σ(exp(...))
6.4 结算计算
Polymarket 使用 HKO 的 floor(最高温) 结算。模型已考虑此规则:
结算预测 = floor(预测最高温)
# 例:预测最高温=29.2 → 结算=29°C
检测到温度回落(当前温度低于峰值 ≥0.5°C)时,基于已观测峰值计算 decline_anchor_settle,防止分布漂离最可能的结算值。
7. API 接口
| 端点 | 方法 | 说明 |
|---|---|---|
/api/weather/hk/live | GET | 实时 HKO 观测(温度、最高温、湿度、风、辐射) |
/api/weather/hk/bracket | GET | 全部温度档位的公平价格 + 市场价格 |
/api/weather/hk/tomorrow | GET | HKO 预报 + Open-Meteo 逐时数据(目标日期) |
/api/weather/hk/nwp-6h | GET | 未来 6 小时 NWP 预报(温度、云量、降雨、风速) |
/api/weather/hk/ecmwf | GET | ECMWF IFS 0.25° 分析:逐时表 + 趋势 + 风场 |
/api/weather/hk/ecmwf/grid | GET | 3×3 周边网格分析 |
/api/weather/hk/llm-predict | POST | LLM 预测接口(DeepSeek V4 Pro) |
/api/weather/hk/backtest | GET | 回测结果(7/14/30 天) |
/api/weather/hk/recalc | GET | 强制重新计算预测并返回最新数据 |
预测 JSON 格式
// GET /api/weather/hk/bracket
{
"predicted_max": 29.2, // 连续预测值 °C
"settlement_pred": 29, // 预期结算值(floor)
"uncertainty": 0.29, // ±°C 不确定性
"lower_bound": 29.2, // 已观测最高温(硬下界)
"confidence": "MEDIUM", // HIGH / MEDIUM / LOW
"prob_distribution": { // 温度 → 概率
"28": 0.00, "29": 0.72, "30": 0.24, "31": 0.01, ...
},
"signals": { // 全部 22 个信号值
"inland": 30.0, "current_max": 30.3, ...
},
"weights": { // 全部 22 个信号权重
"inland": 0.037, "current_max": 0.183, ...
}
}
8. 更新日志
2026-05-14(今日)
- 移除 HKO 官方预报信号(滞后 2-3 天,损害准确度)
- 新增 暖恢复检测(冷→热转换,排除冷锋日)
- 新增 冷恢复检测(热→冷转换,排除热异常日)
- 新增 早间冷偏修正(7日均被冷日污染时提升内陆权重)
- 改进 NWP 多模型:6 模型 × 2 天,早间权重 18%
- 新增 nwp_tomorrow 信号(体系趋势检测)
- 修复 午后梯度压制(原是二值锁定,现为梯度)
- 新增 API:/api/weather/hk/nwp-6h(未来 6h NWP 预报)
- 新增 前端:卫星云图 & ECMWF 选项卡中的 6h 预报面板
2026-05-12
- 提高 HKO 预报权重至 18-22%(后发现有害,5月14日回退)
- 内陆信号权重提升(25-35%)
- 结构性脱钩检测修复(轻微午间回落不再归类为结构性)
- 日内曲线 EMA 预测
2026-05-06
- 关键数据守卫:HKO API 返回不完整数据时跳过预测
- 7天 EMA/气候信号限幅,防止冷日出现 4-6°C 尖峰
2026-05-05
- LLM 推理信号集成(DeepSeek V4 Pro)
- Open-Meteo 逐时预报信号(云量、辐射、降雨、CAPE、湿度)
- ECMWF 多快照趋势分析
- 深圳 NWP 领先指标