Add batch backtest validation and doctrine kernel reset
This commit is contained in:
@@ -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 定义,检查策略抽象是否偏离书本。
|
||||
Reference in New Issue
Block a user