news 2026/9/12 4:22:23

TradingAgents-CN 集成 Tushare 新闻接口实战指南:多源新闻获取、情绪分析与系统接入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TradingAgents-CN 集成 Tushare 新闻接口实战指南:多源新闻获取、情绪分析与系统接入

TradingAgents-CN 集成 Tushare 新闻接口实战指南:多源新闻获取、情绪分析与系统接入

【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN

本指南围绕 TradingAgents-CN 对 Tushare 新闻接口的完整集成展开,覆盖多新闻源支持、智能数据处理(情绪分析、重要性评估、关键词提取)、统一数据结构,以及从 Provider 直调到同步服务、REST API、MongoDB 落库的整条链路。读完本文,你将掌握如何在当前仓库中配置 Tushare Token、开通新闻权限、通过代码与接口获取个股/市场新闻,并结合源码理解其去重、分类与容错机制。

功能概述

TradingAgents-CN 已在统一数据提供器中接入 Tushare 新闻接口,为金融多智能体分析流程提供新闻数据支撑。其核心能力可分为三块:

  1. 多新闻源支持:单次查询即可覆盖新浪财经 (sina)、东方财富 (eastmoney)、同花顺 (10jqka)、华尔街见闻 (wallstreetcn)、财联社 (cls)、第一财经 (yicai)、金融界 (jinrongjie)、云财经 (yuncaijing)、凤凰新闻 (fenghuang) 共 9 个新闻源;
  2. 智能数据处理:自动情绪分析(positive / negative / neutral)、新闻重要性评估(high / medium / low)、关键词提取与分类,以及新闻去重与时间倒序排列;
  3. 灵活查询:支持个股新闻与市场新闻,可配置时间回溯范围(默认 24 小时,源码支持 6~72 小时级灵活传参)、可指定新闻源、支持批量获取与单源获取。

核心接口:TushareProvider 的 get_stock_news

调用示例

from tradingagents.dataflows.providers.china.tushare import get_tushare_provider # 获取提供者实例(模块级单例,首次调用会自动尝试同步连接) provider = get_tushare_provider() await provider.connect() # 获取市场新闻(多源自动选择,默认尝试前 3 个源) market_news = await provider.get_stock_news( symbol=None, limit=10, hours_back=24 ) # 获取个股新闻 stock_news = await provider.get_stock_news( symbol="000001", limit=5, hours_back=48 ) # 指定新闻源 sina_news = await provider.get_stock_news( symbol=None, limit=10, hours_back=24, src="sina" )

说明:原集成文档中的导入路径为tradingagents.dataflows.providers.tushare_provider,当前仓库的实际实现路径为tradingagents/dataflows/providers/china/tushare.py,请以上述路径为准。

源码级实现原理

get_stock_news定义在 tushare.py,其执行流程如下:

  1. 可用性检查:调用is_available(),要求 tushare 库已安装、Provider 已连接且 API 句柄非空;
  2. 时间范围计算:以end_time = datetime.now()为终点,向前回溯hours_back小时,生成%Y-%m-%d %H:%M:%S格式的起止时间;
  3. 新闻源优先级:内部维护news_sources有序列表,未指定src时默认尝试前 3 个源(sina、eastmoney、10jqka);指定src且合法时只尝试该源(见 tushare.py);
  4. 循环拉取:通过self.api.news(src=..., start_date=..., end_date=...)逐源获取,每次调用后await asyncio.sleep(0.2)做限流;一旦累计达到limit即停止;
  5. 去重与排序_deduplicate_news按标题去重,再按publish_time降序排列,最终截取前limit条返回;
  6. 错误分级:异常信息命中“权限/permission/unauthorized/access denied”时提示需单独开通权限,命中“积分/point”时提示积分不足(tushare.py)。

每条原始新闻在_process_tushare_news中被加工为标准结构,包含标题兜底(content前 50 字符)、200 字符摘要截取、频道/正文关键词分类、情绪与重要性分析、关键词提取等(tushare.py)。个股场景下还会调用_is_news_relevant_to_symbol按 6 位代码(兼容.SH/.SZ后缀)对正文与标题做相关性过滤。

Token 管理与连接策略

TushareProvider.__init__会通过get_provider_config("tushare")读取配置;连接时执行“数据库优先、环境变量兜底”的双通道策略(tushare.py):

  • 数据库优先:查询 MongoDBsystem_configs集合中is_active=True的最新版本配置,取data_source_configstype == 'tushare'api_key(跳过your_占位符),保证用户在 Web 后台修改后立即生效;
  • 环境变量兜底:数据库无有效 Token 时,回退到providers_config.py中的TUSHARE_TOKEN环境变量;
  • 连接验证:通过api.stock_basic(list_status='L', limit=1)测试连通性,异步版本使用asyncio.wait_for(..., timeout=10)防止阻塞。

