多市场回测引擎

📎 引用文件

本文引用的文件 - base.py - composite.py - china_a.py - crypto.py - forex.py - futures_base.py - _market_hooks.py - runner.py - models.py - metrics.py - base_loader.py

目录

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

简介

本文件为 Vibe-Trading 的多市场回测引擎提供系统化、可操作的文档。引擎支持股票(A股、美股、港股、印度、韩国、加拿大)、期货(中国及全球)、加密货币(永续合约)和外汇(现货/CFD)等多资产类别,具备统一的数据对齐、信号到头寸的优化、逐根K线执行、市场特定规则(涨跌停、交易时间、结算、资金费率、强制平仓等)以及跨市场组合回测能力。同时提供指标计算、基准对比、风险透视、重平衡记录与证据输出,便于结果可视化与报告生成。

项目结构

回测引擎位于 agent/backtest 目录下,关键模块如下: - engines:各市场引擎实现与复合引擎 - loaders:数据加载器与校验工具 - metrics:年化因子、收益序列、换手率、统计指标 - models:头寸、成交、交易、净值快照等不可变数据模型 - runner:回测入口、配置校验、安全沙箱、调度与执行

graph TB Runner["runner.py<br/>配置校验/安全沙箱/调度"] --> Base["base.py<br/>BaseEngine 通用执行循环"] Base --> Composite["composite.py<br/>CompositeEngine 跨市场组合"] Composite --> AShare["china_a.py<br/>A股规则"] Composite --> Crypto["crypto.py<br/>永续合约规则"] Composite --> Forex["forex.py<br/>外汇规则"] Composite --> FuturesBase["futures_base.py<br/>合约乘数基类"] Base --> Metrics["metrics.py<br/>年化/指标/换手"] Base --> Models["models.py<br/>Position/Fill/Trade/Snapshot"] Runner --> LoaderBase["loaders/base.py<br/>OHLC校验/重试/预算"]

图表来源 - runner.py:1-120 - base.py:377-718 - composite.py:102-147 - metrics.py:150-167 - models.py:13-118 - base_loader.py:50-119

章节来源 - runner.py:1-120 - base.py:377-718 - composite.py:102-147 - metrics.py:150-167 - models.py:13-118 - base_loader.py:50-119

核心组件

章节来源 - base.py:377-718 - composite.py:102-257 - china_a.py:20-93 - crypto.py:41-140 - forex.py:56-137 - futures_base.py:19-57 - metrics.py:150-167 - models.py:13-118 - base_loader.py:50-119 - runner.py:68-162

架构总览

回测流程从 runner 启动,读取配置并校验,选择数据源加载数据,调用信号引擎生成信号,再交由 BaseEngine 进行权重优化与逐根执行,最终输出指标与产物。CompositeEngine 在跨市场场景下将规则委托给具体市场引擎,但资金、头寸、交易记录集中在组合引擎中管理。

sequenceDiagram participant R as "runner.py" participant L as "DataLoader" participant S as "SignalEngine" participant E as "BaseEngine/CompositeEngine" participant M as "Metrics" participant O as "Artifacts" R->>R : 解析并校验配置 R->>L : fetch(codes, start, end, interval, fields) L-->>R : data_map R->>S : generate(data_map) S-->>R : signal_map R->>E : run_backtest(config, loader, signal_engine, run_dir) E->>E : _align(构建统一日历/收盘价矩阵/目标头寸) E->>E : _execute_bars(逐根执行/市场规则/风控) E->>M : calc_metrics(equity_series, trades, ...) M-->>E : metrics E->>O : 写入净值曲线/交易明细/重平衡笔记/风险透视 E-->>R : metrics

图表来源 - runner.py:1-120 - base.py:647-718 - base.py:149-249 - metrics.py:150-167

详细组件分析

BaseEngine:通用执行循环与数据对齐

flowchart TD Start(["开始"]) --> Load["加载数据与增强字段"] Load --> Signal["生成信号"] Signal --> Align["_align 对齐日历/收盘价/头寸"] Align --> Opt{"是否启用优化器?"} Opt -- 是 --> Optimizer["优化器 + 约束"] Opt -- 否 --> SkipOpt["跳过优化"] Optimizer --> Exec["逐根执行"] SkipOpt --> Exec Exec --> Metrics["计算指标/换手/统计"] Metrics --> Artifacts["输出产物/报告"] Artifacts --> End(["结束"])

图表来源 - base.py:149-249 - base.py:647-718 - base.py:468-557

章节来源 - base.py:149-249 - base.py:377-718 - base.py:468-557

CompositeEngine:跨市场组合与共享资金池

classDiagram class BaseEngine { +config +initial_capital +positions +fill_records +trades +equity_snapshots +run_backtest(...) +can_execute(...) +round_size(...) +calc_commission(...) +apply_slippage(...) +on_bar(...) } class CompositeEngine { -_symbol_market -_rule_engines -_funding_applied -_funding_daily_done -_last_swap_dates +run_backtest(...) +can_execute(...) +round_size(...) +calc_commission(...) +apply_slippage(...) +on_bar(...) } class ChinaAEngine class CryptoEngine class ForexEngine class FuturesBaseEngine CompositeEngine --|> BaseEngine CompositeEngine --> ChinaAEngine : "路由" CompositeEngine --> CryptoEngine : "路由" CompositeEngine --> ForexEngine : "路由" CompositeEngine --> FuturesBaseEngine : "路由"

