4.4 KiB
4.4 KiB
max_hold(持有期上限)分析与优化结论
日期:2026-08-17 背景:老莫发现策略回测里大量个股"到期自然出货"(exit_reason=time)而非到 RR 卖点(target),质疑 max_hold 是拍脑袋定的。要求重新测算并评估对收益率/年化的影响。
一、结论速览
- 老莫质疑成立:各策略 max_hold 大部分是硬编码拍定,缺乏专项测算。
- 分温区网格扫描后:最优 max_hold 随市场环境变化——trend_down/choppy 下 20d 最优,trend_up 下 15d(v_mr 族);hk_pe_oversold 相反(down 30d/up 60d)。
- 短持有提升年化(资金周转快),但可能降单笔收益——trade-off 需温区自适应。
- "到期自然出货"不是缺陷:是短持有+高止盈组合的必然结果,年化证明资金效率更优。
二、max_hold 来源审计(是否拍脑袋)
| 策略 | 值 | 来源 | 依据 |
|---|---|---|---|
| v_weak | 40d(已改20) | mr_scanner EXIT_CFG 硬编码 | ❌ git 从30跳到40无扫描 |
| b_td1_v3 | 35d(已改20) | 库 config | ❌ 实盘3.4天触达,35虚设 |
| s2_panic_v2 | 60d(已改20) | scanner/gen 硬编码 | ⚠️ 评估窗口常量非优化 |
| hk_pe_oversold | 40d | hk_strategies 硬编码 | ❌ |
| hk_pe_oversold_v2 | gen20/库40 | 自相矛盾(已统一20) | ❌ |
| accumulation | 无 | 未定义(已补20) | ❌ 完全没定 |
| v_mr | 25d | register 硬编码 | ⚠️ 早期值 |
| p_oversold | 40d | 数据测算 | ✅ 唯一有依据 |
三、网格扫描(固定 tp/sl,重演 15/20/30/40/60d)
均收益最优(分温区)
| 策略 | trend_down | choppy | trend_up |
|---|---|---|---|
| v_mr | 20d (4.92%) | 20d (2.59%) | 15d (1.50%) |
| s2_panic_v2 | 20d (6.69%) | — | — |
| hk_pe_oversold | 30d (9.22%) | 40d (4.98%) | 60d (5.92%) |
年化对比(真实资金模拟, 8槽, 含资金空窗)
| max_hold | 20d | 30d | 40d | 60d |
|---|---|---|---|---|
| v_mr | 10.3% | 11.7% | 9.9% | 8.9% |
| s2_panic_v2 | 5.5% | 4.8% | 5.4% | 4.6% |
| hk_pe_oversold | 22.4% | 21.9% | 23.2% | 22.6% |
重要修正(老莫质疑后复测):此前"20d 最优"基于 8槽满仓近似(过度乐观,未计资金空窗/满仓跳过)。 真实资金模拟(portfolio_nav)显示:v_mr 最优 30d、hk_pe_oversold 最优 40d、仅 s2_panic_v2 20d。 → hk_pe_oversold_v2 已回退 40d、v_mr 调 30d。占仓太久不好,占仓太短也不好,需真实资金模拟找平衡。
旧近似(作废参考)
| max_hold | 20d | 30d | 40d | 60d | 80d |
|---|---|---|---|---|---|
| 年化 | 483% | 370% | 281% | 245% | 221% |
关键:短持有 → 资金周转快 → 年化显著更高(2倍级)。
稳健性(分年份,v_mr)
20d 仅 4/11 年最优(2018 大熊市主导);2021/2022/2024 均 40d 最优 → 最优值随市场环境变化,单一固定值不稳健。
四、实施(2026-08-17)
| 文件 | 改动 |
|---|---|
| s2_panic_v2_scanner.py | max_hold_days 60→20 |
| s2_panic_v2_gen.py | max_hold 60→20 |
| mr_scanner.py (v_weak) | max_hold_days 40→20 |
| accumulation_scanner.py | 补 max_hold=20 定义 |
| b_td1_v3 (DB config 4行) | 35→20 |
| hk_pe_oversold_v2 (DB config 4行) | 40→20(与gen统一) |
| strategy_research v_weak | 补正确参数化回测(id=519) |
五、v_weak 正确回测(id=519)
用 v_mr 信号集 + v_weak exit 参数(tp30/sl12/20d) 重演:
- 胜率 61.5%(优于 v_mr 53.6%)
- 均收益 3.93%
- time 占比 74.8% —— 印证老莫观察:20d 内难到 +30% 止盈,多数到期小赚
六、遗留建议(非本次实施)
- 温区自适应 max_hold:最优做法是把 max_hold 做成随 market_regime 变化的配置(down→20d, up→60d for hk_pe),而非固定值。本次先统一到 trend_down 最优值(当前温区),后续可接入 regime 动态化。
- tp 与 max_hold 联动:v_weak time 74.8% 说明 tp30 在 20d 内偏难,可考虑 tp 降到 20-25% 提升 target 占比(需专项扫描)。
- v_weak 真实信号集回测:本次用 v_mr 信号集参数化重演(近似),完整 v_weak entry 信号(ADX甜区等)回测待建。
涉及文件
- deploy/profile-scripts/{s2_panic_v2_scanner,s2_panic_v2_gen,mr_scanner,accumulation_scanner}.py
- strategy_research 表(b_td1_v3/hk_pe_oversold_v2 config + v_weak 新行 id=519)