21690笔回测→正面因子(4)+负面因子(4)合并: 144笔/avg+12.73%/wr88.9%/pf2.67, 去2018仍+10.76%/83.8%非过拟合 年均14笔=每月1笔适合手工; 待落地: 扫描器规则替换+出场调优
10 KiB
10 KiB
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. 参数是怎么定出来的(完整推导链)
- 翻倍股共性因子(分析 10 年翻倍股):起点集中在 小盘 + MA60 下方深跌 + 近期跌 + RSI 偏低 + 低动量。
- v1 松版基线(strategy_lab.py 首版):923,603 笔 / wr 61.4% / avg -0.1% —— 入场太松 + MA20 出场倒挂,白忙活。
- 离线重放定参(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%)。
- 真实 10y 全市场验证(mr_engine_v2.py):见 §6,avg 3.34% vs 离线预测 3.16%,对齐良好。
6. 验证结果(10y:2016-07-01 ~ 2026-07-24,A 股全市场)
| 指标 | 数值 |
|---|---|
| 交易笔数 | 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. 踩过的坑(重要教训)
- MA20 反弹止盈是毒药 —— 均值回复的票反弹空间只有 2-3% 到 MA20,必须让利润跑向 +18%。
- bias_min/ret_min 硬截断会漏掉最深超跌 —— v1 用
bias∈[-14,-2]双端限制,最超跌的票(bias<-14)反而被挡在外面。v2 改单边(只设上界不设下界)。 - sideways 过滤(ADX<25 才出手)有害 —— 10y 全市场验证:过滤后收益 206.6% → 147.9%。趋势市里买超跌反弹力度更大,强制过滤掉的是赚钱交易。
- MA20 方向过滤无一致规律 —— 2018 熊市大盘 MA20 下抄底反而赚钱(wr 63%),2026 年上下都亏。不能用于过滤。
- 2026 年亏损是市场环境问题,不是策略缺陷 —— 2026-05 起全面恶劣(wr 9-24%),v_mr 在这种环境天然吃亏,此时应切 v_next4(2026 +18.9%)。这正是组合互补的意义。
- 大盘上下文数据曾缺失 —— 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. 运行方式
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 上下文另算)。
11. 六步方法论精选调优(2026-08-02 深夜,v_mr 精选版)
背景:实盘扫描器原用"bias60 最超跌取前10"排序——违反六步方法论、无验证、实测证伪(corr(bias60,profit)=0.028≈0,最深档 bias<-23.7% 反而最差 avg+1.41%/wr42.8%)。按六步方法论从 21690 笔回测中重新推导。
第1步:挑显著收益票
- v_mr 基线 21690 笔,收益分层 p50=+1.5% / p75=+18.0% / max=+18.0% / min=-8.0%
- 显著盈利组 = profit ≥ +18%(即 target 止盈档,5851 笔)
第2步:共同因子(显著盈利组 vs 亏损组)
| 因子 | 显著盈利均值 | 亏损均值 | 结论 |
|---|---|---|---|
| mom20 | -14.17 | -12.14 | 盈利组20日动量更负(加速下跌尾声) |
| rsi_delta | 8.86 | 7.21 | 盈利组RSI回升更强(止跌确认) |
| dist_ma20 | -5.59 | -4.56 | 盈利组离MA20更远(反弹空间大) |
| atr_pct | 4.16 | 3.62 | 盈利组波动更大(弹性足) |
| mkt_adx | 32.88 | 34.68 | 亏损组在大盘强趋势时抄底危险 |
| bias60/rsi/prev_ret60 | ≈无差异 | 深超跌≠更好 |
第3步:正面因子组合全市场重筛
| 组合 | 笔数 | avg | 胜率 | 盈亏比 | 覆盖 |
|---|---|---|---|---|---|
| 基线 v_mr | 21690 | +3.34% | 53.6% | 1.81 | 107月 |
| mom20+rsi_delta 双因子 | 2005 | +8.11% | 71.4% | 2.10 | 68月 |
| 三因子(+dist_ma20) | 620 | +9.04% | 75.6% | 2.25 | 40月 |
| 四因子(+atr_pct) | 242 | +10.56% | 79.8% | 2.34 | 26月 |
第4步:负面因子(四因子组内亏损 vs 盈利)
| 负面因子 | 亏损组 | 盈利组 | 含义 |
|---|---|---|---|
| mkt_adx | 40.15 | 29.43 | 大盘ADX≥35 强跌市抄底危险 |
| obv_delta | -977k | +25k | 资金流出(OBV<0)必死 |
| bias60 | -19.75 | -17.67 | bias<-22 过深易续跌 |
| prev_ret60 | -29.57 | -26.26 | 60日跌超32%易续跌 |
| amount_ma20 | 8.90 | 10.43 | 太缩量流动性差 |
第5步:正负因子合并
| 版本 | 笔数 | avg | 胜率 | 盈亏比 | 亏损 | 覆盖 |
|---|---|---|---|---|---|---|
| 四正面因子 | 242 | +10.56% | 79.8% | 2.34 | 49 | 26月 |
| 全负面合并 | 144 | +12.73% | 88.9% | 2.67 | 16 | 13月 |
第6步:稳健性验证(非过拟合)
| 检查 | 笔数 | avg | 胜率 |
|---|---|---|---|
| 全样本 | 144 | +12.73% | 88.9% |
| 去掉2018全年 | 37 | +10.76% | 83.8% |
| 去掉2018-10极端月 | 60 | +9.27% | 78.3% |
- 年度分布:2018年107笔(74%,2018-10单月84笔)、2022年24笔(+13.86%/100%独立验证)、其余37笔
- 2022 年独立复现高收益 → 不是单一事件过拟合
- 组合模拟(3槽,扣费):10年 +94.0% / 年化 8.4% / 回撤 8.1% / 执行 27 笔
精选版策略画像
- 10年 144 笔 = 年均 14 笔 = 每月约 1 笔,完全适合手工操作
- 单笔毛利 +12.73%、胜率 88.9%、盈亏比 2.67
- 出场沿用 tp18%/sl8%/25天(后续调优中)
待落地
- 实盘扫描器排序规则:bias60最超跌取10 → 精选因子组合筛选
- ST 股不排除(仓位控制即可,老莫 2026-08-02 指示)
- 出场参数调优(tp/sl/max_hold 对精选组重新扫描)