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

253 lines
12 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(路由)