数据验证管道

📎 引用文件

本文引用的文件 - agent/backtest/validation.py - agent/backtest/loaders/base.py - agent/backtest/loaders/local_loader.py - agent/backtest/loaders/registry.py - agent/backtest/loaders/_fundamental_schema.py - agent/src/tools/research_reports_tool.py - agent/tests/test_engine_robustness.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件系统化说明 Vibe-Trading 的数据验证管道,覆盖: - 数据输入验证规则、格式检查与异常处理机制 - 数据清洗流程、缺失值处理与类型转换逻辑 - 验证规则配置、自定义验证器扩展点与错误报告机制 - 数据流图与验证流程图 - 与数据加载器的集成方式及性能优化策略 - 数据质量检查工具与调试方法

该管道贯穿“数据接入 → 清洗校验 → 回测统计验证”的完整链路,确保进入回测引擎的数据具备一致的结构、合理的数值范围与可追溯的质量指标。

项目结构

围绕数据验证的关键模块分布如下: - 数据加载与边界校验:位于 backtest/loaders 下,提供统一的 DataLoader 协议、日期范围校验、OHLC 结构校验、重试与预算控制、本地缓存等能力 - 回测统计验证:backtest/validation.py 提供蒙特卡洛置换检验、Bootstrap Sharpe 置信区间、滚动窗口一致性分析 - 基本面字段规范:_fundamental_schema.py 定义统一字段与派生公式,保证因子计算的一致性 - 工具层通用清洗:research_reports_tool.py 提供文本/日期/数值的通用清洗函数,体现一致的缺失与类型处理范式

graph TB A["数据源<br/>CSV/Parquet/DuckDB/网络"] --> B["数据加载器<br/>DataLoaderProtocol"] B --> C["边界校验<br/>validate_date_range / validate_ohlc"] C --> D["本地缓存<br/>loader_cache_*"] D --> E["回测统计验证<br/>validation.py"] E --> F["输出 artifacts/validation.json"]

图表来源 - agent/backtest/loaders/base.py:31-119 - agent/backtest/loaders/base.py:243-439 - agent/backtest/validation.py:286-341

章节来源 - agent/backtest/loaders/base.py:31-119 - agent/backtest/loaders/base.py:243-439 - agent/backtest/validation.py:286-341

核心组件

章节来源 - agent/backtest/loaders/base.py:31-119 - agent/backtest/loaders/local_loader.py:136-184 - agent/backtest/loaders/local_loader.py:249-354 - agent/backtest/validation.py:29-125 - agent/backtest/validation.py:131-197 - agent/backtest/validation.py:203-280 - agent/backtest/validation.py:286-341 - agent/backtest/loaders/_fundamental_schema.py:28-189

架构总览

数据从多种来源进入,经加载器标准化与校验后,进入回测统计验证阶段,最终产出严格 JSON 的可审计结果。

sequenceDiagram participant U as "调用方" participant L as "数据加载器<br/>local_loader.DataLoader" participant B as "基础校验<br/>base.validate_*" participant C as "本地缓存<br/>base.loader_cache_*" participant V as "统计验证<br/>validation.run_validation" participant O as "输出<br/>artifacts/validation.json" U->>L : fetch(codes, start_date, end_date, interval) L->>B : validate_date_range(start,end) L->>C : cached_loader_fetch(...) alt 命中缓存 C-->>L : DataFrame(已清洗) else 未命中 L->>L : 读取文件/查询DB -> 列映射/日期解析/重采样 L->>B : validate_ohlc(frame) L->>C : loader_cache_put(frame) C-->>L : frame end L-->>U : {symbol : DataFrame} U->>V : run_validation(config, equity_curve, trades, initial_capital) V-->>O : write_validation_json(results)

图表来源 - agent/backtest/loaders/local_loader.py:249-354 - agent/backtest/loaders/base.py:31-119 - agent/backtest/loaders/base.py:343-439 - agent/backtest/validation.py:286-341 - agent/backtest/validation.py:434-451

详细组件分析

数据输入验证规则与格式检查

章节来源 - agent/backtest/loaders/base.py:31-47 - agent/backtest/loaders/base.py:50-119 - agent/backtest/loaders/local_loader.py:136-184

缺失值处理与类型转换逻辑

