TradingAgents-CN 多数据源同步实战指南:Tushare/AKShare/BaoStock 分级与 Fallback 机制详解
【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN
TradingAgents-CN 内置的多数据源同步功能,为 A 股行情与财务数据的获取提供了「数据源分级 + 自动 Fallback」的高可用方案:当 Tushare 不可用时自动降级到 AKShare 或 BaoStock,并配套提供数据源状态检查、连通性测试、同步建议等 API 与命令行工具。读完本文,你将掌握三大数据源的优先级配置、多源同步服务的完整调用链(API、Python SDK 与 CLI 三种方式),以及选择性同步、全历史同步、多周期数据同步三类进阶用法,并理解其底层实现原理。
功能定位与核心特性
多数据源同步功能解决的是金融数据获取链路中的单点故障问题:单一数据源可能因 Token 失效、接口限流、网络波动或服务商维护而中断,导致股票基础信息与财务指标无法更新。该功能通过以下三组能力保证数据获取的高可用:
- 数据源分级:为 Tushare、AKShare、BaoStock 三个数据源定义明确的优先级顺序;
- 自动 Fallback 机制:主数据源失败时自动切换到备用数据源,并记录每次同步实际使用的数据源;
- 灵活配置:支持指定优先数据源、动态调整优先级、实时状态检查与多周期(日线/周线/月线)数据同步。
在代码层面,这一功能的核心实现位于 app/services/data_sources/(适配器与管理器)与 app/services/multi_source_basics_sync_service.py(同步服务),对外暴露的 API 路由在 app/routers/multi_source_sync.py。
数据源分级与优先级机制
默认优先级
三个数据源按「数据全面性」划分默认优先级,其定义散落在各自适配器的_get_default_priority()方法中:
| 数据源 | 默认优先级值 | 说明 |
|---|---|---|
| Tushare | 3(最高) | 专业金融数据 API,提供最全面的财务指标,支持日线/周线/月线 |
| AKShare | 2(中等) | 开源金融数据库,提供基础股票信息,支持日线/周线/月线 |
| BaoStock | 1(最低) | 免费证券数据平台,作为最后备用,支持日线/周线/月线 |
注意一个容易混淆的细节:这里的优先级数值越大越优先。例如 TushareAdapter 的默认优先级实现 返回3并注释 "highest priority",BaoStockAdapter 返回1注释 "lowest priority"。而 DataSourceManager 初始化时按priority降序排序:
self.adapters.sort(key=lambda x: x.priority, reverse=True)因此adapters列表中的顺序恒为 Tushare → AKShare → BaoStock,Fallback 遍历时也按此顺序逐个尝试。
数据库动态优先级
除了代码中的默认优先级,系统还支持从 MongoDB 的datasource_groupings集合动态加载 A 股市场(market_category_id: "a_shares"且enabled: true)的优先级配置,见 manager.py 中的_load_priority_from_database。加载成功后会覆盖适配器的_priority属性,未配置的数据源则回退到默认优先级。这意味着运维人员无需修改代码即可通过数据库调整数据源优先级。
可用性判定(is_available)
三个适配器的可用性判定逻辑各不相同(见各适配器is_available()实现):
- Tushare:检查 provider 是否已连接、
connected状态与api是否可用,未连接时会尝试自动连接(tushare_adapter.py); - AKShare:尝试
import akshare,抛ImportError即判定不可用(akshare_adapter.py); - BaoStock:同样通过
import baostock判定(baostock_adapter.py)。
从源码结构看,AKShare 与 BaoStock 的可用性判定是「依赖包是否安装」级别的轻量检查,而 Tushare 则是「Token 与连接是否有效」级别的真实连接检查。
指定优先数据源的重排序逻辑
当调用方通过preferred_sources指定优先数据源时,DataSourceManager 会重排适配器顺序:将指定名称的适配器按用户给定的顺序排到最前,其余适配器保持默认顺序跟在后面。例如传入["akshare", "baostock"]时,即使 Tushare 可用,也会优先尝试 AKShare。
环境变量配置方法
在项目根目录的.env文件中配置以下环境变量:
# Tushare 配置(推荐作为主数据源) TUSHARE_ENABLED=true TUSHARE_TOKEN=your_tushare_token_here # AKShare 配置(免费数据源,无需 Token) AKSHARE_ENABLED=true # BaoStock 配置(免费数据源,无需 Token) BAOSTOCK_ENABLED=true # 默认数据源 DEFAULT_CHINA_DATA_SOURCE=tushare关于DEFAULT_CHINA_DATA_SOURCE的语义,仓库架构文档>GET /api/sync/multi-source/sources/status
响应示例(实际返回由代码中的DataSourceStatus模型与描述映射生成,见 multi_source_sync.py):
{ "success": true, "message": "Data sources status retrieved successfully", "data": [ { "name": "tushare", "priority": 3, "available": true, "description": "专业金融数据API,提供高质量的A股数据和财务指标 (Token来源: 数据库)" }, { "name": "akshare", "priority": 2, "available": true, "description": "开源金融数据库,提供基础的股票信息" } ] }说明:接口对 Tushare 额外返回
token_source字段(database或env),并在描述中追加 Token 来源标注。
获取当前生效数据源
GET /api/sync/multi-source/sources/current返回优先级最高且可用的数据源(实现上用max(available_adapters, key=lambda x: x.priority)选取),无可用数据源时返回success: false。
获取同步状态与历史
# 获取最近一次同步状态(含总记录数、新增/更新/错误数、实际使用的数据源列表) GET /api/sync/multi-source/status # 分页获取同步历史(支持按状态筛选) GET /api/sync/multi-source/history?page=1&page_size=10&status=success同步状态持久化在 MongoDB 的sync_status集合中,job字段为stock_basics_multi_source,历史记录按started_at倒序返回。
运行多数据源同步
POST /api/sync/multi-source/stock_basics/run?force=false&preferred_sources=tushare,akshare请求参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
force | bool | false | 是否强制运行。当服务已有同步任务在运行时,非 force 请求会直接返回当前状态而不会重复启动 |
preferred_sources | string | null | 优先使用的数据源,逗号分隔,如tushare,akshare |
注意该接口为同步执行,仓库注释说明前端设置了 10 分钟超时(multi_source_sync.py)。响应中的data.status可能为success、success_with_errors、failed或running。
测试数据源连接
# 测试全部数据源(并发测试,每个 10 秒超时) POST /api/sync/multi-source/test-sources # 仅测试指定数据源 POST /api/sync/multi-source/test-sources Content-Type: application/json {"source_name": "tushare"}连通性测试的实现细节(multi_source_sync.py):每个适配器以 10 秒超时运行轻量级连通性检查;对 Tushare 会先强制重置连接状态并重新连接,以确保使用数据库中最新的 Token 配置。
获取同步建议
GET /api/sync/multi-source/recommendations返回primary_source(优先级最高的可用数据源)、fallback_sources(其余备用源)、suggestions与warnings。典型场景:当没有任何数据源可用时给出配置告警;只有一个数据源时建议增加冗余;Tushare 不可用时建议优先配置 Tushare 以获取最全面的财务数据。
清空同步缓存
DELETE /api/sync/multi-source/cache删除sync_status集合中job=stock_basics_multi_source的记录并重置服务运行状态,用于同步卡死后的恢复。
Python 代码使用
在业务代码中可以直接调用同步服务与数据源管理器,入口与文档一致:
from app.services.multi_source_basics_sync_service import get_multi_source_sync_service from app.services.data_sources.manager import DataSourceManager # 获取数据源管理器并查看可用适配器 manager = DataSourceManager() available_adapters = manager.get_available_adapters() for adapter in available_adapters: print(f"{adapter.name} (priority={adapter.priority})") # 运行多数据源同步 service = get_multi_source_sync_service() result = await service.run_full_sync( force=False, preferred_sources=["tushare", "akshare"] ) print(result["status"], result["inserted"], result["updated"], result["errors"])get_multi_source_sync_service()返回进程内的单例服务实例(multi_source_basics_sync_service.py),内部通过asyncio.Lock保证同一时间只有一个同步任务在运行。
数据源管理器的 Fallback 方法族
除了股票基础信息同步,DataSourceManager还提供一系列带 Fallback 的通用方法,供 K 线、新闻、实时快照等场景复用(manager.py):
| 方法 | 作用 |
|---|---|
get_stock_list_with_fallback(preferred_sources) | 获取股票列表,返回(DataFrame, 数据源名) |
get_daily_basic_with_fallback(trade_date, preferred_sources) | 获取每日基础财务数据(PE、PB、市值等) |
find_latest_trade_date_with_fallback(preferred_sources) | 查找最新交易日期(YYYYMMDD 格式) |
get_realtime_quotes_with_fallback() | 获取全市场实时快照 |
get_kline_with_fallback(code, period, limit, adj) | 获取 K 线 |
get_news_with_fallback(code, days, limit, include_announcements) | 获取新闻与公告 |
所有方法遵循同一模式:按优先级遍历可用适配器,逐个尝试,返回第一个成功结果并附带数据源名称;全部失败时返回(None, None)。
命令行测试与调试
仓库提供了现成的端到端测试脚本 scripts/test_multi_source_sync.py,默认向http://localhost:8000发起请求,依次测试数据源状态检查、数据源连接测试等环节:
python scripts/test_multi_source_sync.py对应的手工调试命令:
# 检查数据源状态 curl http://localhost:8000/api/sync/multi-source/sources/status # 测试数据源连接 curl -X POST http://localhost:8000/api/sync/multi-source/test-sources # 触发一次同步并指定优先数据源 curl -X POST "http://localhost:8000/api/sync/multi-source/stock_basics/run?preferred_sources=tushare,akshare"同步流程深度解析
MultiSourceBasicsSyncService.run_full_sync的完整执行流程(multi_source_basics_sync_service.py)可归纳为四步:
1. 数据源检查
获取DataSourceManager实例,调用get_available_adapters()得到所有可用适配器;若无任何可用数据源,直接抛出RuntimeError("No available data sources found")(对应故障排除章节的症状)。
2. 股票列表获取
调用manager.get_stock_list_with_fallback(preferred_sources):优先从 Tushare 获取完整股票列表,失败时自动切换到 AKShare 或 BaoStock,返回(stock_df, source_used)二元组。日志形如:
INFO: Trying to fetch stock list from TushareAdapter INFO: Successfully fetched 5427 stocks from TushareAdapter3. 财务数据获取
调用find_latest_trade_date_with_fallback查找最新交易日期,再调用get_daily_basic_with_fallback获取当日的基础财务数据,按ts_code建立映射。目前财务指标主要依赖 Tushare 的daily_basic接口,字段包括total_mv(总市值)、circ_mv(流通市值)、pe、pb、ps、turnover_rate、volume_ratio、pe_ttm、pb_mrq、ps_ttm、total_share、float_share(tushare_adapter.py)。AKShare 与 BaoStock 暂不支持这些财务指标,这也是故障排除中「只有部分股票有扩展字段」问题的根源。
4. 数据处理与存储
- 统一数据格式:从
ts_code(如000001.SZ)提取 6 位股票代码,依据后缀识别交易所(.SH/.SZ/.BJ); - full_symbol 标准化:
_generate_full_symbol按代码前缀规则生成标准化代码——60/68/90开头补.SS,00/30/20开头补.SZ,8/4开头补.BJ,无法识别时原样返回以保证非空(multi_source_basics_sync_service.py); - 批量写入 MongoDB:每 500 条记录一批执行
bulk_write(ordered=False),以(code, source)为联合查询条件做UpdateOneupsert,从而区分同一股票来自不同数据源的记录; - 写入重试:
_execute_bulk_write_with_retry对超时场景采用指数退避重试(2 秒、4 秒、8 秒,最多 3 次); - 状态持久化:将
SyncStats(total/inserted/updated/errors/status/data_sources_used 等)写入sync_status集合。
SyncStats的状态流转为idle → running → success / success_with_errors / failed,其中success_with_errors表示主流程完成但部分记录处理出错。
故障排除
1. 所有数据源都不可用
症状:API 返回No available data sources found(实际报错为RuntimeError("No available data sources found"))。
解决方案:
- 检查
TUSHARE_ENABLED、AKSHARE_ENABLED、BAOSTOCK_ENABLED等环境变量是否配置正确; - 确认至少安装了一个数据源的依赖包(
pip show akshare/pip show baostock/pip show tushare); - 验证 Tushare Token 是否有效,可通过
POST /api/sync/multi-source/test-sources单独测试,并注意响应中的 Token 来源标注。
2. 只有部分股票有扩展字段
症状:PE、PB 等财务指标缺失。
解决方案:
- 确保 Tushare 可用(其余数据源暂不支持
daily_basic财务指标); - 检查最新交易日期是否正确获取(
last_trade_date字段); - 验证
daily_basic数据是否可正常返回。
3. 同步速度慢
解决方案:
- 优先配置 Tushare(数据最全面,一次可获取全市场数据);
- 检查网络连接与 MongoDB 写入性能;
- 利用批量写入与缓存机制降低请求频率(见下节性能优化)。
性能优化与最佳实践
数据源选择策略
| 环境 | 推荐配置 |
|---|---|
| 生产环境 | 优先 Tushare,配置 AKShare 作为备用 |
| 开发环境 | 使用 AKShare 或 BaoStock 降低成本 |
| 测试环境 | 使用任何可用的数据源 |
缓存与并发控制
仓库为多源同步设计了明确的并发与批量策略:
- 股票列表缓存 24 小时、财务数据缓存 1 小时(文档约定的缓存策略);
- 同一时间只允许一个同步任务运行(
asyncio.Lock+_running标志),force=true可跳过该限制; - 每批 500 条记录批量写库,配合
ordered=False与指数退避重试,避免 MongoDB 写入超时; - 所有耗时 IO 通过
asyncio.to_thread放到线程池执行,避免阻塞事件循环。
配置与维护建议
# 推荐配置(生产环境) TUSHARE_ENABLED=true TUSHARE_TOKEN=your_token AKSHARE_ENABLED=true BAOSTOCK_ENABLED=true DEFAULT_CHINA_DATA_SOURCE=tushare- 定期通过
GET /api/sync/multi-source/sources/status检查数据源状态; - 监控同步成功率与
success_with_errors状态; - 定期更新数据源依赖包(
akshare、baostock、tushare); - 测试故障切换机制,可用
preferred_sources=akshare模拟主数据源降级场景。
选择性数据同步
选择性数据同步允许只更新特定类型的数据,适用于增量更新与数据修复场景。cli/tushare_init.py通过--sync-items参数(逗号分隔)指定同步类型,支持的可选值与 CLI 帮助文本一致(tushare_init.py):
| 取值 | 数据类型 |
|---|---|
basic_info | 股票基础信息 |
historical | 历史行情(日线) |
weekly | 周线数据 |
monthly | 月线数据 |
financial | 财务数据 |
quotes | 最新行情 |
news | 新闻数据 |
# 仅更新历史数据(最近30天) python cli/tushare_init.py --full --sync-items historical --historical-days 30 # 仅更新财务数据 python cli/tushare_init.py --full --sync-items financial # 同步多个数据类型 python cli/tushare_init.py --full --sync-items historical,financial,quotes相关 CLI 参数还包括--full(完整初始化)、--basic-only(仅基础信息)、--historical-days(默认 365 天)、--multi-period(多周期)、--force(覆盖已有数据)、--batch-size(默认 100)与--check-only(仅检查数据库状态)。更多细节可参考 Tushare 数据初始化指南。
全历史数据同步
阈值机制
当--historical-days >= 3650(10 年)时,系统自动切换为全历史模式,从 1990-01-01 起同步至今的全部数据:
| historical_days | 同步范围 | 说明 |
|---|---|---|
| < 3650 | 指定天数 | 从当前日期往前推算指定天数 |
| >= 3650 | 全历史 | 从 1990-01-01 至今的所有数据 |
使用示例
# Tushare 全历史初始化 python cli/tushare_init.py --full --historical-days 10000 # AKShare 全历史初始化 python cli/akshare_init.py --full --historical-days 10000 # BaoStock 全历史初始化 python cli/baostock_init.py --full --historical-days 10000 # 全历史多周期初始化(推荐生产环境) python cli/tushare_init.py --full --multi-period --historical-days 10000数据量参考与注意事项
| 同步模式 | 日线记录数 | 存储空间 | 同步耗时 |
|---|---|---|---|
| 默认 1 年 | ~1,250,000 条 | ~500MB | 30-60 分钟 |
| 全历史 | ~8,000,000 条 | 2-5GB | 2-4 小时 |
适用场景:生产环境首次部署(获取完整历史数据)、长期回测研究、历史数据补全。注意事项:
- 耗时较长:全历史同步需 2-4 小时,建议在非交易时间执行;
- API 限流:注意各数据源的调用频率限制;
- 存储空间:确保有 2-5GB 可用磁盘空间;
- 推荐策略:首次全历史初始化,日常增量更新。
更完整的参数说明见 Tushare 数据初始化指南。
多周期数据支持
支持的数据周期
三个数据源均支持多周期历史数据:
- 日线数据(daily):每个交易日的 OHLCV 数据;
- 周线数据(weekly):每周的 OHLCV 数据;
- 月线数据(monthly):每月的 OHLCV 数据。
数据存储模型
所有周期的数据统一存储在 MongoDB 的stock_daily_quotes集合中,通过period字段区分:
period: "daily"—— 日线数据period: "weekly"—— 周线数据period: "monthly"—— 月线数据
同步统计接口的实现印证了这一点:get_sync_statistics使用聚合管道按period与data_source分组统计记录数与最新交易日期(app/worker/multi_period_sync_service.py)。
初始化多周期数据
# Tushare 多周期初始化(默认1年) python cli/tushare_init.py --full --multi-period # 指定历史数据范围(6个月) python cli/tushare_init.py --full --multi-period --historical-days 180 # 全历史多周期初始化(从1990年至今,推荐生产环境) python cli/tushare_init.py --full --multi-period --historical-days 10000查询多周期数据
from tradingagents.config.database_manager import get_mongodb_client client = get_mongodb_client() db = client.get_database('tradingagents') collection = db.stock_daily_quotes # 查询日线数据 daily_data = list(collection.find({ 'symbol': '000001', 'period': 'daily', 'data_source': 'tushare' })) # 查询周线数据 weekly_data = list(collection.find({ 'symbol': '000001', 'period': 'weekly', 'data_source': 'tushare' })) # 查询月线数据 monthly_data = list(collection.find({ 'symbol': '000001', 'period': 'monthly', 'data_source': 'tushare' }))多周期同步 API
仓库还提供了独立的多周期同步 API 路由(app/routers/multi_period_sync.py),前缀为/api/multi-period-sync:
| 端点 | 功能 |
|---|---|
POST /start | 启动自定义多周期同步(可指定 symbols/periods/data_sources/日期范围) |
POST /start-daily | 启动日线同步 |
POST /start-weekly | 启动周线同步 |
POST /start-monthly | 启动月线同步 |
POST /start-all-history | 启动全历史多周期同步(1990 年至今) |
POST /start-incremental?days_back=30 | 启动最近 N 天增量同步 |
GET /statistics | 获取各周期/数据源的记录统计 |
GET /period-comparison/{symbol} | 对比同一股票同一交易日各周期数据 |
GET /supported-periods | 查询支持的周期与数据源组合 |
GET /health | 健康检查 |
底层服务MultiPeriodSyncService.sync_multi_period_data(app/worker/multi_period_sync_service.py)按「数据源 × 周期」双重循环逐个同步,累计各周期的记录数,并支持all_history模式自动换算全历史日期范围。
扩展新的数据源适配器
如需为系统添加新的数据源(如东方财富、同花顺等),遵循以下步骤:
- 继承
DataSourceAdapter基类:必须实现name、priority、is_available、get_stock_list、get_daily_basic、find_latest_trade_date、get_realtime_quotes、get_kline、get_news等抽象接口(见 app/services/data_sources/base.py); - 实现必要的抽象方法:其中
_get_default_priority()决定默认优先级数值; - 在
DataSourceManager中注册:在 manager.py 的__init__的self.adapters列表中追加适配器实例; - 添加相应的测试用例:可参照 scripts/test_multi_source_sync.py 的端到端测试模式;
- 更新文档:补充数据源说明与优先级描述。
此外,DataSourceManager已预留可选的数据一致性检查器(DataConsistencyChecker,位于 app/services/data_sources/data_consistency_checker.py):当依赖可用且可用数据源不少于两个时,可对主、次数据源的daily_basic数据进行交叉比对、置信度评分与冲突消解(manager.py 的get_daily_basic_with_consistency_check),这是向「跨数据源数据对比与自动数据修复」演进的现成基础。
未来规划
据仓库文档所述,多数据源同步的演进方向包括:
- 更多数据源支持:东方财富 API、同花顺 API、Wind API(企业版);
- 智能数据源选择:基于数据质量自动选择、成本优化算法、实时性能监控;
- 数据验证和清洗:跨数据源数据对比、异常数据检测、自动数据修复。
注意:以上为项目规划方向,尚未在当前仓库代码中全部实现;目前仓库已具备的是一致性检查器基础设施与多源 Fallback 能力。
小结
多数据源同步是 TradingAgents-CN 数据链路的可靠性基石:通过「Tushare > AKShare > BaoStock」的默认优先级与逐级 Fallback,保证股票基础信息与财务指标在任意单点故障下仍可持续供给;配合状态检查、连通性测试、同步建议等 API,运维可以快速定位数据源问题;而选择性同步、全历史同步与多周期同步则覆盖了从首次部署、增量更新到长期回测的完整数据生命周期。文中涉及的源码入口包括 app/services/data_sources/、app/services/multi_source_basics_sync_service.py、app/routers/multi_source_sync.py、app/worker/multi_period_sync_service.py 与 cli/tushare_init.py,读者可按需深入阅读。
【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考