模块底部提供线程安全的全局单例get_tushare_provider(),首次调用即执行connect_sync(),之后直接复用实例(tushare.py)。

统一数据结构

所有新闻源的数据最终都会标准化为如下结构(data_source标记来源体系,original_source保留 Tushare 原始新闻源):

{ "title": "新闻标题", "content": "新闻正文内容", "summary": "新闻摘要", "url": "", # Tushare不提供URL "source": "新浪财经", "author": "", "publish_time": datetime, "category": "market_news", # company_announcement/market_news/policy_news "sentiment": "positive", # positive/negative/neutral "importance": "high", # high/medium/low "keywords": ["股票", "市场", "投资"], "data_source": "tushare", "original_source": "sina" }

在同步服务层,数据还会追加symbol字段并补充落库所需元数据(见下文)。

集成使用

1. 新闻数据同步服务

NewsDataSyncService(app/worker/news_data_sync_service.py)是多源新闻同步的核心编排器,默认按tushare → akshare → realtime顺序拉取:

from app.worker.news_data_sync_service import get_news_data_sync_service # 获取同步服务(单例) sync_service = await get_news_data_sync_service() # 同步Tushare新闻 stats = await sync_service.sync_stock_news( symbol="000001", data_sources=["tushare"], hours_back=48, max_news_per_source=20 ) print(f"同步成功: {stats.successful_saves} 条新闻")

sync_stock_news返回NewsSyncStats统计对象,包含total_processed(处理总数)、successful_saves(保存成功数)、failed_savesduplicate_skipped(去重跳过数)、sources_usedduration_seconds(耗时)与success_rate(成功率)等属性。内部对三路来源分别做异常隔离——Tushare 权限/积分错误被降级为 warning 且不影响 AKShare 与实时聚合通道(news_data_sync_service.py)。此外还提供sync_market_news(data_sources, hours_back, max_news_per_source)用于市场级新闻同步。

2. REST API 接口

新闻功能对外暴露于/api/news-data前缀路由(app/routers/news_data.py),全部接口需要登录鉴权(Depends(get_current_user)):

# 获取股票新闻(智能获取:优先数据库,无数据时实时拉取 AKShare 并落库) curl -X GET "http://localhost:8000/api/news-data/query/000001?limit=10&hours_back=24" # 高级查询(POST,支持多代码、时间范围、类别、情绪、重要性、数据源、关键词) curl -X POST "http://localhost:8000/api/news-data/query" \ -H "Content-Type: application/json" \ -d '{"symbols": ["000001"], "hours_back": 48, "sentiment": "positive"}' # 启动新闻同步(后台任务) curl -X POST "http://localhost:8000/api/news-data/sync/start" \ -H "Content-Type: application/json" \ -d '{"symbols": ["000001"], "data_sources": ["tushare"], "hours_back": 48}' # 同步单只股票新闻(同步执行,返回统计) curl -X POST "http://localhost:8000/api/news-data/sync/single?symbol=000001&data_sources=tushare&hours_back=24" # 最新新闻 / 全文搜索 / 统计 / 清理 / 健康检查 curl -X GET "http://localhost:8000/api/news-data/latest?symbol=000001&limit=10" curl -X GET "http://localhost:8000/api/news-data/search?query=业绩&symbol=000001" curl -X GET "http://localhost:8000/api/news-data/statistics?symbol=000001&days_back=7" curl -X DELETE "http://localhost:8000/api/news-data/cleanup?days_to_keep=90" curl -X GET "http://localhost:8000/api/news-data/health"

接口能力清单(对应 news_data.py):

接口方法用途
/query/{symbol}GET查询个股新闻,数据库优先、缺数据时实时补拉
/queryPOST高级查询(NewsQueryRequest全参数)
/latestGET获取最新新闻(按发布时间倒序)
/searchGETMongoDB 文本索引全文搜索,按相关性排序
/statisticsGET情绪/重要性分布、类别与来源聚合统计
/sync/startPOST后台异步启动个股或市场新闻同步
/sync/singlePOST同步执行个股新闻同步并返回NewsSyncStats
/cleanupDELETE清理超过保留天数的过期新闻(默认 90 天)
/healthGET服务健康检查

3. 数据库查询

新闻统一落库到 MongoDBstock_news集合(app/services/news_data_service.py),由NewsDataService封装存取:

from app.services.news_data_service import get_news_data_service # 获取服务实例(单例) news_service = await get_news_data_service() # 查询最新新闻 latest_news = await news_service.get_latest_news( symbol="000001", limit=10 ) # 全文搜索 search_results = await news_service.search_news( query_text="业绩", symbol="000001", limit=20 )

存储层的关键设计(news_data_service.py):

  • 幂等写入save_news_data使用ReplaceOne(url, title, publish_time, upsert=True)批量写入,同一新闻重复同步不会产生脏数据;
  • 索引体系:首次保存时自动创建 10 个索引,包括(url, title, publish_time)唯一索引、symbol索引、symbol + publish_time复合索引、publish_time倒序索引以及data_source/category/sentiment/importance等筛选索引;
  • 数据清洗_standardize_news_data补全full_symbol60/68.SH00/30.SZ)、marketsymbols数组、created_at/updated_at/version元数据,并显式排除language字段以避免与 MongoDB 文本索引冲突;
  • 容错BulkWriteError时仅记录前 3 条错误并返回成功数量,不中断整体流程。

