Quant Research Platform · Architecture Report

量化实验平台
参数研究与评价机制方案

在固定数据集与时间范围内,系统化搜索算子参数;用严格的时间序列验证、评价算子与不可变实验记录,找出当前研究协议下最可信的参数组合。

架构收敛版日频 · 单股票Feng 串行研究节点2026-08-28
结论:对 UI、CLI 和 worker 只暴露一个深模块 ParameterStudy。它内部完成搜索轮次、Trial、DatasetView、评价与 Holdout 编排;具体回测继续复用现有 Experiment/Attempt,不建立第二套执行系统。
01 · Scope

从“多个新服务”收敛为“一个深模块”

本轮按 Matt Pocock 的深模块、领域建模与 spec-first 方法重新审查:参数研究需要很多内部机制,但调用者不应该学习很多接口。新的设计把复杂度集中在 ParameterStudy,现有 ExperimentService 继续负责策略执行和去重。[17][18][19]

保留现状

Experiment / Attempt

Experiment 仍是唯一策略计算身份;Attempt 仍是同一冻结实验的一次物理启动。

唯一新入口

ParameterStudy

冻结研究协议,协调候选、时间切分、评价和 Holdout;UI、CLI、worker 只调用它。

明确不做

第二套执行系统

Trial 不是进程,参数研究不复制 Experiment/Attempt 状态机,也不绕过去重。

02 · Architecture

外部接口小,内部实现深

← 左右滑动查看完整链路 →

Web / CLI
两个真实 Adapter
→
ParameterStudy
唯一主要接口
→
ExperimentService
复用现有 seam
→
Experiment
执行身份
→
Attempt
物理启动
worker 只调用 ParameterStudy.advance()。Study 的表、事件、搜索轮次、Trial binding 和 Holdout 状态全部隐藏在模块内部。

ParameterStudy 接口

preview、submit、advance、control、detail。调用者无需理解内部表结构或 Search Round。

真实可替换 seam

只有 ParameterSuggester 有多个真实 Adapter:Grid、Seeded Random、Optuna TPE。ExecutionDatasetSliceFactory、MetricDocumentFactory 与 EvaluationPolicy 保持窄接口,但首阶段不承诺插件化。

直接复用现有模块

ParameterStudy 直接调用 ExperimentService,不增加只做转发的 ExperimentGateway 中间层;Catalog 只提供连接和事务原语。

删除测试

如果删除 ParameterStudy,状态机、幂等、候选去重、Holdout 和报告逻辑会散落到 web、worker、CLI 与 Catalog——这说明它确实承担了深度。

03 · Architecture Convergence

首阶段主动删除的复杂度

不建 SearchProfile 服务

搜索范围直接冻结在 StudySpec,并由现有算子参数 Schema 校验。没有第二个调用者前不单独抽象。

不开放评价代码投稿

先交付一个可信、版本化的内置 EvaluationPolicy。出现第二个真实评价实现后,再建立投稿和隔离执行 seam。

不公开 Search Round

内层和最终选参轮次是 ParameterStudy 的内部记录;用户管理 Study 和 Trial,不管理编排细节。

04 · Research Flow

最终选参流程

← 左右滑动查看完整流程 →

1. 预注册冻结参数范围、评价公式、基准、成本、预算和研究谱系。
→
2. 内层搜索只在外层测试起点之前的数据上比较参数。
→
3. 外层验证冻结内层赢家,在下一段 OOS 上评价选参机制。
→
4. 最终选参机制通过后,用全部开发数据选择一个候选。
→
5. 留出审计只让该候选进入 Holdout;失败也不改选第二名。

研究谱系不能清零:看过结果后缩小参数范围、增加预算或换评价规则,必须关联前序 Study;不能通过“新建任务”把多重检验次数重置为零。

05 · Identity

每个结论都能追溯到具体输入

研究身份

FrozenStudyPlan 覆盖数据、模板、算子、搜索空间、FoldWindows、Metric/Evaluation/Execution identities、双重预算与 Study Lineage。

候选身份

