Files
quant-os/IMPLEMENTATION_PLAN.md
T

7.6 KiB
Raw Blame History

Quant OS implementation plan

Quant OS 是项目名;quant60 是第一版 A 股 Baseline 内核、CLI namespace 和 artifact 协议前缀。终态不是“仓库里有若干 adapter”,而是本地研究证据链 可无人值守重放、聚宽登录后可直接回测、QMT 授权环境就绪后无需改源码即可完成 回测/影子验证,并且所有 G1—G10 都由版本绑定的真实证据支持。

当前结论仍为 NOT_BASELINE_60。最近一次标准库全量测试记录为 Ran 224 testsOK (skipped=6);六个 skip 是可选依赖/运行时路径。 该结果证明代码合同,不证明真实平台、券商或合规 Gate。

Stage 1: 独立仓库与确定性执行

目标Quant OS 代码独立于 Obsidian 文档,并有一条可重复的本地验证入口。

已实现

  • quant-os/ 是独立项目目录,Obsidian 只保留项目说明和验证文档;
  • make local / scripts/validate_all.sh 串联测试、bundle、execution smoke、 research smoke、manifest verifier、mock parity、capability probe 和 Colab notebook 执行;
  • 聚宽与 QMT 内置策略由同一个 Python 3.6-compatible portable core 生成;
  • Gitea CI 定义和 Colab notebook 已提供。

状态:本地功能实现完成;CI 首次远端运行记录仍需随提交保存。Stage 1 完成不等于任一 Gate 自动通过。

Stage 2: 数据快照、研究与目标生成

目标:把 PIT 数据、Universe、透明特征、时间有序验证、风险/成本和约束 组合连接成可审计的 research-to-target 链。

已实现

  • PIT effective_time / available_time、修订版本和未来值 fail-closed
  • openable / hold-only / sell-only / frozen / excluded 状态与原因码;
  • 透明价量特征、可执行时钟标签、train-only 预处理;
  • purged walk-forward、deterministic Ridge challenger、IC/RankIC 报告;
  • 日期化费用、low/base/high 冲击、透明因子风险、约束优化与失败诊断;
  • JQData adapter 通过 get_bars 获取 raw OHLCV/money、factor、pre_close、 每日涨跌停/停牌字段,通过 get_extras 获取 PIT is_st,并逐交易日 获取 PIT 指数成员;区间 get_trade_days 必须与 get_all_trade_days 一致,并冻结唯一下一交易日;当日未到 24:00 的日线和任何覆盖缺口均 fail closed
  • snapshot verifier 会重建领域对象、重算质量汇总和 data_version
  • 已验证 snapshot 可直接进入 snapshot-backtestsnapshot-decision,后者支持 canonical broker snapshot 的 fail-closed 账户状态输入;
  • synthetic research artifacts 和 snapshot decision artifacts 都有精确 manifest verifier。

仍缺

  • 授权 JQData 账户上的真实快照、长样本质量报告和许可记录;
  • 完整 Security Master、基本面公告时点、公司行动与退市链;
  • 真实样本风险/冲击/容量校准;
  • Ridge 的冻结 model bundle、真实 OOS 报告与跨引擎推理验证。

状态:功能实现和合成/fake-provider 合同验证完成,生产证据未完成。 Ridge 仍是 research challenger,不是已部署模型。

Stage 3: 平台回测与跨引擎证据

目标:在相同冻结信息集和策略版本上保存本地、聚宽、QMT 与 Qlib 的 逐层结果,而不是只比较净值。

已验证

  • 本地 deterministic execution/research 与 manifest 重放;
  • JoinQuant/QMT fake wrapper 合同和 mock parity exporter
  • 2026-07-26 使用生成 bundle 完成 2024 全年真实 JoinQuant hosted backtest,可见完成日志无 ERROR;该运行还促成 hosted namespace、 科创板保护价与 200 股最小申报的真实修复;
  • CPython 3.12 + pyqlib==0.9.7 native momentum fixture smoke 实际生成 24 条 signal,并保存 signal/report hash、表边界和重算指标;
  • Qlib Alpha158 + LightGBM + Recorder fixture smoke 已真实成功, runner 会为本地 MLflow file store 设置 MLFLOW_ALLOW_FILE_STORE=true,并保存 model、SignalRecord、 SigAnaRecord 和 PortAnaRecord,同时读取 portfolio report 保存 hash、 表边界、重算指标与 artifact path。

