12 KiB
🌡️ PolyWeather: 实时天气查询与分析机器人
专为预测市场和天气博弈设计的智能天气机器人。通过绕过 CDN 缓存直接从全球气象站获取最新数据,并提供模型共识评分和入场时机信号等通俗易懂的自动趋势分析。
🚀 快速开始
环境要求
- Python 3.11+
- 依赖安装:
pip install -r requirements.txt - 环境变量: 在
.env中设置TELEGRAM_BOT_TOKEN(必需)。可选设置METEOBLUE_API_KEY以激活伦敦高精度预报。
VPS 部署 (推荐)
首次部署:
git clone https://github.com/yangyuan-zhen/PolyWeather.git
cd PolyWeather
pip install -r requirements.txt
cp .env.example .env # 编辑 .env 填入你的 Token 和 API Key
创建一键更新脚本(只需执行一次):
cat > ~/update.sh << 'EOF'
#!/bin/bash
cd ~/PolyWeather
git fetch origin
git reset --hard origin/main
pkill -f run.py
pkill -f bot_listener.py
sleep 1
nohup python3 run.py > bot.log 2>&1 &
echo "✅ 已更新并重启!"
EOF
chmod +x ~/update.sh
日常更新(每次代码推送后):
~/update.sh
一条命令完成:拉取最新代码 → 杀旧进程 → 启动新进程。无需手动处理分支冲突。
本地开发 (Windows)
py -3.11 run.py
本地笔记本不需要安装依赖,只用来编辑代码和 Git 推送。IDE 的 import 报错是因为本地没装依赖,不影响 VPS 运行。
🤖 Telegram 机器人指令
| 指令 | 功能 | 说明 |
|---|---|---|
/city [城市] |
查询城市天气 | 获取详细预报、机场实测与趋势分析 |
/id |
获取 Chat ID | 获取当前 Telegram 聊天 ID |
/help |
帮助 | 显示所有可用指令 |
支持的城市
| 城市 | 缩写/别名 | METAR 机场 | 额外数据源 |
|---|---|---|---|
| 伦敦 London | lon, 伦敦 |
EGLC (City Airport) | Meteoblue |
| 巴黎 Paris | par, 巴黎 |
LFPG (Charles de Gaulle) | — |
| 安卡拉 Ankara | ank, 安卡拉 |
LTAC (Esenboğa) | MGM |
| 纽约 New York | nyc, ny, 纽约 |
KLGA (LaGuardia) | NWS |
| 芝加哥 Chicago | chi, 芝加哥 |
KORD (O'Hare) | NWS |
| 达拉斯 Dallas | dal, 达拉斯 |
KDAL (Love Field) | NWS |
| 迈阿密 Miami | mia, 迈阿密 |
KMIA (International) | NWS |
| 亚特兰大 Atlanta | atl, 亚特兰大 |
KATL (Hartsfield-Jackson) | NWS |
| 西雅图 Seattle | sea, 西雅图 |
KSEA (Sea-Tac) | NWS |
| 多伦多 Toronto | tor, 多伦多 |
CYYZ (Pearson) | — |
| 首尔 Seoul | sel, 首尔 |
RKSI (Incheon) | — |
| 布宜诺斯艾利斯 Buenos Aires | ba, 布宜诺斯艾利斯 |
SAEZ (Ezeiza) | — |
| 惠灵顿 Wellington | wel, 惠灵顿 |
NZWN (Wellington) | — |
使用示例
/city 巴黎
/city london
/city par
✨ 核心功能
1. 🏛️ 多源数据融合
| 数据源 | 数据角色 | 覆盖范围 | 优势 |
|---|---|---|---|
| 多模型 (5 NWP) | 共识评分 | 全球 | ECMWF、GFS、ICON、GEM、JMA — 5 个完全独立的数值预报模型,经 Open-Meteo 统一获取 |
| Open-Meteo | 基础预测 | 全球 | 72h 逐小时温度曲线、日出日落、日照时长、短波辐射 |
| Open-Meteo Ensemble | 不确定性区间 | 全球 | 51 成员集合预报:中位数、P10、P90 散度用于置信度评估 |
| Meteoblue (MB) | 高精度共识 | 仅限伦敦 | 聚合多家模型,对微气候处理极佳 |
| METAR | 结算标准 | 全球机场 | Polymarket 结算参考的绝对真理,实时机场观测 |
| NWS | 官方预测(美) | 仅限美国 | 美国国家气象局高精度预报 |
| MGM | 实测数据(土) | 仅限安卡拉 | 土耳其气象局:气压、云量、体感温度、24h 降水 |
⚠️ 所有 NWP 模型查询使用机场坐标(与 METAR 站点一致),而非市中心。这消除了预报位置与结算位置之间的系统性偏差。
Open-Meteo API 架构关系:三个 API 调用都经过 Open-Meteo 平台,但获取的是不同维度的数据:
Open-Meteo (API 平台)
│
┌─────────────┼─────────────┐
│ │ │
┌──────┴──────┐ │ ┌──────┴──────┐
│ /forecast │ │ │ /forecast │
│ (默认模式) │ │ │ ?models=... │
│ = best_match│ │ │ = 多模型模式 │
└──────┬──────┘ │ └──────┬──────┘
│ │ │
▼ │ ▼
自动选最佳模型 │ 返回每个模型单独结果
(通常 ≈ ECMWF) │ ECMWF / GFS / ICON
→ 逐小时曲线 │ GEM / JMA
→ 日出日落 │ → 共识评分
→ 日照/辐射 │
┌──────┴──────┐
│ /ensemble │
│ 51成员集合 │
└──────┬──────┘
│
▼
中位数 / P10 / P90
→ 不确定性区间
💡 OM 默认预报本质上是 5 个模型中的某一个(自动选择),因此不参与共识评分,避免双重计数。
2. ⚡ 超新鲜数据 (零缓存)
- 动态时间戳:每个 API 请求都附带唯一令牌,强制服务器绕过 CDN 缓存。
- MGM 实时同步:针对土耳其 MGM API 做了专门的 Header 伪装和时区校正。
3. 🎯 多模型共识评分
机器人同时查询 5 个独立 NWP 模型(ECMWF、GFS、ICON、GEM、JMA)来评估预报一致性:
| 等级 | 条件(摄氏/华氏) | 含义 |
|---|---|---|
| 🎯 高共识 | 极差 ≤ 0.8°C / 1.5°F | 5 个模型高度收敛 — 高置信,低风险 |
| ⚖️ 中共识 | 极差 ≤ 1.5°C / 3.0°F | 轻微分歧 — 中等置信 |
| ⚠️ 低共识 | 极差 > 1.5°C / 3.0°F | 模型严重分歧 — 不确定性大,建议观察 |
主要模型:ECMWF IFS(欧洲)、GFS(美国 NOAA)、ICON(德国 DWD)、GEM(加拿大)、JMA(日本)。伦敦额外有 Meteoblue,美国城市额外有 NWS。集合预报中位数不参与评分,避免双重计数。
核心逻辑:当 5 个独立模型在温度区间上高度收敛,而市场定价尚未反映时,这就是典型的结构性定价错误——低风险套利的黄金机会。
4. 📊 集合预报散度(新功能)
从 Open-Meteo 获取 51 成员集合预报,量化预测不确定性:
📊 集合预报:中位数 10.8°C,90% 区间 [9.5°C - 12.1°C],波动幅度 2.6°。
区间窄 = 大气状态明确,预报可信。区间宽 = 大气混沌,风险高。
确定性 vs 集合偏差检测:当 OM 确定性预报超过集合 P90 或低于 P10 时,机器人会发出警告。如果实测数据随后验证了预报,警告会升级为 ✅ 预报验证 消息。
5. ⏰ 入场时机信号(新功能)
综合三个因子打分,给出入场建议:
| 因子 | 分值 |
|---|---|
| 最热已过 | +3 |
| 距峰值 ≤ 2h | +2 |
| 距峰值 ≤ 4h | +1 |
| 模型高共识 | +2 |
| 模型中共识 | +1 |
| 实测 ≈ 预报(差 ≤ 0.5°) | +2 |
| 实测接近预报(差 ≤ 1.5°) | +1 |
| 总分 ≥ | 信号 | 建议 |
|---|---|---|
| 5 | ⏰ 理想 | 不确定性低,适合下注 |
| 3 | ⏰ 较好 | 可以考虑小仓位入场 |
| 2 | ⏰ 谨慎 | 建议继续观察 |
| <2 | ⏰ 不建议 | 不确定性大,等更多数据 |
核心理念:拒绝过早布局,选择接近解析时刻、波动率压缩时晚入场,降低不确定性风险。
6. 🧠 智能趋势分析(通俗语言)
机器人自动生成人类可读的分析洞察:
- 🚨 预报击穿预警:当 METAR 实测最高温超过所有预报时自动警报。
- ⏱️ 峰值时段预测:精确预测当日最高温出现的时间窗口。
- 🌬️ 风向交叉验证:同时对比 METAR 和 MGM 风向数据,差异超 90° 自动告警。
- 🍃 风速分析:标注风速并结合风向判断对温度的影响。
- ☁️ 云层遮挡分析:评估云量对升温潜力的影响(晴天/多云/阴天)。
- 📉 气压分析:低气压意味着暖湿气流过境,有利升温。
- 🌧️ 降雨检测:交叉验证 METAR 天气代码和实际降水量,避免误报。
- 📊 最高温时间追踪:精确显示每日最高温出现的时间(如
最高: 12°C @14:20)。 - ☀️ 天气状况一览:综合 METAR 天气现象 + 云量,生成一目了然的天气图标 + 文字(如
⛅ 晴间多云)。 - 🌤️ 太阳辐射分析:追踪累计短波辐射 vs 全天总量;当云层严重遮挡阳光时发出预警。
- 🌙 暖平流检测:当最高温出现在太阳辐射为零的时段(如凌晨 3 点),自动识别并标注"气温由暖空气推高,而非太阳晒热"。
7. 📊 风险等级
每个城市都有基于机场-市区距离的数据偏差风险档案:
- 🔴 高危:首尔 (48.8km)、芝加哥 (25.3km) — 偏差大
- 🟡 中危:安卡拉 (24.5km)、巴黎 (25.2km)、达拉斯、布宜诺斯艾利斯 — 有系统偏差
- 🟢 低危:伦敦 (12.7km)、惠灵顿 (5.1km) — 数据靠谱
8. 🌅 增强显示
- 日出日落 + 日照时长:
🌅 07:34 | 🌇 18:29 | ☀️ 9.9h - 天气状况一目了然:
✈️ 实测 (METAR): 9°C | ⛅ 晴间多云 | 15:00 - WU 结算预览:显示 Wunderground 四舍五入后的值,方便结算参考。
🏗️ 系统架构
graph TD
User[/Telegram User/] --> Bot[bot_listener.py]
Bot --> Collector[WeatherDataCollector]
subgraph "数据引擎"
Collector --> MM[多模型 API<br/>ECMWF/GFS/ICON/GEM/JMA]
Collector --> OM[Open-Meteo 预报]
Collector --> ENS[Open-Meteo Ensemble]
Collector --> MB[Meteoblue API]
Collector --> NOAA[METAR / NOAA]
Collector --> MGM[MGM 实测数据]
Collector --> NWS[US NWS API]
end
Collector --> Processing[共识评分 & 趋势分析]
Processing --> Bot
Bot --> Response[/附带入场信号的天气快照/]
- 逻辑解耦:
weather_sources.py负责数据获取与解析;bot_listener.py负责分析与渲染。 - 城市配置:
city_risk_profiles.py包含所有 METAR 机场映射和风险评估。 - 多模型共识:5 个独立 NWP 模型(ECMWF、GFS、ICON、GEM、JMA)提供稳健的共识评分。
- 集合预报集成:51 成员集合预报提供 P10/P90 不确定性区间和偏差检测。
- 机场坐标对齐:所有 NWP 查询均使用 METAR 机场坐标,而非市中心。
🎯 博弈策略提示
- 看模型共识:🎯/⚖️/⚠️ 评级让你一眼判断预报是否可靠。高共识 + 市场低定价 = 套利机会。
- 用入场信号:等 ⏰ 理想 或 较好 时机再下注。不确定性高时绝不提前入场。
- 关注集合散度:90% 区间越窄(< 2°),模型置信越高 — 这才是 edge 所在。
- 紧盯峰值窗口:在预测的峰值时段频繁使用
/city刷新。 - 结算优先级:结算永远以 METAR 数据为准,通过 Wunderground 四舍五入到整数。
- 地理风险:重点关注高危城市(如首尔、芝加哥)的偏差警告。
- 太阳辐射线索:如果机器人报告"暖平流驱动" 🌙,说明温度由暖空气推高 — 这种模式经常打破模型预测。
- 风向冲突:METAR 和 MGM 风向相反时,温度波动风险增大。
最后更新: 2026-02-22