7.3 KiB
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等时间分支。
仍未关闭的问题
- 日线全天量仍进入早晨数量计算:Broker和projection两条路径都需接入容量模式。
VolumeCapacityMode及SessionCapacityAudit目前只是已测试基础类型,未完成配置、撮合、日终结果和页面的完整接线。不得称P0已修。 - Source可能掩盖缺失:当前目标分钟序列会先剔除无效close,再寻找旧的有效值;部分缺失volume/amount置0;备用Arrow包装器还会用请求时钟替代缺失行情时间。必须清理这些行为,并按数据/市场缺席合同分类。
- TWAP早期配额可能依赖未来可成交记录数:当前实现使用筛选后的
eligible_quotes.len()分配数量。应按冻结时间表切片,后续缺量只能影响后续执行,不改早期分配。 - 集合竞价:实时数据与日线/分钟模型必须区分委托进入竞价、等待撮合和实际成交,不能用竞价中间的零量判定股票停牌,不能提前使用最终清算价。
- 数据种类/单位:源观测类型与价格模型能力要明确;分钟OHLC不能冒充真实L1深度。盘口单位、名义bar区间和可见时间仍须逐源校验。
下一阶段实施合同
- 普通风险开关和参与率仍是同一个策略三端共享配置。历史回测的容量假设单独冻结,不能用研究审核模式绕过Paper/Live临单风控。
- 有真实可见观测时使用
execution_observation;completed_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/。服务均未由本任务重启,没有提交回测任务或证券订单。