MCPcopy Index your code
hub / github.com/DemonDamon/FinnewsHunter

github.com/DemonDamon/FinnewsHunter @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
1,608 symbols 6,189 edges 232 files 1,115 documented · 69%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

FinnewsHunter:金融新闻驱动的多智能体投资决策平台

中文版 | English

FinnewsHunter Logo

基于 AgenticX 框架构建的企业级金融新闻分析系统,融合实时新闻流、深度量化分析和多智能体辩论机制。

FinnewsHunter 不再局限于传统的文本分类,而是部署多智能体战队(NewsAnalyst, Researcher 等),实时监控新浪财经、每经网、金融界、证券时报等多源财经资讯。利用大模型进行深度解读、情感分析与市场影响评估,并结合知识图谱挖掘潜在的投资机会与风险,为量化交易提供决策级别的阿尔法信号。


🎯 项目特色

  • AgenticX 原生: 深度集成 AgenticX 框架,使用 Agent、Tool、Workflow 等核心抽象
  • AgenticX 组件集成: 直接使用 AgenticX 的 BailianEmbeddingProviderMilvusStorage,避免重复造轮子
  • 智能体驱动: NewsAnalyst 智能体自动分析新闻情感和市场影响
  • 多厂商 LLM 支持: 支持百炼、OpenAI、DeepSeek、Kimi、智谱 5 大厂商,前端一键切换
  • 批量操作: 支持批量选择、批量删除、批量分析新闻,提高操作效率
  • 股票 K 线分析: 集成 akshare 真实行情数据,支持日K/分K多周期展示
  • 股票智能搜索: 支持代码和名称模糊查询,预加载 5000+ A股数据
  • 完整技术栈: FastAPI + PostgreSQL + Milvus + Redis + React
  • 实时搜索: 支持标题、内容、股票代码多维度搜索,关键词高亮
  • 异步向量化: 后台异步执行向量化,不阻塞分析流程
  • 生产就绪: Docker Compose 一键部署,日志、监控完备

🏗️ 系统架构

FinnewsHunter Architecture

系统采用分层架构设计: - M6 前端交互层: React + TypeScript + Shadcn UI - M1 平台服务层: FastAPI Gateway + Task Manager - M4/M5 智能体协同层: AgenticX Agent + Debate Workflow - M2/M3 基础设施层: Crawler Service + LLM Service + Embedding - M7-M11 存储与学习层: PostgreSQL + Milvus + Redis + ACE Framework


🚀 快速开始

前置条件

  • Python 3.11+
  • Docker & Docker Compose
  • (可选) OpenAI API Key 或本地 LLM
  • Node.js 18+ (前端开发)

1. 安装 AgenticX

cd /Users/damon/myWork/AgenticX
pip install -e .

2. 安装后端依赖

cd FinnewsHunter/backend
pip install -r requirements.txt

3. 配置环境变量

cd FinnewsHunter/backend
cp env.example .env
# 编辑 .env 文件,填入 LLM API Key 等配置

多厂商 LLM 配置说明:

系统支持 5 个 LLM 厂商,至少配置一个即可使用:

厂商 环境变量 获取地址
百炼(阿里云) DASHSCOPE_API_KEY https://dashscope.console.aliyun.com/
OpenAI OPENAI_API_KEY https://platform.openai.com/api-keys
DeepSeek DEEPSEEK_API_KEY https://platform.deepseek.com/
Kimi(Moonshot) MOONSHOT_API_KEY https://platform.moonshot.cn/
智谱 ZHIPU_API_KEY https://open.bigmodel.cn/

示例配置(推荐百炼):

# 百炼(阿里云)- 推荐,国内访问快
DASHSCOPE_API_KEY=sk-your-dashscope-key
DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
BAILIAN_MODELS=qwen-plus,qwen-max,qwen-turbo

# 可选:其他厂商
OPENAI_API_KEY=sk-your-openai-key
DEEPSEEK_API_KEY=sk-your-deepseek-key

