YellowBeanie/marketbot

GitHub: YellowBeanie/marketbot

一个基于 Python 标准库构建的 Telegram 金融教学机器人,聚合多源市场与宏观数据生成每日教学简报和波动警报。

Stars: 0 | Forks: 0

# marketbot **一个 Telegram OSINT + 金融机器人,将市场和宏观数据转化为两段消息的教学摘要 —— 仅供教育目的,非财务建议。** [![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENSE) ![dependencies: stdlib only](https://img.shields.io/badge/dependencies-stdlib_only-brightgreen.svg) ![python: 3.11+](https://img.shields.io/badge/python-3.11%2B-blue.svg) 🇬🇧 **英文** 见下文 · 🇫🇷 [法文版](#français) ## 英文 marketbot 汇总市场和地缘政治数据,计算出跨市场解读,并在每个工作日多次发布 **两段消息的教学摘要**,以及 **波动警报**。它的构建初衷是 **教学**:它解释市场*为何*波动,展示每个数字背后的数学原理,并提供外部链接,让 非交易者也能学习这些概念。 ### 功能特性 - **两段消息的摘要** - **消息 1 —— 简报(事实):** 报价、跨市场状态解读、来自经济日历的“关注列表”, 以及 **可点击的新闻源链接**。 - **消息 2 —— “深度解析”(洞察层):** 计算出的带有置信区间的相关性/背离信号、针对上一个交易时段的偏差验证结论、带有教学链接的“今日词汇”表术语,以及 **连续的 FX 感知模拟交易**(5,000 CHF 的虚拟账户,自我评分)。*此消息受控于(`decrypt.enabled`),可以在后台静默运行,同时不断记录其账本数据。* - **先计算后叙述:** 每个数字都在 Python(`stats.py`, `signals.py`, `verify.py`, `levels.py`, `sim.py`)中计算得出;LLM 仅负责叙述,并且 **来源防护机制会拒绝任何捏造的数字**。 - **警报:** 基于阈值的波动警报,采用按比例递增的重新触发机制(在再次发生波动前不会重复警报)。 - **可靠性:** 原子 cron 锁、摘要去重、新鲜度防护(当报价看起来冻结时发出警告),以及 **FX 感知 CHF 换算**,从而反映真实的货币波动。 - **100 % 标准库:** 无需任何 pip 依赖 —— 由 AST 导入防火墙(`tests/test_no_deps.py`)强制执行。SQLite 存储,一切由 `config.json` 驱动。 ### 数据源与功能 marketbot 读取的每个外部数据源,供您逐一探索: | 数据源 | 数据 | 链接 | |--------|------|------| | Yahoo Finance | 报价 + 价格历史(指数、板块、FX、加密货币、大宗商品、利率、VIX) | | | GDELT | 经过滤的地缘政治事件流 | | | alternative.me | 加密货币恐惧与贪婪指数 | | | CoinGecko | BTC/ETH 主导度、加密货币市值变化 | | | CFTC COT | 投机者净持仓(每周) | | | Manifold Markets | 市场隐含的宏观/地缘概率 | | | FRED (St. Louis Fed) | 宏观系列数据 + 经济日历 | | | EIA | 美国石油/天然气库存(WTI/Brent 驱动因素) | | | Telegram Bot API | 消息投递 | | | Anthropic Claude | 摘要叙述(默认后端) | | | Google Gemini | 备用叙述后端 | | ### 学习概念 词汇表将每个“今日词汇”链接到通俗易懂的英文解释: [ATR](https://www.investopedia.com/terms/a/atr.asp) · [Beta](https://www.investopedia.com/terms/b/beta.asp) · [Contango](https://www.investopedia.com/terms/c/contango.asp) · [Correlation](https://www.investopedia.com/terms/c/correlation.asp) · [Credit spread](https://www.investopedia.com/terms/c/creditspread.asp) · [Percentile](https://www.investopedia.com/terms/p/percentile.asp) · [Yield curve](https://www.investopedia.com/terms/y/yieldcurve.asp) ### 架构 ``` cron → run.sh {digest|alert} → cli.main (idempotency LOCK) │ ├─ build_snapshot ──(sources/*)──► _merge ──► derive.compute (intermarket read) │ │ │ │ ▼ ▼ │ store.save_snapshot (SQLite) Snapshot (dataclasses) │ ├─ signals.detect / verify.reconcile ──► render/digest.py (message 1: briefing) │ └──► render/decrypt.py (message 2: insight + simulation) └─ alert : render/alert.py (thresholds + re-step) ──► telegram ``` 每次运行都会获取市场快照,将其存储,计算跨市场解读和信号,渲染 Telegram 消息,并且(对于摘要)可以附加洞察/模拟消息。有关详细的架构和决策,请参阅 [`DESIGN.md`](DESIGN.md)。 **包结构**(`marketbot/`):`cli.py`, `schema.py`, `store.py`, `http.py`, `derive.py`, `stats.py`, `signals.py`, `verify.py`, `levels.py`, `sim.py`, `glossary.py`, `telegram.py`, `llm.py`, `llm_claude.py`, `lock.py`, `breaker.py`, `config.py`; `render/` (`digest`, `decrypt`, `deterministic`, `alert`, `common`); `sources/` (`yahoo`, `shadowbroker`, `news_rss`, `sentiment`, `coingecko`, `cftc_cot`, `manifold`, `fred`, `fred_calendar`, `eia`)。 ### 快速开始 ``` git clone https://github.com/YellowBeanie/marketbot.git && cd marketbot cp config.example.json config.json # then edit; config.json is gitignored ``` **配置** —— `config.json` 定义了 `instruments`(名称/Yahoo 代码/类型)、`sources.*.enabled`、 `thresholds`、`models`(摘要后端)、`telegram.markets_chat`(您的群组 ID)以及 `simulation` 配置块。 **密钥**(保存在代码仓库之外,在您的环境中导出): ``` export TELEGRAM_BOT_TOKEN=... # market bot (digests/alerts) export GEMINI_API_KEY=... # narration fallback export FRED_KEY=... EIA_KEY=... # "full" sources export CLAUDE_CODE_OAUTH_TOKEN=... # optional: durable Claude CLI auth for cron ``` 无需安装任何依赖 —— marketbot 仅使用标准库。 ### 用法 (CLI) ``` python3 run.py ingest # fetch sources -> snapshot -> SQLite (no send) python3 run.py show # print the latest stored snapshot python3 run.py digest # build + send the digest python3 run.py alert # send an alert if the market moved notably python3 run.py prune # weekly maintenance (bounds the DB + VACUUM) ``` Flags:`--no-send`(打印但不发布),`--no-lock`(忽略锁,用于手动运行)。在 生产环境中,一个 `run.sh` 包装脚本会加载密钥,然后调用 `run.py`。 ### 测试 ``` python3 -m unittest discover -s tests # stdlib suite, no network (LLM/sender mocked) ``` 测试套件包含一个 **导入防火墙**(`tests/test_no_deps.py`),如果引入了任何非标准库导入,测试就会失败;还有一个 **泄露防护**(`tests/test_no_private_infra.py`),如果发布的文件中出现了私有基础设施信息,测试就会失败。 ## 法文 marketbot agrège des données de marché et géopolitiques, en tire une **lecture intermarché**, et publie un **digest pédagogique en deux messages** plusieurs fois par jour ouvré, plus des **alertes** de mouvement. Il est conçu pour **expliquer** : *pourquoi* le marché a bougé, avec le calcul derrière chaque chiffre et des liens pour que même un non-trader comprenne les concepts. ### 功能特性 - **Digest en deux messages** - **Message 1 — le briefing (les faits) :** cotations, lecture de régime intermarché, liste « à surveiller » issue du calendrier économique, et **liens cliquables** vers les sources d'actualité. - **Message 2 — le « décryptage » (couche d'analyse) :** signaux de corrélation/divergence calculés avec intervalles de confiance, verdict de **vérification du biais** de la séance précédente, « mot du jour » avec lien pédagogique, et une **simulation de trade suivie, sensible au FX** (compte fictif 5 000 CHF, auto-notée). *Ce message est conditionné (`decrypt.enabled`) et peut tourner en dormance pendant que son historique s'accumule.* - **Calculer puis raconter :** chaque chiffre est calculé en Python (`stats.py`, `signals.py`, `verify.py`, `levels.py`, `sim.py`) ; le LLM ne fait que raconter, et un **garde-fou de provenance rejette tout nombre inventé**. - **Alertes :** seuils par type d'instrument avec **re-step proportionnel** (pas de re-alerte tant que ça n'a pas re-bougé). - **Fiabilité :** verrou cron atomique, dédup des digests, garde-fou de fraîcheur (WARN si les cotations semblent gelées), et **conversion CHF sensible au FX**. - **100 % bibliothèque standard :** aucune dépendance pip — imposé par un pare-feu d'imports (`tests/test_no_deps.py`). Stockage SQLite, tout piloté par `config.json`. ### Sources 与功能特性 Chaque source externe lue par marketbot, pour l'explorer : | Source | Donnée | Lien | |--------|--------|------| | Yahoo Finance | cotations + historique (indices, secteurs, FX, crypto, matières, taux, VIX) | | | GDELT | flux d'événements géopolitiques filtré | | | alternative.me | indice Fear & Greed crypto | | | CoinGecko | dominance BTC/ETH, variation de capitalisation crypto | | | CFTC COT | positionnement net des spéculateurs (hebdo) | | | Manifold Markets | probabilités macro/géo implicites de marché | | | FRED (Fed de St. Louis) | séries macro + calendrier économique | | | EIA | stocks pétrole/gaz US (driver WTI/Brent) | | | API Telegram Bot | envoi des messages | | | Anthropic Claude | narration du digest (backend par défaut) | | | Google Gemini | narration de secours | | ### 学习概念 Le glossaire relie chaque « mot du jour » à une explication claire : [ATR](https://www.investopedia.com/terms/a/atr.asp) · [Bêta](https://www.investopedia.com/terms/b/beta.asp) · [Contango](https://www.investopedia.com/terms/c/contango.asp) · [Corrélation](https://www.investopedia.com/terms/c/correlation.asp) · [Spread de crédit](https://www.investopedia.com/terms/c/creditspread.asp) · [Percentile](https://www.investopedia.com/terms/p/percentile.asp) · [Courbe des taux](https://www.investopedia.com/terms/y/yieldcurve.asp) ### 架构 ``` cron → run.sh {digest|alert} → cli.main (VERROU idempotence) │ ├─ build_snapshot ──(sources/*)──► _merge ──► derive.compute (lecture intermarché) │ │ │ │ ▼ ▼ │ store.save_snapshot (SQLite) Snapshot (dataclasses) │ ├─ signals.detect / verify.reconcile ──► render/digest.py (message 1 : briefing) │ └──► render/decrypt.py (message 2 : analyse + simulation) └─ alert : render/alert.py (seuils + re-step) ──► telegram ``` Chaque exécution récupère un instantané, le stocke, calcule la lecture intermarché et les signaux, rend le(s) message(s) Telegram, et (pour un digest) peut joindre le message d'analyse/simulation. Voir [`DESIGN.md`](DESIGN.md) pour l'architecture détaillée et les décisions. ### 快速入门 ``` git clone https://github.com/YellowBeanie/marketbot.git && cd marketbot cp config.example.json config.json # puis éditer ; config.json est gitignored ``` **Secrets** (hors-repo, exportés dans l'environnement) : `TELEGRAM_BOT_TOKEN`, `GEMINI_API_KEY`, `FRED_KEY`, `EIA_KEY`, et optionnellement `CLAUDE_CODE_OAUTH_TOKEN`. Aucune dépendance à installer — marketbot est 100 % bibliothèque standard. ### 使用 (CLI) ``` python3 run.py ingest # récupère les sources -> snapshot -> SQLite (sans envoi) python3 run.py show # affiche le dernier snapshot stocké python3 run.py digest # construit + envoie le digest python3 run.py alert # envoie une alerte si mouvement notable python3 run.py prune # maintenance hebdo (borne la base + VACUUM) ``` Options : `--no-send` (affiche sans poster), `--no-lock` (ignore le verrou). En prod, `run.sh` charge les secrets puis appelle `run.py`. ### 测试 ``` python3 -m unittest discover -s tests # suite stdlib, sans réseau (LLM/sender mockés) ``` La suite inclut un **pare-feu d'imports** (`tests/test_no_deps.py`) et un **garde-fou anti-fuite** (`tests/test_no_private_infra.py`). ### 贡献与许可 欢迎贡献 —— 请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)(安装、测试、stdlib-only 规则,以及 **DCO 签名**)。参与即表示您接受 [行为准则](CODE_OF_CONDUCT.md)。 请通过 [SECURITY.md](SECURITY.md) 私下报告安全问题。 基于 **AGPL-3.0** 许可 —— 详见 [LICENSE](LICENSE)。版权所有 (C) 2026 YellowBeanie。 *教育 / 教学 —— 非财务建议。*
标签:ESC4, OSINT, Python标准库, Telegram机器人, 宏观经济, 逆向工具, 量化交易, 金融数据分析