配置说明

环境变量

.env中至少需要配置 Tushare Token:

# .env 文件 TUSHARE_TOKEN=your_tushare_token_here

ProvidersConfig还支持以下可选变量(默认值见 providers_config.py):

环境变量默认值说明
TUSHARE_ENABLEDtrue是否启用 Tushare 数据源
TUSHARE_TOKENTushare API Token
TUSHARE_TIMEOUT30请求超时(秒)
TUSHARE_RATE_LIMIT0.1请求限流间隔(秒)
TUSHARE_MAX_RETRIES3失败重试次数
TUSHARE_CACHE_ENABLEDtrue是否启用缓存
TUSHARE_CACHE_TTL3600缓存过期时间(秒)

除环境变量外,也可以在 Web 后台将 Tushareapi_key写入数据库激活配置,连接时会优先读取(见“Token 管理与连接策略”)。

权限要求

⚠️重要提示:Tushare 新闻接口需要单独开通权限,并非基础 Token 可用:

  1. 基础权限:免费用户无法使用新闻接口;
  2. 付费权限:需要购买新闻数据权限包;
  3. 积分消耗:每次调用消耗一定积分,账户积分不足时接口直接报错。

获取权限步骤

  1. 访问 Tushare 官网,登录账户;
  2. 进入“数据权限”页面;
  3. 购买“新闻数据”权限包;
  4. 确保账户积分充足后,将 Token 配置到.env或 Web 后台数据库。

测试结果

集成文档记录的验证结论如下:

功能测试通过率:80%(4/5)

测试项目状态说明
连接测试✅ 通过Tushare API 连接正常
多新闻源✅ 通过4 个新闻源全部可用
个股新闻✅ 通过基础功能正常
数据集成❌ 失败需要权限开通
功能特性✅ 通过智能分析功能正常

新闻源测试结果

  • 新浪财经:✅ 成功获取 5 条新闻
  • 东方财富:✅ 成功获取 5 条新闻
  • 同花顺:✅ 成功获取 5 条新闻
  • 财联社:✅ 成功获取 5 条新闻

数据集成项失败的原因与“权限要求”一节一致:Tushare 新闻接口为付费功能,未开通权限时news接口无法返回数据。仓库中还提供了tests/test_news_analyst_integration.pytests/test_news_filtering.py等测试用于验证新闻链路与分析师智能体的集成行为。

故障排除

常见问题

  1. 权限错误

    ⚠️ Tushare新闻接口需要单独开通权限(付费功能)

    解决方案:购买 Tushare 新闻数据权限包;该提示对应源码中对权限类异常的专门拦截。

  2. 积分不足

    ⚠️ Tushare积分不足,无法获取新闻数据

    解决方案:充值 Tushare 积分,并适当降低limit/ 缩短hours_back以减少单次消耗。

  3. 无新闻数据

    ⚠️ 未获取到任何Tushare新闻数据

    解决方案

    • 检查时间范围设置(非交易时段或回溯窗口过短可能无数据);
    • 尝试不同新闻源(src参数逐个替换测试);
    • 确认网络连接与 Token 有效性;
    • 通过日志确认是否命中“权限/积分”分支而非静默返回空列表。

调试模式

import logging logging.getLogger('tradingagents.dataflows.providers.base_provider.Tushare').setLevel(logging.DEBUG)

