Files
MoFin/docs/decisions/2026-08-13-事项五-策略组合市场测温动态切换.md
T

343 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 事项五解决方案:策略组合 + 市场测温 + 动态切换
> 2026-08-13 一次性落地。老莫指示:不分短期中期,全部立即完成。
---
## 一、根因诊断(数据铁证)
### 1.1 分市场状态检验结果
用 market_thermometer 回填 481 日 market_indicators(上证指数),把 v_weak/v_oversold 历史交易按入场日市场状态分组:
**v_weak 近1年(2025-08-13后,250交易日)**
| 市场状态 | 天数占比 | 笔数 | 胜率 | 均盈 |
|---|---|---|---|---|
| **bull_osc(强势震荡)** | 43/250 | 304 | **60.2%** | **+5.05%** |
| bull_trend(牛市趋势) | 47/250 | 95 | 30.5% | -0.61% |
| bear(熊市/下跌) | 111/250 | 223 | 28.3% | -1.88% |
| neutral(中性) | 49/250 | 155 | 28.4% | -1.64% |
**v_weak 全历史(2021+**
| 市场状态 | 笔数 | 胜率 | 均盈 |
|---|---|---|---|
| bull_osc | 441 | **54.4%** | +4.18% |
| bull_trend | 234 | 44.4% | +2.47% |
| neutral | 356 | 44.1% | +1.78% |
| bear | 370 | 37.8% | +0.48% |
### 1.2 核心结论
1. **v_weak 本质是"强势震荡市反弹策略"**bull_osc 胜率 60%/54%),不是"熊市抄底策略"bear 胜率仅 28%/38%
2. **近1年 bear 占一半时间(111/250 天)**——v_weak 一半时间信号质量差,整体胜率被拉低到 39.3%(vs 10y 53.6%
3. **当前市场 = bull_osc(强势震荡)**——正是 v_weak 最有效状态
4. **v_oversold 信号枯竭**:2026 仅 4 笔,结构性牛市下"值得抄底的超跌"消失
5. **失效预警实测**v_weak 近90日胜率 **22.7% → 红牌淘汰**(701笔,盈亏比 1.70 尚可但胜率崩溃)
### 1.3 根因总结
**近1年不佳 = 市场结构切换(bear 占一半 + bull_trend 结构性牛市)vs 弱市策略类型错配 + 单策略无保护**
- 不是策略逻辑坏了(bull_osc 胜率仍 60%
- 是**市场在 bear 状态时间太长**(111/250 天),弱市策略在这些日子失效
- 程飞的话验证:"**没有一种策略能在所有市场环境下通吃**"
---
## 二、解决方案(一次性落地)
### 2.1 市场测温机制(market_thermometer.py
**核心理念**(市场周期测温文/霍华德·马克斯):周期像钟摆无法预测,但可测温——不是预测拐点,是判断当前摆到哪。
**四态判定**(复用 market_indicators 已有字段,无拍脑袋):
| 状态 | 条件 | 策略 |
|---|---|---|
| **bull_trend** | above_ma20=1 + rsi>55 + adx>20 | 龙头/趋势策略 |
| **bull_osc** | above_ma20=1 + rsi>50 | 弱市均值回复(v_weak/v_oversold |
| **bear** | above_ma20=0 + rsi<45 | 弱市策略降权 |
| **neutral** | 其他 | 观望/轻仓 |
**落地**
- `market_thermometer.py`:回填 481 日 market_indicators + 四态判定 + 输出 market_state.json
- cron:每日 16:50 跑(盘后)
- 当前状态:**bull_osc(强势震荡)**rsi 58.7 / above_ma20=1 / dd60 -2.5
### 2.2 策略动态路由(strategy_router.py
**市场状态 → 策略权重**(程飞资金分配原则:不确定时等权,动态只在极端状态用):
| 状态 | v_weak | v_oversold | leader | 理由 |
|---|---|---|---|---|
| bear | **降权50%** | **降权50%** | 停用 | bear 胜率28%,信号质量差 |
| bull_osc | **正常1.0** | **正常1.0** | 停用 | bull_osc 胜率60%,最有效 |
| bull_trend | **降权50%** | **降权50%** | **启用1.0** | bull_trend 适用龙头 |
| neutral | 轻仓0.5 | 轻仓0.5 | 停用 | 观望 |
**落地**
- `strategy_router.py`:读 market_state.json → 输出 strategy_weights.json
- cron:每日 16:55 跑(测温后)
### 2.3 龙头识别策略(leader_scanner.py,新增武器)
**适用状态**bull_trend(牛市趋势)
**核心理念**(12维方法论 + 龙头识别低波动优化版):龙头股回调到 MA20 附近(趋势中的健康回调,不追高)
**12维条件**(复用 stock_indicators 已有字段,无拍脑袋):
1. 个股 close > MA20(趋势向上)→ dist_ma20 ∈ [-3%, +2%](回调到 MA20 附近)
2. RSI ∈ [45, 65](强势未超买)
3. 市值/流动性(mcap_q > 0.3,龙头非小盘)
4. 量能配合(vol_ratio > 0.8,非极度缩量)
5. 趋势共振(trend_aligned=1
6. 行业强势(待接入 sector 数据)
**落地**
- `leader_scanner.py`bull_trend 状态扫描龙头回调买点,输出 leader_signals.json
- 当前 bull_osc 状态不扫描(避免追高——测温决定策略)
**注意**:这是初版框架,需 MoFin 引擎验证达标(年化≥13.2%)才正式上线。当前标记为"待验证"。
### 2.4 失效预警机制(strategy_alert.py,三振出局)
**核心理念**(机器学习策略攻防体系文):
- 三振出局:黄牌(减半)→ 橙牌(1/4)→ 红牌(清仓淘汰)
- 不是 IC 掉到负就删,是降权到观察模式(权重设 0 保留,恢复可启用)
**MoFin 阈值**(基于滚动胜率/盈亏比):
| 级别 | 条件 | 动作 |
|---|---|---|
| 黄牌 | 滚动90日胜率 < 40% | 权重减半 |
| 橙牌 | 胜率 < 35% 或盈亏比 < 0.5 | 权重降1/4 |
| 红牌 | 胜率 < 30% | 权重0(淘汰观察) |
**落地**
- `strategy_alert.py`:监控 v_weak/v_oversold 滚动胜率/盈亏比,输出 strategy_alerts.json
- cron:每周五 17:00 跑
- **实测**v_weak 近90日胜率 22.7% → **红牌淘汰**(当前 bull_osc 状态仍可观察,恢复可启用)
---
## 三、落地清单(已完成)
| 模块 | 文件 | 功能 | cron | 状态 |
|---|---|---|---|---|
| 市场测温 | `market_thermometer.py` | 四态判定+历史回填 | 每日16:50 | ✅ 跑通 |
| 策略路由 | `strategy_router.py` | 状态→策略权重 | 每日16:55 | ✅ 跑通 |
| 龙头识别 | `leader_scanner.py` | bull_trend 龙头回调 | (手动/待验证) | ✅ 框架 |
| 失效预警 | `strategy_alert.py` | 三振出局 | 每周五17:00 | ✅ 跑通 |
| 分市场检验 | `analyze_market_state2.py` | v_weak/v_oversold 分态胜率 | (一次性) | ✅ 完成 |
---
## 四、下一步(待验证/优化)
1. **leader_scanner 回测验证**:用 MoFin 引擎跑 bull_trend 日的龙头回调信号,验证年化≥13.2%
2. **v_weak 恢复观察**:当前红牌(22.7%胜率),但市场已转 bull_osc——每周失效预警自动重评,胜率回升至 40%+ 自动恢复权重
3. **v_oversold 信号恢复**:结构性牛市下信号枯竭,待市场转 bear/neutral 时恢复
4. **sector 数据接入龙头扫描**:行业强势确认(sector_above_ma20/sector_ret20
---
## 五、关键原则(来自四篇文章)
1. **程飞(多策略组合)**:"单策略是茧,多策略是翅膀"——分散化本质是低相关性,不是数量
2. **程工(市场测温)**:"周期无法预测,但可测温"——不是预测拐点,是知道现在摆在哪
3. **因子挖掘框架**:"每个因子都有旱季雨季,没有任何因子能连续36个月保持正超额"——策略必须动态切换
4. **机器学习攻防**:"三振出局,不是IC掉到负就删"——降权观察,恢复可启用
5. **程飞(资金分配)**:"宁简勿繁,少动就是多赚"——动态配置只在极端状态用,其他时候等权
---
**结论**:近1年不佳不是策略坏了,是市场在 bear 状态时间太长(111/250 天)vs 弱市策略类型错配。解法 = 市场测温动态切换(bear 降权/bull_osc 正常/bull_trend 换龙头)+ 新增龙头策略(bull_trend 武器)+ 失效预警淘汰(三振出局)。
---
## 六、测温机制定稿:三态骨架 + 温度(rsi)连续维度(2026-08-13 数据验证后修正)
### 6.1 三态 vs 四态对比(老莫提问,数据决定)
**对比实验**:用 market_regime 回填 10 年(2016-2026,2319 条),按三态分组所有历史策略交易:
| 策略 | trend_up | choppy | trend_down | 适用温区 |
|---|---|---|---|---|
| v_weak | 46% | **55%** | 47% | **choppy** |
| v_oversold | 50% | 57% | **60%/+12.5%** | **trend_down** |
| v_next4 | **63%/+13.6%** | - | - | **trend_up** |
| v8.1 | **57%/+9.4%** | - | - | **trend_up** |
| s2_panic | - | - | **86%/+16.6%** | **trend_down×恐慌** |
| v_lurk_v3 | - | 77% | 71% | choppy/trend_down |
| v_lurk_bull | 33%/-4.7% | 35%/-4.0% | - | 全失效(负收益)|
**choppy 内部按 rsi 温度分组(决定性验证)**
| rsi 档 | v_weak 胜率 | 均盈 |
|---|---|---|
| 恐慌<45 | **71%** | +6.43% |
| 中性45-60 | 46% | +1.74% |
| 亢奋>60 | 37% | -0.16% |
### 6.2 结论:三态够用,温度是叠加的连续维度
1. **三态(trend_up/choppy/trend_down= 策略类型分类**(用哪类策略)——market_regime.py 已有,回填 10 年完成
2. **温度(rsi 分档)= 力度维度**(仓位乘数,连续量)——不并入状态分类(四态会把 rsi 硬切成 50/55 拍脑袋阈值,丢失连续性斜坡:恐慌71%→中性46%→亢奋37%)
3. **废弃 market_thermometer 四态**(避免重复基建,数据纪律:统一 market_regime 三态)
### 6.3 策略-适用温度表(数据驱动固化,STRATEGY_TEMP 基础数据)
| 策略 | 适用状态 | 温度档 | 数据依据 |
|---|---|---|---|
| v_weak | choppy | fear/neutral | 恐慌71% |
| v_oversold | trend_down | panic/fear | 64-86% |
| v_next4 | trend_up | greed/euphoria | 63% |
| v8.1 | trend_up | - | 57% |
| s2_panic | trend_down | panic | 86% |
| v_lurk_v3 | choppy/trend_down | fear/neutral | 71-77% |
**关键发现**:趋势市策略 v_next4/v8.1 已躺在历史列表(不需要新发明 leader_scanner),三态×已有策略 = 完整武器库。
### 6.4 落地文件
| 文件 | 功能 |
|---|---|
| market_regime.py | 三态判定(已有,回填10年) |
| temp_band.py | 温度分档 + 仓位乘数(panic/fear/neutral/greed/euphoria|
| strategy_router.py v2 | 三态选策略 + 温度乘数 → strategy_weights.json |
| strategy_alert.py | 三振出局失效预警 |
当前:choppy×neutral → v_weak/v_lurk_v3 weight=0.8v_next4/v8.1 观察。
---
## 七、温区平滑与周期记录(2026-08-13 老莫补充设计)
### 7.1 设计原则(老莫定)
1. **策略内部不放温区门控因子**v_next4 的 行业ADX>25 是反例,应去除)——让策略在所有温区都能发信号,才能测出全温区表现
2. **策略带"适用温区"属性**——记录温区测试结果,不是内部硬门控
3. **适用温区是动态的**——常态化测试,记录策略在不同温区随时间的变化
4. **系统监控温区变化、记录温区周期**——以温区周期为锚点,触发策略周期性评估
### 7.2 平滑手段(数据选参)
**问题**:日级 regime 切换太频繁(原始 457 周期/151个1天周期),无法直接作为评估锚点。
**方案**:滞回确认(hysteresis)——连续 K 天同温区才确认切换。
**数据选参**
| K(确认天数) | 周期数 | 平均长度 | 效果 |
|---|---|---|---|
| K=1(原始) | 457 | 5.1天 | 太碎,151个1天 |
| K=3 | 177 | 13.1天 | 无1天,仍偏碎 |
| **K=5** | **112** | **20.7天** | **甜区:无1天噪音,周期合理** |
| K=10 | 49 | 47.3天 | 过度平滑,choppy 只剩391天 |
**选 K=5**:滞后约5天(宁慢勿错),事后评估与实时判断统一口径。
### 7.3 实时 vs 事后
- **实时温区**:K=5 滞回确认(滞后5天,确认才切换策略权重)
- **温度(rsi)**:不滞后(连续量,实时反映恐慌/亢奋,用于仓位乘数)
- **事后评估**:用 K=5 平滑后的周期做策略-温区归因
**温区与温度互补**:温区滞后、温度实时。例:当前平滑温区=trend_down7/17起19天)但温度=neutralrsi 58)——阴跌状态,v_oversold/s2_panic 主导(weight 0.8),v_weak 观察(0.24)。
### 7.4 落地文件
| 文件 | 功能 |
|---|---|
| regime_tracker.py | 滞回平滑(K=5+ 周期记录 regime_cycles 表 + 输出平滑温区 |
| strategy_router.py v3 | 读平滑温区 + 温度 → strategy_weights.json |
**cron 顺序**(每日):16:50 market_regime → 16:52 regime_tracker(平滑)→ 16:55 strategy_router(路由)
---
## 八、温区自适应全链路(2026-08-13 完整落地)
### 8.1 核心架构(老莫定)
组合组织不变(固定的组合/策略),但**组合内策略根据当前温区自动激活/休眠**,选股/买卖/重评各环节按温区过滤。
### 8.2 策略-温区表现常态化记录(regime_perf.py
- 表 strategy_regime_perfstrategy × regime × 胜率/均盈/样本)
- **全策略动态纳入**(老莫提醒:不漏历史策略,特定温区可能能打)
- 发现被埋没的温区强者:
- **v_mr_seltrend_down 93%/+15.8%129笔)**——比 v_oversold60%)强得多
- **v7.3trend_up 94%/+9.2%**、v6.282%、v6.071%、v9.272%
- v_combotrend_up 60%(实盘主力)
### 8.3 策略去门控(老莫原则)
- **策略内部不放温区门控因子**——v_next4/v8.1 的 mkt_above_ma20/mkt_adx_min 是反例(只测了 trend_up 一个温区)
- **scanner 层的温区门控是执行层合理设计**mr_scanner 只在 trend_down/choppy 扫,v_next4 让位)——保留
- 策略全温区发信号 → 适用温区由实测动态决定(不是内部硬门控)
### 8.4 各环节接入
| 环节 | 文件 | 接入方式 |
|---|---|---|
| 选股 | mr_scanner / predictive_oversold_scanner | 温区判定升级为平滑温区(regime_gate),adx 仍读原始表(甜区门控)|
| 买卖 | price_monitor | 温区感知:非激活策略的买入/加仓机会抑制(不进摘要),**风控(卖出/止盈)仍推** |
| 重评 | strategy_lifecycle | market_regime 加载用平滑温区(regime_gate)→ timing_signal 合成反映温区 |
| 路由 | strategy_router v5 | 动态策略库:当前温区实测胜率高者激活(>=50%门槛剔除全负策略)|
| 前端 | research Tab | 温区横幅(平滑温区+温度档+rsi+激活策略)+ 成员卡温区徽章 |
### 8.5 验证结果
- **平滑温区 = trend_down**7/17 起 19 天),**原始 market_regime = choppy**8/11-8/12 两天)——平滑避免误判
- 激活策略(trend_down):s2_panic86%)、v_mr_sel93%)、v_oversold60%)、v_mr463%)、v_mr59%)、v_lurk_v377%
- 观察:v_weakchoppy 55%)、v_next4/v_combotrend_up
- price_monitor 非激活策略买入机会抑制、风控仍推
### 8.6 新增文件
| 文件 | 功能 |
|---|---|
| regime_gate.py | 温区门控共享工具(平滑温区 + 策略激活判断)|
| regime_perf.py | 策略-温区表现常态化记录(全策略动态)|
---
## 九、知微日志审查发现的问题(2026-08-13 小小莫遗漏)
> 老莫要求:从知微发来的沟通日志(XMPP)找问题,看我遗漏了什么。
### 已修复
1. **agents_health_check.py 停摆 22+ 小时**(最严重,持续告警):系统 crontab 里该任务被删(AgentsMeeting 监控,非 MoFin 违规 cron)。**已恢复 crontab***/5,备份 /tmp/crontab_backup_health_20260813.txt)。
- 副作用:它检测到的 xmpp_bot_xxm/article_processor 端口关闭(服务本就停用,非本次问题)
2. **deploy_guard 反复回滚我的改动**(工作方式错误):我改完没立即 git commitdeploy_guard 15分钟回滚未提交改动。**已改正**:走 git 工作流(本地改→commit→push→246 pull)。
3. **多个新脚本未跟踪告警**strategy_executor/regime_perf/market_thermometer/health_monitor_daily/daily_kline_collector/factor_engine/live_data_collector/step49_save):我 scp 到 246 没 git add 提交。已逐步补提交(strategy_executor/regime_perf 已提交)。
### 待确认(未修)
4. **LLM 端点故障反复**:最近60分钟多次调用失败(opencode.ai 端点不可用),影响重评/健康检查。
5. **price_monitor 重评管道异常**:1022分未更新(可能 LLM 故障或逻辑卡住)。
6. **服务停用确认**xmpp_bot_xxm/article_processor/wechat_fetcher 端口关闭——需确认是预期停用还是故障。
### 教训(记录 .memory/error_library
- **改 246 代码必须走 git 工作流**(本地改→commit→push→246 pull),deploy_guard 回滚未提交改动
- **新脚本必须 git add 提交**,否则 deploy_guard 告警"未跟踪文件"
- **处理系统 crontab 时别漏 AgentsMeeting 的监控任务**agents_health_check 不是 MoFin 违规 cron
---
## 十、信号溯源系统(2026-08-13 老莫要求)
**要求**:记录股票被推的原因(策略/版本/时间/温区),多策略同推完备记录并加关注。
**落地**
- signal_ledger.py:表 signal_ledgercode/name/strategy/version/regime/temp_band/pushed_at/reason/resonance_count/resonance_strategies/source_module
- 共振检测:同一股票 24h 内被多个激活策略推 → resonance_count>1,标记"🔥多策略共振"(加关注)
- stale_push_wlin 推送行带溯源标记:[策略][温区] + 共振标记(如 🛒 宁德时代(300750) ... [v_oversold][trend_down] 🔥多策略共振(2策略: v_mr_sel,v_oversold)
**用途**:日后评估"哪个策略在什么温区推了什么股票,效果如何";多策略共振的股票给予更多关注。