SAF Architecture Review

策略自动化工厂 — 架构深度评审(修订版) 更新时间: 2026-04-14 评审范围: SAF / Strategy Factory / 各子系统联动


1. 定位与愿景

QMT 工作区
│
├── qdata/          统一数据层
├── qss/            量化策略系统
├── its/            舆情/情绪分析
├── sps/            盘中信号监控
├── tss/            策略研发回测
│
└── SAF/            策略自动化工厂
    ├── core/saf/   saf Python 包(核心引擎)
    └── strategy_factory/  策略工厂(批量评估)

2. 实际架构:双轨并行

strategy_factory/
│
├── run_evaluate.py        ← 批量评估入口(当前生产路径)
│   │
│   ├─ legacy/evaluate/engine.py     CrossSectionalBacktester ← 实际运行的回测引擎
│   ├─ legacy/evaluate/scorer.py    6D 评分 + 场景切片
│   └─ evaluate/fast_screen_policy.py  快筛策略
│
├── run_pipeline.py        ← 策略数据提纯入口(LLM 清洗 raw→JSON)
│   └── pipeline/runner.py
│
├── evaluate/
│   ├── engine_adapter.py  ⚠️ 存在但未接入 — SAF 引擎适配器
│   └── fast_screen.py
│
└── backtest_*.py         ← 专项回测工具(独立使用)
    ├── backtest_regime.py         Regime 三策略对比 (374L) ✅
    ├── backtest_regime_aware.py   Regime-Aware 回测 (499L) ✅
    ├── backtest_skills_v71.py     Skills V7.1 回测 (342L) ✅
    ├── backtest_sps.py            SPS 回测 (360L) ✅
    ├── backtest_sps_v2.py         SPS V2 回测 (325L) ✅
    ├── backtest_v7_vs_v8.py       V7 vs V8 对比 (289L) ✅
    └── test_tdx_api.py             TDX API 测试 (297L)

3. 双轨详解

3.1 Legacy 轨(✅ 当前生产路径)

run_evaluate.py
  │
  ├─ CrossSectionalBacktester   (legacy/evaluate/engine.py)
  │   ├─ load_data_yfinance()        ✅ Mac 主路径
  │   ├─ load_data_csv()             ✅ CSV fallback
  │   ├─ load_data_gateway()         ✅ QMT gateway
  │   ├─ _normalize_ohlcv()         ✅ 列名统一
  │   └─ signal_func(df) → equity   ✅ 截面回测
  │
  ├─ fast_screen_policy.py
  │   ├─ infer_profile()             ✅ 策略画像推断
  │   ├─ should_retry_rejected()     ✅ 重试策略
  │   └─ classify_*()                ✅ 分类逻辑
  │
  └─ legacy/evaluate/scorer.py
      ├─ score_strategy()             ✅ 6D 评分
      ├─ score_scenario_slices()     ✅ 场景切片评分
      └─ generate_report()            ✅ JSON/MD 输出

特点: 直接操作 pandas DataFrame,不依赖 saf.data 包,零抽象开销。

策略路由与专用池:Legacy 轨支持 futures/etf/cb 专用池路由(plan_strategy_route),拒绝不足以 symbol 的专用池标的,不再 fallback 到 equity 池。

3.2 SAF Engine 轨(✅ 已接入 run_evaluate.py)

run_evaluate.py --engine saf
  │
  └─ SAFEngineAdapter (evaluate/engine_adapter.py)
       │
       ├─ strategy_topology=time_series
       │    → run_time_series_backtest()  逐标的调用 TimeSeriesBundle → SAF 引擎
       └─ strategy_topology=cross_sectional
            → run_panel_backtest()         批量调用 PanelBundle → SAF 引擎

SAF/core/saf/engine/
  ├─ TimeSeriesExecutionEngine    ✅ 264行,时序单标的回测
  ├─ PanelExecutionEngine        ✅ 354行,截面多标的回测(含再平衡逻辑)
  ├─ PairsExecutionEngine        ✅ 411行,配对交易回测
  ├─ sandbox.py                 ✅ execute_signal_function(),30s 超时
  ├─ config.py                  ✅ CostModel (commission/slippage/stamp_duty)
  └─ protocols.py               ✅ BacktestRequest / BacktestResult

✅ 共同依赖: saf.data.models
   (StandardBar / TimeSeriesBundle / PanelBundle / PairBundle / Frequency)
   ✅ 已实现(见 core/saf/data/models/)

3.3 两轨对比 ✅

