数据模型与验证

📎 引用文件

本文引用的文件 - agent/backtest/models.py - agent/backtest/loaders/_fundamental_schema.py - agent/backtest/loaders/base.py - agent/src/market_data.py - agent/backtest/validation.py - agent/src/entities/models.py - agent/src/config/schema.py

目录

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

简介

本文件聚焦 Vibe-Trading 的数据模型与验证系统,围绕以下目标展开: - 核心数据模型设计:MarketData、FundamentalData、TimeSeries 的结构定义与职责边界。 - Pydantic 模型验证规则:数据类型检查、业务规则校验与异常处理策略。 - 财务数据模式:资产负债表、利润表、现金流量表的字段规范与派生指标。 - 数据质量检查:缺失值检测、异常值识别、数据一致性验证。 - 数据转换管道:格式标准化、单位换算、时间序列对齐。 - 实际使用示例:如何定义新数据模型并执行数据验证。

项目结构

本项目将“市场数据”“基本面数据”“回测/验证”“实体与配置”分层组织: - 市场数据层:统一通过加载器(Loader)获取 OHLCV,支持多源自动回退与行级裁剪。 - 基本面数据层:以统一字段 Schema 映射 SEC XBRL 概念,提供原始与派生字段。 - 回测与验证:对交易结果进行统计检验(蒙特卡洛、Bootstrap、滚动窗口)。 - 实体与配置:非价格型资产(基金、债券等)的强类型实体;MCP/Agent 配置的 Pydantic 校验。

graph TB subgraph "数据接入" MD["市场数据入口<br/>fetch_market_data"] LBase["加载器基类<br/>validate_ohlc / 缓存"] FSchema["基本面字段Schema<br/>RAW_FIELDS / DERIVED_FIELDS"] end subgraph "数据模型" BM["回测数据模型<br/>Position/Fill/Trade/EquitySnapshot"] EM["实体模型<br/>Instrument/Fund/Bond"] CM["配置模型<br/>Pydantic: MCPServerConfig/AgentConfig"] end subgraph "验证与质量" VAL["统计验证<br/>Monte Carlo / Bootstrap / Walk-Forward"] QG["数据质量<br/>OHLC不变量/缺失/异常"] end MD --> LBase LBase --> BM FSchema --> BM BM --> VAL EM --> CM QG --> VAL

图表来源 - agent/src/market_data.py:97-223 - agent/backtest/loaders/base.py:31-119 - agent/backtest/loaders/_fundamental_schema.py:28-189 - agent/backtest/models.py:13-118 - agent/src/entities/models.py:141-397 - agent/src/config/schema.py:301-513 - agent/backtest/validation.py:29-341

章节来源 - agent/src/market_data.py:97-223 - agent/backtest/loaders/base.py:31-119 - agent/backtest/loaders/_fundamental_schema.py:28-189 - agent/backtest/models.py:13-118 - agent/src/entities/models.py:141-397 - agent/src/config/schema.py:301-513 - agent/backtest/validation.py:29-341

核心组件

章节来源 - agent/src/market_data.py:97-223 - agent/backtest/loaders/_fundamental_schema.py:28-189 - agent/backtest/loaders/base.py:50-119 - agent/backtest/models.py:13-118 - agent/src/entities/models.py:141-397 - agent/src/config/schema.py:301-513

架构总览

下图展示从数据接入到验证输出的端到端流程,包括数据清洗、模型化与统计检验。

sequenceDiagram participant U as "调用方" participant M as "市场数据入口<br/>fetch_market_data" participant R as "加载器注册表/回退链" participant B as "加载器基类<br/>validate_ohlc" participant S as "基本面Schema<br/>resolve_field" participant V as "统计验证<br/>run_validation" U->>M : 请求代码/区间/频率 M->>R : 按市场匹配首选源与回退链 R-->>M : 可用加载器 M->>B : 拉取OHLCV并清洗 B-->>M : 通过validate_ohlc的DataFrame U->>S : 解析基本面字段(可选) S-->>U : 原始/派生字段 U->>V : 传入权益曲线/交易记录 V-->>U : 蒙特卡洛/Bootstrap/滚动窗口结果

图表来源 - agent/src/market_data.py:97-223 - agent/backtest/loaders/base.py:50-119 - agent/backtest/loaders/_fundamental_schema.py:196-217 - agent/backtest/validation.py:286-341

详细组件分析

市场数据(MarketData)

flowchart TD Start(["开始"]) --> Detect["推断首选源"] Detect --> Chain{"构建回退链"} Chain --> TryFetch["尝试加载器.fetch()"] TryFetch --> |成功| Clean["JSON安全化/裁剪行数"] TryFetch --> |失败| Next{"还有备用源?"} Next --> |是| TryFetch Next --> |否| Unresolved["标记_unresolved"] Clean --> Done(["结束"]) Unresolved --> Done