4. 启动服务(推荐:3 条命令)

完整说明见 docs/DEV-START.md

cd FinnewsHunter

# ① 首次准备(换机 / 新 clone 执行一次)
bash scripts/dev-prepare.sh

# ② 每次开发启动(Docker 中间件 + Celery + 本地 API/前端)
bash scripts/dev-up.sh

# ③ 查看状态 / 停止
bash scripts/dev-status.sh
bash scripts/dev-down.sh          # 仅停本地 API/前端(Docker 数据保留)
bash scripts/dev-down.sh --all    # 连同 Docker 容器一起停(数据卷仍保留)
bash scripts/dev-down.sh --purge  # ⚠ 连数据卷一起删除,不可恢复(会二次确认)

数据备份与迁移

# 备份 Postgres + Neo4j(默认不含 Milvus 向量,可重新生成)
bash scripts/dev-backup.sh

# 迁移到新环境:把 .backups/<时间戳>/ 拷过去,然后
bash scripts/dev-prepare.sh && bash scripts/dev-up.sh
bash scripts/dev-restore.sh .backups/<时间戳>

详细的备份策略、数据分层说明见 docs/DEV-START.md

旧版分步启动(不推荐,容易漏 Celery)

4. 启动基础服务(PostgreSQL、Redis、Milvus)

cd FinnewsHunter
docker compose -f deploy/docker-compose.dev.yml up -d postgres redis milvus-etcd milvus-minio milvus-standalone

5. 初始化数据库

cd FinnewsHunter/backend
python init_db.py

5.1 初始化股票数据(可选,用于股票搜索功能)

cd FinnewsHunter/backend
python -m app.scripts.init_stocks
# 将从 akshare 获取全部 A 股数据(约 5000+ 只)并存入数据库

6. 启动后端API服务

cd FinnewsHunter/backend
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

7. 启动Celery Worker和Beat(自动爬取)

# 新开一个终端
cd FinnewsHunter
docker compose -f deploy/docker-compose.dev.yml up -d celery-worker celery-beat

8. 启动前端服务

# 新开一个终端
cd FinnewsHunter/frontend
npm install  # 首次需要安装依赖
npm run dev

9. 访问应用

  • 前端界面: http://localhost:3000
  • 后端 API: http://localhost:8000
  • API 文档: http://localhost:8000/docs

🔄 服务管理

查看所有服务状态

cd FinnewsHunter
docker compose -f deploy/docker-compose.dev.yml ps

重启所有服务

cd FinnewsHunter

# 重启Docker服务(基础设施 + Celery)
docker compose -f deploy/docker-compose.dev.yml restart

# 如果后端API是独立启动的,需要手动重启
# Ctrl+C 停止后端进程,然后重新运行:
cd backend
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

重启特定服务

cd FinnewsHunter

# 只重启Celery(应用代码更改后)
docker compose -f deploy/docker-compose.dev.yml restart celery-worker celery-beat

# 只重启数据库
docker compose -f deploy/docker-compose.dev.yml restart postgres

# 只重启Redis
docker compose -f deploy/docker-compose.dev.yml restart redis

停止所有服务

cd FinnewsHunter
docker compose -f deploy/docker-compose.dev.yml down

查看日志

cd FinnewsHunter

# 查看Celery Worker日志
docker compose -f deploy/docker-compose.dev.yml logs -f celery-worker

# 查看Celery Beat日志(定时任务调度)
docker compose -f deploy/docker-compose.dev.yml logs -f celery-beat

# 查看PostgreSQL日志
docker compose -f deploy/docker-compose.dev.yml logs -f postgres

# 查看所有服务日志
docker compose -f deploy/docker-compose.dev.yml logs -f

🗑️ 重置数据库

方式1:使用一键重置脚本(推荐)⭐

cd FinnewsHunter

# 执行重置脚本
./reset_all_data.sh

# 输入 yes 确认

