数据源集成

📎 引用文件

本文引用的文件 - base.py - registry.py - yahoo_loader.py - yfinance_loader.py - tushare.py - ccxt_loader.py - binance_loader.py - okx.py - local_loader.py - _symbol_utils.py - cn_adjust.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与缓存
  8. 故障排查指南
  9. 结论
  10. 附录:自定义数据源开发指南

简介

本文件面向 Vibe-Trading 的“统一数据加载器”体系,系统性说明数据源注册机制、适配器模式实现、内置数据源(Yahoo Finance、Tushare、Binance、OKX、CCXT、yfinance、本地文件等)的集成方式、数据格式转换与错误处理策略,并解释数据缓存、重试逻辑与性能优化技术。文末提供自定义数据源开发指南与多市场最佳实践。

项目结构

数据加载子系统位于 agent/backtest/loaders 目录,采用“协议 + 注册表 + 具体适配器”的分层设计: - base.py:定义 DataLoaderProtocol 协议、通用校验、重试/预算工具、本地 Parquet 缓存。 - registry.py:集中注册所有 loader 模块,维护按市场的回退链(fallback chains)。 - 各 loader 文件:实现 Yahoo、yfinance、Tushare、CCXT/Binance、OKX、Local 等具体数据源适配。 - 辅助模块:符号类型识别(_symbol_utils)、A股复权(cn_adjust)等。

graph TB subgraph "加载器核心" Base["base.py<br/>协议/校验/重试/缓存"] Reg["registry.py<br/>注册表/回退链"] end subgraph "内置数据源" YF["yahoo_loader.py"] YF2["yfinance_loader.py"] TS["tushare.py"] CCXT["ccxt_loader.py"] BIN["binance_loader.py"] OKX["okx.py"] LOC["local_loader.py"] end subgraph "辅助" Sym["_symbol_utils.py"] Adj["cn_adjust.py"] end Reg --> YF Reg --> YF2 Reg --> TS Reg --> CCXT Reg --> BIN Reg --> OKX Reg --> LOC TS --> Adj YF --> Base YF2 --> Base TS --> Base CCXT --> Base BIN --> CCXT OKX --> Base LOC --> Base

图表来源 - registry.py:1-249 - base.py:1-645 - yahoo_loader.py:1-271 - yfinance_loader.py:1-342 - tushare.py:1-383 - ccxt_loader.py:1-502 - binance_loader.py:1-45 - okx.py:1-373 - local_loader.py:1-354

章节来源 - registry.py:1-249 - base.py:1-645

核心组件

章节来源 - base.py:27-119 - base.py:163-236 - base.py:243-439

架构总览

系统通过“按市场类型的回退链”自动选择可用数据源;每个 loader 仅关注自身协议实现与数据归一化。

sequenceDiagram participant Caller as "调用方" participant Reg as "registry.resolve_loader" participant Ldr as "具体DataLoader" participant Cache as "base.cached_loader_fetch" participant Net as "外部API/本地文件" Caller->>Reg : 指定 market/source Reg->>Reg : _ensure_registered() Reg->>Reg : 遍历 FALLBACK_CHAINS Reg->>Ldr : 构造并 is_available() alt 可用 Caller->>Ldr : fetch(codes, start, end, interval, fields) Ldr->>Cache : 尝试读取缓存 alt 命中 Cache-->>Ldr : DataFrame else 未命中 Ldr->>Net : 拉取数据(带重试/预算) Net-->>Ldr : 原始数据 Ldr->>Ldr : 标准化为OHLCV Ldr->>Cache : 写入缓存 Cache-->>Ldr : 成功/忽略失败 end Ldr-->>Caller : {symbol : DataFrame} else 不可用 Reg->>Reg : 继续下一个候选 end

图表来源 - registry.py:158-193 - base.py:401-439

详细组件分析

统一协议与注册机制

classDiagram class DataLoaderProtocol { +name : str +markets : set +requires_auth : bool +is_available() bool +fetch(codes, start_date, end_date, interval, fields) dict } class Registry { +LOADER_REGISTRY : dict +FALLBACK_CHAINS : dict +resolve_loader(market) +get_loader_cls_with_fallback(source) } class YahooLoader class TushareLoader class CcxtLoader class BinanceLoader class OkxLoader class LocalLoader Registry --> DataLoaderProtocol : "管理实例" YahooLoader ..|> DataLoaderProtocol TushareLoader ..|> DataLoaderProtocol CcxtLoader ..|> DataLoaderProtocol BinanceLoader ..|> CcxtLoader OkxLoader ..|> DataLoaderProtocol LocalLoader ..|> DataLoaderProtocol

