news 2026/9/10 18:11:14

TradingAgents-CN 新闻数据同步功能完全指南:多源采集、情绪分析与存储实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TradingAgents-CN 新闻数据同步功能完全指南:多源采集、情绪分析与存储实践

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"]三路采集,任一来源异常不会影响其他来源继续执行。

智能去重

去重贯穿两个层面:

  1. 同步服务层_deduplicate_news以「标题 + URL」二元组作为去重标识(见 news_data_sync_service.py),在写入前过滤同批次内的重复项,并统计duplicate_skipped数量;
  2. 存储层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开头映射为.SZsymbols数组为空时会自动将主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_indexcategory_indexsentiment_indeximportance_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,news

CLI 会对--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:后台启动股票或市场新闻同步任务,参数含symboldata_sourceshours_backmax_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 天前的过期新闻,用于数据维护)等查询侧能力。

功能特性对比

功能TushareAKShare
新闻源数量9个2个
回溯时间可配置(默认24小时,最多7天)由API决定
情绪分析
情绪分数
关键词提取
新闻分类
重要性评估
数据质量高(需权限)中(免费)
API限制有速率限制较宽松

注意事项

1. 权限要求

  • 新闻数据需要 Tushare 新闻接口权限,属付费功能。get_stock_news在遇到权限类错误(permissionunauthorizedaccess denied等)时会给出明确提示,积分不足(积分/point)也会单独提示(见 tushare.py);
  • 部分新闻源可能需要更高积分等级,免费用户可能只能访问部分新闻源;
  • Tushare 同步服务还内置了按账户等级(free/basic/standard/premium/vip)配置的速率限制器,TUSHARE_TIERTUSHARE_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 18:10:21

非标零件销售的市场困境与精准获客策略

1. 非标零件销售的市场困境与破局思路 非标零件销售一直是工业品领域最难啃的骨头之一。我做了8年机加工行业销售,前5年都在和标准件打交道,直到3年前接手非标业务线,才真正体会到什么叫"销售地狱"。标准件客户可以靠价格战、靠渠道…

作者头像 李华
网站建设 2026/9/10 18:09:25

JAVA毕设项目: 基于 SpringBoot+Vue 的面向企业的产品售后服务管理平台的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/9/10 18:08:45

OpenCV凸缺陷+余弦定理实现五类手势识别

简介:这是一套面向计算机专业本科生的Python毕业设计实战资源,聚焦基于OpenCV的手势识别系统开发,适用于课程设计、毕设选题及图像处理入门实践。项目采用凸包与凸缺陷检测(cv2.convexHull cv2.convexityDefects)核心…

作者头像 李华
网站建设 2026/9/10 18:06:05

AIGCBIYE:当学术写作遇上AI5.0,论文还能这么写?

官网 www.aigcbiye.com ,微信公众号 搜一搜 AIGCbiye 如果你正在为开题报告焦头烂额,为文献综述翻遍知网却无从下笔,为数据分析跑不出显著结果而崩溃——那么这篇文章,就是为你写的。 今天要聊的,是一个专为论文写…

作者头像 李华
网站建设 2026/9/10 18:04:21

MATLAB多模态图像融合技术:原理与实现

1. 项目概述:多模态图像融合的MATLAB实现在遥感监测、医疗影像和安防监控等领域,我们经常需要将不同传感器或不同参数拍摄的同一场景图像进行融合处理。比如红外图像能清晰显示热源但缺乏细节,可见光图像纹理丰富却受光照影响大。通过MATLAB实…

作者头像 李华