🇭🇰 HKO 最高温度预测模型 v2.1
文件: polymarket/scripts/hko_predict.py
输出: polymarket/data/hko/hko_prediction.json
运行: cron 每 10 分钟
文档生成: 2026-04-30 08:31 CST
最后更新: 2026-05-01 17:46 CST(轨迹脉冲阻尼修正)
一、概述
集成 18 个信号 的加权预测系统,预测香港天文台 (HKO) 当日绝对最高温度,输出连续预测值 + 离散概率分布。
关键特性:
二、信号清单
实时信号 (8)
| # | 信号 | 说明 | 早上权重 | 午后权重 |
|---|---|---|---|---|
| 0 | climatology | 过去7天平均 + 趋势 | 8% | 8% |
| 2 | weather_text | HKO 预报文本 NLP(晴/云/雨) | 8% | 8% |
| 3 | rain_cooling | PSR 降雨概率降温效应 | 8% | 8% |
| 4 | warning | WHOT/WRAIN 气象警告 | 0-10% | 0-10% |
| 5 | inland | 内陆站回归(上水/打鼓岭/石岗等) | 15% | 20-15% |
| 6 | trajectory | 日间温度线性外推 + progress_prediction (35/65) | 0% | 14% |
| 6' | trajectory_wx_damp | wx_score < -0.5 时对外推部分阻尼 | - | - |
| 7 | solar | 太阳辐射强度 | 12% | 6% |
| 10 | current_max | 当前已观测最高温(硬下界+1°C) | 8% | 8% |
预报信号 (6)
| # | 信号 | 说明 | 早上权重 | 午后权重 |
|---|---|---|---|---|
| 1 | forecast | HKO 官方预报 + 偏差修正 | 12% | 20% |
| 11 | nwp_ensemble | Open-Meteo 多模型集合 + 偏差修正 | 12% | 12% |
| 12 | shenzhen | 深圳先行站指标 | 10% | 10% |
| 13a | cloud_cover | 日间云量预测 → 温度修正 | 4% | 4% |
| 13b | forecast_radiation | 日间短波辐射预测 → 温度修正 | 3% | 3% |
| 13c | rain_forecast | 小时降雨量预测 → 温度修正 | 3% | 3% |
| 13d | cape | 对流有效位能 (CAPE) | 2.5% | 2.5% |
| 13e | forecast_humidity | 日间湿度预测 → 温度修正 | 2.5% | 2.5% |
衍生信号 (4)
| # | 信号 | 说明 | 早上权重 | 午后权重 |
|---|---|---|---|---|
| 6a | past_peak | 已过历史峰值时间 → 锁定 | 0% | 50% |
| 6b | diurnal_curve | 日内 EMA 峰值预测 | 10% | 10% |
| 6c | cold_front_peak | 冷锋锁定(预报门控) | 0-40% | 0% |
| 6c' | temp_declining | 温度持续下降 → 锁定 | 0-15% | 15-40% |
| 6d | humidity_potential | 湿度驱动升温潜力 | 15% | 6% |
| 6e | warming_accel | 加速升温检测 | 5-12% | 5-12% |
| ~ | early_aggressive | 多信号组合激进预测 | 25-10% | 0% |
| ~ | llm_reasoning | LLM 推理预测 | 20-10% | 15-10% |
三、冷锋检测(2026-04-30 修复)
设计
三层防线,防止正常昼夜温差误判为冷锋:
预报门控 → 温度确认 → 气象验证
第0层:预报门控(强制性)
检测 forecast_weather、local_forecast_desc、local_forecast_general 中是否包含冷锋关键词:
| 类别 | 关键词 |
|---|---|
| ✅ 触发 | cold front, northeast monsoon, temperature fell, temperatures fell, northerly surge, cold surge, cold air mass, cold advection, markedly cooler, significantly cooler, much cooler, temperature(s) will fall/drop |
| ❌ 排除 | cooler(HKO 每天 "Cooler in the morning")、cool air、cooler weather |
额外门控:forecast_max 比昨日实际最高低 ≥ 3°C。
第1层:温度确认
门控通过后,检查 hko_max_midnight - hko_temp ≥ 3.0°C。
旧版门槛 1.5°C → 新版 3.0°C。1.5-3°C 为正常昼夜温差(凌晨峰值→清晨谷值)。
第2层:气象验证
需要 ≥ 2/4 项通过(预报已确认,条件放宽):
1. 温度仍在下降(最近 30 分钟趋势 ≤ -0.2°C)
2. 北风(wind_dir 包含 OFF_SHORE 方向)
3. 气压上升(3h trend > 0.5 hPa)
4. 近 3h 骤降 ≥ 2°C
触发后行为
cold_front_peak 值 = hko_max_midnight(已锁定,不再上升)为什么需要预报门控?
案例: 2026-04-30 08:00,HKO 温度 20.7°C,午夜最高 22.4°C,差 1.7°C。
旧版:直接触发冷锋锁定 22°C @ 98.7%,但 HKO 官方预报 26°C。
新版:预报 "Cooler in the morning" 不匹配冷锋关键词 → 门控未过 → 不触发 → 预测正确升至 ~27°C。
四、内陆站早间修正(2026-04-30 修复)
问题
内陆站回归公式 lead_pred = 0.88 × avg_lead + 3.0 校准于午后数据。早上8点内陆站只记录到夜间温度(~21°C),公式输出 ~22°C,严重低估。
修复
| 时段 | 混合比例 | 权重 |
|---|---|---|
| 8-9 点 | 50% 回归 + 50% 预报 | 15%(原 30%) |
| 9-10 点 | 70% 回归 + 30% 预报 | 15% |
| 10 点后 | 纯回归公式 | 25% → 20% → 15% |
效果:内陆信号从 21.9°C → 24.6°C,不再拖低早间预测。
五、概率分布计算
分布类型
Student-t 分布(非高斯),df 随置信度变化:
| 置信度 | df | 均匀地板 | sigma 乘数 | 说明 |
|---|---|---|---|---|
| HIGH | 15 | 0.2% | 0.5× | 近高斯、集中 |
| MEDIUM | 7 | 0.5% | 0.7× | 中等厚尾 |
| LOW | 5 | 1.0% | 1.0× | 厚尾、分散 |
| 锁定(17时+下降确认) | 20 | 0.1% | 0.15× | 近乎确定 |
确认预测(lower_bound ≥ μ-0.3) | 随置信度 | 减至1/4 | tighten | 已被观测证实 |
历史MAE地板
sigma_effective = max(model_uncertainty, 1.0 × sigma_floor_mult)
历史 MAE ~2.0°C,纯模型不确定性会过度自信。1.0°C 地板确保分布宽度不低于历史表现。
分布中心偏移
当温度下降确认时(temp_decline ≥ 0.3°C),分布中心从 predicted_max 向 settlement + 0.5 偏移:
shift_strength = (1 - rebound_prob) × min(decline / 1.0, 1.0)
rebound_prob = exp(-decline × 1.5 - max(0, hour-13) × 0.3) × 0.5
防止 27.9°C (边缘) + 下降 → 仍给 28°C bin 分配概率的问题。
硬下界消零
t < floor_lb → prob_dist[t] = 0.0
floor_lb = floor(lower_bound),即当日已观测最高温的 floor。已被排除的温度 bin 概率为 0。
六、预测平滑
结算温度钳制
连续两次预测的 settlement_pred 变化 > ±1°C 时,钳制到 ±1°C:
prev_settle=22, new_settle=27 → clamped=23 (Δ=+5 > 1)
防止单一数据点故障导致剧烈摆动。
数据安全阀
hko_temp = None(API 部分故障)→ 跳过预测,不覆盖文件lower_bound,隔日清零hko_data_fetcher.py(cron 每分钟触发 predict)七、信号锚点独立化(2026-04-29)
9 个信号原先以 forecast_max 为锚点,形成 ~35% 的虚假预报一致性。
修复: 非预报信号改用 _clim_base(过去 7 天平均)作为独立锚点:
cloud_cover, forecast_radiation, rain_forecast, cape, forecast_humidity 等均从 _clim_base 出发施加调整lower_bound 钳制bias_correction 归零
八、信号上限裁剪
早起小时(8-10am)轨迹推算和快速升温信号容易被微小数据差分放大。
所有外推信号受多源上限裁剪:
cap = min(forecast_max + 3, inland_max + 1, current_max + 5)
快速升温安全阀
MAX_REALISTIC_RATE = 4.0°C/h(HKO 物理极限)MIN_WINDOW_HOURS = 0.1h(6 分钟最小窗口)九、LLM 推理信号
工作机制
调用 hko_llm_reasoning.py,将实时气象数据 + 预报文本发给 LLM,获取:
predicted_max: 连续最高温预测settlement: 结算温度confidence_pct: 置信度 (0-100)peak_passed: 是否已过峰reasoning: 推理过程key_signal: 核心信号摘要risk_to_higher/lower: 上下行风险缓存策略
hko_llm_cache.json)hko_temp 或 lower_bound 变化 ≥ 0.3°C 时重新推理安全措施
predicted_max),不含结算值(settlement_pred)predicted_max + avg_fc_bias权重
| 时段 | 权重 |
|---|---|
| 8-10 点 | 20% |
| 10-14 点 | 20% |
| 14-16 点 | 15% |
| 16+ 点 | 10%(温度已近锁定,LLM 价值下降) |
十、不确定性量化
数据驱动分量(信号分歧)
spread_unc = min(std(signal_values) × 0.5, 0.8)
信号间标准差越大 → 不确定性越高,上限 0.8°C。
时间驱动分量
| 时段 | time_unc | 说明 |
|---|---|---|
| 早 8-10 点 | 0.45-0.55 | 激进预测时更高 |
| 10-12 点 | 0.40 | |
| 12-14 点 | 0.20 | |
| 14-16 点 | 0.10 | |
| 16-17 点 | 0.06 | |
| 17+ 点 | 0.04 | 基本锁定 |
最终不确定性
uncertainty = min(max(time_unc, spread_unc), 0.6)
下降确认时进一步收紧:
× (1 - 0.4~0.6) → floor 0.08× 0.8 → floor 0.12十一、权重归一化
所有权重归一化到总和 1.0:
total = sum(weights.values())
if total > 0:
for k in weights:
weights[k] = round(weights[k] / total, 3)
冷锋/峰值信号例外
cold_front_peak、past_peak 等信号触发时,可能将其他信号权重乘以抑制因子后重新归一化。
过去峰值信号特殊逻辑
past_peak 权重 50%,并将其余信号(除 current_max, temp_declining, cold_front_peak)清零:
for k in list(weights.keys()):
if k not in ('past_peak', 'current_max', 'temp_declining',
'cold_front_peak', 'llm_reasoning'):
weights[k] = 0.0
十二、输出文件格式
polymarket/data/hko/hko_prediction.json:
{
"timestamp": "2026-04-30 08:11:10",
"date": "2026-04-30",
"hour": 8,
"predicted_max": 27.2,
"settlement_pred": 27,
"uncertainty": 0.6,
"lower_bound": 22.4,
"confidence": "LOW",
"prob_distribution": {
"22": 0.01, "23": 0.015, "24": 0.043,
"25": 0.126, "26": 0.241, "27": 0.269,
"28": 0.174, "29": 0.069, "30": 0.022,
"31": 0.011, "32": 0.01, "33": 0.01
},
"signals": { ... },
"weights": { ... },
"inputs": { ... },
"llm_reasoning": { ... }
}
置信度判定
| uncertainty | confidence |
|---|---|
| ≤ 0.2 | HIGH |
| ≤ 0.4 | MEDIUM |
| > 0.4 | LOW |
十三、运行日志
polymarket/data/hko/hko_prediction_log.jsonl — 每行一条 JSON:
{
"ts": "2026-04-30 08:11:10",
"hour": 8,
"predicted_max": 27.2,
"settlement": 27,
"uncertainty": 0.6,
"lower_bound": 22.4,
"hko_temp": 20.7,
"hko_max": 22.4,
"inland_max": 21.9,
"solar": null,
"forecast": 26,
"rain_prob": 0.1,
"wx_score": -0.6,
"warnings": null
}
十四、修改记录
| 日期 | 变更 | 说明 |
|---|---|---|
| 2026-04-30 | 冷锋检测三层防线 | 预报门控 + 门槛 1.5→3.0°C + 确认放宽 |
| 2026-05-01 | 轨迹脉冲阻尼 | progress_prediction 混合 60/40→35/65, cap 收紧, wx_score 阻尼 |
| 2026-04-30 | 内陆站早间修正 | 8-10点混入50%预报,权重30%→15% |
| 2026-04-29 | Memory Floor | 同日内记忆下限,隔日清零 |
| 2026-04-29 | 信号锚点独立化 | 9个信号脱离 forecast_max 锚定 |
| 2026-04-29 | bias_correction 归零 | 默认 0°C,≥3天历史才激活 |
| 2026-04-29 | 快速升温降级 | skip_ensemble=True → 8-15% 权重 |
| 2026-04-29 | 信号上限裁剪 | 多源上限 min(forecast+3, inland+1, current+5) |
| 2026-04-29 | 预测平滑 | settlement ±1°C 钳制 |
| 2026-04-29 | 相似日限制 | close_matches=空时不降级到 best_match |