脚本会自动完成: 1. ✅ 清空PostgreSQL中的所有新闻和任务数据 2. ✅ 清空Redis缓存 3. ✅ 重置数据库自增ID(从1重新开始) 4. ✅ 清空Celery调度文件 5. ✅ 自动重启Celery服务

执行后等待: - 5-10分钟系统会自动重新爬取数据 - 访问前端查看新数据


方式2:手动重置(高级)

步骤1:清空PostgreSQL数据

# 进入PostgreSQL容器
docker exec -it finnews_postgres psql -U finnews -d finnews_db

在PostgreSQL命令行中执行:

-- 清空新闻表
DELETE FROM news;

-- 清空任务表
DELETE FROM crawl_tasks;

-- 清空分析表
DELETE FROM analyses;

-- 重置自增ID
ALTER SEQUENCE news_id_seq RESTART WITH 1;
ALTER SEQUENCE crawl_tasks_id_seq RESTART WITH 1;
ALTER SEQUENCE analyses_id_seq RESTART WITH 1;

-- 验证结果(应该都是0)
SELECT 'news表', COUNT(*) FROM news;
SELECT 'crawl_tasks表', COUNT(*) FROM crawl_tasks;
SELECT 'analyses表', COUNT(*) FROM analyses;

-- 退出
\q

步骤2:清空Redis缓存

cd FinnewsHunter
docker exec finnews_redis redis-cli FLUSHDB

步骤3:清空Celery调度文件

cd FinnewsHunter/backend
rm -f celerybeat-schedule*

步骤4:重启Celery服务

cd FinnewsHunter
docker compose -f deploy/docker-compose.dev.yml restart celery-worker celery-beat

步骤5:验证数据已清空

# 检查新闻数量(应该是0)
docker exec finnews_postgres psql -U finnews -d finnews_db -c "SELECT COUNT(*) FROM news;"

# 检查Redis(应该是0或很小)
docker exec finnews_redis redis-cli DBSIZE

# 查看Celery是否开始爬取
docker compose -f deploy/docker-compose.dev.yml logs -f celery-beat
# 应该看到每分钟触发10个爬取任务

方式3:使用Python脚本重置

cd FinnewsHunter/backend
python reset_database.py
# 输入 yes 确认

方式4:快速手动清理(一行命令)🔥

适用场景: 当重置脚本不工作时,使用此方法最快速

cd FinnewsHunter

# 步骤1:清空数据库表
docker exec finnews_postgres psql -U finnews -d finnews_db -c "DELETE FROM news; DELETE FROM crawl_tasks; DELETE FROM analyses;"

# 步骤2:重置自增ID
docker exec finnews_postgres psql -U finnews -d finnews_db -c "ALTER SEQUENCE news_id_seq RESTART WITH 1; ALTER SEQUENCE crawl_tasks_id_seq RESTART WITH 1; ALTER SEQUENCE analyses_id_seq RESTART WITH 1;"

# 步骤3:清空Redis缓存
docker exec finnews_redis redis-cli FLUSHDB

# 步骤4:清空Celery调度文件
rm -f backend/celerybeat-schedule*

# 步骤5:重启Celery服务
docker compose -f deploy/docker-compose.dev.yml restart celery-worker celery-beat

# 步骤6:验证是否清空(应该显示0)
docker exec finnews_postgres psql -U finnews -d finnews_db -c "SELECT COUNT(*) FROM news;"

执行后立即刷新浏览器: - Mac: Command + Shift + R - Windows: Ctrl + Shift + R


🖥️ 清除前端缓存(重要!)

数据清空后,前端可能仍显示旧数据,这是因为浏览器缓存。

方法1:硬刷新浏览器(推荐)⭐

Mac系统:

按 Command + Shift + R
或 Command + Option + R

Windows/Linux系统:

按 Ctrl + Shift + R
或 Ctrl + F5

方法2:开发者工具清空缓存

  1. F12 打开开发者工具
  2. 右键点击刷新按钮(地址栏旁边)
  3. 选择 "清空缓存并硬性重新加载"

