Files
quant-os/docs/BASELINE_VERTICAL_SLICE.md

7.0 KiB
Raw Permalink Blame History

Quant OS Baseline vertical slice:当前真实结构与缺口

更新时间:2026-07-26。

一句话结论

Quant OS 现在已经不是“只有一堆互不相连的模块”:本地 synthetic 路径已经把 Universe、Ridge Alpha、风险/成本参与的 Portfolio、post-risk gate 和 reference Execution 串成唯一五层链,并发布冻结模型包与无股数 TargetPackageV1

但它仍然是 NOT_BASELINE_60。原因不是代码行数,而是当前候选只在 synthetic 数据上形成上游四层;虽然一个 synthetic-research TargetPackage 已真实通过 JoinQuant execution consumer 并成交,真实 JQData 长样本 OOS、上游逐层 真实数据 parity、真实 QMT peer 与 20 日 shadow 都还没有证据。

两条不能混记的运行路径

模式 上游决策在哪里 平台上运行什么 当前真实平台事实
portable_momentum_smoke JoinQuant/QMT wrapper 现场用完成日线算动量 动量、封顶权重、股数与 delta JoinQuant 2024 全年跑过;不是 Baseline
target_package 本地 Quant OS 完成 Universe → Alpha → Portfolio → Risk 验包、精确双时钟命中、读取 equity/position/sellable/price、Execution JoinQuant 已有一个真实 execution smoke3 单/3 成交);上游仍是 syntheticQMT 未实跑

默认 bundler 仍生成 smoke,保持历史回归兼容。只有显式传 --target-package 才会生成候选消费者;目标包缺失、重复、篡改或时钟不匹配 都会停止,不会回退到 momentum。

五层实际用了什么

当前 vertical slice 的实际实现 已接通的策略 明确未接通/未证明
Universe SecurityEligibility → 五态 state machine,原因码进入 trace/package openable、hold-only、sell-only、frozen、excluded synthetic 成员;真实基本面 PIT、Security Master、退市链未完成
Alpha train-only winsor/impute/standardize + DeterministicRidge(alpha=5) 冻结 feature order、transform、系数、截距、训练截止与标签 无授权真实 OOSQlib Alpha158/LightGBM 是另一研究路径
Portfolio deterministic long-only constrained optimizer Alpha 减显式成本,按预测方差调整;单名、行业、gross、capacity、turnover 约束 CVXPY 有组件测试但未进入当前主链
Risk 60 日 realized diagonal variance 进入优化,随后独立 concentration/gross/turnover post-check 风险输入变化必须改变 target;风险 gate 不可旁路 factor_risk.py 的因子协方差/stress 尚未进入主链,也未真实校准
Execution 本地 reference account 生成 quantity/delta;平台从 TargetPackage 权重重新绑定真实账户 百股、科创板最小申报、T+1 sellable、卖单优先、平台保护价;JoinQuant 单包已有 3 单/3 fill guarded TWAP/POV 尚未进入这条 slice;无 QMT peer、多期真实数据回放或长期 callback 证据

权威实现和合同:

  • src/quant60/baseline_pipeline.py
  • src/quant60/model_bundle.py
  • schemas/model_bundle.schema.json
  • src/quant60/target_package.py
  • schemas/target_package.schema.json
  • src/quant60/release_reachability.py
  • schemas/release_reachability.schema.json
  • releases/quant60-research-candidate-v1/reachability.json

可直接做平台线路调试的 synthetic 单文件在:

  • dist/target-package/joinquant_strategy.py
  • dist/target-package/qmt_builtin_strategy.py
  • dist/target-package/bundle_manifest.json

它们只用于验证 TargetPackage 消费与执行边界,不能当作真实数据 Baseline 或投资结果。

为什么 hosted 文件仍然可以很短

“完整 Baseline”不等于把训练、特征工程、协方差估计和优化器全部复制进聚宽或 QMT。那样会制造多个决策权威,也会被平台 Python 版本、依赖和数据语义拖成 不同策略。

目标架构是:

本地唯一权威
  冻结数据/模型/配置
  -> 五层决策与逐层 hash
  -> post-risk TargetPackage(权重)

平台薄消费者
  验证同一个 TargetPackage
  -> 绑定平台账户事实和执行价格
  -> quantity / order delta
  -> order API 与导出

所以平台代码短本身是合理的;不合理的是薄 wrapper 自己改算 momentum,却被 文档称为完整 Baseline。现在这两种模式已经在配置、manifest、测试和文档中 分开。

当前机器可证明到哪里

每一层不再只写一个“已实现”,而是分别记录:

  1. implemented
  2. unit_tested
  3. local_entrypoint_reachable
  4. jq_entrypoint_reachable
  5. qmt_entrypoint_reachable
  6. real_platform_observed

release_reachability 要求每个 true 状态有类型匹配、仓库相对路径和实际 SHA-256 证据。源文件 aggregate hash 不能冒充真实平台运行。2026-07-26 的 TargetPackage hosted run 只允许把 execution.real_platform_observed 设为 trueUniverse、Alpha、Portfolio、Risk 仍为 false,因此 all_layers_real_platform_observed 也必须保持 false。

该真实执行记录使用 synthetic-research 输入,只证明验包、时钟、 day_open、账户绑定、下单和成交:

还差什么

按先后顺序:

  1. 用授权 JQData/其他合法数据形成真实 PIT 长样本,训练并冻结候选 model bundle;封住测试集,保存 OOS、容量和多状态报告。
  2. 用真实数据校准 risk/cost;决定并接通 factor risk、CVXPY 是否进入 Baseline 60,而不是因为模块存在就自动算完成。
  3. 从同一个真实候选生成多期 TargetPackage tape;不能用当前单个 synthetic package 代替。
  4. 把同一真实 tape 分别打入 JoinQuant/QMT;现有 JoinQuant 单包 execution smoke 作为线路先验,但仍要导出完整多期 identity/plan/orders/fills。
  5. 做 local/JoinQuant/QMT 逐层差异;任何 UNEXPLAINED 必须为零。当前无 QMT peer,所以 G9 仍未通过。
  6. 完成 Baseline 60 所需的至少 20 个交易日 QMT 只读 shadow、重启/回调/ 对账和券商程序化交易报告/核查确认。Production 80 当前要求同一冻结候选 至少 60 个交易日。

用户什么时候需要参与

当前代码、测试、合同和文档整理不需要用户提供任何凭据,可以直接完成。 后续只有三处需要用户环境:

  • JQData:在本机授权环境抓取可保存的脱敏快照;
  • JoinQuant:已有一个 synthetic 单包 execution smoke;真实候选形成后仍需 上传多期 tape 并导出完整结果;
  • Windows QMT/MiniQMT:使用已登录且有历史数据权限的客户端做 backtest 和 read-only shadow。

不要把密码、cookie、token、QMT userdata、account id 或持牌二进制发到聊天、 Git 或文档中。