维度Legacy 轨SAF Engine 轨
状态✅ 生产可用✅ 代码完整
数据抽象直接用 pandassaf.data 包已实现
截面回测✅ CrossSectionalBacktester✅ PanelExecutionEngine
时序回测❌ 无单独时序引擎✅ TimeSeriesExecutionEngine
配对回测❌ 无✅ PairsExecutionEngine
连接方式直接调用✅ SAFEngineAdapter(–engine saf 接入)

4. SAF/core/saf/ — saf Python 包详情

SAF/core/saf/          (包名: saf)
│
├── models/              StrategySpec / BacktestArtifact / enums         ✅
├── capability/          CapabilityResolver / ExecutionPlanner            ✅
│
├── engine/
│   ├── time_series.py   TimeSeriesExecutionEngine   ✅ 264行
│   ├── panel.py         PanelExecutionEngine       ✅ 354行
│   ├── pair.py          PairsExecutionEngine       ✅ 411行
│   ├── sandbox.py       execute_signal_function()  ✅ 148行
│   ├── config.py        CostModel                  ✅
│   ├── protocols.py     BacktestRequest/Result      ✅
│   └── vnpy_adapter.py VnPyAdapterEngine           ✅
│
├── evaluation/
│   ├── metrics.py       基础 + 扩展指标            ✅
│   ├── scorer.py        消除门 + 6D 评分           ✅
│   ├── slices.py        年度/状态切片 + 报告        ✅
│   ├── diagnostics.py   诊断                        ✅
│   └── failure_codes.py 失败码                      ✅
│
├── orchestrator/        BatchExecutor / Scheduler / JobState   ✅
├── strategy/            Parser / Compiler / StaticChecker      ✅
├── storage/            ArtifactStore / ManifestStore / CacheStore ✅
└── api/               FastAPI routes                        ✅

✅ 已实现(core/saf/data/models/)— Frequency / StandardBar / TimeSeriesBundle / PanelBundle / PairBundle / UniverseSnapshot

5. 核心缺失项

P0 ✅ — saf.data 包已实现

core/saf/data/
├── __init__.py          # 公共导出
└── models/
    ├── __init__.py       # 子模块统一导出
    ├── frequency.py     # Frequency 枚举
    ├── standard_bar.py  # StandardBar
    ├── universe.py       # UniverseSnapshot
    ├── time_series.py    # TimeSeriesBundle
    ├── panel.py          # PanelBundle
    └── pair.py           # PairBundle

验证: 三引擎 import 链路已通过 smoke test:

TimeSeriesExecutionEngine ✓  ← TimeSeriesBundle
PanelExecutionEngine     ✓  ← PanelBundle + StandardBar
PairExecutionEngine      ✓  ← PairBundle + StandardBar
BacktestBundle           ✓  ← 三者联合类型

注意: qdata/qdata/adapters/ 是 qdata 自身的数据适配层(akshare / tdx / qmt_remote / xtpython_futures / tdx_futures / qmt_etf / tdx_etf / tdx_cb / csv),不属于 saf.data,是两个独立的适配器体系。

qdata 专用池适配器(2026-04-14 新增)

qdata/qdata/adapters/
├── xtpython_futures_adapter.py   # XTPython 期货主力合约 + 历史K线
├── tdx_futures_adapter.py        # TDX 期货 K线(无主力合约接口,用默认列表)
├── qmt_etf_adapter.py            # QMT ETF 下载 + 本地缓存
├── tdx_etf_adapter.py            # TDX ETF 筛选 + K线
└── tdx_cb_adapter.py             # TDX 可转债

对应专用池配置:

strategy_factory/config/pools/
├── futures_pool.csv   # 38 个期货品种(RB/HC/I/J/AU/AG...)
├── etf_pool.csv       # 28 个 ETF(510050/510300/159915...)
└── cb_pool.csv       # 24 个可转债

P1 ✅ — SAFEngineAdapter 已接入 run_evaluate.py

evaluate/engine_adapter.py 存在,已通过 --engine flag 接入 run_evaluate.py。
run_evaluate.py --engine legacy (默认) → Legacy 引擎
run_evaluate.py --engine saf          → SAF 引擎

SAF 引擎路径:
  strategy_topology=time_series  → SAFEngineAdapter.run_time_series_backtest() (逐标的)
  strategy_topology=cross_sectional → SAFEngineAdapter.run_panel_backtest() (批量截面)

两种路径输出格式相同,统一经由 _aggregate_results + score_strategy 评分。

P2 — 专项回测工具未集成

backtest_regime.py         独立工具,未接入 run_evaluate.py
backtest_regime_aware.py   同上
backtest_skills_v71.py     同上
backtest_sps.py           同上
backtest_sps_v2.py        同上
backtest_v7_vs_v8.py      同上

