docs(arch): 一切皆扩展架构优化路线 (P0-P4) — 分层物化/统一契约/依赖推导

Signed-off-by: shy3130 <shy3130@qq.com>
This commit is contained in:
shy3130
2026-10-26 13:39:39 +08:00
parent 2892c644f1
commit e9b938a3ac
+68
View File
@@ -0,0 +1,68 @@
# 一切皆扩展 — 架构优化路线(P0–P4)
> 分支 `feat/ext-architecture`。目标: 因子/信号/指标/过滤/评分/策略全部以"定义"形式扩展,
> 保存即注册、处处可用 (检验/筛选/回测/监控/图表), 且性能随扩展数量增长基本持平。
> 本文档是路线图与验收基准, 各阶段独立可交付、可停。
## 目标架构总图
```
┌─ 定义层 ──────────────────────────────────────────────┐
│ 统一契约: {id, kind, version, params(类型+默认), │
│ inputs(依赖列), expression, meta} │
│ kind = signal | factor | indicator | filter | scoring │
│ 存储: 标准 Store 基类(原子写+签名缓存+失效广播+文件锁) │
│ 校验: DSL 解析 → 依赖提取 → DAG 环检测 → 未来函数防线 │
└──────────────────┬───────────────────────────────────┘
▼
┌─ 编译层(三级逃生舱)──────────────────────────────────┐
│ T1 声明式 DSL(含 ewm/ts_slope + macd()/kdj() 宏) │
│ T2 表达式级 Python(只返回 Polars 表达式, ctx.col 可追踪)│
│ T3 自由 Python 策略(现状保留; 第三方导入成真时再子进程) │
└──────────────────┬───────────────────────────────────┘
▼
┌─ 物化层(核心新增)────────────────────────────────────┐
│ L0 OHLCV+复权(现状) L1 内置指标预计算(现状) │
│ L2 扩展定义按需物化: 缓存键 = hash(定义) + 数据版本 │
│ + 分区键; 时序算子按 symbol, 截面算子按 date 分区 │
│ 失效: 定义变更沿 DAG 反向传播 (generation 机制) │
└──────────────────┬───────────────────────────────────┘
▼
┌─ 消费层 ──────────────────────────────────────────────┐
│ 因子检验 | 策略筛选 | 回测/优化 | 监控 | K线图叠加 │
│ 统一选择器 + schema 自动渲染参数表单 + 导入即注册即冒烟 │
└──────────────────────────────────────────────────────┘
横切: 备份/分发管线复用(定义即文件) | AI 生成(契约即提示词)
```
## 设计红线(做错即返工)
1. **截面算子(rank/zscore)按 date 分区, 时序算子(ts_*)按 symbol 分区** — 截面残缺不报错,
是金融数据最危险的错误形态
2. **递归算子(EMA)缓存键必须含窗口参数** — 不同起点结果不同, 禁止跨窗口复用
3. **fail-closed 优先于 fail-fast** — 推导/解析不可证明时保持兜底或拒绝, 绝不静默给错列
4. **存量兼容** — 旧策略/三套缓存在每个阶段全程可跑, 适配器过渡, 不一刀切迁移
## 阶段与验收
| 阶段 | 内容 | 验收 | 状态 |
|---|---|---|---|
| P0 基准 | `backend/scripts/bench_feature_resolution.py`; 依赖解析宽度/耗时基线 | 基线 JSON 落 `data/benchmarks/`(本地不入库) | ✅ |
| P1a 依赖推导 | filter_history AST 列推导(`app/strategy/feature_deps.py`), 引擎加载接入 | 无声明且可证明的策略不再全量兜底 | ✅ |
| P1b 契约统一 | signal/factor 统一 schema + 依赖提取公共化 | 新增 kind 复用同一校验/注册路径 | ⬜ |
| P2 L2 物化 | 按需物化 + 内容寻址缓存 + 失效传播; 指标成为一等定义 | 调参循环提速 ≥2×; 新增 10 个自定义指标热路径耗时不变 | ⬜ |
| P3 表达式级 Python | T2 中间层 (ctx 追踪依赖+安全) | SKDJ 类口径零 DSL 可表达 | ⬜ |
| P4 体验与分发 | 统一选择器/自动表单/导入冒烟; 备份管线复用为扩展包 | 新增信号导入到可回测 ≤2 分钟 | ⬜ |
| 条件: 沙箱 | T3 子进程执行 | 触发条件: 首次真实导入第三方扩展 | ⬜ |
## P1a 实测(2026-10-26, 本机, 26 个动态策略)
| 策略 | legacy 指标列宽 | 推导后 | 宽度比 |
|---|---|---|---|
| custom_v1_kanban_strict | 37 | 3 | 12.3× |
| custom_mq4sq94g | 37 | 4 | 9.3× |
| custom_1782999589 | 37 | 5 | 7.4× |
| auction_steady_rise | 37 | 3 | 12.3× |
| short_term_top10 | 37 | 37 | 1.0× (动态列名循环, 正确 fail-closed) |
数据加载 IO 随列宽近似线性, 宽度比即回测数据准备阶段的近似提速上界。