Files
MoFin/docs/v_mr_strategy.md
T
hmo b676d85c41 feat: v_mr 均值回复策略 v2——10y全市场验证通过(21690笔/53.6%WR/avg+3.34%)
- 独立均值回复引擎: MA60下>10%+RSI≤42+60日跌>15%+小盘≤1500万+RSI止跌≥2
- 出场: 止盈+18%/止损-8%/25天, 移除MA20反弹截断(v1毒药)
- backtest_framework: prepare_bars 补 amount 字段(千元)
- 大盘上下文: sh000001 2016-2020 数据从 sector_index_daily 回填 stock_daily
- 验证: sideways(ADX)过滤有害(206.6%→147.9%), mkt_mode=any 最优
- docs/v_mr_strategy.md 完整策略文档
2026-08-02 15:02:10 +08:00

113 lines
7.2 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.
# v_mr 策略文档:小盘深超跌均值回复
> 创建:2026-08-02 引擎版本:v2(合并自 mr_engine_v2.py 状态:✅ 已通过 10y 全市场验证
## 1. 策略一句话
**买入"跌过头的小盘股",等它反弹回均值**。与 v_next4(追趋势)互补,专攻震荡市/熊市里被错杀的超跌股。
## 2. 背景与动机(为什么建这个策略)
- 翻倍股分析发现:**77% 的翻倍股诞生于震荡/中性市**,只有 23% 诞生于趋势市。
- 趋势引擎(v7.1 评分体系)天然只在趋势市出手,**震荡市是它的盲区**。
- 尝试把趋势引擎改成均值回复(test_vmr/scan_vmr 系列)**全部失败**——评分体系是趋势导向的(追动量、追突破),改 filters 是硬套,方向就错了。
- 结论:均值回复必须**独立建一套入场逻辑**,不走 score/momentum 评分体系。
## 3. 入场逻辑(v2 最终版)
| 因子 | 参数 | 含义 | 来源 |
|------|------|------|------|
| `bias60` | ≤ -10%(单边,无下限) | 价格比 MA60 低超过 10% = 深超跌 | 翻倍股起点 bias60≤-15.75%,取 -10 捕获"超跌未崩"区间 |
| `rsi_max` | ≤ 42 | RSI 超卖 | 翻倍股起点 RSI≤44.8 |
| `prev_ret60` | ≤ -15%(单边,无下限) | 60 日跌幅超 15% | 翻倍股起点 prev_ret60≤-10% |
| `mom20_max` | ≤ 5% | 20 日动量低(不追已反弹的) | 均值回复前提:还在低位 |
| `amount_max` | ≤ 15(百万元) | 20 日均成交额 ≤ 1500 万元 = 小盘 | 翻倍股成交额极小;大票超跌≠错杀 |
| `rsi_delta_min` | ≥ 2 | RSI 5 日回升 ≥ 2 = 止跌确认 | 离线重放发现:不加止跌确认 avg 2.41% → 加后 3.01% |
| `mkt_mode` | `any` | 不限大盘 | **10y 验证:sideways 过滤有害**(见 §7 |
**次日开盘价入场**(信号日收盘确认,次日 open 成交)。
## 4. 出场逻辑(v2 最终版)
| 出场 | 参数 | 说明 |
|------|------|------|
| `target`(止盈) | +18% | 让利润跑向目标,不截断 |
| `stop`(止损) | -8% | 固定止损 |
| `time`(时间) | 25 个交易日 | 超时按收盘价平仓 |
**关键修复(v1 → v2**v1 有 "反弹到 MA20 止盈" 出场(`ma20_revert`)。实测这是**毒药**
- 超跌票 MA20 就在头顶 2-3%,反弹到 MA20 只赚 2-3% 就卖
- 而止损是 -8%,盈亏比严重倒挂
- v2 删除 MA20 出场后,avg 由负转正(200 笔测试中 136 笔走 ma20_revert 的 avg +3.29% 看着还行,但大量本该到 +18% 的票被 2-3% 截断了)
## 5. 参数是怎么定出来的(完整推导链)
1. **翻倍股共性因子**(分析 10 年翻倍股):起点集中在 小盘 + MA60 下方深跌 + 近期跌 + RSI 偏低 + 低动量。
2. **v1 松版基线**strategy_lab.py 首版):923,603 笔 / wr 61.4% / avg **-0.1%** —— 入场太松 + MA20 出场倒挂,白忙活。
3. **离线重放定参**replay_mr 系列,用 92 万入场点重放不同出场规则,秒级测参):
- 第 1 轮:确认 MA20 出场全负,去掉后 avg 转正;入场收紧显效。
- 第 2 轮:最紧入场(bias≤-10/amount≤15/prev≤-15/rsi≤42)→ 13,637 笔 avg 2.41%。
- 第 3 轮:`rsi_delta≥2`(止跌确认)→ avg 3.01% / wr 53.6%`rsi_delta≥3` → 3.15%。
- 第 4 轮:`tp18/sl8/25d` → 9,082 笔 / avg 3.16% / wr 54.8%。年度分布健康(2018 熊市 4098 笔 +4.19%)。
4. **真实 10y 全市场验证**mr_engine_v2.py):见 §6avg 3.34% vs 离线预测 3.16%**对齐良好**。
## 6. 验证结果(10y2016-07-01 ~ 2026-07-24A 股全市场)
| 指标 | 数值 |
|------|------|
| 交易笔数 | 21,690 |
| 胜率 | 53.6% |
| 平均收益/笔 | +3.34% |
| 平均盈利 | +11.9% |
| 平均亏损 | -6.56% |
| 平均持仓 | 16.9 天 |
| 组合 10y(等权 5 仓) | +332.1%(年化 15.6%,回撤 45.4% |
| 组合 10y(满仓模拟) | +208.8%(年化 11.8%,回撤 26.0% |
| 覆盖月份 | 107 个月,universality 76.0 |
| 出场分布 | target 5,851+18%)、stop 7,374-8%)、time 8,465+3.09% |
**年度分布(组合口径)**2018 熊市大量出手(10,163 笔);2019 +49%2025 +25%2026 当前 -12.6%(见 §7)。
## 7. 踩过的坑(重要教训)
1. **MA20 反弹止盈是毒药** —— 均值回复的票反弹空间只有 2-3% 到 MA20,必须让利润跑向 +18%。
2. **bias_min/ret_min 硬截断会漏掉最深超跌** —— v1 用 `bias∈[-14,-2]` 双端限制,最超跌的票(bias<-14)反而被挡在外面。v2 改单边(只设上界不设下界)。
3. **sideways 过滤(ADX<25 才出手)有害** —— 10y 全市场验证:过滤后收益 206.6% → **147.9%**。趋势市里买超跌反弹力度更大,强制过滤掉的是赚钱交易。
4. **MA20 方向过滤无一致规律** —— 2018 熊市大盘 MA20 下抄底反而赚钱(wr 63%),2026 年上下都亏。不能用于过滤。
5. **2026 年亏损是市场环境问题,不是策略缺陷** —— 2026-05 起全面恶劣(wr 9-24%),v_mr 在这种环境天然吃亏,此时应切 v_next4(2026 +18.9%)。这正是组合互补的意义。
6. **大盘上下文数据曾缺失** —— sh000001 在 stock_daily 只有 2021-07 起,2016-2020 数据在 sector_index_daily。已回填(2026-08-02),mkt_adx 覆盖从 23% → 90%。
## 8. 与 v_next4 的分工(组合互补性验证结论)
| 维度 | v_next4(趋势) | v_mr(均值回复) |
|------|----------------|-----------------|
| 出手时机 | **100% 大盘 MA20 上方**(强趋势市) | 83% 在大盘 MA20 下方/震荡市 |
| 典型年份 | 2025 +29.8%、2022 +16.2% | 2019 +49%、2021 +23.7% |
| 2018 熊市 | 0 笔(完全不出手) | 10,163 笔(主战场) |
| 2026 趋势市 | +18.9%(主力) | -12.6%(回避) |
| 股票池 | 58 只(大市值趋势票) | 1,753 只(小盘超跌票) |
| 信号重叠 | 21 个重叠日/10 年(竞争极少) | —— |
**合并价值**v_mr 单独 10y +206.6%,叠加 v_next4 覆盖牛市暴利段后 +302.1%cagr 14.8%dd 26.2%)。两策略按市场周期轮动,互不抢信号。
## 9. 代码位置
- **引擎(合并后)**`strategy_lab.py``run_mr_backtest()`v2 版本,含 skip_stats 统计)
- **注册**`strategy_lab.py``register_mr_strategy()`(B 类策略,不进 v7.1 评分体系)
- **独立副本(历史)**`mr_engine_v2.py`v2 修复版,已合并,保留作参考)
- **数据**`data/mofin.db``strategy_research` 表(version='v_mr',最新一条 = v2 10y 21690 笔)
- **离线重放脚本**`/tmp/replay_mr*.py`(历史调参用)
## 10. 运行方式
```python
import strategy_lab as lab
lab.register_mr_strategy('v_mr', 'v_mr: 小盘深超跌均值回复', summary, hypothesis,
{'bias_max': -10, 'rsi_max': 42, 'ret_max': -15, 'mom20_max': 5,
'amount_max': 15, 'rsi_delta_min': 2, 'mkt_mode': 'any'},
{'tp_pct': 0.18, 'sl_pct': 0.08, 'max_hold_days': 25}, slots=5)
r = lab.run_mr_backtest('v_mr', '2016-07-01', '2026-07-24', 913000, save=True, universe='a', period_tag='10y')
```
> ⚠️ 注册须在跑测前调用(v_mr 不进 STRATEGIES 持久化注册表)。universe='a' = A 股;'all' 含港股(港股 HSI 上下文另算)。