开启 DEBUG 后可以看到逐源的“尝试从 {source} 获取新闻”、单源命中条数、去重前后数量等关键日志,便于定位是哪一步失败。

最佳实践与性能优化

1. 新闻源选择策略

按优先级依次尝试,第一个返回数据的源即停:

# 按优先级使用新闻源 priority_sources = ['sina', 'eastmoney', '10jqka'] for source in priority_sources: news = await provider.get_stock_news(src=source, limit=10) if news: break

2. API 限流控制

Tushare 新闻接口对调用频率有积分约束,批量场景务必插入延迟:

import asyncio # 批量获取时添加延迟 for symbol in symbols: news = await provider.get_stock_news(symbol=symbol) await asyncio.sleep(0.5) # 500ms延迟

Provider 内部每次跨源调用本身已有asyncio.sleep(0.2)限流,外层再加延迟主要面向多股票循环。

3. 错误处理

对权限、积分、网络错误做分级响应:

try: news = await provider.get_stock_news(symbol="000001") except Exception as e: if "权限" in str(e): logger.warning("需要开通新闻权限") elif "积分" in str(e): logger.warning("积分不足") else: logger.error(f"获取新闻失败: {e}")

4. 批量并发

利用asyncio.gather并行获取多只股票,配合return_exceptions=True隔离单点失败:

import asyncio async def batch_get_news(symbols): tasks = [] for symbol in symbols: task = provider.get_stock_news(symbol=symbol, limit=5) tasks.append(task) results = await asyncio.gather(*tasks, return_exceptions=True) return results

5. 缓存策略

对高频查询使用 Redis 做一级缓存,缓解 Tushare 积分消耗:

# 使用Redis缓存新闻数据 from app.core.cache import get_cache cache = await get_cache() cache_key = f"tushare_news:{symbol}:{hours_back}" # 先检查缓存 cached_news = await cache.get(cache_key) if cached_news: return cached_news # 获取新数据并缓存 news = await provider.get_stock_news(symbol=symbol) await cache.set(cache_key, news, expire=3600) # 1小时缓存

此外,ProvidersConfigTUSHARE_CACHE_ENABLED/TUSHARE_CACHE_TTL已为 Provider 层预留了全局缓存开关,生产环境建议与 Redis 一起启用。

延伸阅读

  • 新闻数据系统架构
  • API 接口文档
  • 数据库设计

Tushare 新闻接口的接入让 TradingAgents-CN 具备了一条“9 源可切换、智能标注、可落库检索”的新闻数据流水线:上游由TushareProvider.get_stock_news完成多源拉取与标准化,中游由NewsDataSyncService完成跨源聚合与去重落库,下游通过/api/news-dataREST 接口和NewsDataService查询能力,为新闻分析师智能体持续供给带情绪与重要性标注的新闻语料。配合权限开通与限流策略,即可稳定接入生产分析流程。

【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

Anki 插件如何用 aqt 添加一个显示卡片数量的菜单项?

Anki 插件如何用 aqt 添加一个显示卡片数量的菜单项? 【免费下载链接】anki Anki is a smart spaced repetition flashcard program 项目地址: https://gitcode.com/GitHub_Trending/an/anki 这篇文章解决一个具体的插件开发任务:给 Anki 写一个最…

作者头像 李华
网站建设 2026/9/12 4:21:44

是德科技MXR系列示波器技术解析与应用指南

1. 是德科技MXR系列示波器深度解析 作为电子测试测量领域的标杆产品,是德科技(Keysight Technologies)的MXR系列示波器凭借其卓越性能在工程师群体中享有盛誉。今天我们就来深入剖析MXR604A、MXR804A、MXR404A和MXR254A这四款机型的技术特点与…

作者头像 李华
网站建设 2026/9/12 4:21:13

RK3566 上跑通 sherpa-onnx 流式语音识别:RKNN 部署实战复盘

RK3566 上跑通 sherpa-onnx 流式语音识别:RKNN 部署实战复盘 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet conne…

作者头像 李华
网站建设 2026/9/12 4:20:40

RetroArch 界面中文切换教程:3 步把满屏英文改成中文菜单

RetroArch 界面中文切换教程:3 步把满屏英文改成中文菜单 【免费下载链接】RetroArch Cross-platform, sophisticated frontend for the libretro API. Licensed GPLv3. 项目地址: https://gitcode.com/GitHub_Trending/re/RetroArch 刚装好 RetroArch 点开一…

作者头像 李华
网站建设 2026/9/12 4:20:17

机械思维驱动React应用开发:跨界设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华