2026-04-18 18:00:31 +08:00
|
|
|
|
# 🌦️ WeatherBet — Powered by Hermes Agent
|
2026-03-03 15:32:53 -06:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
> **完全自治的预测市场交易机器人** — 基于 ECMWF 天气预报数据在全链上自动寻找错误定价的 Polymarket 市场进行投注,并借助 **Hermes Agent** 框架实现全自动进化学习。
|
2026-03-03 15:32:53 -06:00
|
|
|
|
|
2026-04-18 17:20:59 +08:00
|
|
|
|
[](https://www.python.org/downloads/)
|
|
|
|
|
|
[](https://polygon.technology/)
|
|
|
|
|
|
[](LICENSE)
|
2026-03-04 00:40:52 -06:00
|
|
|
|
|
|
|
|
|
|
---
|
2026-04-18 18:01:58 +08:00
|
|
|
|

|
2026-03-04 00:40:52 -06:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
## 🤖 为什么选择 Hermes Agent
|
2026-03-04 00:40:52 -06:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
本项目展示了 **Hermes Agent** 框架在自动化交易领域的强大能力:
|
|
|
|
|
|
|
|
|
|
|
|
| Hermes Agent 特性 | 在本项目中的应用 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| **自主学习进化 (Self-Learning)** | 机器人从历史交易中自动调整 Kelly 分数和 EV 阈值参数 |
|
|
|
|
|
|
| **全自动化执行 (Autonomous Execution)** | 60 分钟循环扫描市场 → 计算信号 → 自动下单 → 链上结算,全程无需人工干预 |
|
|
|
|
|
|
| **多消息平台接入 (Multi-Platform Gateway)** | 通过 Telegram 实时推送交易通知,手机随时掌控全局 |
|
|
|
|
|
|
| **长期记忆 (Persistent Memory)** | 交易日志 + 学习模型持久化存储,跨会话保留学习成果 |
|
|
|
|
|
|
| **模型无关 (Model Agnostic)** | 可自由切换任意 LLM 提供者进行决策推理 |
|
|
|
|
|
|
| **工具编排 (Tool Orchestration)** | 整合天气预报 API + 链上 CLOB 交易 + Telegram 通知 |
|
2026-03-04 00:40:52 -06:00
|
|
|
|
|
2026-03-03 15:32:53 -06:00
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
## 🎯 这个项目做什么
|
2026-03-03 15:32:53 -06:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
机器人监控 **6 个美国城市**(纽约、芝加哥、迈阿密、达拉斯、西雅图、亚特兰大)的天气预报,在 **Polymarket 温度预测市场** 中寻找错误定价机会。
|
2026-03-03 15:32:53 -06:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
**核心逻辑:** 当天气预报预测某温度区间的概率与市场隐含概率不一致时 → 计算期望值 (EV) → EV > 阈值则自动投注。
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
## 🧠 核心技术:Gaussian Bucket Model
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
### 第一步 — 从 ECMWF 获取真实概率
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
|
|
|
|
|
```python
|
2026-04-18 17:23:28 +08:00
|
|
|
|
import math
|
|
|
|
|
|
|
|
|
|
|
|
def norm_cdf(x):
|
2026-04-18 18:00:31 +08:00
|
|
|
|
"""标准正态分布累计分布函数"""
|
2026-04-18 17:23:28 +08:00
|
|
|
|
return 0.5 * (1.0 + math.erf(x / math.sqrt(2.0)))
|
|
|
|
|
|
|
|
|
|
|
|
def bucket_prob(forecast_temp, t_low, t_high, sigma=2.0):
|
2026-04-18 17:20:59 +08:00
|
|
|
|
"""
|
2026-04-18 18:00:31 +08:00
|
|
|
|
天气预报给出 72°F ± 2σ
|
|
|
|
|
|
计算实际高温落在 70-75°F 区间的真实概率
|
2026-04-18 17:23:28 +08:00
|
|
|
|
P(t_low ≤ X ≤ t_high) = CDF(z_high) - CDF(z_low)
|
2026-04-18 17:20:59 +08:00
|
|
|
|
"""
|
|
|
|
|
|
z_low = (t_low - forecast_temp) / sigma
|
|
|
|
|
|
z_high = (t_high - forecast_temp) / sigma
|
2026-04-18 17:23:28 +08:00
|
|
|
|
return norm_cdf(z_high) - norm_cdf(z_low)
|
2026-04-18 17:20:59 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
### 第二步 — 计算期望值 (Expected Value)
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
def calc_ev(true_prob, market_price):
|
|
|
|
|
|
"""
|
2026-04-18 18:00:31 +08:00
|
|
|
|
EV = P(赢) × 收益 - P(输) × 损失
|
|
|
|
|
|
EV > 0 表示市场定价偏低 → 买入信号
|
2026-04-18 17:20:59 +08:00
|
|
|
|
"""
|
2026-04-18 18:00:31 +08:00
|
|
|
|
win = true_prob * (1 / market_price - 1)
|
|
|
|
|
|
lose = (1 - true_prob) * 1
|
2026-04-18 17:20:59 +08:00
|
|
|
|
return win - lose
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
**示例:**
|
|
|
|
|
|
- 天气预报:72°F → 70-75°F 区间概率 **75%**
|
|
|
|
|
|
- 市场价格:$0.30(隐含 30% 概率)
|
|
|
|
|
|
- `EV = 0.75 × (1/0.30 - 1) - 0.25 = +1.25` → **强烈买入信号** 📈
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
### 第三步 — Kelly Criterion 最优投注
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
def calc_kelly(p, price):
|
2026-04-18 18:00:31 +08:00
|
|
|
|
"""Kelly % = (bp - q) / b,使用 1/4 Kelly 保守分数"""
|
2026-04-18 17:20:59 +08:00
|
|
|
|
b = 1.0 / price - 1.0
|
|
|
|
|
|
f = (p * b - (1.0 - p)) / b
|
|
|
|
|
|
return round(min(max(f, 0.0) * KELLY_FRAC, 1.0), 4)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
## 🌀 自动进化学习系统
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
这是 Hermes Agent 框架的核心优势之一 — 机器人**从实战中学习,自动调参**:
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
data/learning/
|
2026-04-18 18:00:31 +08:00
|
|
|
|
├── trade_log.json # 所有交易记录:城市、区间、成本、结果、盈亏
|
|
|
|
|
|
└── model.json # 每个城市/区间的学习参数
|
2026-04-18 17:20:59 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
**自适应规则:**
|
|
|
|
|
|
-胜率 < 45% → Kelly 分数 ×0.8,EV 阈值 +10%
|
|
|
|
|
|
-胜率 > 55% + 盈利 > $2 → Kelly 分数 ×1.1,EV 阈值 −5%
|
|
|
|
|
|
-按城市追踪胜率,调整各市场置信度
|
|
|
|
|
|
-初始保守(25% Kelly)→ 随着数据积累自动收敛到最优
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
## 📊 系统架构
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
```
|
|
|
|
|
|
ECMWF 天气预报 API
|
|
|
|
|
|
↓
|
|
|
|
|
|
Hermes Agent(自主决策引擎)
|
|
|
|
|
|
├── 高斯桶模型 → 真实概率
|
|
|
|
|
|
├── calc_ev() → 期望值计算
|
|
|
|
|
|
├── calc_kelly() → 最优投注
|
|
|
|
|
|
└── 自适应学习 → 自动调参
|
|
|
|
|
|
↓
|
|
|
|
|
|
Polymarket CLOB(Polygon 链上执行)
|
|
|
|
|
|
↓
|
|
|
|
|
|
Telegram(实时推送通知)
|
|
|
|
|
|
```
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## ⚙️ 快速开始
|
|
|
|
|
|
|
|
|
|
|
|
### 环境要求
|
2026-04-18 17:20:59 +08:00
|
|
|
|
- Python 3.13+
|
2026-04-18 18:00:31 +08:00
|
|
|
|
- Polygon 钱包 + USDC.e
|
|
|
|
|
|
- Polymarket CLOB 授权
|
|
|
|
|
|
- Polymarket API 凭证
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
### 安装
|
2026-04-18 17:20:59 +08:00
|
|
|
|
```bash
|
2026-04-18 18:00:31 +08:00
|
|
|
|
git clone https://github.com/nicolastinkl/hermes_weatherbot.git
|
|
|
|
|
|
cd hermes_weatherbot
|
2026-04-18 17:20:59 +08:00
|
|
|
|
python3.13 -m venv venv
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
### 配置
|
|
|
|
|
|
创建 `.env`:
|
2026-04-18 17:20:59 +08:00
|
|
|
|
```env
|
|
|
|
|
|
PK=your_polygon_private_key
|
|
|
|
|
|
WALLET=your_polygon_address
|
|
|
|
|
|
SIG_TYPE=0
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
编辑 `config.json`:
|
2026-03-03 15:32:53 -06:00
|
|
|
|
```json
|
|
|
|
|
|
{
|
2026-04-18 17:20:59 +08:00
|
|
|
|
"balance": 0,
|
|
|
|
|
|
"max_bet": 2.0,
|
|
|
|
|
|
"min_ev": 0.10,
|
|
|
|
|
|
"min_volume": 500,
|
2026-03-20 07:13:08 -05:00
|
|
|
|
"scan_interval": 3600,
|
2026-04-18 17:20:59 +08:00
|
|
|
|
"telegram_bot_token": "your_token",
|
|
|
|
|
|
"telegram_chat_id": "your_chat_id"
|
2026-03-03 15:32:53 -06:00
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
### 运行
|
2026-03-04 00:40:52 -06:00
|
|
|
|
```bash
|
2026-04-18 18:00:31 +08:00
|
|
|
|
# 单次扫描
|
2026-04-18 17:20:59 +08:00
|
|
|
|
python bot_v3.py scan
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
# 持续交易循环
|
2026-04-18 17:20:59 +08:00
|
|
|
|
python bot_v3.py run
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
# 查看状态
|
2026-04-18 17:20:59 +08:00
|
|
|
|
python bot_v3.py status
|
2026-03-04 00:40:52 -06:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-03-03 15:32:53 -06:00
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
## 🛡️ 风险管理
|
2026-03-03 15:32:53 -06:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
| 参数 | 值 | 说明 |
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|---|---|---|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
| 最大投注 | $2.00 | 单笔交易上限 |
|
|
|
|
|
|
| Kelly 分数 | 25% | 1/4 Kelly 保守策略 |
|
|
|
|
|
|
| 最低 EV | 10%+ | 只交易正期望值 |
|
|
|
|
|
|
| 最低成交量 | $500 | 避免低流动性市场 |
|
|
|
|
|
|
| 最大价差 | 3% | 避免高滑点 |
|
|
|
|
|
|
| 自适应阈值 | 10-20% | 根据表现自动调整 |
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
## 🔐 交易流程(全自动化)
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
```
|
|
|
|
|
|
1. 拉取 ECMWF 天气预报(D+0 ~ D+3)
|
|
|
|
|
|
2. 查询 Polymarket 温度区间市场
|
|
|
|
|
|
3. Gaussian 模型计算真实概率(σ=2°F)
|
|
|
|
|
|
4. 与市场价格对比 → 计算 EV
|
|
|
|
|
|
5. EV ≥ 自适应阈值 → 计算 Kelly 投注大小
|
|
|
|
|
|
6. Polymarket CLOB 链上下单(Polygon)
|
|
|
|
|
|
7. 记录交易 → 更新学习模型
|
|
|
|
|
|
8. Telegram 实时通知
|
|
|
|
|
|
9. 每 60 分钟循环
|
|
|
|
|
|
```
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
## 💡 技术栈
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
- **框架:** Hermes Agent(自主学习 + 多消息平台)
|
|
|
|
|
|
- **语言:** Python 3.13
|
|
|
|
|
|
- **交易:** [py_clob_client](https://github.com/polymarket/py-clob-client) — Polymarket CLOB
|
|
|
|
|
|
- **天气:** ECMWF OpenMETAR / Open-Meteo API
|
|
|
|
|
|
- **链:** Polygon(Chain ID 137)— USDC.e 稳定币
|
|
|
|
|
|
- **通知:** Telegram Bot API
|
|
|
|
|
|
- **学习:** 纯 Python JSON 持久化(零依赖数据库)
|
2026-04-18 17:20:59 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-18 18:00:31 +08:00
|
|
|
|
## ⚠️ 免责声明
|
|
|
|
|
|
|
|
|
|
|
|
本机器人使用真实资金交易真实市场。过去表现不代表未来结果。风险自担。本项目仅供教育和研究目的。
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
*Built with 🐍 + Hermes Agent on Polygon — Autonomous Weather Prediction Trading.*
|