Add batch backtest validation and doctrine kernel reset

This commit is contained in:
Codex
2026-05-21 18:52:24 +08:00
parent 465fc959c8
commit 1d4e65335f
8 changed files with 918 additions and 4 deletions
@@ -0,0 +1,263 @@
# AI_ICT Doctrine Kernel 全书规则内核重建 D0 2026-05-21 v1
## 0. 阶段判定
本阶段正式承认:旧系统只吸收了《ICT交易全书》中的部分表面形态,例如 sweep、MSS、FVG、retrace。它不足以支撑“帮助交易员稳定盈利”的目标。
S16 批量历史回测已经给出证据:远端矩阵 `S16-remote-20260521-b` 共 `18` 个 no-lookahead run、`211` 个历史结果、`156` 个 executed signals,质量门 `0/18` 通过。这个结果不是单纯参数问题,而是 setup 抽象不够完整:旧候选器没有完整表达书中的 Range、Draw、Location、Time、Invalidation、IRL/ERL、no-trade 条件与复盘错误闭环。
因此从 D0 开始,开发主线切换为:
```text
ICT Doctrine Kernel / 全书规则内核重建
```
目标不是继续美化旧候选器,而是从《ICT交易全书》中重建可验证、可回测、可复盘的 setup playbook。
## 1. 立即降级
现有表面形态候选器从 D0 开始降级为研究材料:
- `sweep / MSS / FVG / retrace` 只能作为 evidence component,不再等同于 setup。
- `OSOK_DAILY_RANGE_SWEEP_MSS_FVG_RETRACE` 等旧模型不得直接进入 Trader Cockpit `Review Now`。
- 旧候选可以继续被记录、回测和复盘,但只能标记为 `research_only` / `study_only`。
- 任何未经过 Doctrine setup mapping 和历史质量门的候选,默认只能输出 `Observe Only` 或 `Do Not Use`。
这个降级不删除历史数据、不破坏现有页面、不停止只读 runtime。它只改变产品解释权:旧候选器不再被视为主交易逻辑。
## 2. 不变边界
本阶段仍然严格只读:
- 不下单
- 不提交 OKX trade order
- 不改变 `execution_allowed`
- 不改变 `decision_support_ready`
- 不改变 `real_live_ready`
- 不改变 risk governor
- 不改变 trust bucket
- 不改变 operator confirmation protocol
- 不伪造 R2 paper ticket / paper execution / weekly review 样本
R2 executable candidate watch 可以继续后台等待,但它不再主导产品开发节奏。
## 3. 新内核定义
Doctrine Kernel 必须把书本内容拆成三层。
### 3.1 Doctrine Rule
每条规则来自《ICT交易全书》的明确章节或执行模板,必须包含:
- `book_anchor`: 章节 / 小节 / 关键公式。
- `rule_statement`: 交易员可理解的一句话规则。
- `required_inputs`: 系统需要哪些数据才能判断。
- `measurable_fields`: 可被代码计算或标注的字段。
- `invalid_when`: 何时该规则失效。
- `no_trade_when`: 何时必须不交易。
- `journal_error_class`: 违反该规则时的复盘错误类型。
- `backtest_observable`: 回测中如何验证这条规则是否有效。
示例:
```text
Rule: Range 未定义不得交易
Anchor: 第1章 / 第2章
Statement: 未定义当前 Dealing Range 时,任何 FVG/MSS 都只是研究材料。
No-trade: 缺 Key High / Key Low / Equilibrium / Premium-Discount 位置。
Journal error: traded_without_range
Backtest observable: setup_without_range_definition
```
### 3.2 Setup Playbook
真正可交易的 setup 必须是完整 playbook,而不是一个形态标签。每个 playbook 必须包含:
- `setup_id`
- `setup_name`
- `book_anchors`
- `market_narrative`
- `range_definition`
- `draw_rule`
- `location_rule`
- `liquidity_event_rule`
- `displacement_structure_rule`
- `pd_array_rule`
- `session_timing_rule`
- `confirmation_rule`
- `invalidation_rule`
- `target_rule`: IRL / ERL / partial / full target
- `no_trade_conditions`
- `backtest_cohort`
- `promotion_gate`
- `cockpit_sentence`
- `journal_error_classes`
未满足以上字段的 setup 不能进入 Trader Cockpit。
### 3.3 Evidence Chain
所有 Trader Cockpit 输出必须来自如下链路:
```text
Doctrine Rule
-> Setup Playbook
-> Historical Backtest Cohort
-> Trading Plan
-> Intraday Evidence
-> Cockpit Conclusion
-> Journal Feedback
```
如果链路断在任何一环,系统必须输出:
```text
Observe Only / Do Not Use
```
不能输出交易倾向、买卖建议或伪装成信号的状态。
## 4. 全书吸收顺序
D 阶段按书本主线吸收,不按功能菜单吸收。
### D1 Market Language Kernel
吸收第 1-6 章:
- Price Delivery / IPDA
- Dealing Range
- Context / Framework / Reference Point
- Draw on Liquidity
- Premium / Discount / Equilibrium / OTE
- IRL / ERL
交付:
- `Range + Draw + Path + Time + Invalidation` 规则矩阵。
- Dealing Range / Premium-Discount / IRL-ERL 数据字段定义。
- 旧候选器缺失这些字段时的 `research_only` 原因。
### D2 Liquidity Kernel
吸收第 7-12 章:
- BSL / SSL
- Liquidity Pool
- Liquidity Void
- Stop Run / Sweep / Raid
- Judas Swing / Manipulation
- 多目标 Draw 优先级
交付:
- 流动性目标排序规则。
- sweep 不是 setup 的硬规则。
- manipulation 与 session timing 的 no-trade / wait 规则。
### D3 PD Array / Reaction Kernel
吸收全书 PD Arrays 与反应位章节:
- FVG
- Order Block
- Breaker
- Mitigation
- Rebalance / Void
- PD array 质量排序
交付:
- FVG/MSS 从“入场触发”降级为“完整链路中的确认组件”。
- PD array 选择必须服从 Range、Draw、Location。
### D4 Time / Session Kernel
吸收 session / kill zone / day model / week model:
- Asia / London / NY AM / NY PM
- Judas / manipulation window
- opening range
- weekly profile
- news / no-trade time
交付:
- setup 必须绑定可验证时段。
- session 之外的候选默认 study-only。
### D5 Model Playbook Kernel
把书中模型整理为可回测 playbook:
- continuation model
- reversal model
- sweep-to-displacement model
- HTF draw pullback model
- London / NY specific model
交付:
- 每个模型形成完整 setup playbook。
- 每个 playbook 都能生成 batch backtest cohort。
### D6 Trader Product Rebuild
只把通过回测与人工复核的 playbook 放回交易员产品:
- Trader Cockpit 只显示合格 playbook。
- Strategy Backtest 以 playbook 为核心,而不是以裸信号为核心。
- Trading Plan 必须引用 playbook。
- Journal 必须按 playbook 错误类型复盘。
## 5. 保留 / 冻结 / 重做
### 保留
- 行情与 K 线数据管道。
- 只读 runtime。
- Strategy Backtest 批量 runner。
- Trader Cockpit 外壳。
- Trading Plan / Journal / System Ops。
- R2 后台 observation 机制。
### 冻结
- 外部 context 长尾。
- archive / workflow / digest 扩展。
- 旧 Decision Assistant 大面板。
- 任何未映射书本规则的候选扩展。
### 重做
- setup 定义。
- candidate promotion gate。
- backtest cohort grouping。
- Trader Cockpit 的 `Historical Edge` 来源。
- Journal error taxonomy。
## 6. D0 闭环标准
D0 完成时必须满足:
- 新阶段文档成为活锚点。
- `SESSION.md` / `TASKS.md` 明确下一步从 Doctrine Kernel 开始。
- 旧候选器被文字上降级为 `research_only` / `study_only`。
- S16 `0/18` 质量门结果被明确用作重建理由。
- 不做任何交易权限、下单、执行 readiness 改动。
## 7. 下一步最小闭环
下一步不是继续扩大旧模型回测,而是做 D1:
```text
D1 Market Language Kernel
```
最小交付:
1. 从《ICT交易全书》第 1-6 章抽取 Doctrine Rule matrix。
2. 生成第一版 `Range / Draw / Location / Time / Invalidation` 规则注册表。
3. 给旧候选器补 `research_only_reason`:缺 Range、缺 Draw、缺 Location、缺 Invalidation、缺 session/time 任一项都不能 promoted。
4. 让 Strategy Backtest 按 Doctrine Rule 缺失项聚合失败原因。
5. 更新 Trader Cockpit:没有完整 playbook 时,直接说明“当前只有研究材料,没有可交易 setup”。
@@ -0,0 +1,156 @@
# AI_ICT 批量历史回测验证 S16 2026-05-21 v1
## 目标
把 Strategy Backtest 从“能查看最近回测结果”推进到“可以批量跑历史验证矩阵”。R2 继续由 runtime 后台等待真实 executable candidate;开发主线转向用历史数据验证 ICT setup 是否有优势。
## 当前完成度判断
在 S16 之前,回测能力不能算“大量历史回测完成”。当时已经完成的是:
- Strategy Backtest 只读页面 `/trading/backtests`。
- 单次回测脚本 `scripts/run_backtest.py`。
- 最近回测、质量门、样本、R 指标、失败原因、最近 run 展示。
S16 补齐的是批量历史验证入口:一次性按 instrument / subject / timeframe / session / candidate model 组合跑多个回测 run,并把所有 run 写回现有 `backtest_runs` / `backtest_results`,用于快速判断哪些 ICT setup 不值得盘中关注。
仍未把它夸大成完整量化研究平台:本阶段不做参数自动寻优、不做外部数据商接入、不做交易执行、不把未过质量门的历史统计提升为实盘信号。
本阶段仍然只读:
- 不下单
- 不提交 OKX
- 不改变 `execution_allowed`
- 不改变 `decision_support_ready`
- 不改变 `real_live_ready`
- 不伪造 paper / execution / weekly review 样本
## 新增入口
```bash
python scripts/run_backtest_batch.py
```
默认行为:
- instrument: `1`
- subject: `plan_replay,signal`
- mode: `replay_no_lookahead`
- limit: `1000`
- session groups: `ALL;LONDON;NY_AM;NY_PM;ASIA`
- 每个 run 写入现有 `backtest_runs` / `backtest_results`
- 输出批量质量门汇总
## 常用参数
通过环境变量控制:
```bash
BACKTEST_BATCH_OUTPUT_JSON=1
BACKTEST_BATCH_ID=bt-ict-mainline-001
BACKTEST_BATCH_INSTRUMENT_IDS=1,2
BACKTEST_BATCH_SUBJECT_TYPES=plan_replay,signal
BACKTEST_BATCH_MODES=replay_no_lookahead
BACKTEST_BATCH_LIMIT=2000
BACKTEST_BATCH_SESSION_GROUPS=ALL;LONDON;NY_AM;NY_PM;ASIA
BACKTEST_BATCH_TIMEFRAME_SETS=1m/1m/1m;15m/5m/1m
python scripts/run_backtest_batch.py
```
PowerShell 示例:
```powershell
$env:BACKTEST_BATCH_OUTPUT_JSON='1'
$env:BACKTEST_BATCH_ID='bt-ict-mainline-001'
$env:BACKTEST_BATCH_LIMIT='2000'
$env:BACKTEST_BATCH_SUBJECT_TYPES='plan_replay,signal'
$env:BACKTEST_BATCH_SESSION_GROUPS='ALL;LONDON;NY_AM;NY_PM;ASIA'
$env:BACKTEST_BATCH_TIMEFRAME_SETS='1m/1m/1m;15m/5m/1m'
.venv\Scripts\python.exe scripts\run_backtest_batch.py
```
质量门参数沿用单次回测:
```bash
BACKTEST_MIN_TOTAL_SIGNALS=100
BACKTEST_MIN_EXECUTED_SIGNALS=30
BACKTEST_MIN_EXPECTANCY_R=0
BACKTEST_MIN_PROFIT_FACTOR_R=1.2
BACKTEST_MAX_DRAWDOWN_R=10
BACKTEST_MAX_CONSECUTIVE_LOSSES=5
```
## 输出如何读
关键字段:
- `run_count`: 本批次实际跑了多少个回测 run。
- `passed_quality_gate_count`: 通过质量门的 run 数。
- `blocked_quality_gate_count`: 被质量门阻断的 run 数。
- `total_result_count`: 总历史样本数。
- `total_executed_signals`: 总执行样本数。
- `quality_gate_reason_counts`: 质量门失败原因聚合。
- `failure_reason_counts`: setup / replay 失败原因聚合。
- `aggregate_by_subject`: plan replay 与 signal 回测分层。
- `aggregate_by_session_group`: session 分层。
- `top_runs_by_expectancy`: 按 executed expectancy 排序的候选 run。
建议先看三件事:
1. `passed_quality_gate_count` 是否大于 0。
2. `quality_gate_reason_counts` 中最大阻断项是什么。
3. `aggregate_by_session_group` 哪些 session 的样本和执行结果明显更差。
## 与 Trader Cockpit 的关系
批量回测不是买卖信号。它只回答:
```text
这个 ICT setup 在历史样本里是否有足够证据,值得进入盘中观察?
```
如果样本太小、expectancy 不足、profit factor 不足、回撤过大、连续亏损过高,Trader Cockpit 必须继续降级为 Observe Only 或 Do Not Use。
## S16 闭环标准
- 批量 runner 可本地测试。
- 远端可执行真实批量回测。
- 新 run 写入 `backtest_runs`,可被 `/trading/backtests` 读取。
- 输出清楚显示哪些 setup/session 不可信。
- 不影响 R2 实盘监控后台等待。
## 首批远端验证结果
2026-05-21 首批远端 smoke 验证:
- batch id: `S16-remote-20260521-a`
- run ids: `490-495`
- run count: `6`
- total result count: `79`
- total executed signals: `66`
- quality gate: `0/6` passed
- main quality blockers: `expectancy_below_threshold=6`, `profit_factor_below_threshold=6`, `sample_size_too_small=5`, `executed_sample_too_small=5`
- main failure reasons: `stopped_out=52`, `outside_session_window=42`, `no_future_candles=12`, `same_candle_entry_exit_ambiguous=10`
结论:批量回测能力已经跑通并落库,但当前策略样本不支持进入 Trader Cockpit `Review Now`。这正是回测应发挥的作用:先把历史上没有优势的 setup 拦住,而不是等盘中再靠主观判断。
同日扩大一轮 timeframe/session 矩阵:
- batch id: `S16-remote-20260521-b`
- run ids: `496-513`
- run count: `18`
- total result count: `211`
- total executed signals: `156`
- quality gate: `0/18` passed
- timeframe sets: `1m/1m/1m`, `15m/5m/1m`, `1h/15m/5m`
- session groups: `ALL`, `LONDON`, `NY_AM`, `NY_PM`, `ASIA`
- main quality blockers: `expectancy_below_threshold=18`, `profit_factor_below_threshold=18`, `executed_sample_too_small=16`, `sample_size_too_small=15`
- main failure reasons: `stopped_out=124`, `outside_session_window=126`, `no_future_candles=54`, `same_candle_entry_exit_ambiguous=30`
扩大矩阵后的结论更明确:当前抽象出来的 setup 在现有历史样本里没有优势,必须继续停留在 study / observe-only,不能进入实盘 Review Now。
## 下一步
S16 之后,主线不应该继续等待 R2。应优先用批量回测积累历史证据:
- 先跑 BTC/ETH/SOL 的同一套 session/timeframe 矩阵。
- 再对通过质量门或接近质量门的 setup 做人工复核。
- 未通过质量门的 setup 不允许进入 Trader Cockpit `Review Now`。
- 如果长期没有任何 run 通过质量门,下一步不是实盘试,而是回到《ICT交易全书》的 setup 定义,检查策略抽象是否偏离书本。