数据源集成架构

📎 引用文件

本文引用的文件 - registry.py - base.py - yahoo_loader.py - binance_loader.py - ccxt_loader.py - akshare_loader.py - local_loader.py - test_registry.py - test_yahoo_loader.py

目录

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

简介

本文件系统性说明 Vibe-Trading 的数据源集成架构,重点覆盖: - 18+ 数据源的统一接入机制:注册表、市场类型映射与自动回退链。 - 各数据源特性对比(A股、美股、港股、加密货币等)、配置方法与认证流程。 - 数据格式标准化过程:OHLCV 数据结构、时间戳处理与货币单位转换。 - 自定义数据源开发指南:基类继承、接口实现与测试要求。 - 实际使用示例:查询不同市场数据与异常处理。

项目结构

数据加载器位于 backtest/loaders 目录,采用“协议 + 注册表 + 回退链”的解耦设计: - base.py 定义 DataLoaderProtocol 协议、通用校验与重试/预算工具、本地缓存。 - registry.py 维护全局注册表 LOADER_REGISTRY、市场到回退链的映射 FALLBACK_CHAINS、以及 resolve_loader/get_loader_cls_with_fallback 等调度函数。 - 具体 loader 通过 @register 装饰器自注册,声明 name/markets/requires_auth,并实现 is_available/fetch。 - 测试覆盖注册表行为与关键 loader 的行为契约。

graph TB subgraph "加载器层" YF["Yahoo 加载器"] AK["AKShare 加载器"] CCXT["CCXT 加载器"] BIN["Binance 加载器"] LOC["本地加载器"] end REG["注册表<br/>LOADER_REGISTRY / FALLBACK_CHAINS"] BASE["协议与工具<br/>DataLoaderProtocol / 重试 / 缓存"] YF --> REG AK --> REG CCXT --> REG BIN --> REG LOC --> REG REG --> BASE

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

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

核心组件

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

架构总览

下图展示从调用方到具体数据源的请求流,包含市场路由、回退链选择、加载器执行与标准化输出。

sequenceDiagram participant Caller as "调用方" participant Reg as "注册表/回退链" participant Ldr as "具体加载器" participant Net as "外部API/本地文件" Caller->>Reg : resolve_loader(市场) Reg->>Reg : 遍历 FALLBACK_CHAINS[市场] alt 找到可用加载器 Reg-->>Caller : 返回加载器实例 Caller->>Ldr : fetch(codes, start, end, interval) Ldr->>Net : 拉取数据或读取本地文件 Net-->>Ldr : 原始数据 Ldr->>Ldr : 标准化(OHLCV/时间戳/字段) Ldr-->>Caller : {symbol : DataFrame} else 全部不可用 Reg-->>Caller : 抛出 NoAvailableSourceError end

图表来源 - registry.py:158-193 - base.py:618-645

详细组件分析

注册表与市场回退链

flowchart TD Start(["开始"]) --> Ensure["_ensure_registered() 确保所有加载器已导入"] Ensure --> Chain{"获取 FALLBACK_CHAINS[market]"} Chain --> |为空| RaiseErr["抛出 NoAvailableSourceError"] Chain --> ForEach{"遍历候选源"} ForEach --> TryInst["尝试构造加载器实例"] TryInst --> Avail{"is_available() ?"} Avail --> |是| ReturnLdr["返回该加载器"] Avail --> |否| Next["下一个候选"] Next --> ForEach ForEach --> |全部失败| RaiseErr

图表来源 - registry.py:71-114 - registry.py:158-193

章节来源 - registry.py:23-155 - registry.py:158-249 - test_registry.py:133-189

Yahoo 加载器(美股/港股/加股/印股)

classDiagram class DataLoader { +string name +set markets +bool requires_auth +is_available() bool +fetch(codes, start_date, end_date, interval, fields) dict } class YahooLoader { +name = "yahoo" +markets = {"us_equity","hk_equity","india_equity","kr_equity","ca_equity"} +requires_auth = False +is_available() True +fetch(...) -_to_yahoo_interval(interval) -_rows_to_frame(rows, start, end, interval) } DataLoader <|-- YahooLoader

