From 1dfdd1842180c3924b386bd328fa802696381d48 Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Tue, 24 Mar 2026 04:21:23 +0800 Subject: [PATCH] Document TAF signals and expand METAR weather translations --- README.md | 1 + docs/TAF_SIGNAL_ZH.md | 290 ++++++++++++++++++++++++++++---- frontend/lib/dashboard-utils.ts | 10 ++ 3 files changed, 267 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 5f080668..cf5348f2 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,7 @@ docker compose logs -f polyweather | egrep "polymarket wallet activity watcher s - Chinese overview: [README_ZH.md](README_ZH.md) - Chinese API guide: [docs/API_ZH.md](docs/API_ZH.md) +- TAF signal guide (ZH): [docs/TAF_SIGNAL_ZH.md](docs/TAF_SIGNAL_ZH.md) - Commercialization: [docs/COMMERCIALIZATION.md](docs/COMMERCIALIZATION.md) - Open-Core policy: [docs/OPEN_CORE_POLICY.md](docs/OPEN_CORE_POLICY.md) - Supabase setup (ZH): [docs/SUPABASE_SETUP_ZH.md](docs/SUPABASE_SETUP_ZH.md) diff --git a/docs/TAF_SIGNAL_ZH.md b/docs/TAF_SIGNAL_ZH.md index 3c830e12..d9f1f6fd 100644 --- a/docs/TAF_SIGNAL_ZH.md +++ b/docs/TAF_SIGNAL_ZH.md @@ -1,64 +1,286 @@ -# PolyWeather TAF 信号实战指南:从报文解析到多维度联动 (TAF_SIGNAL_ZH) +# PolyWeather TAF 信号说明(TAF_SIGNAL_ZH) -在 PolyWeather 系统中,TAF (机场终端预报) 不仅仅是原始文本的展示,它更是**后端分析引擎 (Analysis Engine)** 与 **前端可视化图表** 深度耦合的核心指标。本文档揭秘 TAF 在本项目中的底层逻辑及其在交易中的实战应用。 +本文档说明 PolyWeather 当前如何把 `TAF`(机场终端预报)接入“今日日内分析”,以及这些信号在交易判断里到底代表什么。 + +本文档只描述**当前实现**,不夸大、不脑补。 --- -## 一、 系统架构层面的 TAF 联动 +## 一、TAF 在项目中的定位 -### 1. 后端解析引擎 (`web/analysis_service.py`) +在 PolyWeather 里,`TAF` 不是主温度模型,也不是结算源。 -项目后端通过 `_build_taf_signal` 函数对原始 TAF 报文执行“特征工程”提取,生成两个核心指标: +它的定位是: -- **压温等级 (suppression_level)**:来源于对 `FEW/SCT/BKN/OVC` 云底高度和 `TSRA/RA/DZ`(降雨/雷暴)关键词的扫描。如果 TAF 在午后峰值窗口预告低云(<4000ft)或降雨,该指标会跳变至 `high`,直接削减预测高点的置信度。 -- **扰动等级 (disruption_level)**:主要由 `TEMPO`(临时波动)、`PROB30/40`(概率触发)和 `BECMG`(转变过程)贡献。数值越高,暗示预测的高温点越不稳定,可能受短时云团遮挡产生剧烈震荡。 +1. **机场侧确认层** + - 用来补充说明机场在峰值窗口附近会不会出现云、雨、雷暴或风向切换。 -### 2. 前端可视化呈现 (`FutureForecastModal.tsx`) +2. **压温 / 扰动风险提示层** + - 用来判断“机场最高温是否可能因为天气扰动被压低”。 -在前端“今日/未来预报弹窗”中,TAF 信号通过以下方式呈现: +3. **走势图时间轴联动层** + - 用来在温度走势图上标出 `FM / TEMPO / BECMG / PROB30/40` 对应的时段。 -- **图表标记 (TAF Markers)**:图表右侧的散点或高亮区域标识了 TAF 中的变天时点(如 `FM` 起点)。当鼠标悬停在时点上,会弹出具体的报文解码。 -- **AI 智库融合信号 (Combined Reading)**:在弹窗顶部的结论区,你会看到诸如“高空+TAF+市场读取倾向于...”的判断。这是系统将 **TAF 压温等级** 与 **Open-Meteo GFS 剖面数据** 交叉验证后的最终交易建议。 +它**不负责**: + +1. 直接提供多模型最高温数值 +2. 替代 `DEB` +3. 替代机场实况 `METAR` +4. 替代官方结算源 --- -## 二、 TAF 关键词与交易动作 +## 二、后端当前怎么解析 TAF -| TAF 关键词 | 项目解析逻辑 (Backend) | 典型交易动作 | -| :--------------- | :----------------------------------------- | :----------------------------------------------------------------------------- | -| **BASE (基准)** | 基准气象场,作为初始预测底色。 | 维持基础仓位,关注中性桶。 | -| **FM (From)** | `valid_match` 触发,标志趋势**强制更新**。 | 若 FM 预告冷切或风向改变,立即对冲高位 Yes 仓位。 | -| **TEMPO (临时)** | 贡献 `disruption_level: high`。 | **多头需谨慎**:即使主趋势在升温,TEMPO 降雨也可能导致 ASOS 实测值瞬间“哑火”。 | -| **PROB40** | 高权重扰动。 | 视同确定性信号,如果包含 `SHRA`(阵雨),则是做空当天“极热桶”的最佳理由。 | -| **BECMG (转变)** | 平滑过渡,通常用于修正结算末期的温度。 | 用于判断退场时点,若 17:00 后 BECMG 显著冷却,说明结算价已定格。 | +后端入口在: + +- [web/analysis_service.py](/E:/web/PolyWeather/web/analysis_service.py) + +核心函数: + +- `_build_taf_signal(...)` + +当前会解析这些时间片: + +1. `BASE` +2. `FM` +3. `TEMPO` +4. `BECMG` +5. `PROB30` +6. `PROB40` +7. `PROB30 TEMPO` +8. `PROB40 TEMPO` + +并且只聚焦于: + +- **峰值窗口前后** + +当前窗口定义是: + +- `peak.first_h - 2h` +- 到 +- `peak.last_h + 1h` + +也就是说,TAF 不是整段报文全量平铺,而是会优先关注**和今天高温兑现最相关的时段**。 --- -## 三、 图表联动实战:如何看懂“联动”? +## 三、当前后端真正产出的核心字段 -### 情况 A:TAF 压温与图表分叉 +### 1. `suppression_level` -如果你在 **Daily Trend Graph (趋势图)** 上看到预测曲线直冲 35°C,但上方的 TAF 信号提示 `suppression_level: high`(高风险压温),这意味着: +表示机场端的**压温风险等级**。 -- 数值模型(Open-Meteo)认为太阳热量足。 -- **但 TAF 预报员认为云/雨会打断升温。** -- **结论**:此时不要在高位买入,大概率实际结算会低于模型预测。 +当前逻辑来自: -### 情况 B:TEMPO 峰值重叠 +1. 降水 / 雷暴关键词 + - `TSRA` + - `TS` + - `VCTS` + - `SHRA` + - `SHSN` + - `SHGS` + - `RA` + - `DZ` + - `SN` -当 TAF 的 `TEMPO` 窗口(如 `07/11`,即当地下午 15:00-19:00)内出现降水信号,且图表显示此时为气温最高点时: +2. 低云底 + - 只对 `BKN / OVC` 生效 + - 如果最低云底 `<= 4000 ft` + - 会把原本 `low` 的压温风险至少抬到 `medium` -- 系统会生成“AI 预警:注意峰值被云雨压低”。 -- **交易建议**:这种情况下,买入“低一档”的温度桶往往比“最高的一档”更具性价比(EV 更高)。 +注意: + +- 不是所有 `FEW / SCT / BKN / OVC` 都会直接把风险打到 `high` +- 当前实现里,**低云主要是把风险从 `low` 抬到 `medium`** +- 真正更容易触发 `high` 的,还是阵雨 / 雷暴类关键词 + +### 2. `disruption_level` + +表示峰值窗口附近的**扰动程度**。 + +当前逻辑: + +1. 这些时间片会至少把扰动抬到 `medium` + - `TEMPO` + - `BECMG` + - `PROB30` + - `PROB40` + - `PROB30 TEMPO` + - `PROB40 TEMPO` + +2. 这些情况会把扰动抬到 `high` + - `PROB30 TEMPO` + - `PROB40 TEMPO` + - 或者该时段本身就出现强降水/雷暴类关键词 + +注意: + +- **`TEMPO` 本身不等于 `high`** +- **`PROB40` 也不等于“确定发生”** --- -## 四、 交易员必备:PolyWeather 报文解析口诀 +## 四、前端怎么展示 -> **看 FM 定趋势,看 TEMPO 抓波动。** -> **压温等级看 High,大单入场要收工。** -> **图表高亮即信号,峰值重叠莫冲动。** +前端主要在: + +- [frontend/components/dashboard/FutureForecastModal.tsx](/E:/web/PolyWeather/frontend/components/dashboard/FutureForecastModal.tsx) +- [frontend/lib/dashboard-utils.ts](/E:/web/PolyWeather/frontend/lib/dashboard-utils.ts) + +当前会通过三种方式展示 TAF: + +### 1. 图表时间轴标记 + +在日内温度走势图上,当前会显示: + +- `TAF 时段 / TAF Timing` + +tooltip 会显示该时段摘要,例如: + +- `基础时段 13:00-19:00 以稳定为主` +- `明确切换 15:00-21:00 以稳定为主` +- `临时波动 14:00-17:00 有云雨扰动` + +### 2. 今日日内结构信号里的 `机场预报` + +会显示类似: + +- `防压温` +- `看云雨` +- `暂稳` + +### 3. 顶部摘要与交易动作 + +系统会把: + +1. 近地面结构 +2. 高空结构 +3. `TAF` +4. `market_signal / edge_percent / bucket crowding` + +合并成更贴近交易的提示,例如: + +- `偏暖侧` +- `偏谨慎` +- `先观察` --- -_PolyWeather 文档中心 - 技术与市场的桥梁_ +## 五、TAF 关键词当前在项目里的真实含义 + +| TAF 关键词 | 当前展示词 | 当前项目含义 | +| :-- | :-- | :-- | +| `BASE` | 基础时段 | 在第一个显式变化组出现前的默认背景天气段 | +| `FM` | 明确切换 | 从某个明确时刻开始,机场预报进入一套新的天气阶段 | +| `TEMPO` | 临时波动 | 一段短时、非整段主导的扰动窗口 | +| `BECMG` | 逐步转变 | 天气在该窗口内逐步过渡,不是立刻硬切 | +| `PROB30/40` | 30% / 40% 风险窗 | 有概率触发的扰动窗口,不等于确定发生 | + +注意: + +- `FM` 不是由 `valid_match` 触发,它是按 `FMddhhmm` 独立解析出来的明确切换段 +- `PROB40` 不是“确定性信号”,仍然只是概率窗口 + +--- + +## 六、怎么理解“机场端压温风险偏高” + +这句话的意思不是: + +- 城区一定更冷 +- 一定会结算更低 + +真正意思是: + +**在机场这个结算相关站点上,峰值窗口附近更容易因为云、阵雨或雷暴,导致最终最高温冲不上去。** + +对于很多按机场报文或机场相关站点结算的市场,这一点很关键。 + +一句话: + +- `TAF` 提示压温高 +- 不代表一定下雨 +- 但代表“机场高温可能被压低”的概率更值得防 + +--- + +## 七、怎么和图表一起看 + +### 情况 A:模型还偏热,但 TAF 给出压温高 + +这表示: + +1. 数值模型仍给出较高高温 +2. 但机场端预报提示云雨/雷暴会打断峰值兑现 + +这种情况下,更适合理解成: + +- **机场侧高温兑现有风险** +- 追更高温区间要谨慎 + +### 情况 B:TAF 没有新增压温,但总判断仍偏降温 + +这表示: + +1. `TAF` 没有提供新的云雨压温利空 +2. 但近地面窗口本身已经在走弱 + +比如: + +- 温度走弱 +- 风场切换 +- 气压回升 +- 露点回落 + +所以: + +- `TAF 无压温` +- **不等于** +- `一定继续升温` + +当前系统已经会在摘要里把这层关系解释清楚。 + +--- + +## 八、当前实现边界 + +这套 `TAF` 逻辑当前是**交易导向的轻量解码**,不是完整航空专业解码器。 + +当前做得到: + +1. 识别主要时间片 +2. 找出峰值窗口附近的扰动 +3. 识别云雨压温和风向切换 +4. 联动图表时间轴 +5. 联动交易动作 + +当前还没有做: + +1. 对全部 TAF 语法做完整航空级严格解释 +2. 对每个时段都做完整的逐字段人工预报学解释 +3. 把 TAF 当成温度主预测模型 + +--- + +## 九、产品口径总结 + +最重要的一句: + +**在 PolyWeather 里,TAF 是“机场侧扰动确认层”,不是主模型,也不是结算源。** + +它最值钱的地方是: + +- 帮你判断峰值窗口附近,机场高温会不会被云雨、雷暴、低云或风向切换打断。 + +对交易来说,更适合把它理解成: + +- “机场这边有没有额外的压温风险” + +而不是: + +- “TAF 直接告诉我今天结算温度是多少” + +--- + +_PolyWeather 文档中心_ diff --git a/frontend/lib/dashboard-utils.ts b/frontend/lib/dashboard-utils.ts index 4c48726e..2037be13 100644 --- a/frontend/lib/dashboard-utils.ts +++ b/frontend/lib/dashboard-utils.ts @@ -10,6 +10,14 @@ const METAR_WX_MAP: Record< string, { en: string; icon: string; zh: string } > = { + VCSH: { en: "Showers nearby", icon: "🌦️", zh: "附近有阵雨" }, + SHRA: { en: "Rain showers", icon: "🌦️", zh: "阵雨" }, + "-SHRA": { en: "Light rain showers", icon: "🌦️", zh: "小阵雨" }, + "+SHRA": { en: "Heavy rain showers", icon: "⛈️", zh: "强阵雨" }, + VCRA: { en: "Rain nearby", icon: "🌧️", zh: "附近有降雨" }, + TSRA: { en: "Thunderstorms with rain", icon: "⛈️", zh: "雷雨" }, + "-TSRA": { en: "Light thunderstorms with rain", icon: "⛈️", zh: "小雷雨" }, + "+TSRA": { en: "Heavy thunderstorms with rain", icon: "⛈️", zh: "强雷雨" }, RA: { en: "Rain", icon: "🌧️", zh: "降雨" }, "-RA": { en: "Light rain", icon: "🌦️", zh: "小雨" }, "+RA": { en: "Heavy rain", icon: "⛈️", zh: "强降雨" }, @@ -18,6 +26,8 @@ const METAR_WX_MAP: Record< "+SN": { en: "Heavy snow", icon: "🌨️", zh: "大雪" }, DZ: { en: "Drizzle", icon: "🌦️", zh: "毛毛雨" }, FG: { en: "Fog", icon: "🌫️", zh: "雾" }, + VCFG: { en: "Fog nearby", icon: "🌫️", zh: "附近有雾" }, + MIFG: { en: "Shallow fog", icon: "🌫️", zh: "浅雾" }, BR: { en: "Mist", icon: "🌫️", zh: "薄雾" }, HZ: { en: "Haze", icon: "🌫️", zh: "霾" }, TS: { en: "Thunderstorm", icon: "⛈️", zh: "雷暴" },