Document TAF signals and expand METAR weather translations

This commit is contained in:
2569718930@qq.com
2026-03-24 04:21:23 +08:00
parent 67e691ed95
commit 1dfdd18421
3 changed files with 267 additions and 34 deletions
+1
View File
@@ -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)
+256 -34
View File
@@ -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 不是整段报文全量平铺,而是会优先关注**和今天高温兑现最相关的时段**。
---
## 三、 图表联动实战:如何看懂“联动”?
## 三、当前后端真正产出的核心字段
### 情况 ATAF 压温与图表分叉
### 1. `suppression_level`
如果你在 **Daily Trend Graph (趋势图)** 上看到预测曲线直冲 35°C,但上方的 TAF 信号提示 `suppression_level: high`(高风险压温),这意味着:
表示机场端的**压温风险等级**。
- 数值模型(Open-Meteo)认为太阳热量足。
- **但 TAF 预报员认为云/雨会打断升温。**
- **结论**:此时不要在高位买入,大概率实际结算会低于模型预测。
当前逻辑来自:
### 情况 BTEMPO 峰值重叠
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 文档中心_
+10
View File
@@ -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: "雷暴" },