From b0056e06ef76b89acedf865c7bfab14a7bb02848 Mon Sep 17 00:00:00 2001 From: xxm Date: Sat, 15 Aug 2026 12:16:52 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E9=97=AE=E9=A2=983=E8=AF=8A=E6=96=AD+?= =?UTF-8?q?=E8=BF=9B=E5=8C=96=E9=97=AD=E7=8E=AF=E9=87=8D=E6=9E=84=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E2=80=94=E2=80=94=E8=BF=9B=E5=8C=96=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=85=A8=E9=9D=A2=E8=84=B1=E8=8A=82(=E7=A1=AC=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E5=B7=B2=E8=AF=81=E4=BC=AA=E7=AD=96=E7=95=A5/?= =?UTF-8?q?=E6=97=A0cron/=E8=AF=BB=E5=9B=9E=E6=B5=8B=E5=86=92=E5=85=85?= =?UTF-8?q?=E5=AE=9E=E7=9B=98),=E9=97=AD=E7=8E=AF=3D=E6=AF=8F=E6=97=A5?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E2=86=92=E9=80=80=E5=8C=96=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E2=86=92=E5=8F=98=E4=BD=93=E5=9B=9E=E6=B5=8B=E2=86=92=E6=9C=89?= =?UTF-8?q?=E4=BB=B7=E5=80=BC=E6=89=8D=E6=8E=A8=E9=80=81,=E4=B8=8D?= =?UTF-8?q?=E8=87=AA=E5=8A=A8promote?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-08-15-策略自我进化闭环重构.md | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 docs/decisions/2026-08-15-策略自我进化闭环重构.md diff --git a/docs/decisions/2026-08-15-策略自我进化闭环重构.md b/docs/decisions/2026-08-15-策略自我进化闭环重构.md new file mode 100644 index 00000000..caf554eb --- /dev/null +++ b/docs/decisions/2026-08-15-策略自我进化闭环重构.md @@ -0,0 +1,68 @@ +# 策略自我进化闭环重构(问题3 诊断 + 设计) + +日期:2026-08-15 +状态:诊断完成,设计待老莫批准 +关联:问题2(策略数据每日自动更新,已落地 c91f49ef/b9b4fadf) + +## 一、诊断:进化模块与温区体系全面脱节 + +老莫定义的关系链:**统计数据每日自动更新 → 进化基于最新统计数据做策略研究 → 产出有价值的改进结论**。 + +现状:第一节(统计数据)今天才修好;第二节(进化)整体坏死—— + +| 组件 | 病状 | 证据 | +|---|---|---| +| `evolution_api.py` baseline | 硬编码 `['v_weak','v_oversold']`,与路由激活集合脱节 | 已修(9ba85733,改数据驱动) | +| `lesson_extractor.py` | 硬编码 `version='v_next4'`(已证伪策略);名为"已平仓交易教训提取",实际读的是**回测 trades** 而非实盘平仓 | `strategy_lessons` 最新行 2026-08-01,16 行,无 cron | +| `auto_iterator.py` | 健康度默认 `version='v_next4'`;`PARAM_SPACE`(max_hold_days/reentry_days/sl_atr)是旧策略家族参数,与当前温区策略(s2_panic 的 RSI/bias 阈值、hk_pe_mom 的 PE 分位/tp40%)完全对不上 | `strategy_evolution` 最新行 2026-08-07,8 行,无 cron | +| 调度 | lesson_extractor / auto_iterator 均不在 hermes cron | 管道 8/1、8/7 断供至今 | + +根因:进化模块是 8 月初为 v_next4/v_weak 时代写的**一次性脚本**,温区自适应体系(路由+三温区策略+双市场)上线后没人回头接它。它和 health_monitor 的病是同一类——**硬编码策略名,不跟随系统事实源**。 + +## 二、闭环设计(待批准) + +``` +每日盘后(已有) 每周研究(新增) 产出 +┌─────────────────┐ ┌──────────────────────┐ ┌────────────────┐ +│ period_rollup │ │ evolution_engine.py │ │ 有价值才说话: │ +│ (周期滑窗统计) │────────►│ 1. 读健康度/温区表现 │──────►│ 改进结论+证据 │ +│ regime_perf │ 数据 │ 2. 识别退化信号 │ 结论 │ 推给老莫决策 │ +│ (温区表现) │────────►│ 3. 生成参数变体 │ │ (不自动上线) │ +│ health_monitor │ │ 4. 回测验证(统一模拟) │ └────────────────┘ +│ (健康度) │ └──────────────────────┘ +└─────────────────┘ │ + 无退化/变体不达标 → 静默 +``` + +### 退化信号定义(触发研究的条件,宁缺毋滥) +1. **健康度连续低**:激活策略 health_score 连续 5 天 < 40(实盘显著偏离回测基线) +2. **温区表现衰减**:策略在其适应温区的近 1 年派生胜率 < 5y 胜率 × 0.8(近期失效迹象) +3. **证伪候选**:激活策略在其适应温区的温区级组合年化 < 0(防守失败) + +### 变体生成原则(不拍脑袋) +- 参数空间从**策略定义的当前参数**出发(读 hk_strategies.py / strategy_lab.py 的实际参数,不再硬编码 PARAM_SPACE) +- 每个维度 ±20% 网格,单变量扰动(一次只动一个参数,可归因) +- 验证统一走 portfolio_sim(8 槽资金约束),验收门槛:变体在其适应温区的温区级组合年化 ≥ 原策略 + 3pp,且 max_dd 不劣化超过 2pp + +### 产出与呈现 +- 达标变体 → 写 `strategy_evolution`(parent/child/change_description/promoted=0)+ 推送老莫(附对比证据) +- 老莫说"上线"才进 strategy_research + 路由候选,**永不自动 promote** +- 无退化或变体全灭 → 当周静默(不制造噪音) +- dashboard 进化区:baseline 已跟随路由(9ba85733);lessons 区待 lesson_extractor 重写后复供 + +### lesson_extractor 重写方向 +- 数据源改实盘:`holding_strategies` 已平仓记录(hit_tp/hit_sl)+ strategy_review 的三层复盘结论 +- 不再用 LLM 逐笔分析回测 trades(旧做法既贵又假——回测交易没有"教训"可挖) +- 频率:每周一次,跟随 evolution_engine 同跑 + +## 三、实施清单(批准后执行) +1. `evolution/evolution_engine.py` 新建(退化检测 + 变体生成 + 统一回测验证) +2. `evolution/lesson_extractor.py` 重写(实盘平仓 + 复盘结论驱动) +3. `auto_iterator.py` 归档(参数空间硬编码,被 evolution_engine 取代) +4. hermes cron:`evolution_engine` 每周六 22:00(策略评估 21:00 之后) +5. dashboard 进化区读取验证 + +## 四、明确不做 +- 不自动上线任何变体(老莫决策权) +- 不动 strategy_review.py(实盘单笔复盘,职责不同,运行正常) +- 不在本重构中改温区路由逻辑