量化回测引擎

📎 引用文件

本文引用的文件 - agent/backtest/engines/base.py - agent/backtest/engines/composite.py - agent/backtest/engines/_market_hooks.py - agent/backtest/loaders/base.py - agent/backtest/loaders/registry.py - agent/backtest/runner.py - agent/backtest/models.py - agent/src/factors/base.py - agent/src/factors/registry.py

目录

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

简介

本文件面向 Vibe-Trading 量化回测引擎,系统性说明多市场回测架构、引擎选择与路由机制、性能优化策略、错误处理机制;数据加载器架构、内置数据源、自定义数据源开发与数据缓存策略;因子分析系统架构、内置因子实现、因子计算方法和因子验证流程;以及与数据管理层、交易集成系统的关系。文档以代码级为依据,提供可视化图示和可追溯的源码引用,帮助读者从入门到深入理解并扩展该回测系统。

项目结构

回测子系统主要位于 agent/backtest 与 agent/src/factors 两个目录: - backtest:回测执行引擎、数据加载器、指标与模型定义、运行入口等 - factors:因子(Alpha)注册表、基础算子、zoo 因子库

graph TB subgraph "回测层" R["runner.py<br/>配置校验/路由"] EBase["engines/base.py<br/>通用回测循环"] EComp["engines/composite.py<br/>跨市场组合引擎"] EH["engines/_market_hooks.py<br/>市场识别/费用/强平"] LBase["loaders/base.py<br/>协议/校验/缓存"] LReg["loaders/registry.py<br/>数据源注册/降级链"] M["models.py<br/>头寸/成交/净值快照"] end subgraph "因子层" FBase["src/factors/base.py<br/>算子/面板契约"] FReg["src/factors/registry.py<br/>Alpha注册/计算/校验"] end R --> EBase EBase --> EComp EComp --> EH R --> LReg R --> LBase EBase --> M FBase --> FReg

图表来源 - agent/backtest/runner.py:1-120 - agent/backtest/engines/base.py:647-718 - agent/backtest/engines/composite.py:102-147 - agent/backtest/loaders/registry.py:158-193 - agent/backtest/loaders/base.py:618-645 - agent/src/factors/registry.py:201-397

章节来源 - agent/backtest/runner.py:1-120 - agent/backtest/engines/base.py:647-718 - agent/backtest/loaders/registry.py:158-193 - agent/src/factors/registry.py:201-397

核心组件

章节来源 - agent/backtest/runner.py:68-163 - agent/backtest/loaders/base.py:618-645 - agent/backtest/engines/base.py:377-644 - agent/backtest/engines/composite.py:102-147 - agent/backtest/models.py:13-118 - agent/src/factors/base.py:1-13 - agent/src/factors/registry.py:201-397

架构总览

回测主流程由 runner 驱动,按配置选择数据源与引擎,调用 BaseEngine.run_backtest 完成“数据→信号→权重→逐bar执行→指标”的闭环。CompositeEngine 在跨市场场景下维护共享资金池,并将规则委托给各市场专用引擎。

sequenceDiagram participant U as "用户" participant R as "runner.py" participant L as "loaders/registry.py" participant D as "DataLoader" participant S as "SignalEngine" participant E as "BaseEngine/CompositeEngine" participant M as "metrics/models" U->>R : 传入 config.json R->>R : 校验配置(日期/区间/引擎/源) R->>L : resolve_loader(source/market) L-->>R : 返回可用loader类 R->>D : fetch(codes, start, end, interval, fields) D-->>R : {symbol : DataFrame} R->>S : generate(data_map) S-->>R : {symbol : Series} R->>E : run_backtest(config, loader, signal_engine, run_dir) E->>E : _align + 可选优化器 E->>E : _execute_bars(逐bar执行) E->>M : 记录Fill/Trade/EquitySnapshot E-->>R : metrics + artifacts R-->>U : 结果与产物

图表来源 - agent/backtest/runner.py:68-163 - agent/backtest/loaders/registry.py:158-193 - agent/backtest/engines/base.py:647-718 - agent/backtest/models.py:13-118

详细组件分析

多市场回测引擎与路由

classDiagram class BaseEngine { +config +initial_capital +positions +fill_records +trades +equity_snapshots +run_backtest(config, loader, signal_engine, run_dir) +can_execute(symbol, direction, bar) bool +round_size(raw_size, price) float +calc_commission(size, price, direction, is_open) float +apply_slippage(price, direction) float +on_bar(symbol, bar, timestamp) void } class CompositeEngine { -_symbol_market -_rule_engines -_funding_applied -_last_swap_dates +run_backtest(config, *args, **kwargs) +can_execute(symbol, direction, bar) bool +round_size(raw_size, price) float +calc_commission(...) +apply_slippage(...) +on_bar(symbol, bar, timestamp) void } class MarketHooks { +_detect_market(code) str +code_currency(code) str +calc_crypto_funding_fee(...) +check_crypto_liquidation(...) +calc_forex_swap(...) } BaseEngine <|-- CompositeEngine CompositeEngine --> MarketHooks : "调用"

图表来源 - agent/backtest/engines/base.py:377-644 - agent/backtest/engines/composite.py:102-257 - agent/backtest/engines/_market_hooks.py:23-115 - agent/backtest/engines/_market_hooks.py:223-374

章节来源 - agent/backtest/engines/base.py:377-644 - agent/backtest/engines/composite.py:102-257 - agent/backtest/engines/_market_hooks.py:23-115 - agent/backtest/engines/_market_hooks.py:223-374

