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

17 KiB
Raw Blame History

事项五解决方案:策略组合 + 市场测温 + 动态切换

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.pybull_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_down7/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 已提交)。

待确认(未修)

  1. LLM 端点故障反复:最近60分钟多次调用失败(opencode.ai 端点不可用),影响重评/健康检查。
  2. price_monitor 重评管道异常:1022分未更新(可能 LLM 故障或逻辑卡住)。
  3. 服务停用确认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)

用途:日后评估"哪个策略在什么温区推了什么股票,效果如何";多策略共振的股票给予更多关注。