Files
PolyWeather/docs/MODEL_STACK_AND_DEB_ZH.md
T
2026-05-28 20:46:35 +08:00

8.4 KiB

模型栈与 DEB 去重规则

本文档记录 PolyWeather 当前开放模型接入、区域覆盖差异,以及 DEB 在新增模型后的计权规则。

最后更新:2026-05-28

1. 接入方式

当前多模型层通过 Open-Meteo model API 接入开放 NWP / AIFS 等预报模型,不直接下载原始 GRIB。

入口:

  • src/data_collection/nws_open_meteo_sources.py
  • WeatherDataCollector.fetch_multi_model(...)

返回结构继续保持向后兼容:

  • multi_model.forecasts
  • multi_model.daily_forecasts
  • multi_model.dates

新增元数据:

  • multi_model.provider
  • multi_model.model_metadata
  • multi_model.model_keys
  • multi_model.attribution

Web API 会把这部分元数据挂到:

  • source_forecasts.open_meteo_multi_model

2. 当前模型清单

显示名 Open-Meteo key 来源 层级 说明
ECMWF ecmwf_ifs025 ECMWF global IFS 全球传统数值模式
ECMWF AIFS ecmwf_aifs025_single ECMWF aifs_global ECMWF AIFS 模型;产品文案保留 AIFS 名称,避免和外部泛神经天气模型混淆
GFS gfs_seamless NOAA global NOAA 全球参考
ICON icon_seamless DWD global DWD ICON 全球基准
ICON-EU icon_eu DWD regional_europe 欧洲区域高分辨率
ICON-D2 icon_d2 DWD short_range_europe 欧洲短时高分辨率
GEM gem_seamless ECCC global 加拿大 GEM seamless
GDPS gem_global ECCC global 加拿大全球模式
RDPS gem_regional ECCC regional_north_america 北美区域模式
HRDPS gem_hrdps_continental ECCC short_range_north_america 北美短时高分辨率
JMA jma_seamless JMA global 日本气象厅全球参考

3. 区域覆盖差异

同一个多模型请求会带上完整模型清单,但 Open-Meteo 只会返回覆盖当前坐标的模型字段。区域模型不覆盖时不会进入下游。

欧洲城市

常见模型:

  • ECMWF
  • ECMWF AIFS
  • GFS
  • ICON
  • ICON-EU
  • ICON-D2
  • GEM / GDPS
  • JMA

欧洲高分辨率重点来自 DWD ICON-EU / ICON-D2。

北美城市

常见模型:

  • ECMWF
  • ECMWF AIFS
  • GFS
  • ICON
  • GEM / GDPS
  • RDPS
  • HRDPS
  • JMA
  • NWS

北美高分辨率重点来自 ECCC RDPS / HRDPS,NWS 继续作为美国城市官方预报参考。

亚洲城市

常见模型:

  • ECMWF
  • ECMWF AIFS
  • GFS
  • ICON
  • GEM / GDPS
  • JMA

通常不会出现:

  • ICON-EU
  • ICON-D2
  • RDPS
  • HRDPS

亚洲城市更依赖本地观测增强层,例如 JMA、AMOS(首尔/釜山)、NMC、HKO、CWA、METAR、TAF。

4. DEB 家族去重

DEB 不直接把所有模型按“每个模型一票”计入。新增区域模型后,如果不去重,会造成同一模型机构重复放大。

处理入口:

  • src/analysis/deb_algorithm.py
  • _collapse_forecasts_for_deb(...)
  • calculate_dynamic_weights(...)

DWD ICON 家族

归并成员:

  • ICON
  • ICON-EU
  • ICON-D2

优先级:

ICON-D2 > ICON-EU > ICON

ECCC GEM 家族

归并成员:

  • GEM
  • GDPS
  • RDPS
  • HRDPS

优先级:

HRDPS > RDPS > GDPS > GEM

独立保留

以下模型路径不合并:

  • ECMWF IFS
  • ECMWF AIFS
  • GFS
  • JMA
  • MGM
  • NWS
  • HKO
  • Open-Meteo

ECMWF IFS 与 ECMWF AIFS 分开保留,因为前者是传统 NWP,后者是 AIFS 模型。

5. DEB 权重流程

当前流程:

raw current_forecasts
  -> 过滤不可用值与排除模型
  -> 按模型家族去重
  -> 历史 MAE 统计
  -> MAE 倒数权重
  -> 输出 raw blended_high
  -> recent signed-bias correction
  -> 输出 production prediction + raw_prediction + version

weights_info 出现 家族去重,表示当前输入模型数量多于 DEB 实际入模数量,系统已先折叠同家族模型。

5.1 DEB hourly consensus

当前图表和峰值窗口优先使用 deb_hourly_consensus.v1

入口:

  • src/analysis/deb_hourly_consensus.py
  • web/analysis_service.py
  • src/analysis/trend_engine.py

