16 KiB
English Financial News — 项目开发计划
国际财经新闻抓取与深度研究平台
对标
news/(A 股 Deep Research),复用其架构模式,聚焦英文财经源。
一、项目定位
构建面向国际财经新闻的私有化 Deep Research 平台。
核心能力:
- 英文财经新闻抓取(Crawl4AI)
- 新闻联播数据接入(api.doorcome.cn)
- 全文英译中(LLM)
- 投资事件抽取(LLM)
- 双语向量知识库(Qdrant)
- MCP 服务 + Cherry Studio / Claude Code Agent 深度研究
- 每日 AI 摘要日报(含新闻联播投资相关解读)
本项目不是:
- 交易系统
- 预测系统
- 投资顾问
二、部署拓扑
┌──────────────────────────────────────────────────────────────┐
│ Overseas Server (国外) │
│ M1 Crawl4AI 抓取 → data/raw/{source}/{YYYYMMDD}/ │
│ ↓ │
│ rsync 增量推送 (定时) │
└──────────────────────────┬───────────────────────────────────┘
│ SSH / rsync
▼
┌──────────────────────────────────────────────────────────────┐
│ Domestic Server (国内) │
│ M2 正文提取 → M3 去重 → M4 翻译+事件抽取(LLM) │
│ → M5 向量生成 → M6 Qdrant 入库 │
│ → M7 定时调度 → M8 MCP 服务 │
│ → 日报生成 (AI 摘要 + 重要事件 + 新闻联播投资解读) │
│ │
│ ┌── 新闻联播数据源 (独立 API) ──┐ │
│ │ GET api.doorcome.cn/api/xwlbFine/ │
│ │ → LLM 筛选投资相关 → 重要性评分 → AI 解读 │
│ └──────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
同步机制:
- 海外服务器每天定时
rsync -avz推送data/raw/到国内 - 国内定时任务先拉取同步,再执行 M2→M8 管道
- rsync 天然增量(只传新文件),带宽高效
三、Milestone 分解
M0 — 项目骨架
pyproject.toml(Python 3.11 + uv).env.exampleconfigs/sources.yaml(英文财经源配置)CLAUDE.md- 目录结构初始化
- CLI 入口:
en-news
M1 — 新闻抓取(海外服务器)
技术选型:Crawl4AI(异步 + Playwright JS 渲染),与 A 股项目一致。
英文财经源(初始 12 个):
| 源 ID | 名称 | 类型 |
|---|---|---|
| reuters | Reuters | 综合财经 |
| cnbc | CNBC | 市场新闻 |
| marketwatch | MarketWatch | 市场数据 |
| ft | Financial Times | 财经深度 |
| yahoo_finance | Yahoo Finance | 综合 |
| investing | Investing.com | 全球市场 |
| seekingalpha | Seeking Alpha | 投资分析 |
| barrons | Barrons | 市场评论 |
| wsj | WSJ | 综合财经 |
| economist | The Economist | 经济分析 |
| forexlive | ForexLive | 外汇新闻 |
| zerohedge | ZeroHedge | 另类财经 |
每个源配置字段:
- id: "reuters"
name: "Reuters"
enabled: true
homepage: "https://www.reuters.com/business/"
article_url_pattern: "/[^/]+/[^/]+/"
js_render: true
max_articles_per_run: 30
产物:data/raw/{source_id}/{YYYYMMDD}/{url_hash}.html + index.jsonl
同步守护进程:
# 海外 crontab:每天 05:00 UTC 推送
0 5 * * * rsync -avz --ignore-existing /app/data/raw/ user@domestic:/app/data/raw/
M2 — 正文提取(国内服务器)
输入:data/raw/{source_id}/{date}/(rsync 同步后)
提取方案:
- 优先使用 Crawl4AI 输出的 Markdown(
{url_hash}.md) - 对未生成 Markdown 的源,用
trafilatura(英文正文提取,类 GNE 但针对英文优化) - 输出标准化
Article模型(title/content/publish_time/author/source_id)
产物:data/processed/{source_id}/{YYYYMMDD}/{url_hash}.json
M3 — 去重
与 A 股项目相同的三层去重:
- URL Hash(精确)
- 内容 Hash(SHA256 前 64 字符)
- SimHash 模糊(汉明距离 ≤ 3,30 天窗口)
产物:data/deduped/{YYYYMMDD}/uniques/{url_hash}.json
M4 — 翻译 + 投资事件抽取(LLM)
单次 LLM 调用完成两件事(节省 token):
Prompt 设计:
输入:英文财经新闻全文
输出 JSON:
{
"translation_zh": "中文全文翻译",
"events": [
{
"event_type": "并购/财报/政策/行业/...",
"stock_codes": ["AAPL", "TSLA"],
"sentiment": "positive/negative/neutral",
"importance": 1-5,
"summary_zh": "事件中文摘要"
}
]
}
LLM Provider:DeepSeek(默认)/ Qwen 备选
产物:data/events/{YYYYMMDD}/{url_hash}.json
{
"title": "Apple Reports Record Q2 Earnings",
"title_zh": "苹果公布创纪录第二季度财报",
"content_en": "...",
"content_zh": "...",
"events": [...]
}
M5 — 向量生成
- Embedding Provider:DashScope
text-embedding-v3(1024 维) - 对中文翻译内容向量化(
content_zh+title_zh+ 事件摘要拼接) - 也可选择英文原文向量化,支持双语检索
产物:data/embeddings/{YYYYMMDD}/{url_hash}.json
M6 — Qdrant 入库与检索
与 A 股项目相同:
- 本地文件模式(默认)或 Docker Server 模式
- Collection:
en_finance_news - Payload:
source_id/title/title_zh/url/publish_time/events/sentiment/importance - Vector:从 M5 产物加载
uv run en-news search "Fed interest rate decision"
M7 — 新闻联播数据源(独立模块)
数据获取:
GET https://api.doorcome.cn/api/xwlbFine/?start_date=YYYY-MM-DD&end_date=YYYY-MM-DD
响应结构:
{
"status": "success",
"data": {
"news": [
{
"news_days": "2026-06-20",
"daily_sub_id": 1,
"news_title": "牢记总书记嘱托 各地在文脉赓序中推动城市高质量发展",
"news_improve": "历史文化是城市的灵魂...(全文约3000字)"
}
]
}
}
每天约 12-15 条新闻,每条含完整文字稿。
处理流程:
- 获取 — 日报生成前拉取昨日新闻联播数据。例如 6/21 早上执行日报 → 拉取 6/20 的新闻联播(前一日 19:00 播出,次日凌晨 API 已就绪)
- 投资相关性筛选(LLM) — 用 DeepSeek 逐条判断是否与投资相关
- 经济数据、产业政策、贸易谈判 → 高相关(importance 4-5)
- 科技创新、区域发展、基建项目 → 中相关(importance 2-3)
- 文化、民生、体育、天气 → 非相关(跳过)
- AI 解读 — 对投资相关条目生成 2-3 句投资视角解读:
- 对哪些行业/板块有影响
- 政策信号含义
- 市场可能的反应
- 纳入日报 — 单独一节展示,区别于英文财经新闻
产物:data/xwlb/{YYYYMMDD}/index.jsonl
{
"news_days": "2026-06-20",
"daily_sub_id": 5,
"news_title": "中欧班列统一品牌十周年",
"is_investment_related": true,
"importance": 4,
"category": "贸易/物流",
"ai_interpretation": "中欧班列十年数据将直接反映一带一路贸易活跃度,利好物流、港口、跨境贸易板块..."
}
M8 — 定时调度
- 国内 crontab 或 APScheduler 守护进程
- 日期规则:T 日早上生成的日报覆盖 T-1 日数据(新闻 + 新闻联播)
- 流程:
06:00 等待海外 rsync 完成(检查哨兵文件) 06:30 M2→M3→M4→M5→M6 全链路(处理 T-1 日英文新闻) 07:00 拉取 T-1 日新闻联播 → LLM 筛选解读 → 日报生成 12:00 增量(只处理当日新增) 18:00 增量 22:00 增量 + 日报
M9 — MCP 服务
暴露 5 个 MCP 工具给 Cherry Studio / Claude Code:
| 工具 | 功能 |
|---|---|
search_en_news |
通用语义检索(中文查询 → 中文翻译向量匹配) |
search_by_company |
按公司名/股票代码检索 |
search_by_sentiment |
按情绪检索+统计 |
search_by_event_type |
按事件类型检索 |
get_daily_report |
获取最新日报 |
四、数据模型
class EnArticle(BaseModel):
source_id: str
url: str
url_hash: str
title: str # 英文原标题
title_zh: str # 中文翻译标题
content_en: str # 英文原文
content_zh: str # 中文全文翻译
author: str
publish_time: datetime
source_name: str
word_count: int
word_count_zh: int
class EnExtractedEvent(BaseModel):
article_url_hash: str
event_type: str # 并购/财报/政策/行业/市场/...
stock_codes: list[str] # 涉及美股代码
sentiment: str # positive/negative/neutral
importance: int # 1-5
summary_zh: str # 中文摘要
summary_en: str # 英文摘要
class XwlbItem(BaseModel):
"""新闻联播条目(经 LLM 筛选和解读)。"""
news_days: str # 播出日期 "2026-06-20"
daily_sub_id: int # 当日序号 (1-15)
news_title: str # 标题
news_improve: str # 完整文字稿
is_investment_related: bool # 是否投资相关
importance: int # 投资重要性 1-5 (非投资为 0)
category: str # 投资类别 (贸易/产业政策/科技/基建/金融/...)
ai_interpretation: str # AI 投资解读 2-3 句
五、日报设计
命令:uv run en-news pipeline --once --report
执行顺序:新闻联播拉取 → LLM 筛选解读 → 日报 HTML 生成
六段式结构:
-
AI 摘要(24h 国际财经 + 昨日新闻联播投资相关,≤500 字,最后一条不截断)
-
重要事件:国际新闻(24h 英文源,importance ≥ 4 逐级回退,最多 20 篇)
-
📺 新闻联播投资解读(昨日播出,投资相关条目 + AI 解读)
- 展示格式:标题 | 投资相关性类别 | 重要度 | AI 解读(2-3 句)
- 非投资相关条目不显示
- 示例:
📺 中欧班列统一品牌十周年 [贸易/物流] ⭐⭐⭐⭐ AI解读: 中欧班列十年数据将直接反映一带一路贸易活跃度。 关注物流、港口、跨境贸易板块。政策利好中国外运、中远海控等。
-
市场情绪分布(利好/利空/中性,24h 国际新闻 + 新闻联播合并统计)
-
数据总览(M1→M6 管道统计 + 各源抓取量 6 列网格 + 重要度分布 + 事件类型分布 + 新闻联播条目数)
-
完整新闻联播条目列表(当天的全部条目,标题+简要,含非投资类,供快速浏览)
六、配置规范
configs/sources.yaml
settings:
concurrency: 5
user_agent: "Mozilla/5.0 ..."
output_root: "data/raw"
sources:
- id: "reuters"
name: "Reuters"
enabled: true
homepage: "https://www.reuters.com/business/"
article_url_pattern: "/[^/]+/[^/]+/"
js_render: false
max_articles_per_run: 30
.env 关键配置
# LLM
LLM_PROVIDER=deepseek
LLM_MODEL=deepseek-v4-flash
DEEPSEEK_API_KEY=sk-xxx
# Embedding
EMBEDDING_PROVIDER=dashscope
DASHSCOPE_API_KEY=sk-xxx
# 新闻联播
XWLB_API_BASE=https://api.doorcome.cn
# Schedule
SCHEDULE_TIMES=06:30,12:00,18:00,22:00
SYNC_WAIT_SEC=300
# Qdrant
QDRANT_COLLECTION=en_finance_news
# Overseas → Domestic
SYNC_HOST=user@domestic-server
SYNC_PORT=22
SYNC_SENTINEL=/tmp/en_news_sync_done
七、目录结构
english-news/
├── crawler/ # M1 新闻抓取(Crawl4AI, 部署海外)
├── extractor/ # M2 英文正文提取(trafilatura)
├── dedup/ # M3 三层去重
├── translator/ # M4a 全文翻译(LLM)
├── llm/ # M4b 投资事件抽取
├── embedding/ # M5 向量生成
├── vectorstore/ # M6 Qdrant 客户端
├── xwlb/ # M7 新闻联播数据源
├── scheduler/ # M8 定时任务
├── mcp_server/ # M9 MCP 服务
├── app/ # CLI 入口(en-news)
├── configs/ # sources.yaml / system config
├── prompts/ # LLM Prompt 模板
├── scripts/ # 部署 & 运维脚本
│ ├── sync_daemon.sh # 海外 rsync 推送脚本
│ └── wait_for_sync.py # 国内等待同步完成
├── tests/ # pytest
├── docs/ # 设计文档
├── data/ # 数据目录(git ignored)
│ ├── raw/ # M1 产物(海外与国内共享)
│ ├── processed/ # M2 产物
│ ├── deduped/ # M3 产物
│ ├── events/ # M4 产物
│ ├── embeddings/ # M5 产物
│ ├── xwlb/ # 新闻联播数据(经 LLM 筛选与解读)
│ ├── qdrant_storage/ # M6 Qdrant 本地存储
│ └── reports/ # 日报 HTML
├── logs/ # 运行日志
├── pyproject.toml
├── CLAUDE.md
└── README.md
八、技术选型对比
| 模块 | A 股项目 | 英文财经项目 | 差异 |
|---|---|---|---|
| 抓取 | Crawl4AI | Crawl4AI | 一致 |
| 正文提取 | GNE | trafilatura | 英文优化 |
| 翻译 | — | LLM (DeepSeek) | 新增 |
| 去重 | 三层 | 三层 | 一致 |
| LLM 事件 | DeepSeek/Qwen | DeepSeek/Qwen | 一致 |
| Embedding | DashScope | DashScope | 一致 |
| 向量库 | Qdrant | Qdrant | 一致 |
| 新闻联播 | — | api.doorcome.cn + LLM 筛选 | 新增 |
| 调度 | APScheduler | APScheduler | 一致 |
| MCP | FastMCP | FastMCP | 一致 |
| CLI | a-share | en-news | 命名区分 |
九、开发优先级(建议顺序)
| 序号 | Milestone | 预估工期 | 依赖 |
|---|---|---|---|
| 1 | M0 项目骨架 | 0.5 天 | — |
| 2 | M1 抓取(海外) | 2 天 | M0 |
| 3 | rsync 同步机制 | 0.5 天 | M1 |
| 4 | M2 正文提取 | 1 天 | 同步就绪 |
| 5 | M3 去重 | 1 天 | M2 |
| 6 | M4 翻译+事件抽取 | 1.5 天 | M3 |
| 7 | M5 向量 + M6 Qdrant | 1 天 | M4 |
| 8 | M7 新闻联播数据源 | 1 天 | — (独立模块) |
| 9 | M8 调度 + 日报 | 1.5 天 | M6, M7 |
| 10 | M9 MCP 服务 | 1 天 | M6 |
| 总计 | ~11 天 |
十、关键风险
| 风险 | 缓解措施 |
|---|---|
| 英文源 JS 渲染复杂 | Crawl4AI 已有 Playwright 支持,优先使用轻量级源 |
| LLM 翻译质量不稳定 | System prompt 约束翻译风格,保留原文备查 |
| rsync 网络不稳定 | 添加重试机制 + 哨兵文件完整性检查 |
| 海外 IP 被封 | 轮换 User-Agent,控制请求频率(≥ 2s/req) |
| DeepSeek API 限流 | 并发控制 + Qwen 备选 provider |
本计划文件:
~/Downloads/cc-projects/english-news-plan.md最后更新:2026-06-20