统一加载器架构

📎 引用文件

本文引用的文件 - base.py - registry.py - _symbol_utils.py - yahoo_loader.py - tushare.py - local_loader.py - test_loader_retry_helpers.py - test_registry.py

目录

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

简介

本文件为 Vibe-Trading 的统一数据加载器架构提供系统化文档。重点覆盖: - BaseLoader 抽象基类(实际以 Protocol 与共享工具实现)的设计模式、数据源注册机制与符号工具函数 - 数据加载器的生命周期管理、错误处理策略与性能优化技术 - 统一的数据接口规范,包括 OHLCV 数据结构、时间序列处理与元数据管理 - 自定义数据源开发指南:接口实现、数据验证与测试方法 - 数据缓存策略、重试逻辑与并发处理的实践建议

项目结构

统一加载器位于 agent/backtest/loaders 目录,采用“协议 + 注册表 + 多实现”的分层组织: - base.py:定义 DataLoaderProtocol 协议、校验工具、重试与预算控制、本地缓存等通用能力 - registry.py:维护全局注册表、市场级回退链、自动解析与不可降级约束 - _symbol_utils.py:交易所代码识别(如 ETF/LOF 前缀) - 各 loader 实现:遵循统一接口,封装不同数据源的获取与标准化流程 - tests:对重试、缓存、注册与回退链的单元测试

graph TB subgraph "加载器基础设施" BASE["base.py<br/>协议/校验/重试/缓存"] REG["registry.py<br/>注册表/回退链/解析"] SYM["_symbol_utils.py<br/>符号工具"] end subgraph "具体加载器实现" YAHOO["yahoo_loader.py"] TUSHARE["tushare.py"] LOCAL["local_loader.py"] end BASE --> YAHOO BASE --> TUSHARE BASE --> LOCAL REG --> YAHOO REG --> TUSHARE REG --> LOCAL SYM --> TUSHARE

图表来源 - base.py:618-645 - registry.py:23-59 - _symbol_utils.py:9-21 - yahoo_loader.py:173-185 - tushare.py:116-128 - local_loader.py:1-43

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

核心组件

章节来源 - base.py:31-119 - base.py:163-236 - base.py:243-439 - registry.py:62-115 - registry.py:136-193 - registry.py:196-249

架构总览

统一加载器通过“协议 + 注册表 + 回退链”解耦上层调用与底层数据源: - 上层仅依赖 DataLoaderProtocol 与 resolve_loader/get_loader_cls_with_fallback - 每个 Loader 实现 is_available 与 fetch,并在模块导入时通过 @register 自注册 - 按市场类型选择回退链,优先选择稳定、低限流风险的数据源;必要时降级到备选源 - 所有 Loader 输出统一的 OHLCV DataFrame 结构,便于后续回测引擎消费

sequenceDiagram participant Caller as "调用方" participant Reg as "registry.resolve_loader" participant Ldr as "具体Loader实例" participant Base as "base.* 工具" participant Src as "外部数据源" Caller->>Reg : 请求市场类型 Reg->>Reg : 遍历回退链 Reg->>Ldr : 构造并 is_available() alt 可用 Caller->>Ldr : fetch(codes, start, end, interval, fields) Ldr->>Base : validate_date_range / cached_loader_fetch Ldr->>Src : 拉取原始数据 Src-->>Ldr : 原始记录 Ldr->>Ldr : 标准化为OHLCV DataFrame Ldr-->>Caller : {symbol : DataFrame} else 不可用 Reg->>Reg : 尝试下一个回退源 end

图表来源 - registry.py:158-193 - base.py:31-119 - base.py:401-439 - yahoo_loader.py:191-200

详细组件分析

BaseLoader 抽象基类(Protocol)与统一接口

章节来源 - base.py:618-645

数据源注册机制与回退链

flowchart TD Start(["开始"]) --> Ensure["_ensure_registered()"] Ensure --> Chain{"根据市场选择回退链"} Chain --> TryNext["依次尝试每个source"] TryNext --> Construct["构造Loader实例"] Construct --> Avail{"is_available() ?"} Avail -- 是 --> Return["返回实例"] Avail -- 否 --> Next["下一个source"] Next --> |无更多| Error["抛出 NoAvailableSourceError"] Next --> TryNext

图表来源 - registry.py:71-115 - registry.py:136-193 - registry.py:196-249

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

符号工具函数

章节来源 - _symbol_utils.py:9-21 - tushare.py:88-97

统一数据接口规范

章节来源 - yahoo_loader.py:125-170 - base.py:574-595

生命周期管理与错误处理

章节来源 - base.py:31-119 - base.py:163-236 - tushare.py:18-49 - registry.py:117-124

性能优化技术

章节来源 - base.py:243-439 - base.py:475-595 - yahoo_loader.py:125-170

依赖关系分析

graph LR BASE["base.py"] --> REG["registry.py"] BASE --> YAHOO["yahoo_loader.py"] BASE --> TUSHARE["tushare.py"] BASE --> LOCAL["local_loader.py"] REG --> YAHOO REG --> TUSHARE REG --> LOCAL SYM["_symbol_utils.py"] --> TUSHARE

图表来源 - base.py:618-645 - registry.py:23-59 - _symbol_utils.py:9-21

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

性能考量

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

故障排查指南

章节来源 - registry.py:158-193 - base.py:475-595 - test_loader_retry_helpers.py:74-166

结论

统一加载器架构通过清晰的协议、健壮的注册与回退机制、完善的校验与重试、以及高效的本地缓存,实现了跨数据源的一致性与鲁棒性。该设计使上层业务无需关心底层数据源差异,同时为扩展新数据源提供了最小侵入的接入方式。

[本节为总结性内容,不直接分析具体文件]

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

接口实现

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

数据验证

章节来源 - base.py:31-119 - yahoo_loader.py:125-170

重试与预算

章节来源 - base.py:163-236 - test_loader_retry_helpers.py:74-166

缓存集成

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

测试方法

章节来源 - test_loader_retry_helpers.py:1-200 - test_registry.py:1-200