市场数据源

📎 引用文件

本文引用的文件 - agent/backtest/loaders/registry.py - agent/backtest/loaders/base.py - agent/src/market_data.py - agent/backtest/loaders/yahoo_loader.py - agent/backtest/loaders/yahoo_client.py - agent/backtest/loaders/tushare.py - agent/backtest/loaders/eastmoney_loader.py - agent/backtest/loaders/eastmoney_client.py - agent/backtest/loaders/ccxt_loader.py - agent/backtest/loaders/binance_loader.py - agent/backtest/loaders/cn_adjust.py - agent/src/config/env_schema.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件为 Vibe-Trading 的市场数据源集成提供综合文档,覆盖 Yahoo Finance、Tushare、Binance、CCXT、东方财富等主流数据源的接入方式、API 特性与配置项;说明各数据源的数据格式差异、时区处理与复权因子计算;描述数据获取策略、频率限制与错误恢复机制;并给出多市场同步的最佳实践(一致性保证与增量更新)、常见问题诊断方法与性能调优技巧。

项目结构

Vibe-Trading 将“数据源加载器”抽象为统一接口,并通过注册表与回退链实现跨市场的自动选择与容错。关键路径: - 统一入口与路由:market_data.fetch_market_data - 加载器注册与回退:loaders.registry - 通用能力:重试/预算/缓存/校验:loaders.base - 具体数据源:yahoo_loader、tushare、eastmoney_loader、ccxt_loader、binance_loader - 客户端层:yahoo_client、eastmoney_client - 复权因子:cn_adjust - 配置中心:env_schema(环境变量与默认值)

graph TB A["调用方<br/>fetch_market_data"] --> B["路由与分组<br/>detect_source/_detect_market"] B --> C["回退链选择<br/>FALLBACK_CHAINS"] C --> D["加载器实例化<br/>get_loader_cls_with_fallback"] D --> E["Yahoo 加载器<br/>yahoo_loader"] D --> F["Tushare 加载器<br/>tushare"] D --> G["东方财富加载器<br/>eastmoney_loader"] D --> H["CCXT 加载器<br/>ccxt_loader"] D --> I["Binance 专用加载器<br/>binance_loader"] E --> J["Yahoo 客户端<br/>yahoo_client"] G --> K["东方财富客户端<br/>eastmoney_client"] F --> L["A股复权因子<br/>cn_adjust"]

图表来源 - agent/src/market_data.py:97-223 - agent/backtest/loaders/registry.py:136-193 - agent/backtest/loaders/yahoo_loader.py:173-271 - agent/backtest/loaders/tushare.py:116-202 - agent/backtest/loaders/eastmoney_loader.py:51-143 - agent/backtest/loaders/ccxt_loader.py:184-308 - agent/backtest/loaders/binance_loader.py:23-44

章节来源 - agent/src/market_data.py:16-63 - agent/backtest/loaders/registry.py:23-155

核心组件

章节来源 - agent/backtest/loaders/base.py:27-119 - agent/backtest/loaders/base.py:163-236 - agent/backtest/loaders/base.py:243-439 - agent/backtest/loaders/registry.py:136-193 - agent/src/market_data.py:16-63

架构总览

下图展示从请求到数据返回的端到端流程,包括自动路由、回退链、加载器执行与客户端访问。

sequenceDiagram participant U as "调用方" participant M as "market_data.fetch_market_data" participant R as "registry.resolve_loader" participant L as "具体Loader" participant C as "客户端(如yahoo_client/eastmoney_client)" participant S as "外部服务(Yahoo/Tushare/Eastmoney/CCXT)" U->>M : 传入 codes/start/end/source/interval M->>M : detect_source + _detect_market M->>R : get_loader_cls_with_fallback(source) R-->>M : Loader类或抛出NoAvailableSourceError M->>L : loader.fetch(codes, start, end, interval) L->>C : 调用客户端拉取K线/行情 C->>S : HTTP/REST 请求(受节流/代理/超时保护) S-->>C : 原始数据(JSON/CSV) C-->>L : 标准化行/列 L-->>M : {symbol : DataFrame} M-->>U : JSON安全结果(含_provenance可选)

图表来源 - agent/src/market_data.py:97-223 - agent/backtest/loaders/registry.py:158-193 - agent/backtest/loaders/yahoo_client.py:156-205 - agent/backtest/loaders/eastmoney_client.py:269-324 - agent/backtest/loaders/ccxt_loader.py:426-501

详细组件分析

Yahoo Finance(yahoo_loader + yahoo_client)

flowchart TD Start(["进入 Yahoo 加载器"]) --> CheckSupported{"是否支持的代码?"} CheckSupported -- 否 --> ReturnNone["返回空/跳过"] CheckSupported -- 是 --> MapInterval["映射 interval"] MapInterval --> FetchChart["调用 yahoo_client.get_chart"] FetchChart --> ParseRows["解析为 OHLCV 行"] ParseRows --> Normalize["转 DatetimeIndex 并归一化(非日内)"] Normalize --> Clip["裁剪到[start,end]闭区间"] Clip --> CachePut{"可缓存?"} CachePut -- 是 --> Put["写入本地 parquet"] CachePut -- 否 --> Done["返回 DataFrame"] Put --> Done

图表来源 - agent/backtest/loaders/yahoo_loader.py:44-73 - agent/backtest/loaders/yahoo_loader.py:125-170 - agent/backtest/loaders/yahoo_client.py:156-205 - agent/backtest/loaders/base.py:301-439

