Commit Graph
7 Commits
Author SHA1 Message Date
shy3130 c932098ae7 docs(ext-architecture): P4 交付记录补齐前端消费面 (选择器/定义目录页签/导入冒烟展示)
Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-26 15:56:02 +08:00
shy3130 f3c30b728b feat(definitions): P4 统一定义目录 + 导入即冒烟 — 导入到可回测全链 <2s, P0-P4 收官
「一切皆扩展」的消费面与验收闭环:

- GET /api/definitions: 跨 kind (signal/factor) 统一目录视图 (label/lang/
  依赖/warmup/状态) — 统一选择器的数据半边; 单个坏定义不阻断目录 (隔离)。
- POST /api/definitions/smoke: 导入冒烟 (静态层) — validate → 编译 → 依赖
  可解析性 (enriched/指标/注册表因子/扩展字段的并集判据, 拼错列名 W001
  当场报出)。信号编译告警经日志捕获转为 issue, 不静默。
- 备份导入内置冒烟: apply_archive 对每个导入的信号/因子落盘后立刻冒烟,
  结果随响应返回 (smoke 字段); 冒烟自身异常不阻断导入 (fail-open)。
- 验收 (docs/ext-architecture-plan.md P4 ≤2 分钟): 自动化全链测试 —
  构建含新信号+新因子的备份 ZIP → apply (冒烟 ok) → 立即用引用该信号的
  策略跑回测成功, 全程 <2s。
- 前端选择器组件/参数表单自动渲染属前端后续工作, 数据与 API 契约已就绪。
- 回归: config_backup/definitions/factor 67 测试全过; ruff 新增文件全清
  (main.py/config_backup 存量告警与 HEAD 逐条一致)。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-26 14:59:52 +08:00
shy3130 0f12836401 feat(factors): P3 T2 表达式级 Python — SKDJ 类口径零 DSL 可表达
自定义因子新增第二档编写语言 (lang=python): 受限 Python 表达式块,
只返回单个 Polars 表达式。三档编译层就此齐备: T1 DSL < T2 表达式级
Python < T3 自由 Python 策略。

- app/factors/py_expr.py: AST 白名单文法 (仅赋值/表达式语句; 名字限
  ctx/pl 与已赋值局部量; 禁 import/def/lambda/循环/推导式/下划线属性/
  map_*/apply/IO 类调用) + {ctx, pl} + 空 builtins 求值; ctx.col 构造期
  登记依赖 (无需推导); warmup 从窗口常量保守求和 (显式声明只能增大,
  少算失真是错误方向)。
- 贯通链路: FactorSpec.lang (默认 dsl, 存量零影响) → to_spec 编译分支 →
  materialize 按 lang 分发 (T2 结果同样进 P2b 内容寻址缓存, 依赖即缓存键
  输入) → API /validate 与 /trial 支持 lang=python。
- 验收 (docs/ext-architecture-plan.md P3): 看板口径 SKDJ — 9日RSV
  (分母 0 时取 50) → EMA(α=0.5) 两级 — 的 T2 单表达式与策略文件的分阶段
  列实现逐元素一致; 19 个契约测试 (含依赖登记/warmup 下限/11 种文法拒绝
  形态/物化与缓存贯通), 相关回归 568 全过, ruff 新增文件全清。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-26 14:46:42 +08:00
shy3130 6d51bb52de feat(factors): P2b 内容寻址因子列缓存 — +10 因子热路径增量 0.1ms, P2 两项验收达成
自定义 (DSL) 因子此前每次求值都全量重算 frame_transform (132 万行帧上
每因子 ~36ms, 随因子数线性增长 — 回测/守护复验/实验室批量的共同热路径)。

- app/factors/materialize_cache.py: 键 = sha256(定义 + 依赖列内容指纹 +
  行数) — 内容指纹即失效传播 (公式变/输入任何值变 → 键变), 无需数据版本
  号。两层: 进程内 LRU (字节上限) + 磁盘 parquet (跨进程, 文件数上限,
  目录可整删)。fail-open: 任何故障回退现算。列指纹按帧记忆化 (weakref
  finalize 回收), 同帧 K 个因子每列只哈希一次 (~8ms/百万行)。