图表来源 - composite.py:102-257 - base.py:377-718 - futures_base.py:19-57

章节来源 - composite.py:26-147 - composite.py:149-257

ChinaAEngine:A股特殊规则

flowchart TD A["can_execute(symbol, direction, bar)"] --> B{"direction == -1 ?"} B -- 是 --> X["拒绝(不允许做空)"] B -- 否 --> C{"direction == 0 ?"} C -- 是 --> D{"是否T+1限制? (同日买入)"} D -- 是 --> X D -- 否 --> E{"是否触及涨跌停?"} E -- 是 --> X E -- 否 --> Y["允许"] C -- 否 --> E

图表来源 - china_a.py:40-93 - china_a.py:115-193

章节来源 - china_a.py:20-93 - china_a.py:115-193

CryptoEngine:永续合约与严格模式

sequenceDiagram participant CE as "CryptoEngine" participant MH as "_market_hooks" participant BE as "BaseEngine" Note over CE,BE : 每根K线 CE->>MH : calc_crypto_funding_fee(...) MH-->>CE : 资金费用 CE->>CE : capital -= fee CE->>MH : check_crypto_liquidation(...) alt 触发强平 CE->>BE : _close_position(..., "liquidation") else 正常 CE-->>BE : 继续执行 end

图表来源 - crypto.py:96-140 - crypto.py:243-347 - crypto.py:601-615 - _market_hooks.py:223-307

章节来源 - crypto.py:41-140 - crypto.py:243-347 - crypto.py:601-615 - _market_hooks.py:223-307

ForexEngine:外汇现货/CFD

flowchart TD FStart["on_bar(symbol, bar, timestamp)"] --> SwapCheck{"swap_enabled ?"} SwapCheck -- 否 --> FEnd["结束"] SwapCheck -- 是 --> CalcSwap["calc_forex_swap(...)"] CalcSwap --> CapitalAdj["capital += swap"] CapitalAdj --> FEnd

图表来源 - forex.py:56-137 - _market_hooks.py:322-374

章节来源 - forex.py:56-137 - _market_hooks.py:322-374

FuturesBaseEngine:合约乘数基类

章节来源 - futures_base.py:19-57

数据对齐与跨市场日历

章节来源 - base.py:149-249

市场检测与货币一致性

章节来源 - _market_hooks.py:23-116 - composite.py:68-99

依赖关系分析

graph LR Runner["runner.py"] --> Loader["loaders/*"] Runner --> Engine["engines/base.py"] Engine --> Models["models.py"] Engine --> Metrics["metrics.py"] Composite["engines/composite.py"] --> Hooks["_market_hooks.py"] Composite --> Engines["china_a/crypto/forex/futures_base"]

图表来源 - runner.py:30-47 - base.py:26-44 - composite.py:16-23

章节来源 - runner.py:30-47 - base.py:26-44 - composite.py:16-23

性能考量

章节来源 - base.py:149-249 - metrics.py:150-167 - crypto.py:156-196 - base_loader.py:163-200

故障排查指南

章节来源 - composite.py:68-99 - base_loader.py:50-119 - crypto.py:85-94 - base.py:468-557

结论

该多市场回测引擎通过统一的 BaseEngine 抽象与 CompositeEngine 组合机制,实现了跨资产类别的一致化回测体验。各市场引擎封装了差异化的交易规则与风控逻辑,配合严格的数据对齐、优化器与指标体系,能够支撑复杂策略研究与组合回测。严格模式下的加密合约提供了接近实盘的强平与资金结算模拟,适合高杠杆策略验证。结合可视化与报告输出,用户可高效迭代策略并评估风险收益特征。

附录:配置与使用示例

以下为常用配置要点与参数说明(不展示具体代码内容,路径引用见下方): - 基本配置 - codes:标的列表(支持多市场符号格式) - start_date/end_date:回测区间(YYYY-MM-DD) - source:数据源(如 tushare/yfinance/ccxt/okx/local 等) - interval:K线周期(1m/5m/15m/30m/1H/4H/1D) - engine:回测引擎(daily/options) - initial_cash:初始资金(必须为正) - position_adjustment:hold 或 rebalance - 市场特定参数 - A股:commission_rate/commission_min/stamp_tax/transfer_fee/slippage - 加密:maker_rate/taker_rate/funding_rate/margin_mode/perpetual_strict/liquidation_fee_rate - 外汇:leverage/spread_pips_override/lot_size/swap_enabled/slippage_pips - 期货:合约乘数由子类实现(get_contract_multiplier) - 优化器与约束 - optimizer:优化器名称(如 mean_variance/risk_parity/equal_volatility/max_diversification/turnover_aware) - optimizer_params:优化器参数 - constraints:约束条件(作用于优化器输出) - 基准与增强 - benchmark:基准代码或 auto - fundamental_fields:基本面字段增强(表名→字段列表) - event_feeds:RSSHub 事件增强(name/route_template/event_type/code_style) - 运行入口 - 通过 runner 执行:python -m backtest.runner - 安全沙箱:信号引擎代码在导入与运行时受限,禁止危险操作

章节来源 - runner.py:68-162 - runner.py:165-768 - base.py:252-279 - base.py:684-718 - china_a.py:20-93 - crypto.py:41-140 - forex.py:56-137 - futures_base.py:19-57