feat: establish Quant OS production-80 architecture

This commit is contained in:
2026-07-30 22:59:25 +08:00
parent 919c64c679
commit 26cc814f3f
67 changed files with 7005 additions and 142 deletions
+3 -2
View File
@@ -300,8 +300,9 @@ synthetic/fake 数据是合同测试,不是市场证据;Qlib synthetic fixtu
- 授权真实数据训练的冻结模型包和真实 OOS 证据;
- 真实数据校准的风险、冲击、容量和 TCA;
- 授权真实数据的多期 JoinQuant 导出、逐层本地对账与真实 QMT peer;
- 券商状态映射、restart recovery daemon、20 日 shadow 与连续对账;
- 运维监控、kill-switch 演练和程序化交易合规确认。
- 券商状态映射、restart recovery daemon、连续对账,以及 Production 80
要求的同一冻结候选 60 日 shadowBaseline 60 的前置门槛为 20 日);
- 运维监控、kill-switch 演练和券商程序化交易报告/核查确认。
所以 Quant OS 已具备本地五层 vertical slice 与 TargetPackage 平台边界,
但仍只是可继续填证据的候选骨架,不是已经达到整体 60 分的实盘系统。证据政策见
+3 -1
View File
@@ -117,7 +117,9 @@ trueUniverse、Alpha、Portfolio、Risk 仍为 false,因此
smoke 作为线路先验,但仍要导出完整多期 identity/plan/orders/fills。
5. 做 local/JoinQuant/QMT 逐层差异;任何 `UNEXPLAINED` 必须为零。当前无
QMT peer,所以 G9 仍未通过。
6. 完成至少 20 个交易日 QMT 只读 shadow、重启/回调/对账和合规确认。
6. 完成 Baseline 60 所需的至少 20 个交易日 QMT 只读 shadow、重启/回调/
对账和券商程序化交易报告/核查确认。Production 80 当前要求同一冻结候选
至少 60 个交易日。
## 用户什么时候需要参与
+1 -1
View File
@@ -244,7 +244,7 @@ PYTHONPATH=src:. python -m platforms.qlib_runner \
| real JoinQuant export vs local canonical run | Yes,覆盖的 layers/dates |
| licensed qmttools run with saved version/result | Yes,覆盖的 layers |
| XtTrader shadow using real broker snapshot | Yespre-trade/order semantics |
| ≥20 trading days QMT shadow, zero unexplained differences | 文章 G9 必需 |
| ≥20 trading days QMT shadow, zero unexplained differences | Baseline 60 的 G9 必需;Production 80 另要求同一冻结候选 ≥60 日 |
真实 JoinQuant smoke 已运行;QMT 和 broker shadow 尚未运行,而且
JoinQuant 仍缺同输入导出与 local peer,所以 G9 继续为 `not_passed`
+3 -1
View File
@@ -68,6 +68,8 @@ still missing:
portable plan, orders and fills;
- a local canonical run over the exact same frozen inputs;
- layer-by-layer L1—L4 comparison with enumerated difference reasons;
- a real QMT peer run and at least 20 trading days of broker shadow evidence.
- a real QMT peer run and the Baseline-60 minimum of 20 trading days of broker
shadow evidence; Production 80 requires at least 60 trading days for the same
frozen candidate.
Accordingly, `gate_scorecard.json` remains `NOT_BASELINE_60`.
+1 -1
View File
@@ -16,7 +16,7 @@
| QMT local harness | built-in wrapper 合同 | Python ≥3.10,无账号 | Python 3.6 source、`ContextInfo` 回滚模拟、动量 smoke 与 TargetPackage 合同 | 不证明 QMT |
| QMT built-in bundle | GUI backtest-only | 授权 QMT 客户端/历史数据 | 两种模式都硬限制 backtestTargetPackage 模式不重算上游四层;模块全局 `g` | 尚无 TargetPackage 真实 QMT run/export10% GUI 配置和执行时钟待取证 |
| qmttools runner | native-Python QMT backtest/history | 券商分发 `xtquant` + 已登录 terminal | 固定中证 500/10% 参与率、参数、只读 preflight 和 hard backtest/history 合同已测 | 尚无专有运行时实跑 |
| XtTrader read-only shadow | 账户绑定 target-diff 与 broker observation | MiniQMT/QMT、账户查询权限、既有本地 HMAC key | HMAC 账户绑定 + authenticated evidence envelope、decision/observation semantic replay、资产/持仓/委托/成交恒等式、fail-closed exact verifier 与 fake broker 合同 | HMAC 不是 broker attestation;仍缺官方 query 失败/空结果合同callback/restart、20 日真实 shadownot live-ready |
| XtTrader read-only shadow | 账户绑定 target-diff 与 broker observation | MiniQMT/QMT、账户查询权限、既有本地 HMAC key | HMAC 账户绑定 + authenticated evidence envelope、decision/observation semantic replay、资产/持仓/委托/成交恒等式、fail-closed exact verifier 与 fake broker 合同 | HMAC 不是 broker attestation;仍缺官方 query 失败/空结果合同callback/restartBaseline 60 至少 20 个交易日,Production 80 当前缺口为同一冻结候选至少 60 个交易日not live-ready |
| Qlib native momentum | signal/model research | CPython 3.12 + exactly `pyqlib==0.9.7` | 真实本地 fixture 成功,24 signal;保存 signal/report hash、表边界和重算 portfolio 指标 | synthetic 两股票;无真实数据/OOS,无 L3/L4 parity |
| Qlib Alpha158/LightGBM | model fit + Recorder workflow | 同上 + LightGBM/MLflow stack | 真实 fixture 完成 model/Recorder;读取 portfolio report,保存表 hash、边界、重算指标与 artifact path | synthetic 两股票性能无意义;真实 provider/OOS 和冻结模型缺失 |
| Tushare local → Qlib | completed Parquet 的只读盘点、不可变 provider 与本地研究 smoke | 同上 + `pyarrow==24.0.0`;本地镜像 | 93 个 completed 文件全部通过 size/SHA/row-countv4 provider verifier 成功;同一动量命令连续两次 evidence JSON 逐 byte 相同 | `daily` 仅完成约 8.2%,缺复权、真实 benchmark、PIT 成分/ST/停牌/涨跌停;`production_ready=false` |
+10
View File
@@ -0,0 +1,10 @@
# Quant OS documentation map
- 80 分标准:[`standards/QUANT_OS_80_STANDARD.md`](standards/QUANT_OS_80_STANDARD.md)
- 60 与 80[`standards/BASELINE_60_VS_PRODUCTION_80.md`](standards/BASELINE_60_VS_PRODUCTION_80.md)
- 新架构:[`architecture/ARCHITECTURE_80.md`](architecture/ARCHITECTURE_80.md)
- 上手:[`getting-started/GETTING_STARTED_80.md`](getting-started/GETTING_STARTED_80.md)
- 独立仓 ADR[`adr/0001-independent-project-and-three-planes.md`](adr/0001-independent-project-and-three-planes.md)
- 当前实现架构:[`../docs/ARCHITECTURE.md`](ARCHITECTURE.md)
- 平台矩阵:[`PLATFORM_MATRIX.md`](PLATFORM_MATRIX.md)
- Tushare 数据:[`TUSHARE_LOCAL_DATA.md`](TUSHARE_LOCAL_DATA.md)
+1 -1
View File
@@ -111,7 +111,7 @@ Signal/Target/Order/Broker 合同。当前 Tushare adapter 只实现第一条链
从 Quant OS 根目录执行。镜像路径只放在当前 shell 环境变量中,不写入 Git:
```bash
export QUANT_OS_ROOT=/path/to/quants-strategies/quant-os
export QUANT_OS_ROOT=/path/to/quant-os
export TUSHARE_MIRROR_ROOT=/path/to/tushare-mirror
cd "$QUANT_OS_ROOT"
@@ -0,0 +1,35 @@
# ADR-0001Quant OS 独立仓与三平面模块化单体
- 状态:Accepted
- 日期:2026-07-30
## 背景
Quant OS 原位于 `quants-strategies/quant-os`,把操作系统框架和具体策略仓库
混在一起;包名 `quant60` 又把成熟度写进产品身份。继续迭代到 80 会造成路径、
CI、发布 URL、import 和 artifact 身份持续破坏。
## 决策
1. Quant OS 迁为独立项目 `boat/quant-os`
2. `quant-os` / `quant_os` 是长期产品 CLI/import。
3. `baseline-60` / `production-80` 是 profile,不是新包。
4. 使用三平面模块化单体,专有 SDK 通过 adapter/runtime 隔离。
5. `quant60` 和 V1 artifact 至少保留两个兼容发布周期。
6. 迁仓和大模块重构分成独立提交;先证明行为等价,再按 vertical slice 拆分。
## 后果
正面:
- 策略仓与框架生命周期解耦;
- 80 分标准成为机器可验收控制面;
- QMT mutation authority 可以独立封闭;
- 历史证据和 Colab/平台入口有稳定产品名。
代价:
- 一段时间内同时存在 `quant_os``quant60`
- 根级 legacy adapters/platforms 仍需逐步迁移;
- 新旧公开 URL 需要并行和重定向;
- subtree split 会重写原路径提交 SHA,必须保存映射。
+167
View File
@@ -0,0 +1,167 @@
# Quant OS 面向 80 分的目标架构
状态:本轮已建立边界、长期 namespace、机器标准和兼容入口;大模块拆分按
vertical slice 继续进行,不声称已经完成 26k 行重写。
## 1. 架构选择
采用**严格边界的模块化单体 + 专有 runtime 代理**,不是微服务。
原因:
- 个人系统不需要承担微服务的网络、部署和分布式一致性成本;
- QMT、聚宽、Qlib、JQData 有互不兼容的 Python/SDK 运行时,必须物理隔离;
- 决策身份、证据链和本地重放需要单一仓库和明确的事务边界;
- 模块边界可以先在进程内强制,达到真实吞吐或隔离需求后再拆服务。
## 2. 三平面
```mermaid
flowchart LR
B["Composition root<br/>CLI · runtime wiring"] --> C
B --> X
C["Control plane<br/>RunSpec · orchestration · release policy"] --> A["Application use cases"]
A --> D["Data plane<br/>PIT → research → portfolio → execution"]
D --> P["Ports"]
X["Adapters / proprietary runtimes<br/>JQData · Qlib · JoinQuant · QMT · XtTrader"] --> P
D --> E["EvidenceSink port"]
C --> E
X --> E
E --> V["Evidence plane<br/>manifest · parity · scorecard · claims"]
```
硬规则:
- Control plane 只编排 RunSpec、状态和发布,不计算信号,不直接调用券商 SDK。
- Data plane 只消费不可变输入,产生 model、weight 和 execution intent;它不读
网页状态或 Gate。
- Evidence plane 只记录已经发生的事实,不得修改 target、order 或 broker fact。
- Adapter 向内实现 portcore 永远不 import `jqdatasdk``qlib``xtquant`
或 hosted 平台全局 API。
- `ReadBrokerPort``TradeBrokerPort` 分离。拥有查询权不等于拥有下单权。
- `composition` 是唯一同时依赖 application/control 与 adapters 的受检装配根;
adapter 只实现 port,不反向 import application。
## 3. 依赖方向
```text
foundation
contracts / ports
data | research | portfolio | execution
application
control
composition / CLI
adapters ──implements──> ports
evidence <── consumes immutable envelopes
composition ──wires──> application + control + adapters
```
新 namespace 的边界由 `quant_os.architecture.validate_architecture` 扫描 AST
执行。CI 会拒绝例如 `research -> execution``data -> control` 的倒置依赖,
也会拒绝新层绕回根级 `quant60``adapters``platforms``tools`
只有 `composition` 可以临时调用 compatibility 内核;每个 vertical slice
迁完后继续收窄。
## 4. 目录
```text
src/quant_os/
foundation/ # ID、双时钟、symbol、money
contracts/ # DTO、schema registry、版本迁移
ports/ # Data/Engine/ReadBroker/TradeBroker/EvidenceSink
data/ # PIT snapshot、catalog、quality
research/ # feature、split、model、evaluate
portfolio/ # risk、cost、capacity、optimizer
execution/ # intent、OMS、reconcile、kill switch
application/ # ingest/train/backtest/publish/shadow use cases
control/ # RunSpec、orchestrator、release policy
evidence/ # manifest、claim、parity、maturity
adapters/ # provider/platform/broker implementations
composition/ # 唯一受检进程装配根
runtimes/ # portable36、JoinQuant、QMT built-in、Colab
profiles/ # baseline-60、production-80
examples/ # 永不晋级为候选的 smoke 策略
status/ # 可发布静态验收快照
```
`quant_os` 是长期产品 namespace;成熟度只存在于 profile。当前 AST checker
只覆盖新 namespace(现为迁移壳层与新增控制代码),不会把约 26k 行 legacy
自动宣称为已分层。`quant60` 保留两个
兼容发布周期,继续读取/写入现有 V1 artifact,避免历史证据失效。
## 5. 当前代码如何迁移
| 当前模块 | 问题 | 目标位置 | 迁移条件 |
| --- | --- | --- | --- |
| `portable_core.py` | symbol、TargetPackage、动量、sizing、delta 混合 | foundation/contracts/portfolio/execution + example | golden vectors 先行 |
| `experiment.py` | fixture、研究、编排、证据混合 | research + application + evidence | real snapshot Ridge slice 接通 |
| `qmt_shadow.py` | 规划、签名、落盘、重放 3595 行 | execution/application/evidence | 真 QMT contract probe 后冻结 |
| `snapshot_pipeline.py` | 数据、决策、broker clock 混合并依赖 backtest 私有函数 | data + application + execution | 先建立公共合同 |
| `backtest.py` | engine 与 artifact publisher 混合 | local adapter + evidence | V1 manifest reader 保持兼容 |
| 平台 wrapper | JoinQuant/QMT 重复执行逻辑 | shared portable36 consumer + thin mapping | Python 3.6 golden test |
| status builder | 解析 Markdown 形成机器状态 | 只读 machine claims index | 标准/assessment 已先机器化 |
## 6. 唯一决策权威
当前最大结构问题不是文件太大,而是存在两个上游决策权威:
1. 真实 provider snapshot 仍走 `portable-momentum-v1`
2. Ridge 五层链只在 synthetic research 中产生 TargetPackage。
目标必须统一为:
```text
authorized immutable PIT snapshot
-> frozen feature/model
-> portfolio + independent post-risk
-> TargetPackage (weights, no account quantities)
-> JoinQuant/QMT thin execution consumer
```
hosted runtime 不再现场重算 Alpha。`portable-momentum` 永远留在 example/smoke
不能被默认 bundler 静默提升成生产候选。
跨引擎 strict peer 是 local、JoinQuant 与 QMT 的 L1—L5。Qlib 只比较其声明
参与的层级;只有显式导出同一冻结模型和组合实现时,才可提升比较范围。
Alpha158/LightGBM 研究工作流不能冒充 portable candidate 的 L3/L4 peer。
## 7. 分阶段路线
### 已在本轮落地
- 独立仓历史分支;
- `quant_os` 长期 CLI/import`quant60` 兼容;
- 七维 80 分 machine profile 和 fail-closed evaluator
- standard/profile canonical hash、可信 Baseline 前置、不可跳过的 77→canary→80
授权链及 `TEST_ONLY` 信任隔离;
- 新 namespace 层级和依赖检查;
- composition root 与 adapter 单向依赖;
- ReadBroker/TradeBroker/EvidenceSink port
- 独立根 CI
- 独立仓 clean-clone 测试修复;
- 架构、标准、迁移和上手文档。
### 下一阶段
1. 建立 golden vectors 和 V1/V2 schema registry
2. 把真实 snapshot 接入 Ridge 主链,消除双决策权威;
3. 先拆一个完整 vertical slice,而不是按文件批量搬家;
4. 平台 wrapper 收敛为同一个 portable consumer
5. status builder 改读统一 claims index,不再解析 Markdown
6. 取得真实 QMT 后接通 read-only contract probe、shadow 和对账。
### 依赖外部环境的阶段
- 完整授权 JQData/OOS
- 多期真实聚宽导出;
- 真 QMT/qmttools/XtTrader
- 60 个交易日 shadow
- 10 个交易日受限资金 canary;
- 生产 SLO、RPO/RTO、凭据轮换、券商程序化交易确认。
+299
View File
@@ -0,0 +1,299 @@
# Quant OS 新架构上手
这份文档只给出当前真实可运行入口。每一步都标明它需要什么、产生什么,以及
不能证明什么。
## 0. 先认清当前声明
```text
Baseline 60: NOT_BASELINE_60 (0/10 gates)
Production 80: BLOCKED_FROM_LIMITED_LIVE (0/100 verified evidence points)
Broker mutation: disabled
Investment value claim: false
```
这是 fail-closed 结论,不妨碍运行本地工程 smoke。
## 1. 本地路径和安装
独立仓:
```text
~/boat-workspace/Code/quant-os
```
推荐 Python 3.12
```bash
cd ~/boat-workspace/Code/quant-os
python3.12 -m venv .venv-core
source .venv-core/bin/activate
python -m pip install -e .
```
核心无第三方运行依赖。JQData、Qlib 和 QMT 必须使用各自独立环境。
当前 CLI 的 profile、配置和 bundle 是仓库资产,不嵌入 wheel。已安装的
`quant-os` 应在 checkout 内运行;从其他目录调用新命令时显式写:
```bash
quant-os --project-root ~/boat-workspace/Code/quant-os doctor
```
wheel 不是独立的数据/runtime 分发包。
## 2. 十分钟理解三平面
- Control plane:选择 RunSpec、编排 use case、做发布判定。
- Data plane:不可变 PIT 数据 → 特征/模型 → 权重 → execution intent。
- Evidence plane:记录 hash、来源、平台事实、差异和 Gate;不能修改决策。
平台和供应商只通过 adapter/port 进入。读券商与下单是两个独立接口。
## 3. 工程体检
状态:`[已实现|无需账号]`
```bash
quant-os doctor
quant-os architecture check
quant-os standard validate
quant-os standard evaluate
```
预期:
- `doctor.ok = true`:目录、入口、profile 和新 namespace 边界有效;
- `standard evaluate.ok = true`:评估过程有效;
- `qualified = false`:当前没有达到 80,属于正确结果。
`doctor.architecture.scope = new_namespace_only` 表示 AST checker 只覆盖
`src/quant_os/`legacy `quant60` 和根级 adapter/platform/tool 仍在迁移。
它证明工程和标准可验证,不证明全部旧代码已经分层、策略有效或平台可用。
没有 editable install 时可用:
```bash
PYTHONPATH=src:. python -m quant_os doctor
```
## 4. 无账号本地 demo
状态:`[已实现|无需账号]`
完整验证:
```bash
make local
```
较短路径:
```bash
quant-os smoke \
--config configs/baseline.json \
--output artifacts/local-smoke
quant-os verify-manifest artifacts/local-smoke/manifest.json
quant-os research-smoke --output artifacts/research-smoke
quant-os verify-research-manifest artifacts/research-smoke/manifest.json
```
`quant-os` 在这些命令上调用兼容的 `quant60` V1 内核。产物仍使用 V1 identity
因此历史 verifier 不会失效。
本地 demo 证明:
- 核心规则、ledger、manifest 和 hash 可重放;
- synthetic 五层链能够生成 ModelBundle 和 TargetPackage
- 平台 bundle 可生成并通过 fake contract。
它不证明:
- 真实市场收益;
- 真实 JQData 完整性;
- 真实 QMT 或券商执行;
- 60/80 达标。
## 5. Tushare 数据与 Qlib
状态:`[已实现到技术 smoke|真实镜像仍不完整]`
先阅读 [`../TUSHARE_LOCAL_DATA.md`](../TUSHARE_LOCAL_DATA.md)。当前盘点表明
completed Parquet 能校验并转换为 managed Qlib provider,但缺复权、真实
benchmark、历史成分、ST、停牌和涨跌停,不能进入生产 decision。
典型流程:
```bash
PYTHONPATH=src:. python tools/tushare_qlib.py inventory --help
PYTHONPATH=src:. python tools/tushare_qlib.py build --help
PYTHONPATH=src:. python tools/tushare_qlib.py verify --help
PYTHONPATH=src:. python -m platforms.qlib_runner --help
```
具体参数以 Tushare 文档和本机 inventory 为准。不要为了跑通而静默补缺失字段。
这条路径证明数据桥和 Qlib runtime 可用,不证明 Ridge Baseline、G1/G2 或
投资价值。
## 6. JQData → 本地 PIT
状态:`[已实现 adapter|需要授权账号]`
```bash
python3.12 -m venv .venv-jqdata
source .venv-jqdata/bin/activate
python -m pip install -r requirements/jqdata.txt
PYTHONPATH=src:. python tools/jqdata_snapshot.py \
--index 000905.XSHG \
--start 2024-01-02 \
--end 2024-12-31 \
--output data/snapshots/csi500-2024
quant-os snapshot-backtest \
--snapshot data/snapshots/csi500-2024/manifest.json \
--config configs/baseline.json \
--output artifacts/csi500-2024-backtest
```
凭据只通过无回显登录或本地 secret source 注入,不进入命令历史、Git、OB、
notebook 或 artifact。
重要限制:当前 snapshot backtest/decision 仍走
`portable-momentum-v1` compatibility path;它尚未接入真实 Ridge 五层权威。
## 7. Colab
状态:`[默认流程已实现|JQData/Qlib cell 需对应授权/运行时]`
打开 `notebooks/quant_os_colab.ipynb`。独立仓 clone 目标为:
```text
https://git.gomars.fun/boat/quant-os.git
```
默认 cell 不需要账号。`RUN_JQDATA=True``RUN_QLIB=True` 是显式可选。
Colab 禁止上传券商凭据、账户号、持仓/成交、QMT userdata 或未获许可的行情。
本地先验证 notebook
```bash
python tools/run_colab_notebook.py notebooks/quant_os_colab.ipynb
python tools/run_colab_notebook.py notebooks/quant_os_colab.ipynb --execute
```
## 8. 聚宽
状态:`[bundle 已实现|上传/导出需要登录聚宽]`
动量 smoke
```bash
python tools/bundle_platforms.py
```
TargetPackage consumer
```bash
python tools/bundle_platforms.py \
--target-package artifacts/research-smoke/target_package.json \
--output-dir dist/target-package
```
上传 `dist/target-package/joinquant_strategy.py` 后,必须保存平台运行参数、日志、
订单、成交和同输入 hash。当前已有一次 synthetic-research package 的真实
execution smoke,只证明 execution consumer,不计 G9/60/80。
## 9. QMT
状态:`[bundle/fake/read-only 框架已实现|真运行需要 Windows QMT 账号]`
当前可做:
```bash
python tools/bundle_platforms.py
PYTHONPATH=src:. python tools/export_mock_parity.py export \
--output artifacts/mock-parity/report.json
PYTHONPATH=src:. python tools/export_mock_parity.py verify \
artifacts/mock-parity/report.json
```
取得 QMT 后按顺序启用:
1. built-in 历史回测;
2. qmttools 回测导出;
3. XtTrader 只读 contract probe
4. broker snapshot 与 shadow plan
5. callback/restart/reconcile
6. 完成券商程序化交易报告确认后,才讨论 TradeBrokerPort。
账号、userdata 路径和账户标识不放进 Git/OB。当前没有任何 operator 可运行的
实盘下单命令,这是有意的安全边界。
## 10. 如何读 60/80 状态
```bash
quant-os standard evaluate
```
重点字段:
- `raw_score`:只有达到最低 evidence tier 且 hash 有效的控制项得分;
- `effective_score`:应用 60/canary cap 后的分数;
- `hard_gate_failures`:任何一项都阻断上线;
- `domain_floor_failures`:防止用文档/单一领域堆分;
- `prerequisites`60、QMT、券商确认、shadow、canary、P0/P1
- `standard_canonical_sha256`:本次评估解释所使用的精确标准版本;
- `pre_canary_authorization`:授权 ID/hash、有效期和 verifier/issuer provenance
- `pre_canary_authorization_valid_as_of_assessment`:授权在评估日是否仍可开始或继续
canary;过期后为 false,但不会否定期限内已完成的历史 canary chain
- `canary_authorization_chain_verified`:E4 canary 是否引用同一有效授权、处于合法
时间窗,并以实际最大资本/notional、标的、流量和 breach/stop 记录证明未突破
hard caps
- `verification_environment` / `test_only`:测试 verifier 永远不能冒充生产信任;
- `pre_canary_authorized`:只有生产 issuer registry 核验后才可能为真;
- `trusted_attestation_verified`:最终 promotion attestation 是否由信任边界核验;
- `qualified`:唯一可用于 promotion policy 的布尔值。
当前 CLI 没有注入 production trust provider / issuer registry,所以它只能
诚实评估当前全负状态,不能接受手工伪造的 `passed` 或自行颁发 60/80。
单元测试即使构造满分证据,也只能得到 `TEST_ONLY_STRUCTURAL_PASS`
production verifier 是明确 backlog。
公开页只展示脱敏静态快照,不是实时健康页:
```text
https://gomars.fun/quant-os/status/
```
## 11. 新策略如何接入
状态:`[目标 API|本轮只定义边界,尚未完成 Strategy SDK]`
策略最终应留在 `quants-strategies`,通过版本化 StrategySpec/port 进入 Quant OS。
策略只提供特征、预测或目标权重逻辑,不能自行:
- 读取券商 secret
- 调用 TradeBrokerPort
- 修改 evidence
- 绕过独立风险;
- 把 hosted 平台变成第二个 Alpha 权威。
当前新增策略仍按现有 `quant60` 实验接口工作,待 V2 StrategySpec 和 golden
vectors 完成后迁移。
## 12. 建议的学习顺序
1.`doctor``standard evaluate`
2.`make local`,打开 manifest 看 hash/identity
3. 对照 60/80 文档解释为什么 synthetic 不得分;
4. 阅读三平面架构和 ReadBroker/TradeBroker 拆分;
5. 盘点 Tushare provider,再跑 Qlib technical smoke
6. 获得 JQData 后生成真实 snapshot
7. 先做真实聚宽多期导出,再接真实 QMT;
8. 最后才累计 shadow/canary。
任何时候发现“代码可以下单,但证据/规则/券商确认还没到”,正确行为都是让
系统保持停机。
@@ -0,0 +1,57 @@
# Quant OS 60 分与 80 分的边界
## 一句话区别
- 60 分回答:同一策略研究链是否**可运行、可重放、可审计,并可进入只读 shadow**?
- 80 分回答:同一已报告版本是否已经在真实券商和受限资金 canary 下,满足
**本 profile 明示的账户、报告、风控、恢复与审计控制项**
80 不是替代 60;60 的 G1—G10 全部通过是 80 的前置。
## 对照表
| 责任 | 60 分 Baseline | 80 分受限生产 | 当前状态 |
| --- | --- | --- | --- |
| 系统定位 | research-to-shadow baseline;无资金发送权 | limited-production/canary-ready | 未达到 60 |
| 数据 | 有 PIT 合同、不可变快照和真实抽样重放 | 完整生产 PIT、许可、SLO、质量告警、恢复/回填 | fake JQData + 不完整 Tushare |
| 研究 | purge/embargo walk-forward、冻结 OOS 和成本后结果 | 再加真实容量、选择治理、registry、drift、champion/challenger | Ridge 只接 synthetic |
| 策略收益 | 可报告冻结 OOS,但不能用 synthetic 冒充 | 仍按预注册 mandate 判断,不设全局 Sharpe 门槛 | 无投资价值声明 |
| 风险 | A 股规则和事前/事后风险合同 | 独立且不可绕过的真实账户风控,失效即拒单 | 组件存在,未接真实券商 |
| 执行 | 本地 fill model、平台薄 wrapper、订单状态机合同 | 有效期规则包、真实 OMS、幂等/重连/重启、真实 TCA | 聚宽仅窄执行 smoke |
| 跨引擎 | local/JQ/QMT 同输入层级 parity,未知差异为零 | local/JQ/QMT 做 L1—L5 strict peerQlib 只在声明层级比较,另有订单/成交 difference ledger | mock parity,无真 QMT |
| QMT | bundle、qmttools、只读 shadow 入口 | 真账号 query/callback/reject/partial/cancel/reconnect/cross-day | fake contract |
| 对账 | 影子计划与 broker snapshot 有可重放合同 | 每个交易日现金、持仓、可卖、订单、成交 100% 对账 | 无真实连续序列 |
| Shadow | 至少 20 个交易日,验证研究到券商只读链 | 同一冻结候选至少 60 个交易日;重大变更重置 | 0 日真实 QMT |
| 实盘 | 明确禁止宣称可实盘 | 先以 E3 独立授权冻结资本/标的/流量/停机 hard caps;只有授权仍有效才能开始或继续 canary。E4 canary claim 反向引用授权,并逐项证明实际资本/notional、标的、流量未超限以及 breach 已触发 fail-closed stop,完成至少 10 个交易日;禁止自动扩容。已在期限内完成的历史 canary 可于到期后晋级复核 | 未授权 |
| 运维 | runbook、停机条件、恢复设计 | 监控告警、P0/P1、RPO=0、交易窗口 RTO≤15 分钟及故障演练 | 无生产演练 |
| 发布 | 可复现 manifest、schema 和 bundle hash | 原子晋级、审批、签名、依赖清单、回滚演练 | 独立 CI 正在建立 |
| 安全 | 凭据不入 Git/OB/artifact,默认关闭券商 mutation | secret store、最小权限、轮换/撤销、日志脱敏、供应链治理 | 仅仓库级边界 |
| 合规 | 明确程序化交易义务和需券商确认 | 已完成首次报告,实际版本与报告一致,重大变更受控 | 无券商确认 |
| 资本权限 | `NONE` | 小额、单策略、单账户、有限标的且有 hard cap | `NONE` |
| 达标标签 | `BASELINE_60_VERIFIED` | `PRE_CANARY_AUTHORIZED``LIMITED_LIVE_VERIFIED` | `NOT_BASELINE_60` |
80 分的 21 个生产 Hard Gate 权重合计正好 80,缺一项都不能用软项补偿。额外
20 分描述数据冗余、模型选择治理、真实 TCA 和未来监管模式等成熟度余量。
所有正向 evidence 都必须绑定同一 subject、standard/profile canonical hash
并经过外部可信 verifier60 分也不能靠 scorecard 手填。当前 production
issuer registry 尚未实现,所以当前只能得到负向、fail-closed 结论;测试
verifier 最多得到 `TEST_ONLY_*`,不会得到正式 60/80。
## 不能混淆的三类分数
1. **系统成熟度**:本标准 0—100,关心数据、执行、运维、合规。
2. **策略证据**:按预注册 mandate 判断 OOS、容量、风险和 canary,不用基础设施
分数掩盖没有 Alpha。
3. **实际收益**:只来自真实账户或具备适用授权、版本冻结的研究报告,不是系统
成熟度分数。
一个工程完美但没有有效策略的系统,可以有很高的系统成熟度,但不能发布一个
没有通过策略 mandate 的 model;一个回测收益很好但缺少风控、券商确认和恢复
能力的策略,同样不能上线。
## 为什么 80 仍不是“机构满分”
80 面向个人自有资金的受限生产。完整机构化还需要组织隔离、独立复核、多账户/
多策略资本分配、法务与合规职能、供应商管理、审计留存、业务连续性、人员权限
和可能的持牌/私募义务。未来进入外部资金模式时必须切换独立的
`REGULATED_MODE`,不能沿用个人 profile。
+220
View File
@@ -0,0 +1,220 @@
# Quant OS 80 分受限生产验证标准
基准日:2026-07-30
机器权威:[`profiles/production-80/standard.json`](../../profiles/production-80/standard.json)
当前评估:[`profiles/production-80/current-assessment.json`](../../profiles/production-80/current-assessment.json)
## 结论先说
80 分不是“代码功能比 60 分多一点”,而是系统责任发生了变化:
> 60 分证明系统能在受控数据和研究/影子环境中被复现;80 分证明同一个已报告、
> 已版本化、可审计的系统,已经在真实券商链路下完成受限资金验证,并且故障时
> 会自动停,而不是继续错。
当前 Quant OS 为 `NOT_BASELINE_60`80 分机器评估是
`BLOCKED_FROM_LIMITED_LIVE`,已验证得分为 0/100。这不等于“没有代码”,而是
目前的代码、synthetic、mock 和单次聚宽执行 smoke 没有达到本标准规定的
E2—E4 外部证据等级。当前 production trust provider / issuer registry 尚未
实现,因此 evaluator 能验证 profile、subject、claim envelope 与 hash 结构,
但不能自行颁发正向 80 分资格。
80 分代表个人自有资金系统的**受限生产已验证**。它不代表:
- 有超额收益或任何投资回报保证;
- 获得机构牌照;
- 可以管理第三方资金,或接受他人委托并代其决策、执行交易;
- 券商必然开放程序化交易权限;
- 法律意见。
## 1. 判定公式
状态分两步,避免“尚未实盘,却要先拿实盘证据”的循环:
1. `PRE_CANARY_AUTHORIZED`:除 `D6-CANARY` 外的 20 个 Hard Gate 全部通过,
得分至少 77,60 分、真实 QMT、券商确认、60 日 shadow、P0/P1 和同一冻结
subject 全部满足,并取得独立的 E3 可信 canary 授权。该不可变授权绑定标准
hash、pre-canary projection、账户/策略、有效期、资本/notional、标的白名单、
“申报+撤单”流量和停机条件;只有评估日仍在授权有效期内,状态才能保持
`PRE_CANARY_AUTHORIZED``CANARY_RUNNING`。它不是 E4 实盘结果,也不是
常规实盘许可。
2. `LIMITED_LIVE_VERIFIED`:完成至少 10 个交易日 canary 后,21 个 Hard Gate
全部通过,七个维度**合计**证据得分不低于 80/100,并取得绑定整个 assessment
hash 的可信 E4 promotion attestation。D6-CANARY 的 E4 claim 必须反向引用
前述授权 ID/hash,并证明 `authorized_at < canary window <= expires_on`
claim 还必须记录 canary 实际最大资本、gross notional、标的、每秒/每日
“申报+撤单”流量、是否自动扩容,以及 breach 与 fail-closed stop event 的
逐项关联。任一实际值超过授权即不得通过。若 canary 已在授权到期前合法完成,
后续 E4 promotion 可以在授权到期后复核这段历史链;到期不能倒推抹除已经发生
的受控观察,但也不能继续开放新的 canary 交易。
完整 80 分必须同时满足:
1. 七个维度合计证据得分不低于 80/100;
2. 60 分 G1—G10 全部通过;
3. 所有 Hard Gate 通过;
4. 每个维度至少获得该维度 60% 的分数;
5. 同一冻结候选累计至少 60 个交易日真实 QMT shadow
6. 受限资金 canary 至少 10 个交易日;
7. 没有未关闭 P0/P1
8. 已取得券商程序化交易报告/核查确认,部署版本与报告事实一致;
9. 已有真实 QMT 运行证据;
10. assessment、每份 evidence claim 和最终 attestation 都绑定相同的
candidate、release、model、dataset、账户 pseudonym 与 material-change
epoch,以及同一个 canonical `standard.json` SHA-256Baseline 60 还必须
引用可信 evaluator 的签名结果和 canonical profile hash。
机器 profile 中 21 个 Hard Gate 的权重恰好合计 80;其余 20 分是数据冗余、
champion/challenger、真实 TCA 与未来监管模式等成熟度余量。换句话说,80
不能靠软项补偿任何生产核心门;81—100 表示更高的冗余和治理深度。
不可补偿规则:
- 60 分未通过,最终分封顶 59
- 没有 canary,最终分封顶 79;
- 任一 Hard Gate 失败,即使原始分超过 80,也不得上线;
- 代码、文档、mock、fixture 和单元测试不能替代真实数据、真实平台、真实券商
或持续运行证据;
- 不允许人工把 `not_passed` 改成 `passed`。通过项必须提供仓库相对路径、
证据等级、SHA-256、绑定同一 subject 的 claim envelope,并由配置在外部
trust provider 中的 verifier 核验;最终 attestation 还必须绑定整个
assessment 的 canonical hash。
- canary 不能跳过 77 分授权:授权使用独立 E3 authoritycanary observation
使用 E4,并以授权 hash、评估日有效期、时间窗和“授权上限 vs 实际观测”
hard caps 形成不可断开的链;风险、数据、规则或对账 breach 必须引用同窗
stop event,且该 stop 明确停止交易、禁止自动恢复。
- 当前仓库没有生产 verifier 或信任根;单独编辑 JSON、复用无关文件或拿
`standard.json` 冒充 E4 都不能产生正向资格。测试 verifier 只能产生
`TEST_ONLY_PRE_CANARY_PASS` / `TEST_ONLY_STRUCTURAL_PASS``qualified`
仍为 false。
cap 用于分数呈现,Hard Gate/prerequisite 用于资格阻断,二者是纵深防御。
这些时长、维度和内部限额是 Quant OS 的工程标准,不是监管机关原文。
## 2. 证据等级
| 等级 | 定义 | 可证明什么 | 不能证明什么 |
| --- | --- | --- | --- |
| E0 | 口头结论、设计文档、源文件存在 | 意图和设计边界 | 代码可运行、市场有效、平台有效 |
| E1 | 确定性本地测试、synthetic、fixture、mock | 算法/合同/故障路径在受控环境成立 | 真实数据、平台、券商和收益 |
| E2 | 授权真实数据、冻结 OOS,或外部权威原始证据 | 数据/研究可重放,或规则/权属来源可核验 | 券商执行、持续运行 |
| E3 | 真实平台/券商 shadow,或绑定生产环境的运维、数据、安全、合规控制观察/独立 canary 授权 | 真实平台、账户状态、生产控制链路或受限实盘授权边界 | 已发生的资金实盘行为 |
| E4 | 受限资金、受控 live canary | 小范围真实生产行为 | 自动扩容、机构级规模或投资收益 |
每个控制项声明最低证据等级。更高等级可以覆盖更低等级,但 claim 的 control、
subject、evidence type、authority、时点和来源 hash 必须满足该项 acceptance
不能拿一份无关 E4 文件替代数据或研究证据。当前实现已经强制 control/subject/
standard/profile hash、pre-authorization chain 和带 verifier/issuer/key/policy
provenance 的验证决定;生产 issuer registry、允许的 evidence type/
authority/freshness policy 仍是下一阶段交付,因此当前不能颁发正向 60/80。
## 3. 七个评分维度
| 维度 | 分值 | 核心问题 | 关键 Hard Gate |
| --- | ---: | --- | --- |
| D1 数据与 PIT 真值 | 15 | 决策日看到的是否真是当时可得数据,数据是否有许可、时效和恢复能力 | 完整 PIT、许可/lineage/数据 SLO |
| D2 研究与模型治理 | 15 | 是否在真实长样本 OOS 下冻结,模型是否可追责、过期和回滚 | OOS、成本/容量、Model Registry |
| D3 跨引擎一致性 | 10 | 本地、聚宽、QMT strict peer 是否一致;Qlib 是否只在声明层级比较 | local/JQ/QMT L1—L5 identity、difference ledger |
| D4 执行与独立风控 | 15 | 策略能否绕过验资验券、规则、OMS 和 kill-switch | 独立风控、2026 规则包、幂等 OMS |
| D5 真实 QMT 与券商真值 | 15 | 查询、回报、重连、持仓、可卖、订单和成交是否由券商事实驱动 | 真 QMT、逐日 100% 对账、可重放证据 |
| D6 运维、灾备与审计 | 15 | 是否经历足够长的 shadow/canary,故障能否恢复 | 60 日 shadow、10 日 canary、RPO/RTO |
| D7 合规与安全 | 15 | 是否先报告后交易、账户和业务符合本 profile 边界、系统与报告一致、凭据受控 | 个人自营范围、券商确认、异常交易防线、安全 |
25 个控制项、权重和 acceptance 以机器 profile 为准。文档只解释标准,不替代
profile。
## 4. 当前差距
当前评估全部保持 `not_passed`,主要原因如下:
- G1—G10 仍是 0/10,未满足 80 分前置;
- Ridge 五层链的上游研究输入仍是 synthetic;
- JQData 真实完整 PIT 长样本未进入冻结模型和 TargetPackage tape
- 聚宽只有一次 synthetic-research TargetPackage execution consumer 观察;
- QMT 只有语法、fake contract 与只读 shadow 框架,没有真实账号证据;
- 没有 60 个交易日真实 shadow;
- 没有受限资金 canary
- 没有券商程序化交易报告/核查确认;
- 2026-07-06 生效(含部分继续暂缓实施条款)的交易规则尚未形成状态化规则包;
- 没有生产数据 SLO、真实 TCA、持续监控、RPO/RTO 演练、签名发布和凭据轮换证据。
- 没有 production trust provider、issuer registry 和可验证的 promotion
attestation,因此 evaluator 即使未来看到手工 `passed` 也不会自行授予资格。
因此,本轮交付只建立“能客观判断什么时候达到 80”的标准和架构,不声称已经
达到 80。
## 5. 监管硬事实与内部工程门槛
下面只概括与系统设计直接相关的规则事实。券商协议和后续有效规则可能更严格,
实盘以券商书面确认及当时有效规则为准。
### 5.1 规则事实
1. 《证券法》第 45 条将程序自动生成或下达交易指令纳入程序化交易,要求符合
证监会规定并向交易所报告,不得影响交易系统安全或正常交易秩序。
2. 《证券市场程序化交易管理规定(试行)》自 2024-10-08 实施。客户必须向
券商报告账户、资金/杠杆、策略、指令执行、最高申报速率、日最高申报笔数、
软件名称/版本/开发主体和联系人等;券商核查确认后才能开始程序化交易。
3. 沪、深、北程序化交易实施细则自 2025-07-07 施行,个人投资者明确纳入。
资金、杠杆、联系人、策略、速率、软件或停止交易等重大变化需要按规定变更
报告,实际交易行为会与报告事实比对。
4. 交易所重点监控瞬时申报速率异常、频繁瞬时撤单、频繁拉抬打压和短时间大额
成交。低于高频定义不等于监管安全。
5. 单账户申报加撤单最高达到 300 笔/秒,或单日达到 20,000 笔,属于高频交易。
这是高频分类阈值,不是低于阈值即可免责的安全港。
6. 沪深《交易规则(2026 年修订)》自 2026-07-06 施行,但上交所通知同时
明确部分既有条文继续暂缓实施。规则生效不等于每一条款均已启用;系统不能
继续依赖旧硬编码,也必须建模 `effective/suspended/resumed/repealed` 状态。
7. 对实施细则列明情形,会员应当按照委托协议等约定采取拒绝程序化交易委托、
撤销相关申报等措施;具体适用仍以券商协议和当时有效规则为准。
8. 突发故障或重大差错时,系统必须具备暂停、撤单、错误处理和应急处置能力。
### 5.2 Quant OS 内部门槛
- 账户模式固定为 `PERSONAL_PROPRIETARY`。出现第三方资金、接受他人委托并代其
决策或执行交易、向他人提供收费投资顾问服务,或与他人共享交易控制权时,
系统 fail closed,转入单独的法律/合规适用性评估。仅购买或阅读第三方研究
信息本身不等于代客指令。
- 没有券商确认、实际委托协议和版本一致性证据,TradeBrokerPort 保持禁用。
- machine profile 的日频 Baseline 默认上限按“Quant OS 发出的全部委托申报
尝试 + 撤单请求”合计,每账户及实际控制账户组均不超过 10 条/秒、
1,000 条/交易日。日撤单率 = 策略主动撤单请求 / 已接受委托申报;拒单不进
分母,部分成交后主动撤单进分子,交易所自动撤单不进分子。达到 30% 预警并
人工复核;更严规则优先。这是内部限额,不是监管安全港。
- 当前交易能力范围明确为沪深;北交所为 `excluded/fail_closed`。规则包按市场、
板块、证券类型及发布、生效、暂缓、恢复、废止日期版本化。规则未知、过期、
暂缓或不完整时拒单。
- Colab 只允许上传供应商许可范围内的脱敏研究数据,绝不上传券商凭据、账户号、
持仓、成交或个人敏感信息。
## 6. 官方来源
- [中华人民共和国证券法(全国人大)](https://www.npc.gov.cn/c2/c30834/201912/t20191231_304436.html)
- [证券市场程序化交易管理规定(试行)(证监会 PDF)](https://www.csrc.gov.cn/csrc/c101954/c7480579/7480579/files/%E9%99%84%E4%BB%B61%EF%BC%9A%E8%AF%81%E5%88%B8%E5%B8%82%E5%9C%BA%E7%A8%8B%E5%BA%8F%E5%8C%96%E4%BA%A4%E6%98%93%E7%AE%A1%E7%90%86%E8%A7%84%E5%AE%9A%EF%BC%88%E8%AF%95%E8%A1%8C%EF%BC%89.pdf)
- [上交所程序化交易管理实施细则](https://www.sse.com.cn/lawandrules/sselawsrules2025/trade/universal/c/c_20250612_10781696.shtml)
- [深交所程序化交易管理实施细则通知](https://www.szse.cn/lawrules/rule/allrules/bussiness/t20250403_612770.html)
- [北交所程序化交易管理实施细则](https://www.bse.cn/jygl_list/200025383.html)
- [上交所交易规则(2026 年修订)](https://www.sse.com.cn/lawandrules/sselawsrules2025/stocks/exchange/c/c_20260424_10816482.shtml)
- [深交所交易规则(2026 年修订)](https://www.szse.cn/lawrules/rule/trade/current/t20260424_620190.html)
- [程序化交易委托协议示范文本(中证协)](https://www.sac.net.cn/zlgl/zlgz/202512/t20251231_69956.html)
- [JR/T 0303—2024 投资研究时序数据参考模型](https://www.csrc.gov.cn/csrc/c100028/c7483073/content.shtml)
- [个人信息保护法(全国人大)](https://www.npc.gov.cn/npc/c2/c30834/202108/t20210820_313088.html)
如果未来管理外部资金,个人 profile 立即失效。量化私募还涉及系统/数据安全、
策略上线、防自成交/反向交易、超限控制以及长期保存等要求。参见
[私募证券投资基金运作指引(中基协 PDF)](https://www.amac.org.cn/xwfb/xhyw/202304/P020231126355219356728.pdf)。
## 7. 机器验收
```bash
PYTHONPATH=src:. python -m quant_os standard validate
PYTHONPATH=src:. python -m quant_os standard evaluate
```
第一条验证标准本身权重、控制项和证据等级是否自洽;第二条重新评估当前证据。
评估成功运行只表示“当前结构与负向结论有效”,不表示达到 80。必须看
`qualification_state``qualified``pre_canary_authorization`
`canary_authorization_chain_verified``standard_canonical_sha256`
`verification_environment``trusted_attestation_verified``hard_gate_failures`
`domain_floor_failures``prerequisites`。当前 CLI 不注入生产 verifier
这是明确的未完成项,而不是允许手工绕过的入口。