
基于 AgenticX 框架构建的企业级金融新闻分析系统,融合实时新闻流、深度量化分析和多智能体辩论机制。
FinnewsHunter 不再局限于传统的文本分类,而是部署多智能体战队(NewsAnalyst, Researcher 等),实时监控新浪财经、每经网、金融界、证券时报等多源财经资讯。利用大模型进行深度解读、情感分析与市场影响评估,并结合知识图谱挖掘潜在的投资机会与风险,为量化交易提供决策级别的阿尔法信号。
BailianEmbeddingProvider 和 MilvusStorage,避免重复造轮子
系统采用分层架构设计: - 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
cd /Users/damon/myWork/AgenticX
pip install -e .
cd FinnewsHunter/backend
pip install -r requirements.txt
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
完整说明见 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)
cd FinnewsHunter
docker compose -f deploy/docker-compose.dev.yml up -d postgres redis milvus-etcd milvus-minio milvus-standalone
cd FinnewsHunter/backend
python init_db.py
cd FinnewsHunter/backend
python -m app.scripts.init_stocks
# 将从 akshare 获取全部 A 股数据(约 5000+ 只)并存入数据库
cd FinnewsHunter/backend
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
# 新开一个终端
cd FinnewsHunter
docker compose -f deploy/docker-compose.dev.yml up -d celery-worker celery-beat
# 新开一个终端
cd FinnewsHunter/frontend
npm install # 首次需要安装依赖
npm run dev
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
cd FinnewsHunter
# 执行重置脚本
./reset_all_data.sh
# 输入 yes 确认
脚本会自动完成: 1. ✅ 清空PostgreSQL中的所有新闻和任务数据 2. ✅ 清空Redis缓存 3. ✅ 重置数据库自增ID(从1重新开始) 4. ✅ 清空Celery调度文件 5. ✅ 自动重启Celery服务
执行后等待: - 5-10分钟系统会自动重新爬取数据 - 访问前端查看新数据
# 进入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
cd FinnewsHunter
docker exec finnews_redis redis-cli FLUSHDB
cd FinnewsHunter/backend
rm -f celerybeat-schedule*
cd FinnewsHunter
docker compose -f deploy/docker-compose.dev.yml restart celery-worker celery-beat
# 检查新闻数量(应该是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个爬取任务
cd FinnewsHunter/backend
python reset_database.py
# 输入 yes 确认
适用场景: 当重置脚本不工作时,使用此方法最快速
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
数据清空后,前端可能仍显示旧数据,这是因为浏览器缓存。
Mac系统:
按 Command + Shift + R
或 Command + Option + R
Windows/Linux系统:
按 Ctrl + Shift + R
或 Ctrl + F5
F12 打开开发者工具Command + Shift + Delete (Mac) 或 Ctrl + Shift + Delete (Windows)点击"清除数据"
刷新页面后,再次硬刷新
# 在前端终端按 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个新闻源的自动爬取:
工作方式: - ✅ 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 键点击可进行范围选择 - 使用顶部工具栏的"全选"按钮选择当前筛选结果的所有新闻 - 切换新闻源或筛选条件时,选择状态会自动清空
删除后会自动刷新列表
批量分析:
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
前端操作: 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(贵州茅台)
- 搜索关键词:新能源、半导体
- 搜索来源:sina、eastmoney
前端操作: 1. 点击任意新闻卡片 2. 右侧滑出详情抽屉,展示: - 📰 新闻标题和来源 - 📊 情感评分(利好/利空/中性) - 📈 关联股票代码 - 📝 完整新闻内容 - 🤖 AI 分析结果(Markdown 格式) - 🔗 原文链接 3. 点击"复制分析内容"可复制 Markdown 格式的分析报告
前端操作:
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"
前端操作:
显示该来源的新闻数量和列表
新闻流页面
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
$ claude mcp add FinnewsHunter \
-- python -m otcore.mcp_server <graph>