Files

46 lines
4.5 KiB
Markdown

# 回测未来数据检查与版本记录
从本功能起,通过策略回测页面、`POST /api/backtest/strategy/run` 或 SSE 发起的正式回测,会自动生成核查报告。日线表达式、历史 Python 策略、矩阵策略、叠加策略及分钟策略复用各自的生产信号管线;优化器的每个参数试算保持轻量,需将选中的参数载入正式回测生成报告。
## 时间检查
- 固定本次数据快照、策略参数、标的集合和预热起点,最多选择 3 个实际交易时点;分钟策略选择最多 3 个交易日,每日最多 3 个分钟截点。
- 分别删除截点后的行情、扰动截点后的数值,重算后比较截点及之前的历史特征、候选、买卖信号和评分。矩阵策略检查其公开的信号输出;分钟策略检查触发时间、触发价及评分。
- 若发现变化,再用完全相同的输入复算基线,区分未来数据依赖与非确定性/带状态策略。
- 浮点比较容差为 `rtol=1e-6, atol=1e-7`,空值与空值相等。报告记录差异数量,并为每次重算保留最多 5 条日期、标的、字段和前后数值示例。
- 状态分别为抽样未发现差异、检测到变化、数据不足、检查错误、部分未完成和取消。缺字段、重算异常、无可切分时间点都不会记为通过。发现变化只标记结果供排查,不擅自修改用户策略。
日线表达式路径从基础数据重新计算指标与信号,不是切割已经算好的信号。公告日门控、交易日、股票 T+1、费用、滑点和涨跌停成交约束继续由原有管线执行。
同时单独核对已完成交易的信号日和成交日:信号不能晚于成交,日线的「次日开盘」信号成交必须晚于信号日;分钟触发入场及期末估值按原有语义处理。时间核对不修改成交结果,异常在页面和报告中单独标出。扩展时序数据在准备时固定为快照,检查重算不会再次读取更新后的扩展数据。
这不是全时点无泄漏证明。检查不能证明供应商数据、复权历史修订、历史股票池、静态维表及外部 Python 导入满足 point-in-time;未触发的逻辑也可能未被覆盖。应结合公告时点验证、滚动样本外验证及模拟盘结果判断。
## 版本追溯
报告分别记录:
- 本次实际加载的本地标准化数据内容 SHA-256、字段指纹、行数和时间范围,区分股票/ETF。包括预热和全量模式退出尾部;分钟回放和分钟精确成交按实际读取批次记录。
- 标的信息、历史股本、财务公告、市场环境和同期基准等实际使用的辅助数据。
- 策略文件、叠加子策略及本地信号/因子/仓位定义目录的内容指纹。定义目录指纹覆盖整个注册目录,未使用定义的修改也会改变该部分指纹。
- 包含默认参数的有效运行配置、独立参数指纹、应用/核心代码/Python/Polars/NumPy 版本及组合指纹。冻结发行版缺少源码文件时,对应代码文件指纹为 `null`,应用版本仍保留。
- 检查报告、核心回测统计及策略定义在运行期间是否发生变化。
数据来源标注为本次读取的本地标准化快照,**不把当前配置的数据源冒充为历史入库来源**。不读取密钥、环境变量或完整偏好配置。
每次正式回测的报告保存在运行数据目录的 `backtest_runs/<run_id>.json`。按回测编号读取:
```text
GET /api/backtest/strategy/runs/{run_id}/evidence
```
策略回测结果的 `evidence` 字段包含同一份报告,页面可展开查看及导出 JSON;CSV 概要携带回测编号及三个版本指纹。保存失败会明确标记,仍可导出内存中的报告。旧结果缺少 `evidence` 时正常显示,重新回测后才生成记录。
**内容指纹不是全量行情备份。** 它用于确认两次运行的数据、策略或参数是否变化、定位变化字段。原始行情被覆盖后,不能仅凭指纹恢复旧数据或自动重放旧回测。
## 缓存与兼容边界
版本与检查仅在独立回测 worker 内收集。检查重用本次不可变输入,变体不写行情仓库、Parquet、共享矩阵缓存或策略结果缓存;报告不进入缓存键。SSE 重连复用原结果时携带原报告,不重新盖章。原有日K修订失效检查保持生效。
未修改行情存储 schema、数据源协议或历史配置。核查报告按版本 1 独立落盘,读写拒绝非法回测编号、符号链接越界和损坏记录;原有用户数据不迁移、不覆盖。