章节来源 - agent/backtest/loaders/local_loader.py:157-184 - agent/src/tools/research_reports_tool.py:305-327

异常处理机制

章节来源 - agent/backtest/loaders/base.py:163-236 - agent/backtest/loaders/base.py:475-511 - agent/backtest/validation.py:49-58 - agent/backtest/validation.py:151-165

数据清洗流程

flowchart TD Start(["开始"]) --> Read["读取原始数据<br/>CSV/Parquet/DuckDB"] Read --> MapCols["列映射与选择<br/>date/open/high/low/close/volume"] MapCols --> ParseDate["日期解析与归一化<br/>UTC→UTC-naive 索引"] ParseDate --> DropNA["缺失值处理<br/>dropna 剔除空行"] DropNA --> ValidateOHLC["OHLC 结构校验<br/>结构不变量 + 价格非正"] ValidateOHLC --> Resample{"是否需重采样?"} Resample --> |是| ToInterval["按目标周期聚合<br/>open=first, high=max, low=min, close=last, volume=sum"] Resample --> |否| Keep["保持原粒度"] ToInterval --> Finalize["类型转换<br/>float64 并确保列存在"] Keep --> Finalize Finalize --> End(["结束"])

图表来源 - agent/backtest/loaders/local_loader.py:83-126 - agent/backtest/loaders/local_loader.py:136-184 - agent/backtest/loaders/base.py:50-119

验证规则配置与执行

章节来源 - agent/backtest/validation.py:286-341 - agent/backtest/validation.py:434-451 - agent/backtest/validation.py:454-486

自定义验证器开发与扩展点

章节来源 - agent/backtest/loaders/registry.py:62-68 - agent/backtest/loaders/registry.py:136-155 - agent/backtest/loaders/_fundamental_schema.py:196-217

错误报告机制

章节来源 - agent/backtest/validation.py:49-58 - agent/backtest/validation.py:151-165 - agent/backtest/validation.py:419-451 - agent/backtest/loaders/base.py:475-511

数据流图与验证流程图

graph LR S["数据源"] --> L["加载器<br/>local_loader"] L --> V["校验<br/>base.validate_*"] V --> C["缓存<br/>base.loader_cache_*"] C --> R["回测统计验证<br/>validation.run_validation"] R --> J["JSON 输出<br/>validation.json"]

图表来源 - agent/backtest/loaders/local_loader.py:249-354 - agent/backtest/loaders/base.py:31-119 - agent/backtest/loaders/base.py:343-439 - agent/backtest/validation.py:286-341 - agent/backtest/validation.py:434-451

依赖关系分析

graph TB R["registry.py"] --> L1["local_loader.py"] R --> L2["其他网络加载器"] R --> B["base.py"] B --> V["validation.py"] L1 --> B

图表来源 - agent/backtest/loaders/registry.py:23-59 - agent/backtest/loaders/registry.py:136-155 - agent/backtest/loaders/registry.py:158-193 - agent/backtest/loaders/base.py:243-439 - agent/backtest/validation.py:286-341

章节来源 - agent/backtest/loaders/registry.py:23-59 - agent/backtest/loaders/registry.py:136-155 - agent/backtest/loaders/registry.py:158-193

性能考量

章节来源 - agent/backtest/loaders/base.py:243-439 - agent/backtest/loaders/base.py:163-236 - agent/backtest/validation.py:60-113 - agent/backtest/validation.py:169-192

故障排查指南

章节来源 - agent/backtest/loaders/base.py:31-47 - agent/backtest/loaders/base.py:50-119 - agent/backtest/loaders/base.py:475-511 - agent/backtest/validation.py:49-58 - agent/backtest/validation.py:151-165 - agent/tests/test_engine_robustness.py:476-506

结论

Vibe-Trading 的数据验证管道以“强边界校验 + 稳健清洗 + 统计验证”为核心,确保进入回测的数据具备一致性与可靠性。通过统一的 DataLoader 协议、可配置的验证规则、严格的 JSON 输出与完善的缓存/重试机制,系统在易用性、鲁棒性与性能之间取得平衡。建议在生产环境中: - 显式启用 validate_ohlc 并采用 warn/drop 策略逐步收敛脏数据 - 合理配置缓存与重试预算,避免极端场景下的资源耗尽 - 定期审查 validation.json 中的统计指标,识别策略不稳定或数据质量问题

附录