6. run_evaluate.py CLI 参数(生产可用)

run_evaluate.py [OPTIONS]

标的与时间:
  --symbols              标的代码 (默认: 510300.SSE)
  --start / --end       日期范围

股票池:
  --pool-file           股票池 CSV 路径
  --pool-limit          最大标的数量

专用池 (2026-04-14 新增):
  --futures-pool-file   期货池 CSV 路径
  --etf-pool-file       ETF 池 CSV 路径
  --cb-pool-file        可转债池 CSV 路径
  --enable-futures-routing  启用期货路由

策略限制:
  --limit               最大处理策略数

数据源:
  --data-source         csv | gateway
  --csv-dir             CSV 目录
  --gateway-strict-remote

回测参数:
  --engine             回测引擎: legacy (默认) | saf
  --cash                初始资金 (默认: 1000000)
  --commission          手续费率 (默认: 0.001)
  --slippage            滑点 bps (默认: 0.2%)
  --signal-timeout-sec  信号超时 (默认: 20s)

快筛:
  --fast-screen-size    快筛数量 (默认: 24)
  --fast-screen-min-valid-symbols

缓存与报告:
  --strategy-cache-dir  策略缓存目录 (默认: .cache/evaluate_strategy)
  --report-dir          报告输出目录 (默认: .cache/evaluate_results)

7. 6D 评分系统 ✅ 已完整实现

消除门 (任一触发 → 直接淘汰):
  MaxDD > 40% / Sharpe < 0.3 / CAGR < 0 / trades < 6 / win_rate < 20%

6D:
  Return Score (35%)    CAGR(40%) + Sharpe(30%) + ProfitFactor(30%)
  Robust Score (45%)   MaxDD(30%) + Calmar(25%) + RollingSharpeStd(25%) + Sortino(20%)
  Implement Score (20%) WinRate(30%) + PayoffRatio(30%) + HoldingDays(20%) + Turnover(20%)

Tier: S≥85 / A≥70 / B≥55 / C<55

8. 已实现组件总览

组件文件状态
截面回测引擎(含 cancel_futures=True 超时修复)legacy/evaluate/engine.py✅ 生产可用
6D 评分legacy/evaluate/scorer.py✅ 生产可用
TimeSeriesExecutionEnginecore/saf/engine/time_series.py✅ 代码完整
PanelExecutionEnginecore/saf/engine/panel.py✅ 代码完整
PairsExecutionEnginecore/saf/engine/pair.py✅ 代码完整
SAFEngineAdapterevaluate/engine_adapter.py✅ 已接入 run_evaluate.py
Regime 回测对比backtest_regime.py✅ 独立工具
Regime-Aware 回测backtest_regime_aware.py✅ 独立工具
Skills V7.1 回测backtest_skills_v71.py✅ 独立工具
SPS 回测backtest_sps.py✅ 独立工具
SPS V2 回测backtest_sps_v2.py✅ 独立工具
V7 vs V8 对比backtest_v7_vs_v8.py✅ 独立工具
TDX API 测试test_tdx_api.py
策略提纯流水线run_pipeline.py✅ LLM 清洗入口
saf.data 抽象层core/saf/data/✅ 已实现
期货池 CSVstrategy_factory/config/pools/futures_pool.csv✅ 38 品种
ETF 池 CSVstrategy_factory/config/pools/etf_pool.csv✅ 28 ETF
可转债池 CSVstrategy_factory/config/pools/cb_pool.csv✅ 24 可转债
XTPython 期货适配器qdata/qdata/adapters/xtpython_futures_adapter.py
TDX 期货适配器qdata/qdata/adapters/tdx_futures_adapter.py
QMT ETF 适配器qdata/qdata/adapters/qmt_etf_adapter.py
TDX ETF 适配器qdata/qdata/adapters/tdx_etf_adapter.py
TDX 可转债适配器qdata/qdata/adapters/tdx_cb_adapter.py

9. 建议补齐路径

第一步: 专项回测工具集成 (P1)
  │
  └─ backtest_regime/regime_aware/sps 等接入统一流水线

10. 相关文档

文档位置
SAF 特性树SAF/docs/SAF_FEATURE_TREE.md
SAF 系统需求SAF/docs/SAF_SYSTEM_REQUIREMENTS.md
策略工厂特性树SAF/strategy_factory/docs/strategy_factory_FEATURE_TREE.md
统一特性树docs/FeatureTree.md
FeatureTree HTMLdocs/FeatureTree.html

本评审基于代码逐行分析,各文件行数均已核实。如有出入请指出。