方法3:清除浏览器缓存

  1. Chrome/Edge:
  2. Command + Shift + Delete (Mac) 或 Ctrl + Shift + Delete (Windows)
  3. 勾选"缓存的图片和文件"
  4. 时间范围选择"全部"
  5. 点击"清除数据"

  6. 刷新页面后,再次硬刷新

  7. 确保React Query缓存也被清除

方法4:重启前端开发服务器(最彻底)

# 在前端终端按 Ctrl+C 停止服务
# 然后重新启动
cd FinnewsHunter/frontend
npm run dev

📊 重置后的数据恢复时间线

时间 事件 预期结果
0分钟 执行重置脚本 数据库清空,Redis清空
1分钟 Celery Beat开始调度 10个爬取任务被触发
2-5分钟 第一批新闻保存 数据库开始有数据
5-10分钟 所有源都有数据 前端可看到100+条新闻
30分钟 数据持续增长 500+条新闻
1小时 稳定运行 1000-2000条新闻

注意: - 重置后需要等待5-10分钟才能看到新数据 - 前端必须硬刷新(Command+Shift+R / Ctrl+Shift+R)清除缓存 - 不要频繁重置,会影响系统稳定性

重置后立即硬刷新前端的步骤: 1. 执行重置命令 2. 立即在浏览器按 Command + Shift + R (Mac) 或 Ctrl + Shift + R (Windows) 3. 等待5-10分钟后再次刷新查看新数据


⚠️ 爬虫状态检查

查看哪些源正常工作

cd FinnewsHunter

# 查看各源的新闻数量
docker exec finnews_postgres psql -U finnews -d finnews_db -c "
SELECT source, COUNT(*) as count 
FROM news 
WHERE created_at > NOW() - INTERVAL '1 hour'
GROUP BY source 
ORDER BY count DESC;
"

# 查看最近的爬取任务状态
docker exec finnews_postgres psql -U finnews -d finnews_db -c "
SELECT source, 
       crawled_count, 
       saved_count, 
       status,
       error_message 
FROM crawl_tasks 
WHERE created_at > NOW() - INTERVAL '10 minutes'
ORDER BY created_at DESC 
LIMIT 20;
"

查看爬取错误

cd FinnewsHunter

# 查看ERROR日志
docker compose -f deploy/docker-compose.dev.yml logs celery-worker | grep ERROR

# 查看特定源的问题
docker compose -f deploy/docker-compose.dev.yml logs celery-worker | grep "jwview"

📚 使用指南

自动爬取模式(推荐)⭐

系统已配置10个新闻源的自动爬取:

  1. 🌐 新浪财经
  2. 🐧 腾讯财经
  3. 💰 金融界
  4. 📊 经济观察网
  5. 📈 财经网
  6. 📉 21经济网
  7. 📰 每日经济新闻
  8. 🎯 第一财经
  9. 📧 网易财经
  10. 💎 东方财富

工作方式: - ✅ Celery Beat 每1分钟自动触发所有源的爬取 - ✅ 自动去重(URL级别) - ✅ 智能时间筛选(保留24小时内新闻) - ✅ 股票关键词筛选 - ✅ 无需手动操作

查看爬取进度:

# 查看Celery Beat调度日志
cd FinnewsHunter
docker compose -f deploy/docker-compose.dev.yml logs -f celery-beat

# 查看Celery Worker执行日志
docker compose -f deploy/docker-compose.dev.yml logs -f celery-worker

手动刷新(立即获取最新)

方式 1: 通过前端 1. 访问 http://localhost:3000/news 2. 点击右上角"🔄 立即刷新"按钮 3. 系统会立即触发爬取,约2分钟后数据更新

方式 2: 通过 API

# 强制刷新新浪财经
curl -X POST "http://localhost:8000/api/v1/news/refresh?source=sina"

# 强制刷新所有源(需要逐个调用)
for source in sina tencent jwview eeo caijing jingji21 nbd yicai 163 eastmoney; do
  curl -X POST "http://localhost:8000/api/v1/news/refresh?source=$source"
  sleep 1
