Files
quant-os/docs/BASELINE_VERTICAL_SLICE.md

137 lines
7.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 版本、依赖和数据语义拖成
不同策略。
目标架构是:
```text
本地唯一权威
冻结数据/模型/配置
-> 五层决策与逐层 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`、账户绑定、下单和成交:
- [`JOINQUANT_TARGET_PACKAGE_EVIDENCE_2026-07-26.md`](JOINQUANT_TARGET_PACKAGE_EVIDENCE_2026-07-26.md)
- [`../evidence/joinquant/TP-20240311-795dcfba/2457a7c39a276e09e0fabf99e28978e1/run.json`](../evidence/joinquant/TP-20240311-795dcfba/2457a7c39a276e09e0fabf99e28978e1/run.json)
## 还差什么
按先后顺序:
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 或文档中。