回测后端边界
语言:简体中文 · English
本页记录 portfolio-backtester 当前已经落地的后端边界,以及历史候选、参考框架和规划项的真实状态。
当前结论
当前 BackendRegistry 只登记 native.position_replay,对应实现为 NativePositionReplayBackend。包还公开了独立调用的 SequencedExecutionBackend,它不在该 registry 中。
外部信号或目标持仓
|
v
组合选择、权重与约束
|
v
NativePositionReplayRequest
|
v
NativePositionReplayBackend
|
v
CanonicalBacktestResult
BackendRegistry 提供显式登记和查找机制,不会自动发现插件。主分支没有第三方回测框架适配器。pyqlib 仅作为可选依赖 extra 声明,不代表当前存在 Qlib 后端。两种原生 API 的输入与用途见下文。
框架状态
| 名称 | 当前状态 | 当前用途 |
|---|---|---|
native.position_replay |
已实现并作为权威后端 | 确定性持仓周期回放、A 股规则、成本和容量研究 |
| Qlib | 历史候选没有进入 main |
当前无运行职责 |
| LEAN | 历史候选没有进入 main |
只保留架构参考用途 |
| Backtrader | 仍处于规划阶段 | 当前没有适配器、依赖或 registry 项 |
| vn.py | 属于本仓库范围外 | Gateway、实时传输和券商执行由执行系统决定 |
Qlib 与 LEAN 的历史候选没有进入 main。LEAN 只保留架构参考用途。2026-09 的固定版本 feasibility spike 因 A 股和容量账本语义需要重复实现而作出 no-adoption 决策,且没有声称通过运行时 parity。详见 LEAN feasibility spike。文档和测试不得把这些历史工作描述成可调用能力。
Backtrader 仍处于规划阶段。任何后续实现都需要独立设计评审、可选依赖、规范化结果转换和固定场景对照证据。
vn.py 属于本仓库范围外。本仓库不维护 Gateway、实时订单传输或券商账户状态。
机器可读状态见 框架状态账本。账本把当前后端、历史候选、规划项和范围外项目分开记录。
稳定边界
执行契约
portfolio_backtester.execution_contracts 定义框架中立的类型:
InstrumentTargetOrderIntentOrderEventFillLedgerSnapshot
订单状态覆盖 created、submitted、accepted、partial、filled、cancelled、expired 和 rejected。reduce_order_events 使用稳定事件 ID 去重,并按时间确定性重放重复或乱序事件。
后端协议
portfolio_backtester.backends 公开:
BacktestBackendBackendCapabilitiesCanonicalBacktestResultBackendRegistryNativePositionReplayBackendSequencedExecutionBackendwrite_execution_aware_result_bundle
NativePositionReplayBackend 将现有持仓周期回放转换为规范化结果,并可通过 ledger=True 额外运行执行模拟、附加订单和每日账本。SequencedExecutionBackend 接收多次决策的目标持仓和逐决策时钟,调用共享的每日执行模拟器。它要求调用方另行证明生成目标所用输入在决策截止时点可见。两者都返回 CanonicalBacktestResult,但只有前者由当前 registry 登记。
每个后端都要声明订单生命周期、部分成交、每日账本和多空能力。缺少相应能力时,规范化结果中的相关表保持为空。
原生回放显式启用 ledger=True 且执行模拟产生非空每日账本后,CanonicalBacktestResult.unified_ledger 会携带同一次模拟得到的八张完整账本表。订单、成交 ID 和每日现金、持仓价值、净值必须与结果视图一致。默认回放或无每日账本时,该字段为 None,能力声明保持诊断等级。调用 write_execution_aware_result_bundle 并提供完整、时序合法的 research.clock.v1、producer 和至少一个输入来源后,平台用标准 bundle writer 校验能力与账户对账并原子发布证据。CanonicalBacktestResult.performance 仍是历史持仓周期收益视图。执行感知净值应读取 bundle 的 daily_nav.parquet。
NativePositionReplayBackend 对当前持仓周期回放做安全收口:
- 拒绝
long_only=False、空头和负权重。 - 使用
ffill成交价时要求显式允许过期价格。 - 使用分钟数据时要求声明信号在开盘前产生,或由调用方裁剪到可执行窗口。
内置后端保留能力
以下能力继续由内置实现维护:
- T+1 可卖数量。
- 买入整手和零股卖出。
- 涨跌停的方向限制。
- 停牌、上市、退市和最后估值。
- 带生效日期的费用表。
- 分红、拆股、送转等企业行动。
- PIT 输入和决策、下单、成交、估值时间戳。
- 输入、配置、日历、费率和校准版本哈希。
固定对照场景
后端变更至少覆盖三组固定场景:
- 充分流动性多头场景,对比持仓、换手、毛收益、费用和净值。
- A 股规则场景,覆盖 T+1、涨跌停、停牌、整手和最低佣金。
- 容量与部分成交场景,覆盖多日成交、撤单重报、现金不足和非线性最低佣金。
未来的 Backtrader 适配器只有满足以下条件,才有资格进入 registry:
- 作为可选依赖安装。
- 转换为
CanonicalBacktestResult。 - 不向公开结果泄露第三方对象。
- 固定对照场景全部通过。
- A 股领域语义保持完整。
- 迁移和回滚路径经过评审。
达到这些条件代表适配器可以接受评审,不会自动替换内置实现。
统一账本路线
长期账本链路为:
目标持仓 -> 订单 -> 成交 -> 持股与现金 -> 每日净值 -> 报告
当前 NativePositionReplayBackend 默认仍是周期级回放,它的 orders、fills 和 daily_ledger 为空,能力声明会如实反映这一限制。启用可选 ledger 模式后会调用已落地的订单级执行引擎并填充统一账本,详见 会计与执行路线图。
范围约束
本仓库不新增以下通用基础设施:
- 通用事件引擎。
- 通用 Gateway。
- 通用订单管理系统。
- 通用 CTA 策略基类。
- 通用参数优化器。
- 通用数据源。
- 与市场无关的券商模拟器。
项目代码继续聚焦组合领域、A 股市场语义、稳定契约和可信研究结果。