图表来源 - base.py:618-645 - yahoo_loader.py:173-271

章节来源 - yahoo_loader.py:1-271 - test_yahoo_loader.py:56-107 - test_yahoo_loader.py:130-176 - test_yahoo_loader.py:188-320

Binance 专用加载器(加密货币)

classDiagram class CcxtDataLoader { +name = "ccxt" +markets = {"crypto"} +requires_auth = False +fetch(...) -_get_exchange(instrument_type) } class BinanceLoader { +name = "binance" +markets = {"crypto"} +requires_auth = False -_get_exchange(instrument_type) } CcxtDataLoader <|-- BinanceLoader

图表来源 - ccxt_loader.py:184-224 - binance_loader.py:23-45

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

CCXT 加载器(多交易所统一)

sequenceDiagram participant App as "应用" participant CCXT as "CCXT 加载器" participant EX as "交易所(CCXT)" App->>CCXT : fetch(codes, start, end, interval) CCXT->>EX : fetch_ohlcv(symbol, timeframe, since, limit) loop 分页拉取 EX-->>CCXT : 一批K线 CCXT->>CCXT : 累积/裁剪时间窗口 end CCXT-->>App : {symbol : DataFrame}

图表来源 - ccxt_loader.py:226-308 - ccxt_loader.py:426-502

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

AKShare 加载器(A股/美股/港股/期货/外汇/宏观)

flowchart TD S(["输入代码"]) --> D{"识别市场"} D --> |A股| A["stock_zh_a_hist"] D --> |美股| U["stock_us_hist"] D --> |港股| H["stock_hk_hist"] D --> |外汇| F["forex_hist_em"] D --> |ETF| E["fund_etf_hist_sina"] A --> N["标准化为 OHLCV"] U --> N H --> N F --> N E --> N N --> O["返回 DataFrame"]

图表来源 - akshare_loader.py:74-157 - akshare_loader.py:158-292

章节来源 - akshare_loader.py:1-292

本地加载器(CSV/Parquet/DuckDB)

flowchart TD C["读取 config.yaml"] --> R{"根据 symbol 匹配 source"} R --> |csv| CSV["读取 CSV 并标准化"] R --> |parquet| PQ["读取 Parquet 并标准化"] R --> |duckdb| DB["执行 SQL 并标准化"] CSV --> RS["按 interval 重采样"] PQ --> RS DB --> RS RS --> O["返回 DataFrame"]

图表来源 - local_loader.py:129-216 - local_loader.py:219-354

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

依赖关系分析

graph LR Base["base.py"] --> Reg["registry.py"] Reg --> YF["yahoo_loader.py"] Reg --> AK["akshare_loader.py"] Reg --> CC["ccxt_loader.py"] CC --> BIN["binance_loader.py"] Reg --> LOC["local_loader.py"]

图表来源 - registry.py:71-114 - ccxt_loader.py:203-224 - binance_loader.py:15-45

章节来源 - registry.py:71-114 - ccxt_loader.py:203-224 - binance_loader.py:15-45

性能考量

章节来源 - base.py:163-236 - base.py:243-439 - ccxt_loader.py:50-57 - yahoo_loader.py:125-170 - local_loader.py:83-127

故障排查指南

章节来源 - registry.py:158-193 - registry.py:221-249 - base.py:31-119 - test_registry.py:226-337

结论

Vibe-Trading 的数据源集成通过“协议 + 注册表 + 回退链”实现了高内聚、低耦合的统一接入。各数据源遵循相同接口,屏蔽差异化的时间戳、列名与认证方式;回退链在保证可用性的同时,兼顾了网络稳定性与数据质量。结合重试预算与本地缓存,系统在大规模回测与实时场景中具备鲁棒性与高性能。

附录

数据源特性对比(摘要)

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

配置与认证要点

章节来源 - base.py:618-645 - local_loader.py:1-354

数据格式标准化

章节来源 - base.py:50-119 - yahoo_loader.py:125-170 - akshare_loader.py:259-292 - ccxt_loader.py:426-502

自定义数据源开发指南

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

实际使用示例(描述性)

章节来源 - registry.py:158-193 - ccxt_loader.py:226-308 - local_loader.py:249-354