- materialize_scoring_columns 两段式: 命中列一次批量附着 (成本与因子数
  无关); 未命中逐个现算 (依赖顺序)。DSL 分阶段临时列不再泄漏进下游帧
  (与命中路径列集合完全一致)。
- 顺带修复存量 bug: winsorize(x) 省略 k 时 DSL 编译器直接 IndexError
  (该写法此前完全不可用), 补回归测试。
- 基准 (132 万行, K3→K13): 热路径 0.0ms→0.1ms (+10 因子绝对增量 0.1ms,
  基线 +400ms 线性); 冷启动 480.7ms vs 无缓存 478ms (开销 ~0.5%)。
  端到端优化器复测 trials 4.23×/含 prepare 3.16×, stats 完全一致。
- 回归: 552 个相关测试全过 (含 6 个缓存契约测试: 命中等价/输入与定义
  变更失效/损坏回退/小帧旁路/临时列不泄漏); ruff 新增文件全清。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-26 14:36:58 +08:00
shy3130 583462a704 feat(backtest): P2a-2 共享矩阵编码 — 参数无关半边一次编码, 调参循环 3.14×
build_market_matrix 内部的参数无关成本 (build_market_data_matrix 行情
矩阵 + _encode_axes 轴 + _signal_code_matrix 信号码, 占剩余每组成本
~55%) 拆出复用:

- matrix.py 新增 PanelMatrixEncoding / encode_panel_matrix /
  build_market_matrix_from_encoding; build_market_matrix 改为两者的组合
  (单一实现, 无平行路径)。score 场随参数变化 (universe 置空), 不进共享
  编码 — 逐组散布进信号矩阵, 非有限值→nan 语义与 _float_matrix 一致。
- PreparedPanelBacktest.sim_encoding: prepare 期构建 sim 窗口编码 (失败
  回退逐组建矩阵, 只损失性能); run 侧列序 (忽略 score 列) 与行数比对
  通过才走共享编码, 否则整建 — 回退是优化放弃, 不是正确性闸门。
- 基准 (同进程交错 A/B, 15 组): 试算 4.24×, 含 prepare 3.14× (P2a 单
  面板共享为 1.8×); stats 剔除计时字段后完全一致。对应 P2 验收 ≥2×。
- 回归: tests/backtest 410 全过 (含新增矩阵级逐元素等价测试); ruff
  零新增 (与 HEAD 逐条相同)。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-26 14:27:37 +08:00
shy3130 e382232243 feat(definitions): 统一定义契约 P1b — Store 基类收口四处持久化 + kind 注册分发
- app/definitions.py 新增 JsonDefinitionStore: 原子写 + 损坏跳过告警 +
  目录 mtime 签名, glob/日志名/逐条归一化参数化; 自定义信号/自定义因子/
  监控规则/批次四处同型实现收口为委托, 公开签名零变化。
- DefinitionKind 注册表 + validate_definition / definition_dependencies
  统一分发入口; 内置 kind (signal/factor) 惰性导入, 消费方无需预导入领域
  模块。signal 依赖提取复用编译表达式 root_names (与回测/管线同源),
  factor 复用 to_spec DSL 编译 — 不引入第二套提取逻辑。
- 验收: 新增第三种 kind = 注册一个描述器即走同一存取/校验/依赖管线
  (test_new_kind_reuses_same_pipeline), 对应路线图 P1b 验收标准。
- 契约视图归一化渲染留给 P4 消费方; 失效广播/文件锁随 P2 叠加。

Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-26 14:02:54 +08:00
shy3130 e9b938a3ac docs(arch): 一切皆扩展架构优化路线 (P0-P4) — 分层物化/统一契约/依赖推导
Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-26 13:39:39 +08:00