StrategyConfiguration 是完整、规范化的参数值对象;重复 suggestion 只记事件,不新增 Trial。unique Trials 和原始 suggestions 分别设上限。

评价身份

评价结果绑定评价规则、全部输入产物摘要、评分区间和运行环境,而不是相信可变路径。

执行身份

Study 绑定源代码、依赖/runtime 与 runner image 的内容摘要;release path 只是 locator。首阶段不跨 release 续跑,摘要漂移后停止并显式 fork。

06 · Evaluation Policy

“评价算子”先做成可信内置规则

MetricDocumentFactory 先验证不可变产物、账户/交易/成本核对和指标语义;评价规则只负责定义“什么叫好”。首阶段只有一个真实评价实现,因此它不是提前建设的插件 seam。

搜索器使用

单一 validation_score

只向搜索器提供一个冻结分数,例如“各折净 Sharpe 中位数 − 稳定性惩罚 − 换手惩罚”。公式、权重和门槛不能在同一 Study 中继续搜索。

用户查看

证据保持多维

净收益、买入持有、超额收益、回撤、换手、暴露、交易次数、成本、Sharpe、Sortino、Calmar 和跨折离散度全部独立保留。

内置规则 robust_walk_forward@1.0.0

资格检查有限数值、完整交易日、账户与交易账本核对一致
最低交易数避免零交易策略因“零回撤”意外胜出
风险约束显式最大回撤与年度换手上限,不隐藏风险偏好
稳定性跨折表现和最优点周边参数平台,而非孤立尖峰
研究谱系前序 Study 中影响本次选择的候选也进入多重检验口径
确定性排序同分时按冻结规则比较回撤、换手与参数哈希

何时才开放自定义评价算子? 至少出现第二个真实评价逻辑,并证明两者需要同一投稿、验证和执行生命周期。此前不建设 EvaluatorSubmissionService、EvaluatorWorker 或投稿 UI。

07 · No Leakage

防泄漏分成两层,不能混为一谈

跨阶段:ExecutionDatasetSlice

UI 显示为 DatasetView。派生快照 ID 承诺 parent lineage、FoldWindow 和 access-boundary digest;内层切片不包含外层未来或 Holdout。旧完整快照 Experiment 禁止作为 validated evidence 复用。

评分区间内部:causal prefix

可信 replay engine 按日期推进;custom operator 每次只收到当前时点以前的前缀,并且不能读取文件、环境、网络或完整 DataFrame。

两层缺一不可:DatasetView 不能单独证明逐日因果;prefix-only 接口也不能单独证明内层任务没挂载最终 Holdout。发布前同时做物理挂载审计与“追加未来行不改变过去决策”的 prefix-stability 测试。

Holdout 不是一个状态枚举

访问阶段使用 SEALED → GRANTED → ACCESSED;结果使用 NOT_RUN / PASSED / FAILED;历史新鲜度另用 NO_RECORDED_PLATFORM_EXPOSURE / PREVIOUSLY_EXPOSED / LEGACY_UNKNOWN。三者分别记录,禁止声称“全球全新”。

08 · Validation

时间序列验证与多重检验

嵌套 Walk-forward

内层选参,外层评价选参机制;外层 OOS 按时间拼接,不能事后从每段挑赢家。[13][14][15]

Purge / Embargo

根据 signal、execution、label end 的信息区间删除重叠;严格 expanding 流程不机械增加测试后 embargo。[16]

Outer OOS 账户拼接

首阶段仅支持 FORCE_FLAT_WITH_COST:每折以标准资金和空仓开始,折末真实平仓计费,再拼接净 daily returns。它评价定期重新选参并在边界清仓的流程,不冒充持仓跨折连续策略。

后续 Slice

DSR

修正反复试验和非正态收益导致的 Sharpe 膨胀;研究谱系不完整时必须标明下界。[8]

后续 Slice

PBO / CSCV

只对 final Search Round 的共同候选 × 共同日期矩阵计算,不能混合不同 outer rounds。[10]

后续 Slice

SPA / Reality Check

检验反复搜索后,流程是否仍优于预注册基准。条件不足时输出“证据不足”。[11][12]