done

查看新闻列表

方式 1: 通过前端(推荐) - 访问 http://localhost:3000 - 首页:查看来源统计和最新新闻 - 新闻流:按来源和情感筛选新闻 - 支持批量选择:使用复选框选择多条新闻,支持 Shift 键范围选择 - 批量操作:全选/取消全选、批量删除、批量分析

方式 2: 通过 API

# 获取所有来源的最新新闻(200条)
curl "http://localhost:8000/api/v1/news/latest?limit=200"

# 获取特定来源的新闻
curl "http://localhost:8000/api/v1/news/latest?source=sina&limit=50"

# 按情感筛选(使用旧接口)
curl "http://localhost:8000/api/v1/news/?sentiment=positive&limit=20"

# 获取所有可用的新闻源列表
curl "http://localhost:8000/api/v1/news/sources"

批量操作新闻

前端操作: 1. 批量选择: - 点击新闻卡片左侧的复选框选择单条新闻 - 按住 Shift 键点击可进行范围选择 - 使用顶部工具栏的"全选"按钮选择当前筛选结果的所有新闻 - 切换新闻源或筛选条件时,选择状态会自动清空

  1. 批量删除
  2. 选择多条新闻后,点击顶部工具栏的"批量删除"按钮
  3. 确认删除对话框后,选中的新闻将被删除
  4. 删除后会自动刷新列表

  5. 批量分析

  6. 选择多条新闻后,点击顶部工具栏的"批量分析"按钮
  7. 系统会依次分析选中的新闻,显示进度和结果统计
  8. 分析完成后会显示成功/失败数量

API 操作:

# 批量删除新闻
curl -X POST "http://localhost:8000/api/v1/news/batch/delete" \
  -H "Content-Type: application/json" \
  -d '{"news_ids": [1, 2, 3]}'

# 批量分析新闻
curl -X POST "http://localhost:8000/api/v1/analysis/batch" \
  -H "Content-Type: application/json" \
  -d '{"news_ids": [1, 2, 3], "provider": "bailian", "model": "qwen-plus"}'

分析新闻

方式 1: 通过前端 - 在新闻卡片上点击"✨ 分析"按钮 - 等待3-5秒查看分析结果 - 点击新闻卡片打开详情抽屉,查看完整分析内容

方式 2: 通过 API

# 分析指定ID的新闻(使用默认模型)
curl -X POST http://localhost:8000/api/v1/analysis/news/1

# 分析新闻(指定模型)
curl -X POST http://localhost:8000/api/v1/analysis/news/1 \
  -H "Content-Type: application/json" \
  -d '{"provider": "bailian", "model": "qwen-max"}'

# 查看分析结果
curl http://localhost:8000/api/v1/analysis/1

切换 LLM 模型

前端操作: 1. 点击右上角的模型选择器(显示当前模型名称) 2. 在下拉菜单中选择不同的厂商和模型 3. 选择后自动保存,后续分析将使用新模型

支持的模型: - 🔥 百炼: qwen-plus, qwen-max, qwen-turbo, qwen-long - 🤖 OpenAI: gpt-4, gpt-4-turbo, gpt-3.5-turbo - 🧠 DeepSeek: deepseek-chat, deepseek-coder - 🌙 Kimi: moonshot-v1-8k, moonshot-v1-32k, moonshot-v1-128k - 🔮 智谱: glm-4, glm-4-plus, glm-4-air

API 获取可用模型列表:

curl http://localhost:8000/api/v1/llm/config

搜索新闻

前端操作: 1. 在顶部搜索框输入关键词 2. 支持搜索:标题、内容、股票代码、来源 3. 匹配的关键词会高亮显示 4. 搜索带有 300ms 防抖,输入停止后自动搜索

搜索示例: - 搜索股票代码:600519(贵州茅台) - 搜索关键词:新能源半导体 - 搜索来源:sinaeastmoney


查看新闻详情

