6.8 KiB
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 smoke(3 单/3 成交);上游仍是 synthetic,QMT 未实跑 |
默认 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、系数、截距、训练截止与标签 | 无授权真实 OOS;Qlib 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.pysrc/quant60/model_bundle.pyschemas/model_bundle.schema.jsonsrc/quant60/target_package.pyschemas/target_package.schema.jsonsrc/quant60/release_reachability.pyschemas/release_reachability.schema.jsonreleases/quant60-research-candidate-v1/reachability.json
可直接做平台线路调试的 synthetic 单文件在:
dist/target-package/joinquant_strategy.pydist/target-package/qmt_builtin_strategy.pydist/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、测试和文档中 分开。
当前机器可证明到哪里
每一层不再只写一个“已实现”,而是分别记录:
implementedunit_testedlocal_entrypoint_reachablejq_entrypoint_reachableqmt_entrypoint_reachablereal_platform_observed
release_reachability 要求每个 true 状态有类型匹配、仓库相对路径和实际
SHA-256 证据。源文件 aggregate hash 不能冒充真实平台运行。2026-07-26 的
TargetPackage hosted run 只允许把 execution.real_platform_observed 设为
true;Universe、Alpha、Portfolio、Risk 仍为 false,因此
all_layers_real_platform_observed 也必须保持 false。
该真实执行记录使用 synthetic-research 输入,只证明验包、时钟、
day_open、账户绑定、下单和成交:
JOINQUANT_TARGET_PACKAGE_EVIDENCE_2026-07-26.md../evidence/joinquant/TP-20240311-795dcfba/2457a7c39a276e09e0fabf99e28978e1/run.json
还差什么
按先后顺序:
- 用授权 JQData/其他合法数据形成真实 PIT 长样本,训练并冻结候选 model bundle;封住测试集,保存 OOS、容量和多状态报告。
- 用真实数据校准 risk/cost;决定并接通 factor risk、CVXPY 是否进入 Baseline 60,而不是因为模块存在就自动算完成。
- 从同一个真实候选生成多期 TargetPackage tape;不能用当前单个 synthetic package 代替。
- 把同一真实 tape 分别打入 JoinQuant/QMT;现有 JoinQuant 单包 execution smoke 作为线路先验,但仍要导出完整多期 identity/plan/orders/fills。
- 做 local/JoinQuant/QMT 逐层差异;任何
UNEXPLAINED必须为零。当前无 QMT peer,所以 G9 仍未通过。 - 完成至少 20 个交易日 QMT 只读 shadow、重启/回调/对账和合规确认。
用户什么时候需要参与
当前代码、测试、合同和文档整理不需要用户提供任何凭据,可以直接完成。 后续只有三处需要用户环境:
- JQData:在本机授权环境抓取可保存的脱敏快照;
- JoinQuant:已有一个 synthetic 单包 execution smoke;真实候选形成后仍需 上传多期 tape 并导出完整结果;
- Windows QMT/MiniQMT:使用已登录且有历史数据权限的客户端做 backtest 和 read-only shadow。
不要把密码、cookie、token、QMT userdata、account id 或持牌二进制发到聊天、 Git 或文档中。