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
+91 -23
View File
@@ -7,9 +7,11 @@ Quant OS 是项目名;`quant60` 是第一版 A 股 Baseline 的 Python
本地与 Colab 可零账号运行工程 smoke;JQData 登录后可生成不可变快照并直接
运行 PIT 本地回测/目标决策;聚宽、QMT 与 Qlib 有各自明确的运行入口。
> 当前状态仍是 `NOT_BASELINE_60`。代码存在、单测、synthetic、fake harness
> Qlib fixture 和单次真实聚宽 hosted smoke都不能代替同输入跨引擎对比、
> 真实 QMT、券商影子盘、连续对账与合规证据。
> 当前状态仍是 `NOT_BASELINE_60`。本地五层 vertical slice、单测
> synthetic、fake harness、Qlib fixture真实聚宽 hosted 动量 smoke以及
> 单个 synthetic-research TargetPackage 的真实聚宽 **execution smoke**
> 都不能代替授权真实数据 OOS、逐层同输入 parity、真实 QMT、券商影子盘、
> 连续对账与合规证据。
> 原文章复评为设计覆盖约 70/100、可实施规格 49/100、原实现证据 6/100、
> G1—G10 为 0/10。详见
> [`docs/AUDIT_2026-07-25.md`](docs/AUDIT_2026-07-25.md) 与
@@ -40,18 +42,21 @@ python3 tools/build_public_status.py --check
| 路径 | 当前能做什么 | 已有证据 | 仍缺什么 |
| --- | --- | --- | --- |
| 本地 synthetic execution | 周度信号、T+1 开盘撮合、费用、涨跌停、部分成交、ledger、重放 | 标准库全量测试、确定性 smoke、manifest verifier | 不代表真实市场或投资价值 |
| 本地 synthetic research | PIT/Universe、透明特征、purged walk-forward、Ridge、成本/风险、约束 target | research artifact 与 verifier | 仍是 syntheticRidge 尚未冻结为跨平台生产模型 |
| 本地 synthetic research | Universe → Ridge Alpha → 风险/成本参与的 Portfolio → post-risk → reference execution 五层链 | 冻结 model bundle、无股数 TargetPackage、逐层 hash trace 与 manifest verifier | 仍是 synthetic;当前风险是 60 日对角方差,尚无真实样本校准或投资价值 |
| JQData → 本地 | 原始价、复权因子、前收、涨跌停、停牌、PIT ST 状态与历史指数成员快照;PIT 本地回测与单日目标 | fake-provider 端到端回归测试、完整收盘日 fail-closed 合同 | 需要用户授权登录后保存真实数据运行;基本面/公司行动尚未全接 |
| Colab | 自动 clone、测试、bundle、两套 synthetic 流程;可选 JQData/Qlib | notebook 本地逐 cell 执行 | JQData/Qlib 可选 cell 需对应账号/运行时 |
| 聚宽 hosted | 可上传的 Python 单文件,直接回测 portable baseline | 2024 全年、100 万资金的真实 hosted run 已完成且可见日志无 ERROR;另有 bundle/fake/mock 合约 | 仍需完整导出、相同输入本地 peer 逐层差异报告 |
| QMT built-in/qmttools | 可上传/驱动的硬 backtest-only portable baseline;固定中证 500 benchmark、10% 参与率、PIT 成分/ST | Python 3.6 语法、fake/qmttools 合约 | 需要已授权 QMT 客户端、历史 ST 数据权限/正例探针与实跑导出 |
| 聚宽 hosted | 默认动量 smoke;显式注入 TargetPackage 后只消费本地 post-risk 权重并绑定平台账户/价格 | 动量模式已有一次 2024 全年 run;一个 synthetic-research TargetPackage 已真实命中、绑定 `day_open` 并产生 3 笔委托/成交 | 只观察 execution consumer;无授权真实长样本/OOS、上游四层 hosted 执行、QMT peer 逐层真实数据 parity |
| QMT built-in/qmttools | 默认动量 smokeTargetPackage 模式为 Python 3.6 backtest-only 消费器 | Python 3.6 语法、TargetPackage/fake/qmttools 合约 | 需要已授权 QMT 客户端、历史数据权限与 TargetPackage 实跑导出 |
| Qlib 0.9.7 | native momentum backtestAlpha158/LightGBM CLI/Recorder 工作流 | Python 3.12 两条 fixture 已真实跑通,并保存表级 hash、行列/时间边界和重算指标 | synthetic 两股票没有投资价值;无真实 OOS、L3/L4 parity |
| Tushare → Qlib | 只读盘点 completed Parquet、校验 checksum、构建/验证不可变 provider、运行本地回测 | 93 个 completed 文件已验证;早期未复权 provider 与两次 byte-identical momentum run | 下载仅到 1993-10;缺复权、真实 benchmark、历史成分/ST/停牌/涨跌停,不能进入生产 decision |
| XtTrader shadow | 只读账户查询、HMAC 账户绑定、broker observation/snapshot、零下单 target-diff 计划与完整 verifier | fake broker/QMT 合约;所有 broker mutation 均不可达 | 需要授权 QMT 环境的账户合同探针、20 日影子、恢复/对账和券商确认 |
跨四个引擎当前共同的、可冻结生产基线
`portable-momentum-v1`。本地 Ridge 与 Qlib Alpha158/LightGBM 是研究候选
在出现版本化 model bundle、真实 OOS 证据和跨引擎推理验证前,不会冒充已经部署。
`portable-momentum-v1` 只是当前真实跑过聚宽的跨引擎连通性 smoke,不
60 分 Baseline。Baseline 的权威决策留在本地:冻结 Ridge model bundle
完成五层链并发布无股数的 `TargetPackageV1`;聚宽/QMT 只做精确双时钟查找、
账户状态绑定和执行。当前 synthetic 包已经真实通过聚宽 execution consumer
但这只证明平台边界可运行;尚未证明上游四层的真实数据有效性、QMT peer 或
跨引擎一致性。
## 一条命令验证本地工程
@@ -90,6 +95,9 @@ artifacts/
│ └── report.json
├── research-smoke/
│ ├── manifest.json
│ ├── model_bundle.json
│ ├── target_package.json
│ ├── pipeline.json
│ ├── signals.json
│ ├── targets.json
│ ├── forecasts.json
@@ -175,6 +183,11 @@ provider calendar 的唯一下一交易日 Asia/Shanghai `[09:00,09:30)`;它
它仍是本地 fill model,不是聚宽/QMT 的真实成交证据。
注意:现有 `snapshot-decision` 仍是 `portable-momentum-v1` 的 provider-data
路径,不能因为输入来自 JQData 就冒充 Ridge Baseline。完整候选链的权威交换物
`TargetPackageV1`;在真实数据训练、风险/成本校准与 OOS 冻结完成前,
`research-smoke/target_package.json` 只用于验证部署结构。
## Colab
打开 [`notebooks/quant_os_colab.ipynb`](notebooks/quant_os_colab.ipynb)
@@ -197,7 +210,7 @@ python3 tools/run_colab_notebook.py notebooks/quant_os_colab.ipynb --execute
## 聚宽:直接上传回测
先构建
不传目标包时,构建的是历史兼容的动量 smoke
```bash
python3 tools/bundle_platforms.py
@@ -221,7 +234,7 @@ canonical 周时钟不是固定星期几:某 ISO 周第一实际交易日收
作为限价保护;共享核心拒绝不足 200 股的普通科创板申报,只保留一次性卖清
不足 200 股余额的交易所例外。
2026-07-26 已用生成 bundle 完成一次真实聚宽全年 hosted backtest。运行记录、
2026-07-26 已用该动量 smoke bundle 完成一次真实聚宽全年 hosted backtest。运行记录、
bundle hash、指标、真实平台发现的问题和证据边界见
[`docs/JOINQUANT_HOSTED_EVIDENCE_2026-07-26.md`](docs/JOINQUANT_HOSTED_EVIDENCE_2026-07-26.md)。
该次运行的可见完成日志没有 `ERROR`,但尚未导出相同输入、plan、orders/fills
@@ -238,13 +251,52 @@ bundle hash、指标、真实平台发现的问题和证据边界见
单次 hosted smoke 是外部运行证据,但没有同输入跨引擎 manifest 时仍不算
真实聚宽 Gate 通过。
要验证五层候选链,必须显式传入已验真的 TargetPackage;打包器不会自动从
动量回退或把 smoke 提升成 Baseline
```bash
python3 tools/bundle_platforms.py \
--target-package artifacts/research-smoke/target_package.json \
--output-dir dist/target-package
```
这个示例包来自 synthetic 数据,只能验证线路。目标包保存 post-risk **权重**
及 model/data/feature/risk/cost/optimizer/config/source hash,不保存账户股数。
聚宽在包声明的 `next_session` 开盘读取真实 equity、持仓、可卖数量和价格,
形成 execution plan;包缺失、双时钟不匹配、hash 篡改或重复决策都会停止,
不会现场改算 momentum。
此时应上传
[`dist/target-package/joinquant_strategy.py`](dist/target-package/joinquant_strategy.py)
并以同目录
[`bundle_manifest.json`](dist/target-package/bundle_manifest.json)
核对 package ID、package SHA 与 tape SHA;不要误传默认 smoke 文件。
2026-07-26`TP-20240311-795dcfba` 已用 FINAL4 在真实 JoinQuant hosted
环境完成 2024-03-11 至 2024-03-13 的 execution smoke3 月 11/13 日为
精确时钟 no-op,3 月 12 日按 `CURRENT_DATA_DAY_OPEN` 命中包,生成 3 笔
委托并全部成交。`600519.XSHG` 虽有 10% 权重,但 1693.94 元开盘价使一手
价值 169,394 元,高于 100,000 元目标名义金额,因而合法取整为 0 股。
- 脱敏机器记录:
[`evidence/joinquant/TP-20240311-795dcfba/2457a7c39a276e09e0fabf99e28978e1/run.json`](evidence/joinquant/TP-20240311-795dcfba/2457a7c39a276e09e0fabf99e28978e1/run.json)
- 证据边界:
[`docs/JOINQUANT_TARGET_PACKAGE_EVIDENCE_2026-07-26.md`](docs/JOINQUANT_TARGET_PACKAGE_EVIDENCE_2026-07-26.md)
该 run 的 `platform_evidence_class``real_platform_runtime`,但输入
`input_evidence_class` 仍是 `synthetic-research`;它只支持
`execution.real_platform_observed=true`。JoinQuant 没有重跑本地冻结的
Universe、Alpha、Portfolio、Risk,三日收益字段仅用于识别 smoke,
`performance_claim=false`,不计 G9 或 Baseline 60。
## QMT built-in 与 qmttools
同一 bundler 生成:
同一 bundler 生成动量 smoke 或显式 TargetPackage 消费器
```text
dist/qmt_builtin_strategy.py
dist/bundle_manifest.json
dist/qmt_builtin_strategy.py # 默认 momentum smoke
dist/target-package/qmt_builtin_strategy.py # synthetic 候选线路调试
dist/target-package/bundle_manifest.json # 目标包与 bundle 身份
```
在 QMT Python 策略编辑器导入,选择 `1d`**backtest**,主图/基准设为
@@ -253,18 +305,20 @@ dist/bundle_manifest.json
QMT 文档所述的 `ContextInfo` 用户属性回滚。它硬编码 backtest-only;参数和
环境变量均不能把它提升成实盘 `passorder`
策略按原始毫秒 timetag 查询历史中证 500 成分,并通过
在动量 smoke 模式,策略按原始毫秒 timetag 查询历史中证 500 成分,并通过
`ContextInfo.get_his_st_data` 读取决策日 ST/*ST/PT 区间;接口缺失、格式异常
或覆盖不足会阻止计划。首次真实验收还必须用一只已知历史 ST 股票做正例探针,
证明客户端权限和本地历史 ST 数据确实可用,不能把空结果直接解释成“当天无
ST”。
ST”。在 TargetPackage 模式,Universe/Alpha/Portfolio/Risk 已由本地包冻结;
QMT 不重算这些层,只在包的 signal close 命中后绑定账户和完成日线价格,
`quickTrade=0` 交给下一执行步。两种模式的证据不得混记。
Windows 上、已登录且安装券商分发 `xtquant` 的 qmttools 入口:
```powershell
$env:PYTHONPATH = "src;."
python -m platforms.qmt_research_runner `
dist/qmt_builtin_strategy.py `
dist/target-package/qmt_builtin_strategy.py `
--stock-code 000905.SH `
--start 20240102 `
--end 20241231 `
@@ -509,6 +563,11 @@ gate_credit = []
- `universe.py`openable / hold-only / sell-only / frozen / excluded
- `features.py`:透明价量特征、可执行时钟标签、train-only 预处理;
- `research.py` / `experiment.py`purge/embargo、Ridge、OOS IC/RankIC
- `model_bundle.py`:冻结 train-only 预处理、Ridge 参数、标签与训练 lineage
- `baseline_pipeline.py`:唯一五层本地主链和因果 hash trace;
- `target_package.py`:无股数、双时钟、可防篡改的 post-risk 权重合同;
- `release_reachability.py`:逐层区分 implemented、tested、entrypoint
reachable 与 real-platform observed
- `factor_risk.py`:行业/风格暴露、EWMA 收缩因子协方差、特异风险、stress;
- `costs.py`:日期化费率、最低佣金、low/base/high impact 与 capacity
- `optimizer.py`deterministic fallback 与 lazy CVXPY 约束优化;
@@ -519,22 +578,27 @@ gate_credit = []
provider snapshot 到 PIT target 与本地历史回测;
- `platforms/` / `adapters/`:聚宽、QMT、Qlib 与 XtTrader 边界。
这些模块已有自动测试,聚宽 hosted 路径也已有一次真实运行;真实数据校准、
QMT/券商运行和运营证据仍分别计分。
组件存在、单测通过、进入本地入口、进入平台入口和真实平台观察是五种不同
事实。聚宽现有 TargetPackage run 只观察 execution consumer;它不证明
factor risk、CVXPY、TWAP/POV 或 Ridge 上游四层在 hosted 环境被调用。
## 仍未达到 60 的核心原因
- 基本面公告时点、完整公司行动、Security Master 与退市链尚未形成生产数据湖;
- Ridge/LightGBM 候选尚未冻结成四引擎共同加载的 model bundle
- Ridge 已能冻结成可重放 model bundle,但目前只有 synthetic 候选
尚无授权真实长样本 OOS,也没有必要让 hosted 引擎重新加载训练栈;
- 风险协方差、冲击参数和容量尚未用真实长样本校准;
- 聚宽已有真实 hosted run 但尚无完整同输入导出;QMT 尚无真实导出,QMT
- factor risk、CVXPY 和 guarded TWAP/POV 仍是组件级能力,尚未进入当前
Baseline vertical slice
- 聚宽已有单包 TargetPackage execution 导出,但仍缺授权真实数据的多期
TargetPackage、本地/聚宽逐层同输入对账;QMT 尚无真实 peer 导出,QMT
历史 ST 权限正例、账户 query 合同、
20 日只读影子、回调/恢复/对账尚未形成真实证据;
- 自动 scheduler、日终对账服务、监控告警与 kill-switch 演练未形成连续证据;
- 实际券商程序化交易报告、权限、频率与软件要求尚未书面确认。
因此当前是可以继续填真实证据的 Quant OS 生产候选框架,不是可直接投入资金的
成品,也不构成投资建议。
因此当前是“已接通本地五层与平台 TargetPackage 边界的候选骨架”,不是已经
达到 60 分或可直接投入资金的成品,也不构成投资建议。
## 安全与进一步文档
@@ -542,7 +606,11 @@ QMT/券商运行和运营证据仍分别计分。
行情数据一律不得进入 Git。
- 架构:[`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)
- 五层真实结构与缺口:
[`docs/BASELINE_VERTICAL_SLICE.md`](docs/BASELINE_VERTICAL_SLICE.md)
- 平台矩阵:[`docs/PLATFORM_MATRIX.md`](docs/PLATFORM_MATRIX.md)
- 聚宽 TargetPackage 证据:
[`docs/JOINQUANT_TARGET_PACKAGE_EVIDENCE_2026-07-26.md`](docs/JOINQUANT_TARGET_PACKAGE_EVIDENCE_2026-07-26.md)
- 部署:[`runbooks/PLATFORM_DEPLOYMENT.md`](runbooks/PLATFORM_DEPLOYMENT.md)
- 安全:[`docs/SECURITY.md`](docs/SECURITY.md)
- 故障:[`runbooks/INCIDENTS.md`](runbooks/INCIDENTS.md)