Files
fidc-backtest-engine/docs/framework-execution-comparison-20260911.md
T

7.3 KiB
Raw Blame History

FIDC执行合同与开源框架审查

状态:源码审查和部分通用修复已完成。尚未完成多策略长区间A/B;不能据此宣称某个框架性能最优或FIDC生产闭环已通过。

固定版本

源码保存在/Volumes/SystemSSD/WorkSpace/fidc-reference-frameworks,未执行第三方项目的策略或交易程序。

框架 审查版本 主要参考位置
NautilusTrader 6f48cd8e713b72b878626e9a9757c6e4a026b708 报价类型归并
LEAN 8ee075a39918f2df6fe9e0a5944e366fb60d10dc 股票撮合
Zipline Reloaded 943010b9da848e317fc520de87edade2b884d329 滑点与容量
Backtrader b853d7c90b6721476eb5a5ea3135224e33db1f14 Broker

可采用的设计

事件与时钟

Nautilus把Quote、Trade、Bar区分为不同类型,保存事件与接收/初始化时钟;数据归并按ts_init排序,分块保留同一时间戳的完整组。这适合FIDC后续有界分钟流:Source声明观测类型、覆盖区间和可见时间,执行端持有独立账户状态,而非共享一个同时装着日终与盘中字段的可变字典。

FIDC本轮实际发现:以09:32:58行情给09:33订单定价时,成交时间也写成09:32:58。已修为实际成交不得早于订单执行时钟;价格仍引用原行情,容量扣减也继续绑定原行情,不能通过换一个订单时钟重新获得额度。

开盘和陈旧行情

LEAN的MarketOnOpenFill单独处理正式开盘成交标志、bar开始/结束时间和订单时间;不是任意取一个日线字段即可成交。但其默认模型也有整体成交和数据回退假设,不能直接当作真实市场流动性保证。

FIDC已统一预估与撮合的盘中价格选择。己方价、对手价和最近成交价各用自己的字段;缺失/无效时不改用另一种价,也不越过最新坏行情寻找更旧的可用价格。

成交量与滑点

Zipline按股票和bar累计已使用量,历史冲击窗口排除当前未完成交易日。FIDC应复用不可变历史校准,但每个账户自己的成交消耗必须独立;不能按订单次数重复分配同一个bar的额度。它在历史不足时的回退不是FIDC的默认准入策略。

FIDC新增ParticipationRate:按冻结JSON小数语义精确向下取整,避免浮点乘法和窄整数转换误差。例如58%乘50股为29,不应因二进制误差成为28;巨大市场量也不能在转u32时截断成另一个额度。比例解析在配置阶段完成,不放入逐成交腿热循环。

Backtrader把volume filler、滑点开关、cheat-on-open/close等模型选择显式区分。值得采用的是明确暴露假设;不照搬不带成交量限制的默认值,也不为了收益对齐开启能改变可见时间的行为。

已落地通用修复

  • 精确参与率计算用于Broker和策略预估,同一观测的已消耗量跨订单共享、跨账户隔离。
  • 实际执行时钟与参考行情时钟分开,修复成交早于下单的问题。
  • 缺失的执行价不由其他价格或更旧行情代替;删除重复价格选择及不可达深度分支。
  • Runner拒绝空身份、错日期、晚于请求时钟的行情、非有限价格、缺失或非整数数量。
  • 多查询引用同一观测只有完全一致才合并;同一目标查询的源重复行和跨查询冲突均报错,不采用第一条。
  • 目录缓存使用Linux变更通知,不能只凭mtime/目录大小判断没有新文件;通知不可用时重新扫描。事件溢出、目录替换、重命名、删除均失效重建。

这些改变不按策略ID、固定选股条件或10:17/10:18等时间分支。

仍未关闭的问题

  1. 日线全天量仍进入早晨数量计算Broker和projection两条路径都需接入容量模式。VolumeCapacityModeSessionCapacityAudit目前只是已测试基础类型,未完成配置、撮合、日终结果和页面的完整接线。不得称P0已修。
  2. Source可能掩盖缺失:当前目标分钟序列会先剔除无效close,再寻找旧的有效值;部分缺失volume/amount置0;备用Arrow包装器还会用请求时钟替代缺失行情时间。必须清理这些行为,并按数据/市场缺席合同分类。
  3. TWAP早期配额可能依赖未来可成交记录数:当前实现使用筛选后的eligible_quotes.len()分配数量。应按冻结时间表切片,后续缺量只能影响后续执行,不改早期分配。
  4. 集合竞价:实时数据与日线/分钟模型必须区分委托进入竞价、等待撮合和实际成交,不能用竞价中间的零量判定股票停牌,不能提前使用最终清算价。
  5. 数据种类/单位:源观测类型与价格模型能力要明确;分钟OHLC不能冒充真实L1深度。盘口单位、名义bar区间和可见时间仍须逐源校验。

下一阶段实施合同

  • 普通风险开关和参与率仍是同一个策略三端共享配置。历史回测的容量假设单独冻结,不能用研究审核模式绕过Paper/Live临单风控。
  • 有真实可见观测时使用execution_observationcompleted_bar须验证bar结束和可见时间,不靠日线日期猜15:00。
  • 只有日线总量而没有开盘容量时,严格模式须在提交预检失败;用户可明确选择session_capacity_audit做研究。日终只判定容量验收,不回写早晨的数量、现金、持仓或净值。
  • 不能自动关闭参与率限制,也不能悄悄替换为昨日量。
  • Source、Runner、Engine、研究handoff、Strategy AI和UI成套发布;持有冻结合同的旧任务不改写。当前研究维护方尚未授权共享服务切换。

验证与基准

Engine当前680项通过、8忽略;Runner375项通过,真实Source的8个JSON/Arrow行情点通过严格解析。小样本中的14:59零量在serving Parquet中确实存在,15:00有成交;这是源事实核对,不是完整集合竞价逻辑验收。历史股票收盘竞价时段应按适用规则处理,不能将后来的规则回填到旧日期。深交所2023年交易机制说明

上交所2026版规则于2026-07-06生效,且通知明确存在暂缓实施条文。后续交易时段/容量合同必须同时核对规则版本和实施范围。上交所发布通知

下一组A/B应覆盖动态Top-N日线、静态组合、逐分钟策略、TWAP/VWAP及共享模型信号,分别检查同条件重复、时间变更、参数变更、短区间和五年区间。先关闭时点错误,再测准备/引擎/持久化/端到端耗时、峰值RSS、缓存代际与逐笔差异。不得用微型元数据读取速度外推完整回测性能。

本轮证据根:/srv/fidc/canonical/run/research/historical-slippage-20260911/。服务均未由本任务重启,没有提交回测任务或证券订单。