处理逻辑:

multi_model hourly curves
  -> 按 DEB 可用模型和家族去重口径选择候选
  -> 使用 DEB 权重生成逐小时 consensus
  -> 输出 deb.hourly_consensus
  -> 图表 DEB Forecast 与 peak-window 逻辑优先读取该路径

关键口径:

  • deb_hourly_consensus.v1 是预测曲线,不是实测曲线。
  • 它只用于日内形状、峰值窗口和 DEB Forecast 展示;视觉预警和“接近峰值”状态必须优先读取实测/跑道/官方站点当前值与今日实测高点。
  • 如果多模型小时路径缺失,系统才回退旧的 hourly_plus_deb_offset

5.2 版本化预测与偏差校正

DEB 原始融合逻辑不推倒重写,calculate_dynamic_weights(...) 仍作为 raw baseline。线上生产入口使用 calculate_deb_prediction(...) 包装 raw baseline,并在有足够历史样本时追加城市级 recent signed-bias correction。

当前版本:

  • deb_v1_raw:原始 DEB,最近模型误差倒数加权后的融合值。
  • deb_v1_recent_bias_corrected:在 raw DEB 上叠加最近已结算样本的有符号偏差校正。偏差使用 shrinkage,样本少时自动收缩,避免单日异常过拟合。

API deb payload 会保留:

  • prediction:当前生产使用值。
  • raw_prediction:未经 recent-bias correction 的原始 DEB。
  • version:生产值对应的 DEB 版本。
  • bias_adjustment / bias_samples:城市级偏差校正幅度与训练样本数。
  • intraday_adjustment:网页 full detail 中额外的日内观测路径修正,仅用于当前日实时展示。

版本化回测命令:

python scripts/backtest_deb_versions.py \
  --output-json data/deb_backtest_latest.json \
  --output-csv data/deb_backtest_latest.csv

本地 data/polyweather.db 于 2026-05-27 的回测样本显示:

版本 样本 MAE RMSE Bias 结算桶命中率
deb_v1_raw 1272 1.626 2.602 -0.633 25.8%
deb_v1_recent_bias_corrected 1272 1.499 2.542 +0.263 31.4%

该结果只证明当前历史样本上的离线表现改善;后续仍需要持续用版本化回测追踪不同城市、季节与结算源下的漂移。

6. 前端展示

网页的模型展示读取:

  • multi_model
  • multi_model_daily
  • source_forecasts.open_meteo_multi_model.model_metadata
  • deb.hourly_consensus

显示分组:

  • 全球基准
  • AIFS 模型
  • 欧洲高分辨率
  • 北美高分辨率

展示字段:

  • 可用模型数量
  • 模型分歧 spread
  • 来源
  • provider
  • model
  • resolution
  • horizon

区域模型不覆盖时不显示空模型。

终端图表默认:

  • 展示“全天”视图,按城市当地日 00:00-23:59 和真实观测时间绘制。
  • 可选“高温”视图,窗口由 deb_hourly_consensus.v1 的峰值区域推导。
  • DEB Forecast 使用橙色预测曲线;实测/跑道/官方站点曲线独立展示,不把 DEB 当成实测。
  • legacy 高斯概率显示为水平温度带和 mu 参考线,不参与时间序列曲线。

6.1 “来源 Open-Meteo”是什么意思

前端中的 来源 - Open-Meteo 表示本次多模型数据通过 Open-Meteo model API 归一化接入。

它不表示:

  • Open-Meteo 是单一数值模型
  • Open-Meteo 生成了所有预报
  • ECMWF / DWD / ECCC / NOAA / JMA 的机构来源被替换

所以模型行仍会分别展示:

  • 机构:例如 ECMWF、DWD、ECCC、NOAA、JMA
  • 接入接口:例如 Open-Meteo
  • 模型 key:例如 ecmwf_ifs025icon_d2gem_hrdps_continental

6.2 模型区间、校准概率、市场参考的关系

当前前端把三层拆开展示:

  • 模型区间与分歧:解释不同模型当前给出的最高温范围和分歧,不直接等于命中概率。
  • 市场参考:只展示市场价格和错价背景,不再作为主判断,也不默认输出 BUY YES / BUY NO。

模型票数只用于解释“哪些模型支持某个档位”,不等于最终概率。最终概率应优先读取 probabilities.engine 对应的校准分布。

7. 测试覆盖

相关测试:

  • tests/test_multi_model_sources.py
  • tests/test_deb_model_family.py
  • tests/test_deb_evaluation_upgrade.py

重点覆盖:

  • Open-Meteo 多模型解析
  • 新模型元数据输出
  • 区域模型缺失时降级
  • DEB 家族去重
  • 历史不足时的去重等权
  • 有历史 MAE 时的去重动态权重
  • DEB raw/corrected 版本化评估、recent-bias correction、JSON/CSV 回测输出