feat: preserve Quant OS target-package vertical slice

This commit is contained in:
2026-07-30 21:27:44 +08:00
parent 00efeb7ec2
commit 919c64c679
42 changed files with 15454 additions and 404 deletions
+134
View File
@@ -0,0 +1,134 @@
# 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. 完成至少 20 个交易日 QMT 只读 shadow、重启/回调/对账和合规确认。
## 用户什么时候需要参与
当前代码、测试、合同和文档整理不需要用户提供任何凭据,可以直接完成。
后续只有三处需要用户环境:
- JQData:在本机授权环境抓取可保存的脱敏快照;
- JoinQuant:已有一个 synthetic 单包 execution smoke;真实候选形成后仍需
上传多期 tape 并导出完整结果;
- Windows QMT/MiniQMT:使用已登录且有历史数据权限的客户端做 backtest 和
read-only shadow。
不要把密码、cookie、token、QMT userdata、account id 或持牌二进制发到聊天、
Git 或文档中。