# 特征日行情缺口与跨日回退 ## 问题 审查发现股票表达式上下文的三个位置把缺少的特征日行情回退到执行/当前市场日: 两个 `StockStateSnapshotSource::feature_market` 实现,以及最终构建器的 `unwrap_or(market)`。 当 `factor_date` 早于 `date` 时,这会把后来日期的OHLCV用于原本指定的历史特征日。 这是错误日期代用,并具有前视风险;不据此推断所有历史回测都已触发此路径。 真实代码的合成缺口回归已复现:2025-04-03因子快照存在但行情缺失, 2025-04-07行情存在,旧版返回close=20.0、volume=45600、open=19.0, 而非报告4月3日行情缺失。此回归使用合成数据验证代码路径,不是行情数据造假或真实市场收益样本。 ## 修改 - 两个行情读取入口只返回指定特征日期的快照,删除向执行日的回退。 - 构建器缺少快照时返回 `MissingSnapshot { kind: "feature_market", date: factor_date, symbol }`。 - 保持原市场、候选和因子缺失错误优先级;失败状态不写入股票上下文缓存。 - 同日上下文继续使用同日快照;正常跨日上下文仍将历史OHLCV与执行报价分开。 - 不调整价格、因子、窗口、风险、手续费、滑点、成交量或原始数据,不引入替代缓存。 新增回归覆盖索引读取、每日视图读取、错误缓存边界和同日合法输入。 原next-open涨跌停测试只有前一日因子、没有对应行情,原先隐式依赖了该回退。 已补充两只证券各自明确的历史行情,并断言历史价1.80与决策日价2.20分开; 不放宽时点规则,也不改真实数据。 ## 当前状态 177的红色回归已确认为行为失败;最初缺少错误枚举限定名的编译失败另存,不作为复现证据。 修复后完整引擎783项、runner410项、API113项通过,分别9/8/3项既有外部或手动测试忽略。 已通过官方入口发布到回测服务;Paper/Live/Strategy Runtime没有在本轮重建或重启, 不能将共享源码修复等同于全部消费者已经部署。 ## 真实回放 固定原策略、2021-08-23至2025-11-17、初始1000万及原冻结bundle。 保留历史`session_capacity_audit`,不能当作开盘容量验收。 全部运行重新执行引擎,Source/磁盘数据缓存保持,不缓存回测结果。 | 状态 | 版本 | 运行ID | 总耗时 | 数据准备 | 引擎 | |---|---|---|---:|---:|---:| | 清DataSet内存 | 原版 | btr_1789251904666_3596554_4 | 17.689s | 8.664s | 8.141s | | 清DataSet内存 | 原版 | btr_1789251925997_3596554_5 | 17.082s | 8.333s | 7.947s | | 清DataSet内存 | 修复版 | btr_1789252042334_3735010_0 | 15.668s | 7.247s | 7.608s | | 清DataSet内存 | 修复版 | btr_1789252061568_3735010_1 | 15.717s | 6.949s | 7.985s | | DataSet复用 | 修复版 | btr_1789252206579_3735010_2 | 8.790s | 0.006s | 7.988s | | DataSet复用 | 修复版 | btr_1789252217644_3735010_3 | 9.892s | 0.006s | 7.880s | 六次均21,393笔成交,账户、权益、委托、成交、持仓、风控canonical及完整制品SHA一致, 终态clean,每次引擎执行次数为1。真实完整数据没有触发新增缺失错误。 最后一次包含1.233秒Source合同验证,不能把DataSet复用等同于Source无等待。 本轮未观察到该样本的性能回退,但这是正确性修复;主机负载及数据读取也有波动, 不将17秒至15秒归因于普遍算法提速,更不外推所有策略。 canonical:`3f089cbcc5412e07bbe2308d0dd60ac561a119f0a2228010fc3323714fde8ca7`。 结果制品:`1905f0c8a887215279342b26d5769a6cbe40058971eef15adf86ef2eaa02aeb9`。 ## 发布证据 177 engine `e3b39295787c4fd896753d633e457deddf9f1232`,service `106a89d8bb74af494cdf84d9d3af5ec4bcb249cd`。 - API:`86f0a0385410db8ab308edf892f4ad6376c0a706c0ebbac0f397a23539d782c0`。 - Runner:`aebdd37ad30ee73f11a9ffd206ad8c978ced19a257cb51849881b0e5bdce36ee`。 - 运行身份:`d196bd4740b1b506c42515a689ae155a21e37b8092956b99a298b8d7934e53c7`。 - 在用构建根:`/srv/fidc/canonical/build/feature-date-candidate-20260913`,禁止清理。 - PID3735010、Boris、active、NRestarts=0;收据时cgroup约7.91GiB,峰值约9.29GiB。 - 原生目录字节SHA仍为`cec37331a476bc39bdea32c308581b8ac2f86d005d8dd4cc7ba228c5d9dc9a2e`。 - Source保持d5/PID1700096,研究和信号未恢复,没有向券商提交订单。 证据根 `/srv/fidc/canonical/run/research/feature-date-integrity-20260913`。 [结构化证据](evidence/feature-date-market-integrity-20260913.json), SHA256 `56e70172916c45060106aca3eb006984735a3f85e6b13d2c325c409e83b8962b`。 更多策略、真实缺口数据审计、Paper/Live消费者发布及完整财务PIT仍未完成。 Source目录缓存的隔离后继验证单独见Alpha Factory的`docs/native-condition-transport-20260913.md`, 不能把本轮回测发布当作Source冻结解除。