前端操作: 1. 点击任意新闻卡片 2. 右侧滑出详情抽屉,展示: - 📰 新闻标题和来源 - 📊 情感评分(利好/利空/中性) - 📈 关联股票代码 - 📝 完整新闻内容 - 🤖 AI 分析结果(Markdown 格式) - 🔗 原文链接 3. 点击"复制分析内容"可复制 Markdown 格式的分析报告


股票 K 线分析

前端操作: 1. 访问 http://localhost:3000/stocks/SH600519(贵州茅台示例) 2. 使用右上角搜索框输入股票代码或名称(如 茅台600519) 3. 选择时间周期:日K、60分、30分、15分、5分、1分 4. 图表支持: - 📈 K 线蜡烛图(OHLC) - 📊 成交量柱状图 - 📉 MA 均线(5/10/30/60日)

API 操作:

# 获取 K 线数据(日线,默认180条)
curl "http://localhost:8000/api/v1/stocks/SH600519/kline?period=daily&limit=180"

# 获取分钟 K 线(60分钟线)
curl "http://localhost:8000/api/v1/stocks/SH600519/kline?period=60m&limit=200"

# 搜索股票
curl "http://localhost:8000/api/v1/stocks/search/realtime?q=茅台&limit=10"

# 查看数据库中的股票数量
curl "http://localhost:8000/api/v1/stocks/count"

按来源筛选查看

前端操作:

  1. 首页(Dashboard)
  2. 查看"新闻来源统计"卡片
  3. 点击任意来源按钮筛选
  4. 显示该来源的新闻数量和列表

  5. 新闻流页面

  6. 顶部有10个来源筛选按钮
  7. 点击切换查看不同来源
  8. 支持来源+情感双重筛选

API操作:

```bash

查看新浪财经的新闻

curl "http://localhost:8000/api/v1/news/latest?source=sina&limit=50"

查看每日经济新闻

curl "http://localhost:8000/api/v1/news/latest?source=nbd&limit=50"

查看所有来源

curl "http://localhos

Extension points exported contracts — how you extend this code

News (Interface)
(no doc)
frontend/src/types/api.ts
Analysis (Interface)
(no doc)
frontend/src/types/api.ts
CrawlTask (Interface)
(no doc)
frontend/src/types/api.ts
TaskStats (Interface)
(no doc)
frontend/src/types/api.ts
CrawlRequest (Interface)
(no doc)
frontend/src/types/api.ts

Core symbols most depended-on inside this repo

get
called by 486
backend/app/core/redis_client.py
info
called by 468
backend/app/financial/providers/base.py
get
called by 117
backend/app/tools/crawler_enhanced.py
cn
called by 62
frontend/src/lib/utils.ts
execute
called by 46
backend/app/alpha_mining/vm/factor_vm.py
execute
called by 42
backend/app/tools/crawler_base.py
get_collection
called by 40
legacy_v1/src/Kite/database.py
sse_event
called by 37
backend/app/api/v1/agents.py

Shape

Method 892
Function 306
Class 259
Interface 79
Route 72

Languages

Python88%
TypeScript12%

Modules by API surface

backend/tests/financial/test_smoke_openbb_provider.py48 symbols
backend/tests/test_alpha_mining/test_smoke_p0.py44 symbols
backend/app/api/v1/agents.py42 symbols
backend/app/api/v1/stocks.py39 symbols
backend/tests/test_smoke_alpha_mining.py37 symbols
backend/app/api/v1/alpha_mining.py37 symbols
backend/tests/test_alpha_mining/test_smoke_p1.py32 symbols
backend/app/tools/crawler_enhanced.py32 symbols
backend/app/services/stock_data_service.py25 symbols
backend/tests/test_alpha_mining/test_integration_p2.py24 symbols
frontend/src/types/api.ts23 symbols
backend/app/agents/data_collector_v2.py22 symbols

Datastores touched

stocknewsDatabase · 1 repos

For agents

$ claude mcp add FinnewsHunter \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact