数据源架构

📎 引用文件

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

目录

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

简介

本文件系统性梳理 Vibe-Trading 的数据源架构,围绕 DataLoaderProtocol 接口设计、数据源注册机制与适配器模式展开,解释可用性检查、认证管理、市场分类策略;记录内置数据源(Yahoo Finance、Tushare、Binance、OKX、CCXT、Local 等)及其特性对比;提供自定义数据源开发指南与最佳实践;并说明路由策略、负载均衡与故障转移机制。

项目结构

数据源子系统位于 backtest/loaders 目录,采用“协议 + 注册表 + 多实现”的分层组织: - base.py:定义 DataLoaderProtocol 协议、通用校验、重试/预算工具、本地缓存等基础设施。 - registry.py:全局注册表、市场级回退链、自动发现与解析。 - 各 loader 模块:具体数据源实现(Yahoo、Tushare、Binance、OKX、CCXT、Local 等),通过 @register 装饰器自注册。

graph TB subgraph "加载器基础" BASE["base.py<br/>协议/校验/重试/缓存"] end subgraph "注册与路由" REG["registry.py<br/>注册表/回退链/解析"] end subgraph "数据源实现" YAHOO["yahoo_loader.py"] TUSHARE["tushare.py"] BINANCE["binance_loader.py"] OKX["okx.py"] CCXT["ccxt_loader.py"] LOCAL["local_loader.py"] end BASE --> REG REG --> YAHOO REG --> TUSHARE REG --> BINANCE REG --> OKX REG --> CCXT REG --> LOCAL

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

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

核心组件

章节来源 - base.py:27-119 - base.py:163-236 - base.py:243-439 - registry.py:23-155 - registry.py:158-249

架构总览

下图展示从调用方到数据源的完整流程:注册表懒加载导入各 loader 模块,按市场回退链尝试 is_available(),命中后执行 fetch(),期间使用缓存与重试/预算工具保障稳定性。

sequenceDiagram participant Caller as "调用方" participant Reg as "registry.py" participant Ldr as "具体Loader" participant Base as "base.py(重试/缓存)" participant API as "外部API/本地文件" Caller->>Reg : resolve_loader(market) / get_loader_cls_with_fallback(source) Reg->>Reg : _ensure_registered() 导入所有loader模块 loop 遍历回退链 Reg->>Ldr : 构造实例并 is_available() alt 可用 Caller->>Ldr : fetch(codes, start_date, end_date, interval, fields) Ldr->>Base : cached_loader_fetch(...) Base-->>Ldr : 命中则返回缓存DataFrame alt 未命中 Ldr->>API : 拉取数据(带重试/预算) API-->>Ldr : OHLCV DataFrame Ldr->>Base : 写入缓存(可选) end Ldr-->>Caller : {symbol : DataFrame} else 不可用 Reg-->>Reg : 继续下一个候选 end end alt 全部不可用 Reg-->>Caller : NoAvailableSourceError end

图表来源 - registry.py:71-115 - registry.py:158-193 - base.py:401-439 - base.py:184-236

详细组件分析

DataLoaderProtocol 与适配器模式

classDiagram class DataLoaderProtocol { +string name +set~string~ markets +bool requires_auth +is_available() bool +fetch(codes, start_date, end_date, interval, fields) dict } class YahooDataLoader class TushareDataLoader class BinanceDataLoader class OkxDataLoader class CcxtDataLoader class LocalDataLoader DataLoaderProtocol <|.. YahooDataLoader DataLoaderProtocol <|.. TushareDataLoader DataLoaderProtocol <|.. BinanceDataLoader DataLoaderProtocol <|.. OkxDataLoader DataLoaderProtocol <|.. CcxtDataLoader DataLoaderProtocol <|.. LocalDataLoader

图表来源 - base.py:618-645 - yahoo_loader.py:173-271 - tushare.py:116-383 - binance_loader.py:23-45 - okx.py:101-373 - ccxt_loader.py:184-502 - local_loader.py:219-354

章节来源 - base.py:618-645 - yahoo_loader.py:1-271 - tushare.py:1-383 - binance_loader.py:1-45 - okx.py:1-373 - ccxt_loader.py:1-502 - local_loader.py:1-354

数据源注册机制与路由策略

flowchart TD A["请求 source/market"] --> B{"是否指定source?"} B -- 否 --> C["按市场回退链尝试"] B -- 是 --> D["尝试指定source"] D --> E{"可用?"} E -- 是 --> F["返回该source"] E -- 否 --> G{"是否受限源(local/qveris)?"} G -- 是 --> H["抛出NoAvailableSourceError"] G -- 否 --> I["按source.markets查找同市场回退"] C --> J{"有可用?"} J -- 是 --> F J -- 否 --> K["抛出NoAvailableSourceError"]

图表来源 - registry.py:62-115 - registry.py:158-249

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

可用性检查与认证管理

章节来源 - yahoo_loader.py:173-189 - tushare.py:124-138 - okx.py:101-129 - ccxt_loader.py:184-201 - local_loader.py:219-238

市场分类与回退链

章节来源 - registry.py:131-155

内置数据源特性对比

章节来源 - yahoo_loader.py:1-271 - tushare.py:1-383 - binance_loader.py:1-45 - okx.py:1-373 - ccxt_loader.py:1-502 - local_loader.py:1-354

自定义数据源开发指南与最佳实践

章节来源 - base.py:31-119 - base.py:163-236 - base.py:401-439 - registry.py:62-115 - registry.py:131-155

数据源路由、负载均衡与故障转移

sequenceDiagram participant M as "market_data.fetch_market_data" participant R as "registry.resolve_loader" participant O as "OkxDataLoader" participant B as "BinanceDataLoader" M->>R : 解析 crypto 回退链 R->>O : is_available() O-->>R : False (模拟不可用) R->>B : is_available() B-->>R : True R-->>M : 返回 BinanceDataLoader M->>B : fetch(["BTC-USDT"], ...) B-->>M : 返回DataFrame

图表来源 - registry.py:158-193 - test_binance_fallback.py:11-42

章节来源 - registry.py:158-193 - test_binance_fallback.py:1-42

依赖关系分析

graph LR REG["registry.py"] --> BASE["base.py"] YAHOO["yahoo_loader.py"] --> BASE TUSHARE["tushare.py"] --> BASE BINANCE["binance_loader.py"] --> BASE OKX["okx.py"] --> BASE CCXT["ccxt_loader.py"] --> BASE LOCAL["local_loader.py"] --> BASE

图表来源 - registry.py:15-115 - base.py:1-645

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

性能考量

章节来源 - base.py:163-236 - base.py:243-439 - ccxt_loader.py:50-57 - okx.py:67-69 - local_loader.py:83-127

故障排查指南

章节来源 - registry.py:158-193 - tushare.py:18-79 - okx.py:291-322 - ccxt_loader.py:426-502 - base.py:475-511

结论

Vibe-Trading 的数据源架构通过统一的 DataLoaderProtocol 与注册表/回退链机制,实现了多市场、多供应商的统一接入与高可用调度。内置数据源覆盖主流市场与资产类别,配合重试/预算、本地缓存与严格的数据校验,保障了回测与研究的稳定性与可重复性。扩展新数据源只需遵循协议与注册规范,即可无缝融入现有生态。

附录