章节来源 - agent/backtest/loaders/yahoo_loader.py:173-271 - agent/backtest/loaders/yahoo_client.py:71-93 - agent/backtest/loaders/yahoo_client.py:95-153

Tushare(A股/港股/基金/指数)

flowchart TD S(["开始"]) --> Type{"代码类型"} Type -- 指数/ETF/港股/美股权/加密 --> SkipAdj["跳过复权或跳过"] Type -- A股/基金 --> FetchDaily["拉取日线"] FetchDaily --> AdjFactor["拉取 adj_factor"] AdjFactor --> QFQ["apply_qfq 前复权"] QFQ --> MergeBasic{"是否请求基本面?"} MergeBasic -- 是 --> Merge["合并 daily_basic 字段"] MergeBasic -- 否 --> Done["返回DataFrame"] Merge --> Done SkipAdj --> Done

图表来源 - agent/backtest/loaders/tushare.py:204-265 - agent/backtest/loaders/cn_adjust.py:27-78 - agent/backtest/loaders/tushare.py:51-79

章节来源 - agent/backtest/loaders/tushare.py:116-202 - agent/backtest/loaders/tushare.py:322-382 - agent/backtest/loaders/cn_adjust.py:1-78

东方财富(Eastmoney)

flowchart TD A["输入代码"] --> Resolve["resolve_secid(按后缀/A股/港股/美股搜索)"] Resolve --> KLT{"是否支持的时间粒度?"} KLT -- 否 --> None["返回空"] KLT -- 是 --> Fetch["fetch_kline(secid,klt,fqt,beg,end)"] Fetch --> Frame["_frame_from_rows 构建OHLCV"] Frame --> Out["返回DataFrame"]

图表来源 - agent/backtest/loaders/eastmoney_client.py:208-236 - agent/backtest/loaders/eastmoney_client.py:269-324 - agent/backtest/loaders/eastmoney_loader.py:112-143

章节来源 - agent/backtest/loaders/eastmoney_loader.py:51-143 - agent/backtest/loaders/eastmoney_client.py:1-325

CCXT(加密货币通用)

sequenceDiagram participant L as "CCXT DataLoader" participant X as "Exchange(由CCXT创建)" participant P as "分页拉取" L->>X : fetch_ohlcv(symbol,timeframe,since,limit) loop 直到结束或达到预算 P->>X : 下一页(since=last_ts+1) X-->>P : OHLCV 列表 end P-->>L : 合并后的DataFrame Note over L,P : 若为永续则追加mark价格与资金费率

图表来源 - agent/backtest/loaders/ccxt_loader.py:226-308 - agent/backtest/loaders/ccxt_loader.py:426-501 - agent/backtest/loaders/ccxt_loader.py:310-372

章节来源 - agent/backtest/loaders/ccxt_loader.py:184-308 - agent/backtest/loaders/ccxt_loader.py:374-424

Binance(专用 CCXT 封装)

章节来源 - agent/backtest/loaders/binance_loader.py:1-45

数据格式与时区处理要点

章节来源 - agent/backtest/loaders/yahoo_loader.py:125-170 - agent/backtest/loaders/eastmoney_loader.py:145-177 - agent/backtest/loaders/tushare.py:204-265 - agent/backtest/loaders/ccxt_loader.py:426-501

依赖关系分析

graph LR MD["market_data"] --> REG["registry.FALLBACK_CHAINS"] MD --> SRC["detect_source"] REG --> YAH["yahoo_loader"] REG --> TS["tushare"] REG --> EM["eastmoney_loader"] REG --> CC["ccxt_loader"] CC --> BIN["binance_loader"] YAH --> YC["yahoo_client"] EM --> EC["eastmoney_client"] TS --> ADJ["cn_adjust"]

图表来源 - agent/src/market_data.py:16-63 - agent/backtest/loaders/registry.py:136-155 - agent/backtest/loaders/binance_loader.py:23-44

章节来源 - agent/backtest/loaders/registry.py:136-193 - agent/src/config/env_schema.py:153-198

性能考虑

章节来源 - agent/backtest/loaders/base.py:163-236 - agent/backtest/loaders/base.py:243-439 - agent/backtest/loaders/ccxt_loader.py:50-57 - agent/backtest/loaders/yahoo_client.py:44-68 - agent/backtest/loaders/eastmoney_client.py:32-40 - agent/src/market_data.py:66-84

故障排查指南

章节来源 - agent/backtest/loaders/tushare.py:18-48 - agent/backtest/loaders/yahoo_client.py:95-153 - agent/backtest/loaders/ccxt_loader.py:493-501 - agent/backtest/loaders/base.py:475-533

结论

Vibe-Trading 通过统一的数据加载协议、注册表与回退链,实现了跨市场、跨数据源的稳健集成。Yahoo、东方财富、Tushare、CCXT/Binance 各有侧重:前者适合公开免费数据与高并发场景,后者提供丰富的加密资产与合约数据。结合节流、预算、重试与本地缓存,系统在稳定性与性能之间取得平衡。建议在生产环境开启缓存、合理设置预算与间隔,并根据市场特征选择合适的回退顺序。

附录

配置项速查(数据相关)

章节来源 - agent/src/config/env_schema.py:153-198

多市场同步最佳实践

章节来源 - agent/src/market_data.py:198-223 - agent/backtest/loaders/base.py:328-439 - agent/backtest/loaders/registry.py:117-124