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 新闻接口,为金融多智能体分析流程提供新闻数据支撑。其核心能力可分为三块:
- 多新闻源支持:单次查询即可覆盖新浪财经 (sina)、东方财富 (eastmoney)、同花顺 (10jqka)、华尔街见闻 (wallstreetcn)、财联社 (cls)、第一财经 (yicai)、金融界 (jinrongjie)、云财经 (yuncaijing)、凤凰新闻 (fenghuang) 共 9 个新闻源;
- 智能数据处理:自动情绪分析(positive / negative / neutral)、新闻重要性评估(high / medium / low)、关键词提取与分类,以及新闻去重与时间倒序排列;
- 灵活查询:支持个股新闻与市场新闻,可配置时间回溯范围(默认 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,其执行流程如下:
- 可用性检查:调用
is_available(),要求 tushare 库已安装、Provider 已连接且 API 句柄非空; - 时间范围计算:以
end_time = datetime.now()为终点,向前回溯hours_back小时,生成%Y-%m-%d %H:%M:%S格式的起止时间; - 新闻源优先级:内部维护
news_sources有序列表,未指定src时默认尝试前 3 个源(sina、eastmoney、10jqka);指定src且合法时只尝试该源(见 tushare.py); - 循环拉取:通过
self.api.news(src=..., start_date=..., end_date=...)逐源获取,每次调用后await asyncio.sleep(0.2)做限流;一旦累计达到limit即停止; - 去重与排序:
_deduplicate_news按标题去重,再按publish_time降序排列,最终截取前limit条返回; - 错误分级:异常信息命中“权限/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):
- 数据库优先:查询 MongoDB
system_configs集合中is_active=True的最新版本配置,取data_source_configs中type == '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_saves、duplicate_skipped(去重跳过数)、sources_used、duration_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 | 查询个股新闻,数据库优先、缺数据时实时补拉 |
/query | POST | 高级查询(NewsQueryRequest全参数) |
/latest | GET | 获取最新新闻(按发布时间倒序) |
/search | GET | MongoDB 文本索引全文搜索,按相关性排序 |
/statistics | GET | 情绪/重要性分布、类别与来源聚合统计 |
/sync/start | POST | 后台异步启动个股或市场新闻同步 |
/sync/single | POST | 同步执行个股新闻同步并返回NewsSyncStats |
/cleanup | DELETE | 清理超过保留天数的过期新闻(默认 90 天) |
/health | GET | 服务健康检查 |
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_symbol(60/68→.SH,00/30→.SZ)、market、symbols数组、created_at/updated_at/version元数据,并显式排除language字段以避免与 MongoDB 文本索引冲突; - 容错:
BulkWriteError时仅记录前 3 条错误并返回成功数量,不中断整体流程。
配置说明
环境变量
.env中至少需要配置 Tushare Token:
# .env 文件 TUSHARE_TOKEN=your_tushare_token_hereProvidersConfig还支持以下可选变量(默认值见 providers_config.py):
| 环境变量 | 默认值 | 说明 |
|---|---|---|
TUSHARE_ENABLED | true | 是否启用 Tushare 数据源 |
TUSHARE_TOKEN | 空 | Tushare API Token |
TUSHARE_TIMEOUT | 30 | 请求超时(秒) |
TUSHARE_RATE_LIMIT | 0.1 | 请求限流间隔(秒) |
TUSHARE_MAX_RETRIES | 3 | 失败重试次数 |
TUSHARE_CACHE_ENABLED | true | 是否启用缓存 |
TUSHARE_CACHE_TTL | 3600 | 缓存过期时间(秒) |
除环境变量外,也可以在 Web 后台将 Tushareapi_key写入数据库激活配置,连接时会优先读取(见“Token 管理与连接策略”)。
权限要求
⚠️重要提示:Tushare 新闻接口需要单独开通权限,并非基础 Token 可用:
- 基础权限:免费用户无法使用新闻接口;
- 付费权限:需要购买新闻数据权限包;
- 积分消耗:每次调用消耗一定积分,账户积分不足时接口直接报错。
获取权限步骤
- 访问 Tushare 官网,登录账户;
- 进入“数据权限”页面;
- 购买“新闻数据”权限包;
- 确保账户积分充足后,将 Token 配置到
.env或 Web 后台数据库。
测试结果
集成文档记录的验证结论如下:
功能测试通过率:80%(4/5)
| 测试项目 | 状态 | 说明 |
|---|---|---|
| 连接测试 | ✅ 通过 | Tushare API 连接正常 |
| 多新闻源 | ✅ 通过 | 4 个新闻源全部可用 |
| 个股新闻 | ✅ 通过 | 基础功能正常 |
| 数据集成 | ❌ 失败 | 需要权限开通 |
| 功能特性 | ✅ 通过 | 智能分析功能正常 |
新闻源测试结果
- 新浪财经:✅ 成功获取 5 条新闻
- 东方财富:✅ 成功获取 5 条新闻
- 同花顺:✅ 成功获取 5 条新闻
- 财联社:✅ 成功获取 5 条新闻
数据集成项失败的原因与“权限要求”一节一致:Tushare 新闻接口为付费功能,未开通权限时news接口无法返回数据。仓库中还提供了tests/test_news_analyst_integration.py、tests/test_news_filtering.py等测试用于验证新闻链路与分析师智能体的集成行为。
故障排除
常见问题
权限错误
⚠️ Tushare新闻接口需要单独开通权限(付费功能)解决方案:购买 Tushare 新闻数据权限包;该提示对应源码中对权限类异常的专门拦截。
积分不足
⚠️ Tushare积分不足,无法获取新闻数据解决方案:充值 Tushare 积分,并适当降低
limit/ 缩短hours_back以减少单次消耗。无新闻数据
⚠️ 未获取到任何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: break2. 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 results5. 缓存策略
对高频查询使用 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小时缓存此外,ProvidersConfig中TUSHARE_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),仅供参考