Files
intl_news/english-news-plan.md
T
2026-07-18 16:13:52 +08:00

16 KiB
Raw Blame History

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.tomlPython 3.11 + uv
  • .env.example
  • configs/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 股项目相同的三层去重:

  1. URL Hash(精确)
  2. 内容 HashSHA256 前 64 字符)
  3. 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 ProviderDeepSeek(默认)/ Qwen 备选

产物data/events/{YYYYMMDD}/{url_hash}.json

{
  "title": "Apple Reports Record Q2 Earnings",
  "title_zh": "苹果公布创纪录第二季度财报",
  "content_en": "...",
  "content_zh": "...",
  "events": [...]
}

M5 — 向量生成

  • Embedding ProviderDashScope text-embedding-v31024 维)
  • 对中文翻译内容向量化(content_zh + title_zh + 事件摘要拼接)
  • 也可选择英文原文向量化,支持双语检索

产物data/embeddings/{YYYYMMDD}/{url_hash}.json

M6 — Qdrant 入库与检索

与 A 股项目相同:

  • 本地文件模式(默认)或 Docker Server 模式
  • Collectionen_finance_news
  • Payloadsource_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 条新闻,每条含完整文字稿。

处理流程

  1. 获取 — 日报生成前拉取昨日新闻联播数据。例如 6/21 早上执行日报 → 拉取 6/20 的新闻联播(前一日 19:00 播出,次日凌晨 API 已就绪)
  2. 投资相关性筛选(LLM — 用 DeepSeek 逐条判断是否与投资相关
    • 经济数据、产业政策、贸易谈判 → 高相关importance 4-5
    • 科技创新、区域发展、基建项目 → 中相关importance 2-3
    • 文化、民生、体育、天气 → 非相关(跳过)
  3. AI 解读 — 对投资相关条目生成 2-3 句投资视角解读:
    • 对哪些行业/板块有影响
    • 政策信号含义
    • 市场可能的反应
  4. 纳入日报 — 单独一节展示,区别于英文财经新闻

产物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 生成

六段式结构:

  1. AI 摘要(24h 国际财经 + 昨日新闻联播投资相关,≤500 字,最后一条不截断)

  2. 重要事件:国际新闻24h 英文源,importance ≥ 4 逐级回退,最多 20 篇)

  3. 📺 新闻联播投资解读(昨日播出,投资相关条目 + AI 解读)

    • 展示格式:标题 | 投资相关性类别 | 重要度 | AI 解读(2-3 句)
    • 非投资相关条目不显示
    • 示例:
      📺 中欧班列统一品牌十周年 [贸易/物流] ⭐⭐⭐⭐
      AI解读: 中欧班列十年数据将直接反映一带一路贸易活跃度。
      关注物流、港口、跨境贸易板块。政策利好中国外运、中远海控等。
      
  4. 市场情绪分布(利好/利空/中性,24h 国际新闻 + 新闻联播合并统计)

  5. 数据总览(M1→M6 管道统计 + 各源抓取量 6 列网格 + 重要度分布 + 事件类型分布 + 新闻联播条目数)

  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