图表来源 - base.py:618-645 - registry.py:23-155

章节来源 - registry.py:62-115 - registry.py:158-249

Yahoo Finance(直接 HTTP)

flowchart TD Start(["开始"]) --> Validate["校验日期范围"] Validate --> Loop{"遍历代码"} Loop --> |是| FetchOne["获取单标的行情"] FetchOne --> Normalize["标准化为OHLCV"] Normalize --> Filter["裁剪至起止日期"] Filter --> CachePut{"是否可缓存"} CachePut --> |是| Put["写入Parquet缓存"] CachePut --> |否| Return["返回结果"] Put --> Return Loop --> |否| End(["结束"])

图表来源 - yahoo_loader.py:173-271 - base.py:401-439

章节来源 - yahoo_loader.py:1-271

yfinance(Yahoo 封装)

章节来源 - yfinance_loader.py:1-342

Tushare(A股/港股/期货/基金)

flowchart TD S(["开始"]) --> DType{"标的类型?"} DType --> |A股/基金| Daily["调用 daily/fund_daily"] DType --> |指数| Index["调用 index_daily"] DType --> |港股| HK["调用 hk_daily"] Daily --> Adj["获取复权因子并前复权"] Index --> NoAdj["指数连续,不复权"] HK --> NoAdj Adj --> Merge["可选合并基本面字段"] NoAdj --> Merge Merge --> Out["输出OHLCV"]

图表来源 - tushare.py:116-383 - cn_adjust.py:27-78

章节来源 - tushare.py:1-383 - cn_adjust.py:1-78

CCXT(统一加密交易所)

sequenceDiagram participant C as "调用方" participant L as "CcxtDataLoader" participant X as "CCXT Exchange" C->>L : fetch(codes, start, end, interval) L->>L : 解析symbol/类型(spot/swap) L->>X : 分页拉取OHLCV(带预算/重试) X-->>L : 原始K线 L->>L : 标准化/过滤/校验 alt swap L->>X : 拉取mark价格与funding历史 X-->>L : mark/funding L->>L : 对齐并填充funding_rate end L-->>C : {symbol : DataFrame}

图表来源 - ccxt_loader.py:184-502

章节来源 - ccxt_loader.py:1-502

Binance(专用 CCXT 包装)

章节来源 - binance_loader.py:1-45

OKX(现货K线)

章节来源 - okx.py:1-373

本地数据源(CSV/Parquet/DuckDB)

章节来源 - local_loader.py:1-354

依赖关系分析

graph LR Base["base.py"] --> Reg["registry.py"] Reg --> YF["yahoo_loader.py"] Reg --> YF2["yfinance_loader.py"] Reg --> TS["tushare.py"] Reg --> CCXT["ccxt_loader.py"] Reg --> BIN["binance_loader.py"] Reg --> OKX["okx.py"] Reg --> LOC["local_loader.py"] TS --> Adj["cn_adjust.py"]

图表来源 - registry.py:83-115 - base.py:618-645

章节来源 - registry.py:83-115

性能与缓存

章节来源 - base.py:163-236 - base.py:243-439 - ccxt_loader.py:50-57 - okx.py:67-69 - tushare.py:18-35

故障排查指南

章节来源 - registry.py:158-193 - tushare.py:38-79 - base.py:31-119 - base.py:243-439 - ccxt_loader.py:73-92 - okx.py:72-98

结论

Vibe-Trading 的数据加载器体系通过统一的协议、注册表与回退链,实现了跨市场、跨供应商的稳定数据接入。内置数据源覆盖 A 股、港股、美股、加密资产与本地文件,配合强化的重试/预算与本地缓存,显著提升了鲁棒性与性能。遵循本文档的规范与最佳实践,可快速扩展新的数据源并保持与现有生态一致的行为。

附录:自定义数据源开发指南

接口规范

章节来源 - base.py:618-645 - registry.py:62-68

数据验证与清洗

章节来源 - base.py:31-119

缓存与重试

章节来源 - base.py:163-236 - base.py:401-439

测试方法

[本节为通用指导,不直接引用具体文件]

多市场最佳实践

[本节为通用指导,不直接引用具体文件]