图表来源 - agent/src/market_data.py:51-84 - agent/src/market_data.py:97-223

章节来源 - agent/src/market_data.py:51-84 - agent/src/market_data.py:97-223

基本面数据(FundamentalData)

classDiagram class 原始字段 { +revenue +cogs +gross_profit +operating_income +net_income +total_assets +total_equity +total_debt +cash +shares_diluted +cfo +capex } class 派生字段 { +roe +roa +gross_profitability +asset_growth +accruals +leverage } class SEC概念映射 { +映射表 } 原始字段 <.. 派生字段 : "依赖" SEC概念映射 --> 原始字段 : "归一化"

图表来源 - agent/backtest/loaders/_fundamental_schema.py:28-189 - agent/backtest/loaders/_fundamental_schema.py:196-217

章节来源 - agent/backtest/loaders/_fundamental_schema.py:28-189 - agent/backtest/loaders/_fundamental_schema.py:196-217

时间序列(TimeSeries)与数据质量

flowchart TD In(["输入DataFrame"]) --> CheckCols{"包含OHLC列?"} CheckCols --> |否| OutKeep["原样返回"] CheckCols --> |是| Structural{"结构不变量检查"} Structural --> Positivity{"价格正性检查(可配)"} Positivity --> Strategy{"策略: drop/warn/raise"} Strategy --> |drop| Clean["剔除无效行"] Strategy --> |warn| Keep["保留并记录警告"] Strategy --> |raise| Err["抛出异常"] Clean --> Out(["输出"]) Keep --> Out Err --> Out

图表来源 - agent/backtest/loaders/base.py:50-119

章节来源 - agent/backtest/loaders/base.py:50-119

回测数据模型(Position/Fill/Trade/EquitySnapshot)

classDiagram class Position { +symbol +direction +entry_price +entry_time +size +leverage +entry_bar_idx +entry_commission } class FillRecord { +symbol +timestamp +bar_idx +action +signed_quantity +notional +execution_price +fee +margin +reason +holding_bars } class TradeRecord { +symbol +direction +entry_price +exit_price +entry_time +exit_time +size +leverage +pnl +pnl_pct +exit_reason +holding_bars +commission +entry_margin +exit_margin } class EquitySnapshot { +timestamp +capital +unrealized +equity +positions } FillRecord --> TradeRecord : "组成" Position --> TradeRecord : "闭合" TradeRecord --> EquitySnapshot : "驱动权益曲线"

图表来源 - agent/backtest/models.py:13-118

章节来源 - agent/backtest/models.py:13-118

实体与配置(非价格资产与Pydantic校验)

classDiagram class Entity { +entity_id +name +entity_type +domicile +parent_id } class Instrument { +instrument_id +currency +name +issuer +inception_date } class Security { +symbol +exchange +security_type } class Fund { +vintage_year +structure +strategy +commitment +management_fee_rate } class Bond { +face_value +coupon_rate +coupon_frequency +maturity_date +day_count } Instrument <|-- Security Instrument <|-- Fund Instrument <|-- Bond Entity <.. Instrument : "关联发行主体"

图表来源 - agent/src/entities/models.py:141-397 - agent/src/config/schema.py:301-513

章节来源 - agent/src/entities/models.py:141-397 - agent/src/config/schema.py:301-513

依赖关系分析

graph LR MD["market_data.py"] --> LB["loaders/base.py"] FS["_fundamental_schema.py"] --> BM["backtest/models.py"] BM --> VAL["validation.py"] EM["entities/models.py"] --> CFG["config/schema.py"]

图表来源 - agent/src/market_data.py:97-223 - agent/backtest/loaders/base.py:50-119 - agent/backtest/loaders/_fundamental_schema.py:28-189 - agent/backtest/models.py:13-118 - agent/backtest/validation.py:286-341 - agent/src/entities/models.py:141-397 - agent/src/config/schema.py:301-513

章节来源 - agent/src/market_data.py:97-223 - agent/backtest/loaders/base.py:50-119 - agent/backtest/loaders/_fundamental_schema.py:28-189 - agent/backtest/models.py:13-118 - agent/backtest/validation.py:286-341 - agent/src/entities/models.py:141-397 - agent/src/config/schema.py:301-513

性能考量

章节来源 - agent/backtest/loaders/base.py:243-439 - agent/src/market_data.py:66-84 - agent/backtest/validation.py:60-113 - agent/backtest/validation.py:131-192

故障排查指南

章节来源 - agent/backtest/loaders/base.py:50-119 - agent/src/market_data.py:158-223 - agent/backtest/loaders/_fundamental_schema.py:196-217 - agent/src/config/schema.py:373-492

结论

附录:使用示例