🇭🇰 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) 当日绝对最高温度,输出连续预测值 + 离散概率分布。


关键特性:

  • Floor 结算规则 → 27.8°C 结算为 27°C
  • Student-t 厚尾分布(非纯高斯)
  • 预测平滑 ±1°C 钳制
  • 硬下界防护(日最高温只增不减)
  • DB 锁重试(最多 3 次,5s 间隔)



  • 二、信号清单


    实时信号 (8)


    #信号说明早上权重午后权重
    0climatology过去7天平均 + 趋势8%8%
    2weather_textHKO 预报文本 NLP(晴/云/雨)8%8%
    3rain_coolingPSR 降雨概率降温效应8%8%
    4warningWHOT/WRAIN 气象警告0-10%0-10%
    5inland内陆站回归(上水/打鼓岭/石岗等)15%20-15%
    6trajectory日间温度线性外推 + progress_prediction (35/65)0%14%
    6'trajectory_wx_dampwx_score < -0.5 时对外推部分阻尼--
    7solar太阳辐射强度12%6%
    10current_max当前已观测最高温(硬下界+1°C)8%8%

    预报信号 (6)


    #信号说明早上权重午后权重
    1forecastHKO 官方预报 + 偏差修正12%20%
    11nwp_ensembleOpen-Meteo 多模型集合 + 偏差修正12%12%
    12shenzhen深圳先行站指标10%10%
    13acloud_cover日间云量预测 → 温度修正4%4%
    13bforecast_radiation日间短波辐射预测 → 温度修正3%3%
    13crain_forecast小时降雨量预测 → 温度修正3%3%
    13dcape对流有效位能 (CAPE)2.5%2.5%
    13eforecast_humidity日间湿度预测 → 温度修正2.5%2.5%

    衍生信号 (4)


    #信号说明早上权重午后权重
    6apast_peak已过历史峰值时间 → 锁定0%50%
    6bdiurnal_curve日内 EMA 峰值预测10%10%
    6ccold_front_peak冷锋锁定(预报门控)0-40%0%
    6c'temp_declining温度持续下降 → 锁定0-15%15-40%
    6dhumidity_potential湿度驱动升温潜力15%6%
    6ewarming_accel加速升温检测5-12%5-12%
    ~early_aggressive多信号组合激进预测25-10%0%
    ~llm_reasoningLLM 推理预测20-10%15-10%



    三、冷锋检测(2026-04-30 修复)


    设计


    三层防线,防止正常昼夜温差误判为冷锋:


    
    预报门控 → 温度确认 → 气象验证
    

    第0层:预报门控(强制性)


    检测 forecast_weatherlocal_forecast_desclocal_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 aircooler 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


    触发后行为


  • 权重: 40% → 65%(随时长增长)
  • 抑制因子: 60% → 90% 乘到其他信号
  • 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 乘数说明
    HIGH150.2%0.5×近高斯、集中
    MEDIUM70.5%0.7×中等厚尾
    LOW51.0%1.0×厚尾、分散
    锁定(17时+下降确认)200.1%0.15×近乎确定
    确认预测(lower_bound ≥ μ-0.3随置信度减至1/4tighten已被观测证实

    历史MAE地板


    sigma_effective = max(model_uncertainty, 1.0 × sigma_floor_mult)


    历史 MAE ~2.0°C,纯模型不确定性会过度自信。1.0°C 地板确保分布宽度不低于历史表现。


    分布中心偏移


    当温度下降确认时(temp_decline ≥ 0.3°C),分布中心从 predicted_maxsettlement + 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_lbprob_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 归零


  • 默认 0°C
  • 仅在 ≥ 3 天历史误差时激活自适应 ±1.5°C 修正



  • 八、信号上限裁剪


    早起小时(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 分钟最小窗口)
  • 权重 8-15%(非过去的 60-90%)



  • 九、LLM 推理信号


    工作机制


    调用 hko_llm_reasoning.py,将实时气象数据 + 预报文本发给 LLM,获取:


  • predicted_max: 连续最高温预测
  • settlement: 结算温度
  • confidence_pct: 置信度 (0-100)
  • peak_passed: 是否已过峰
  • reasoning: 推理过程
  • key_signal: 核心信号摘要
  • risk_to_higher/lower: 上下行风险

  • 缓存策略


  • 缓存 15 分钟(hko_llm_cache.json
  • 只在 hko_templower_bound 变化 ≥ 0.3°C 时重新推理
  • 输入印有生成时间戳,避免 LLM 误判数据新鲜度

  • 安全措施


  • 输入仅含预测中间值(predicted_max),不含结算值(settlement_pred
  • 输出中去除温度数字后重新校验值范围 [15, 36]
  • 脱靶时回退到输入 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)
    

    下降确认时进一步收紧:

  • 强下降 ≥ 0.5°C: × (1 - 0.4~0.6) → floor 0.08
  • 温和下降 ≥ 0.3°C: × 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_peakpast_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": { ... }
    }
    

    置信度判定


    uncertaintyconfidence
    ≤ 0.2HIGH
    ≤ 0.4MEDIUM
    > 0.4LOW



    十三、运行日志


    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-29Memory Floor同日内记忆下限,隔日清零
    2026-04-29信号锚点独立化9个信号脱离 forecast_max 锚定
    2026-04-29bias_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