Qlib 两次 smoke 使用的是确定性两股票 synthetic fixture,性能没有投资意义, 也不证明 A 股逐日涨跌停/T+1/目标订单语义。mock parity 的 evidence_class=mock_contract_onlyreal_platform_pass=false 因此不能计入 G9。

仍缺

  • 聚宽完整输入/plan/orders/fills 导出和相同输入本地 peer;
  • 授权 QMT built-in 与 qmttools 回测导出;
  • 至少 20 个交易日的真实 QMT/broker shadow
  • 同一 canonical 输入的 L1—L5 差异报告。

状态:部分完成;JoinQuant runtime smoke 已执行,但 strict comparison、 真实 QMT 和 broker 运行仍未完成,G9 保持 not_passed

Stage 4: Broker-safe shadow operation

目标:完成查询、callback replay、重启恢复、持续对账、 guarded TWAP/POV 和影子证据。

已有基础

  • XtTrader adapter 默认禁止 live mutation
  • operator CLI 严格只读,能生成 HMAC 账户绑定的 broker observation/snapshot、target-diff shadow plan 与 exact manifest
  • T 日完整 Signal 只能与冻结 provider calendar 的唯一下一交易日 Asia/Shanghai [09:00,09:30) broker observation 显式绑定,保留两个 时钟;同日、周末近似、错窗、错误 session 和迟到补查均失败关闭;
  • 严格类型、提交前幂等 reservation、单调状态回调、fresh account-bound guard 和审计记录;
  • hash-chain ledger、重复/乱序重放和完整 broker snapshot 对账合同。

仍缺

  • 券商实际状态码映射与脱敏回调;
  • 实际 QMT query API 的失败/空列表合同探针;
  • durable scheduler/recovery daemon
  • 20 个交易日 shadow、日终零未知账差和故障恢复演练;
  • 券商权限、频率、软件和程序化交易报告确认。

状态:仅有未认证的安全边界;不可视为 live-ready。

Stage 5: Baseline-60 evidence

目标:证据评分至少 60,且 G1—G10 十道硬门全部 passed

状态:未开始计分。当前 gate_scorecard.json 中 G1—G10 全部 not_passed。源文件、单测、synthetic、fixture、fake harness 和成功的 Qlib smoke 都不能替代真实数据、平台、券商和合规证据。

当前验证入口

# 核心、本地两条 synthetic 链、bundle、mock parity、Colab
make local

# JQData 授权后:快照 -> 语义校验 -> PIT 回测/决策
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
PYTHONPATH=src:. python -c \
  "from quant60.data_snapshot import verify_data_snapshot; verify_data_snapshot('data/snapshots/csi500-2024/manifest.json')"
PYTHONPATH=src:. python -m quant60 snapshot-backtest \
  --snapshot data/snapshots/csi500-2024/manifest.json \
  --config configs/baseline.json --output artifacts/csi500-2024-backtest
PYTHONPATH=src:. python -m quant60 snapshot-decision \
  --snapshot data/snapshots/csi500-2024/manifest.json \
  --config configs/baseline.json --as-of 2024-12-31 \
  --equity 1000000 --output artifacts/csi500-2024-decision

# Qlib 0.9.7 独立环境
python3.12 -m venv .venv-qlib312
source .venv-qlib312/bin/activate
python -m pip install -r requirements/research-py312.txt
python tools/build_qlib_tiny_fixture.py artifacts/qlib-fixture --days 400

平台真实运行和证据保存步骤见 runbooks/PLATFORM_DEPLOYMENT.md