10 · Delivery Slices

按垂直能力交付,不按数据库表铺开

首个生产 release 只包含 Slice A–C;高级统计诊断、Optuna 和自定义评价投稿分别进入后续独立 Slice。

Slice A|StudySpec + ParameterStudy

建立统一术语、七项关键 ADR 和唯一外部接口;Web/CLI/worker 不接触 Study 内部表或状态机。

Slice B|可信 Grid Study

一次交付 DatasetView、嵌套切分、Grid/Random、内置评价规则、Experiment 复用、Holdout 与最小 CLI;先形成完整可用闭环。

Slice C|UI 与报告

创建向导、搜索范围、外层 OOS、Trial 排行、约束原因、研究谱系、Holdout 暴露和移动端报告。

Slice D|高级统计诊断

在共同候选 × 共同日期矩阵上增加 DSR、PBO/CSCV、SPA/Reality Check;研究谱系不足时明确证据不完整。

Slice E|Optuna Adapter

只有 Grid/Random 的重启等价与去重门禁通过后,才接入固定版本 TPE 和确定性 proposal seed。

Slice F|第二种评价逻辑后再泛化

只有两个真实 EvaluationPolicy 证明 seam 存在,才建设自定义评价 bundle、验证容器与投稿 UI。

11 · Acceptance Gates

上线前必须全部通过

  • ParameterStudy 是 UI、CLI、worker 唯一主要接口
  • 搜索范围有限、规范化并进入 Study identity
  • submit 必须匹配 preview digest,过期则重新预览
  • unique Trial 与原始 suggestion 分别设预算上限
  • 默认参数固定作为每次内部搜索的 Trial 0
  • 外层 OOS 从不反馈内层搜索
  • 只有一个最终候选进入 Holdout,失败不改选第二名
  • 历史结果影响本次范围时必须关联 Study Lineage
  • ExecutionDatasetSlice 以 access-boundary digest 进入 Experiment identity
  • 旧完整快照 Experiment 不复用于 validated Study
  • custom operator 只能接收 causal prefix,追加未来行不改变过去决策
  • 相同任务复用 Experiment,不复制执行状态机
  • divergent canonical results 一律 fail closed
  • 评价只读取验证后的不可变 canonical evidence
  • Grid/Random 重启完全一致后才启用 Optuna TPE
  • Study 冻结 Execution Identity;release 漂移后停止并 fork
  • Pause/Cancel 不撤回已提交到全局 worker 的当前 Attempt
12 · Testing

测试最高接口,不复制实现

主测试面

绝大多数行为从 ParameterStudy 的 preview / submit / advance / control / detail 验证,配合临时真实 SQLite Catalog 与真实 ExperimentService。

独立内部测试

只为 ExecutionDatasetSliceFactory、MetricDocumentFactory、ParameterSuggester contract、EvaluationPolicy 和 ExperimentService 集成写专门测试。

崩溃恢复

advance() 每次最多推进一个持久化 effect;先记录 intent,再以确定性 action_id 执行,恢复时重放同一 effect。

少量真实 E2E

最小 Grid validated Study、复用 Experiment、重启继续、DatasetView 攻击、prefix stability、最终 Holdout 和公开链路验收。

13 · Boundaries

第一阶段明确不做

不自动交易

不连接券商,不自动 paper/live trading,也不把赢家自动设为算子默认值。

不宣称全局最优

只说明在冻结的数据、时间、搜索空间、成本、评价规则与研究谱系下观察到的最优候选。

不做推测性基础设施

不引入 GPU、Ray、早停、首版 Pareto、自定义评价投稿平台和未被真实变化证明的 seam。

14 · Final Position

最终建议

采用“一个深 ParameterStudy 模块 + 现有 ExperimentService + 一个真实 ParameterSuggester seam”。
先交付可信 Grid Study,再接 Optuna;先交付内置评价规则,第二个真实实现出现后再开放投稿。用更小的接口承载同样严格的金融验证和可追溯性。
Sources

主要依据

工具能力优先引用官方文档;验证方法优先引用论文、作者研究页与正式教材。