TradingAgents-CN 新闻数据同步功能完全指南:多源采集、情绪分析与存储实践
【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN
新闻数据是金融交易框架感知市场情绪的重要输入。TradingAgents-CN(中文增强版多智能体交易框架)在 v1.4 版本中为 Tushare 与 AKShare 两大数据源加入了完整的新闻同步能力,支持多新闻源采集、智能去重、情绪分析、关键词提取、新闻分类与重要性评估,并将结果统一落库至 MongoDB。阅读本文后,你将掌握tushare_init.py/akshare_init.py的 CLI 同步命令、TushareSyncService等同步服务的 Python API 调用方式,以及新闻数据结构与底层实现原理,可直接在本地仓库中复现整套新闻数据流水线。
功能概述
新闻数据同步功能为 Tushare 和 AKShare 数据源添加了完整的新闻同步能力,支持从多个新闻源获取股票相关新闻,并在此基础上提供情绪分析和关键词提取等文本加工能力。该功能位于 news_data_sync_service.py(多源同步编排)与 news_data_service.py(存储与查询)两层服务中,整体架构可概括为:
- 采集层:Tushare Provider、AKShare Provider、RealtimeNewsAggregator 分别从各自新闻源拉取原始新闻;
- 加工层:同步服务对原始新闻进行标准化、去重、情绪分析、关键词提取、分类与重要性评估;
- 存储层:标准化后的新闻统一写入 MongoDB 的
stock_news集合。
多数据源支持
Tushare 新闻源(9 个)
Tushare 提供 9 个新闻源,在 tushare.py 的get_stock_news方法中以优先级列表形式定义:
| 新闻源标识 | 媒体名称 |
|---|---|
| sina | 新浪财经 |
| eastmoney | 东方财富 |
| 10jqka | 同花顺 |
| wallstreetcn | 华尔街见闻 |
| cls | 财联社 |
| yicai | 第一财经 |
| jinrongjie | 金融界 |
| yuncaijing | 云财经 |
| fenghuang | 凤凰财经 |
从源码实现看,get_stock_news(symbol, limit, hours_back, src)会先计算回溯时间范围(start_time = now - hours_back),随后默认依次尝试前 3 个新闻源(sources_to_try = news_sources[:3]),一旦累计获取的新闻数量达到limit即停止尝试后续源;你也可以通过src参数显式指定单一新闻源。获取结果会按发布时间降序排序并去重后返回。
AKShare 新闻源(2 个)
AKShare 提供 2 个新闻源,实现在 akshare.py 的get_stock_news_sync方法中:
- 东方财富个股新闻(
ak.stock_news_em(symbol=symbol_6)):按 6 位股票代码获取个股新闻,内置 3 次重试与指数退避机制(应对 JSON 解析错误); - CCTV 市场新闻(
ak.news_cctv()):不指定股票代码时获取全市场新闻。
实时新闻聚合(realtime)
除两大 Provider 外,同步服务还支持RealtimeNewsAggregator实时新闻聚合源。在 news_data_sync_service.py 中,未显式指定数据源时默认启用["tushare", "akshare", "realtime"]三路采集,任一来源异常不会影响其他来源继续执行。
智能去重
去重贯穿两个层面:
- 同步服务层:
_deduplicate_news以「标题 + URL」二元组作为去重标识(见 news_data_sync_service.py),在写入前过滤同批次内的重复项,并统计duplicate_skipped数量; - 存储层:
save_news_data使用ReplaceOne(filter, doc, upsert=True)批量写入,过滤条件为「URL + 标题 + 发布时间」三元组(见 news_data_service.py),配合url_title_time_unique唯一索引,从数据库层面保证跨批次、跨数据源的全局去重。
这意味着同一则新闻即使被 Tushare 与 AKShare 同时抓取,也只会保留一条记录,覆盖更新而非重复插入。
情绪分析
每条新闻都会被自动打上情绪标签并计算情绪分数:
- 情绪类型:
positive(积极)/negative(消极)/neutral(中性),通过积极、消极财经关键词计数对比得出(见 news_data_sync_service.py)。积极词如「增长、上涨、利好、盈利、突破、创新」,消极词如「下跌、亏损、风险、下滑、警告」; - 情绪分数:范围 -1.0(极度消极)到 1.0(极度积极),分数解读区间为:0.5~1.0 强烈积极(重大利好)、0.2~0.5 积极(一般利好)、-0.2~0.2 中性、-0.5~-0.2 消极(一般利空)、-1.0~-0.5 强烈消极(重大利空)。
分数采用加权计算,不同关键词权重不同,例如涨停(1.0)、跌停(-1.0)、暴涨(0.9)、大跌(-0.8)、利好(0.6)、上涨(0.5)等,详见 新闻情绪分析功能说明。注意:情绪分析基于关键词规则实现,属于启发式判断,官方文档明确提示其结果仅供参考。
关键词提取
系统自动从标题与正文中提取财经相关关键词,支持股票、公司、市场、政策等多类关键词,最多返回 10 个。实现为关键词表匹配(common_keywords列表,如业绩、年报、增长、利润、营收、股价、投资、市场、行业、政策、监管、风险等),见 news_data_sync_service.py。
新闻分类
自动将新闻归类到 6 种类别之一,分类依据标题关键词(见 news_data_sync_service.py):
| 类别 | 触发关键词示例 |
|---|---|
| company_announcement(公司公告) | 年报、季报、业绩、财报、公告 |
| policy_news(政策新闻) | 政策、央行、监管、法规 |
| market_news(市场新闻) | 市场、行情、指数、板块 |
| research_report(研究报告) | 研报、分析、评级、推荐 |
| industry_news(行业新闻) | 行业相关(其余分支) |
| general(一般新闻) | 未命中以上关键词 |
重要性评估
按标题关键词将新闻分为三个级别(见 news_data_sync_service.py):
- high(高):命中「重大、紧急、突发、年报、业绩、重组、收购」等词;
- medium(中):命中「公告、通知、变更、调整、计划」等词;
- low(低):未命中上述关键词。
数据结构
新闻数据模型
标准化后的新闻文档结构如下(字段含义与取值范围见注释):
{ // 股票信息 "symbol": "000001", // 股票代码 "full_symbol": "000001.SZ", // 完整代码(含交易所后缀) "market": "CN", // 市场 "symbols": ["000001"], // 相关股票列表 // 新闻内容 "title": "新闻标题", "content": "新闻正文内容", "summary": "新闻摘要", "url": "https://...", // 新闻链接 "source": "sina", // 新闻来源 "author": "作者名", // 时间信息 "publish_time": "2025-09-30 12:00:00", // 发布时间 // 分类和标签 "category": "general", // 分类 "sentiment": "neutral", // 情绪 (positive/negative/neutral) "sentiment_score": 0.0, // 情绪分数 (-1.0 到 1.0) "keywords": ["关键词1", "关键词2"], // 关键词(最多10个) "importance": "medium", // 重要性 (high/medium/low) "language": "zh-CN", // 语言 // 元数据 "data_source": "tushare", // 数据源 "created_at": "2025-09-30 12:00:00", "updated_at": "2025-09-30 12:00:00", "version": 1 }存储层实际落库时,_standardize_news_data(见 news_data_service.py)还会补充full_symbol字段的推导逻辑:A 股市场(CN)下,6 位代码以60/68开头映射为.SH,以00/30开头映射为.SZ;symbols数组为空时会自动将主symbol放入;publish_time支持%Y-%m-%d %H:%M:%S、ISO 格式等多种输入解析。
数据库集合与索引
新闻数据统一存储在 MongoDB 的stock_news集合中。save_news_data首次调用时会自动创建 10 个索引(见 news_data_service.py),核心索引包括:
url_title_time_unique:URL+标题+发布时间唯一索引,防止重复新闻;symbol_index/symbols_index:按股票代码查询;publish_time_desc:按时间范围查询;symbol_time_index:股票代码+发布时间复合索引(常用查询);data_source_index、category_index、sentiment_index、importance_index:多维筛选;updated_at_index:数据维护。
CLI 命令使用
Tushare 数据源
CLI 入口为 cli/tushare_init.py,--sync-items参数支持的可选值为basic_info,historical,weekly,monthly,financial,quotes,news。
# 1. 仅同步新闻数据(默认回溯24小时,同步所有股票) python cli/tushare_init.py --full --sync-items news # 2. 同步新闻和其他数据 python cli/tushare_init.py --full --sync-items basic_info,news python cli/tushare_init.py --full --sync-items historical,financial,news # 3. 完整初始化(包含新闻在内的所有数据类型) python cli/tushare_init.py --full --sync-items basic_info,historical,financial,quotes,newsCLI 会对--sync-items的值做合法性校验,非法项会直接报错并提示有效选项(见 tushare_init.py)。其他常用参数包括--historical-days(历史数据天数,默认 365)、--batch-size(批处理大小,默认 100)、--force(强制覆盖已有数据)、--check-only(仅检查数据库状态,会输出新闻数据量统计)。
AKShare 数据源
CLI 入口为 cli/akshare_init.py,用法与 Tushare 一致:
# 1. 仅同步新闻数据 python cli/akshare_init.py --full --sync-items news # 2. 同步新闻和其他数据 python cli/akshare_init.py --full --sync-items basic_info,news python cli/akshare_init.py --full --sync-items historical,financial,news # 3. 完整初始化(包含新闻) python cli/akshare_init.py --full --sync-items basic_info,historical,financial,quotes,news需要说明的是,--full未显式指定--sync-items时,初始化服务默认同步basic_info,historical,financial,quotes(多周期模式下追加weekly,monthly),即新闻并不在默认同步列表内,需显式传入news才会触发,这一点在 tushare_init_service.py 的run_full_initialization中可以看到。
Python API 使用
1. 使用同步服务
Tushare 同步服务(tushare_sync_service.py):
from app.worker.tushare_sync_service import get_tushare_sync_service # 获取同步服务 sync_service = await get_tushare_sync_service() # 同步所有股票的新闻 result = await sync_service.sync_news_data( hours_back=24, # 回溯24小时 max_news_per_stock=20 # 每只股票最多20条新闻 ) # 同步指定股票的新闻 result = await sync_service.sync_news_data( symbols=["000001", "600000"], hours_back=48, max_news_per_stock=50 )sync_news_data其余可选参数还包括force_update(强制更新)与job_id(调度任务 ID,用于进度跟踪与取消检测)。其内部按batch_size=100分批处理,逐只调用provider.get_stock_news后经news_service.save_news_data落库,成功与失败路径均设计了休眠间隔(成功 0.2 秒、失败 1.0 秒),以规避 API 限流与"失败雪崩"。
AKShare 同步服务(akshare_sync_service.py)接口略有差异——不提供hours_back参数(回溯由 API 决定),但额外提供favorites_only参数,默认True时仅同步自选股,可有效控制同步范围与耗时:
from app.worker.akshare_sync_service import get_akshare_sync_service sync_service = await get_akshare_sync_service() result = await sync_service.sync_news_data( symbols=["000001", "600000"], # 指定股票;为 None 时按 favorites_only 决定范围 max_news_per_stock=20, favorites_only=False # False 表示同步所有股票 )2. 使用初始化服务
from app.worker.tushare_init_service import get_tushare_init_service # 获取初始化服务 init_service = await get_tushare_init_service() # 运行完整初始化(包含新闻) result = await init_service.run_full_initialization( historical_days=365, sync_items=['basic_info', 'historical', 'news'] )初始化服务中新闻步骤的实现值得注意(见 tushare_init_service.py):回溯小时数按min(historical_days * 24, 24 * 7)计算,即新闻最多回溯 7 天,超出部分会被截断。
3. 直接使用 Provider
跳过同步服务、直接调用底层数据提供者:
from tradingagents.dataflows.providers.china.tushare import get_tushare_provider # 获取 Provider provider = get_tushare_provider() await provider.connect() # 获取单只股票的新闻 news_data = await provider.get_stock_news( symbol="000001", limit=20, hours_back=24 ) # 可选参数 src 可指定单一新闻源,如 src="sina"AKShare 对应使用tradingagents.dataflows.providers.china.akshare.get_akshare_provider,其get_stock_news签名不含hours_back(个股新闻接口由数据源决定返回范围)。
4. 通过 HTTP API 触发
仓库还提供了 REST 接口封装(app/routers/news_data.py),带鉴权保护:
POST /api/news-data/sync/start:后台启动股票或市场新闻同步任务,参数含symbol、data_sources、hours_back、max_news_per_source;POST /api/news-data/sync/single:同步执行单只股票新闻同步;GET /api/news-data/query/{symbol}:查询股票新闻,数据库无数据时会自动降级为实时抓取。
同步结果统计
同步完成后返回详细统计信息,Tushare/AKShare 同步服务的返回结构如下:
{ "total_processed": 100, # 处理的股票总数 "success_count": 98, # 成功数量 "error_count": 2, # 错误数量 "news_count": 1234, # 获取的新闻总数 "duration": 120.5, # 耗时(秒) "errors": [...] # 错误列表 }此外,news_data_service.py 还提供get_news_statistics聚合统计(情绪分布、重要性分布、分类分布、来源分布)、search_news全文搜索(基于 MongoDB$text索引)以及delete_old_news(默认清理 90 天前的过期新闻,用于数据维护)等查询侧能力。
功能特性对比
| 功能 | Tushare | AKShare |
|---|---|---|
| 新闻源数量 | 9个 | 2个 |
| 回溯时间 | 可配置(默认24小时,最多7天) | 由API决定 |
| 情绪分析 | ✅ | ✅ |
| 情绪分数 | ✅ | ✅ |
| 关键词提取 | ✅ | ✅ |
| 新闻分类 | ✅ | ✅ |
| 重要性评估 | ✅ | ✅ |
| 数据质量 | 高(需权限) | 中(免费) |
| API限制 | 有速率限制 | 较宽松 |
注意事项
1. 权限要求
- 新闻数据需要 Tushare 新闻接口权限,属付费功能。
get_stock_news在遇到权限类错误(permission、unauthorized、access denied等)时会给出明确提示,积分不足(积分/point)也会单独提示(见 tushare.py); - 部分新闻源可能需要更高积分等级,免费用户可能只能访问部分新闻源;
- Tushare 同步服务还内置了按账户等级(free/basic/standard/premium/vip)配置的速率限制器,
TUSHARE_TIER与TUSHARE_RATE_LIMIT_SAFETY_MARGIN可从环境变量读取(见 tushare_sync_service.py)。
2. 限制说明
- 默认回溯时间:24小时;
- 最大回溯时间:7天(初始化服务按
min(historical_days*24, 24*7)强制截断); - 每只股票默认最多获取 20 条新闻;
- 受 Tushare API 速率限制约束(每分钟调用次数受限)。
3. 数据质量
- 新闻数据的完整性取决于数据源,部分新闻可能缺少作者、摘要等字段(例如 Tushare 新闻接口本身不返回 URL,见 tushare.py 附近处理逻辑);
- 情绪分析基于关键词规则,结果仅供参考。
4. 性能考虑
- 新闻同步速度受网络和 API 限制影响,全市场同步为逐股串行拉取,耗时较长;
- 建议在非交易时间进行大批量同步;
- 可以使用
--sync-items news单独同步新闻,AKShare 侧还可利用favorites_only=True只同步自选股以显著缩短耗时。
故障排查
问题1: 未获取到新闻数据
可能原因:
- Tushare 账户没有新闻权限(源码会输出"Tushare新闻接口需要单独开通权限(付费功能)"类日志)
- 指定时间段内没有新闻
- API 调用频率超限
解决方法:
- 检查 Tushare 账户权限与积分等级
- 增加回溯时间范围(
hours_back调大,注意上限 7 天) - 等待一段时间后重试,避免频繁触发限流
问题2: 新闻保存失败
可能原因:
- 新闻数据缺少必需字段(URL、标题等),导致唯一索引冲突
- MongoDB 连接问题
- 数据格式不正确
解决方法:
- 检查日志中的详细错误信息(
BulkWriteError会记录前 3 条错误的错误码与消息) - 验证 MongoDB 连接状态
- 检查
publish_time字段格式(服务支持多种格式解析,无法解析时回退为当前时间)
问题3: 同步速度慢
可能原因:
- 网络延迟
- API 速率限制(服务对每次成功调用后休眠 0.2 秒、失败后休眠 1.0 秒)
- 股票数量过多(全市场约数千只股票逐只拉取)
解决方法:
- 使用更快的网络连接
- 减少每批次处理的股票数量
- 分批次进行同步,或使用
favorites_only限定自选股范围
相关文档
- 多周期数据同步更新
- 多数据源同步指南
- Tushare 使用指南
- 新闻情绪分析功能说明
更新历史
v1.4 (2025-09-30)
- ✅ 添加 Tushare 新闻数据同步功能
- ✅ 添加 AKShare 新闻数据同步功能
- ✅ 支持多新闻源(Tushare 9个,AKShare 2个)
- ✅ 实现智能去重(标题+URL 层与 URL+标题+发布时间唯一索引层双重保障)
- ✅ 添加情绪分析(positive/negative/neutral)
- ✅ 添加情绪分数计算(-1.0 到 1.0)
- ✅ 添加关键词提取(最多10个)
- ✅ 添加新闻分类(6种类别)
- ✅ 添加重要性评估(high/medium/low)
- ✅ 更新 CLI 工具(tushare_init.py 和 akshare_init.py,新增
--sync-items news选项) - ✅ 更新文档
【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考