引擎选择与路由机制

flowchart TD A["配置source/market"] --> B{"是否auto?"} B -- 否 --> C["直接取指定source"] B -- 是 --> D["根据symbol推断市场"] D --> E["按FALLBACK_CHAINS尝试"] C --> F["实例化并检查is_available()"] E --> F F --> |可用| G["返回loader类"] F --> |不可用| H{"有同市场fallback?"} H -- 是 --> E H -- 否 --> I["抛出NoAvailableSourceError"]

图表来源 - agent/backtest/loaders/registry.py:23-59 - agent/backtest/loaders/registry.py:136-155 - agent/backtest/loaders/registry.py:158-193 - agent/backtest/loaders/registry.py:196-249 - agent/backtest/engines/_market_hooks.py:23-60 - agent/backtest/engines/_market_hooks.py:135-150

章节来源 - agent/backtest/runner.py:68-163 - agent/backtest/loaders/registry.py:158-249 - agent/backtest/engines/_market_hooks.py:23-60

数据加载器架构与缓存策略

flowchart TD Start(["fetch()"]) --> Cache["检查本地缓存"] Cache --> |命中| ReturnCache["返回DataFrame"] Cache --> |未命中| Load["调用底层API"] Load --> Validate["validate_ohlc()"] Validate --> Retry{"需要重试?"} Retry --> |是| Wait["退避等待"] Wait --> Load Retry --> |否| Save["写入parquet缓存"] Save --> ReturnData["返回DataFrame"]

图表来源 - agent/backtest/loaders/base.py:31-119 - agent/backtest/loaders/base.py:163-236 - agent/backtest/loaders/base.py:251-439 - agent/backtest/loaders/registry.py:83-108

章节来源 - agent/backtest/loaders/base.py:31-119 - agent/backtest/loaders/base.py:163-236 - agent/backtest/loaders/base.py:251-439 - agent/backtest/loaders/registry.py:83-108

自定义数据源开发

章节来源 - agent/backtest/loaders/base.py:618-645 - agent/backtest/loaders/base.py:163-236 - agent/backtest/loaders/base.py:251-439

因子分析系统架构

classDiagram class Alpha { +id +zoo +module_path +meta } class Registry { +list(zoo, theme, universe) list +get(alpha_id) Alpha +compute(alpha_id, panel) DataFrame +health() dict +export_manifest() dict } class BaseOperators { +rank(df) +zscore(df) +ts_rank(df,n) +ts_corr(x,y,n) +ts_cov(x,y,n) +ts_mean(df,n) +ts_std(df,n) +delta(df,d) +vwap(panel, market) } Registry --> Alpha : "持有" Registry --> BaseOperators : "使用"

图表来源 - agent/src/factors/base.py:27-356 - agent/src/factors/registry.py:87-125 - agent/src/factors/registry.py:201-397

章节来源 - agent/src/factors/base.py:27-356 - agent/src/factors/registry.py:87-125 - agent/src/factors/registry.py:201-397

因子计算方法与验证流程

章节来源 - agent/src/factors/registry.py:147-184 - agent/src/factors/registry.py:321-397

与数据管理层、交易集成系统的关系

章节来源 - agent/backtest/runner.py:274-467 - agent/backtest/engines/composite.py:68-99

依赖关系分析

graph LR Runner["runner.py"] --> Reg["loaders/registry.py"] Runner --> BaseEng["engines/base.py"] BaseEng --> Models["models.py"] BaseEng --> Metrics["metrics.py"] Composite["engines/composite.py"] --> Hooks["_market_hooks.py"] FactorsReg["factors/registry.py"] --> FactorsBase["factors/base.py"]

图表来源 - agent/backtest/runner.py:30-47 - agent/backtest/engines/base.py:26-44 - agent/backtest/engines/composite.py:16-23 - agent/src/factors/registry.py:24-40

章节来源 - agent/backtest/runner.py:30-47 - agent/backtest/engines/base.py:26-44 - agent/backtest/engines/composite.py:16-23 - agent/src/factors/registry.py:24-40

性能考量

章节来源 - agent/backtest/engines/base.py:149-249 - agent/src/factors/base.py:93-144 - agent/src/factors/base.py:221-252 - agent/src/factors/base.py:265-296 - agent/backtest/loaders/base.py:163-236 - agent/backtest/loaders/base.py:251-439

故障排查指南

章节来源 - agent/backtest/loaders/registry.py:158-193 - agent/backtest/loaders/registry.py:196-249 - agent/backtest/loaders/base.py:31-119 - agent/backtest/runner.py:274-467 - agent/src/factors/registry.py:321-397 - agent/backtest/engines/composite.py:68-99

结论

Vibe-Trading 的回测引擎以 BaseEngine 为核心,提供跨市场、可扩展的 bar-by-bar 执行框架;通过 loaders.registry 的灵活降级链与本地缓存保障数据稳定性与性能;factors 系统以面板契约与严格校验确保因子计算的可靠性与可维护性;runner 的安全沙箱隔离策略代码与生产交易环境,降低风险。整体设计兼顾了多市场适配、性能优化与工程稳健性。

附录:使用模式与示例路径

章节来源 - agent/backtest/runner.py:68-163 - agent/backtest/loaders/registry.py:158-249 - agent/src/factors/registry.py:201-397 - agent/backtest/loaders/base.py:618-645 - agent/backtest/runner.py:274-467