diff --git a/deploy/profile-scripts/promote_candidates.py b/deploy/profile-scripts/promote_candidates.py index f21d5fe5..9586cca9 100644 --- a/deploy/profile-scripts/promote_candidates.py +++ b/deploy/profile-scripts/promote_candidates.py @@ -120,8 +120,8 @@ def main(): processed += 1 continue # 超跌类策略豁免 RR 门槛(超跌反弹 RR 天然 <2,用策略自带参数即可,同 p_oversold 先例) - if _rr < 2.0 and cand_sector not in ("p_oversold", "b_td1_v3", "b_td1"): - print(f" ⏭ {code} {name} RR={_rr:.2f}<2.0,不入自选") + if _rr < 1.0 and cand_sector not in ("p_oversold", "b_td1_v3", "b_td1"): + print(f" ⏭ {code} {name} RR={_rr:.2f}<1.0(保底门槛),不入自选") processed += 1 continue # 用候选自带参数(不再重锚定) @@ -164,7 +164,7 @@ def main(): WHERE status='active' AND decision_type='自选策略' AND code != ? ORDER BY COALESCE(rr_ratio,0) ASC, updated_at ASC LIMIT 1""", (code,)).fetchone() - if weakest and (weakest[2] or 0) < 2.0: + if weakest and (weakest[2] or 0) < 1.0: conn.execute( "INSERT INTO watchlist_log (code, name, event, reason, old_signal, new_signal, price) " "VALUES (?,?,?,?,?,?,?)", diff --git a/deploy/profile-scripts/watchlist_auto_exit.py b/deploy/profile-scripts/watchlist_auto_exit.py index bf76e5d4..002ba564 100644 --- a/deploy/profile-scripts/watchlist_auto_exit.py +++ b/deploy/profile-scripts/watchlist_auto_exit.py @@ -77,8 +77,8 @@ def main(dry_run=False): _rr = conn.execute( "SELECT rr_ratio FROM holding_strategies WHERE code=? AND status='active'", (code,)).fetchone() - if _rr and _rr[0] is not None and 0 < _rr[0] < 2.0: - reasons.append(f"RR={_rr[0]}<2.0") + if _rr and _rr[0] is not None and 0 < _rr[0] < 1.0: + reasons.append(f"RR={_rr[0]}<1.0(保底)") except Exception: pass diff --git a/docs/RR分析结论.md b/docs/RR分析结论.md new file mode 100644 index 00000000..b788fb3b --- /dev/null +++ b/docs/RR分析结论.md @@ -0,0 +1,90 @@ +# RR(盈亏比)与最终结果关联分析结论 + +> 日期:2026-08-17 +> 背景:老莫要求回溯各高分策略选股时选入的 RR,探究 RR 与最终结果是否有关系,以决定 RR 阈值设定。 + +## 数据来源 + +- 数据库:`strategy_research.results_json.trades`(各策略严格按规则回测的逐笔交易) +- 样本:123,049 笔交易,15 个策略版本合并(v_mr/v_mr2/v_weak/v1.0/hk_pe_oversold/v2.0/hk_pe_mom/hk_mr2/v3.0/v_mr3/v_oversold/v7.1/v8.1/v_combo/v5.0) +- 每笔含 entry_price / exit_price / stop_loss / target / profit_pct / exit_reason / hold_days + +## 核心指标定义 + +- **计划 RR**(选股时):`(target - entry) / (entry - stop_loss)` —— 止盈/止损参数的比例 +- **实际 RR**(退出时):`(exit - entry) / (entry - stop_loss)` —— 退出结果的度量 + +## 分析结果 + +### 1. 计划 RR vs 最终结果(全局,123,049 笔) + +| RR区间 | n | 胜率 | 均收益% | 均持仓天 | +|--------|---|------|--------|---------| +| <1.5 | 28240 | 45.2% | 0.82 | 31.9 | +| 1.5~2.0 | 23268 | 40.2% | 1.74 | 55.5 | +| 2.0~2.5 | 60057 | 50.1% | 3.04 | 28.2 | +| 2.5~3.0 | 7533 | 40.6% | 1.82 | 62.3 | +| ≥3.0 | 3951 | 41.2% | 2.65 | 50.0 | + +**Pearson 相关系数 r ≈ 0.05** —— 计划 RR 与收益几乎无线性相关。 + +### 2. 分策略规律不一致(重要) + +| 策略 | 观察 | +|------|------| +| v_mr / v_weak | RR 全部集中 2.0~2.5(胜率 53.6%) | +| v1.0 | RR 越高收益越好(0.20→1.14%),≥3.0 回落 | +| v_mr2 | RR 高反而收益低(2.08→1.10%) | +| hk_pe_oversold | RR 越高收益越好(9.77→13.78%) | +| v8.1 / v_combo | RR<2.0 区间收益最好(11.43%/16.68%) | + +→ **RR 与结果的关联是策略特性相关,不是全局规律**。 + +### 3. 分年稳定性(v1.0)—— 不稳定 + +| 年份 | RR<1.5 收益 | RR2.0-2.5 收益 | +|------|------------|---------------| +| 2021 | +0.46% | +1.77% | +| 2022 | +0.37% | **-1.97%** | +| 2023 | -0.73% | -0.73% | +| 2024 | -0.93% | -0.36% | +| 2025 | +2.17% | +3.28% | +| 2026 | -0.04% | +0.58% | + +→ 2022 年 RR 高反而亏,年度间关系不稳定(市场环境主导)。 + +### 4. 计划 RR 与退出原因(v_mr) + +RR 2.0~2.5 时退出分布:time 39% / stop 34% / target 27% —— 多数是时间到期或止损,仅 27% 到达目标位。 + +### 5. 实际 RR(退出时)vs 结果 + +| 实际RR | n | 均收益% | +|--------|---|---------| +| <-0.5(深亏) | 8131 | -7.68 | +| -0.5~0 | 1933 | -1.88 | +| 0~0.5 | 2228 | +2.06 | +| 0.5~1.5 | 3144 | +7.29 | +| 1.5~2.5 | 6261 | +17.73 | + +→ 实际 RR 与收益强正相关,但它是**退出后的结果度量**,不是选股的前置指标。 + +## 结论 + +1. **RR 值本身与最终结果没有稳定的可预测关系**(r≈0.05,分策略相反,分年不稳定)。 +2. 计划 RR 只是**止盈/止损参数的比例**(tp/sl),反映策略的风险偏好设计,不是选股质量指标。 +3. **RR 2.0 作为统一淘汰阈值没有数据支撑** —— 它既不保证收益,也不代表质量。 +4. RR 的合理作用是**防止负期望交易**(如 RR<1 止损距离大于止盈),而非精选门槛。 +5. 真正的选股质量指标是**胜率/收益/回撤**(strategy_regime_perf 的 win_rate/avg_pnl),RR 是辅助风控。 + +## 决策落地(2026-08-17) + +- **RR 阈值从 2.0 调整为 1.0**(基本保底:只拦截止损距离 ≥ 止盈距离的负期望交易) +- promote 进自选:RR < 1.0 拦截 +- watchlist_auto_exit 每日淘汰:RR < 1.0 淘汰 +- 超跌类策略(p_oversold/b_td1_v3)继续豁免 RR 门槛 + +## 涉及文件 + +- `deploy/profile-scripts/promote_candidates.py`(promote 门槛) +- `deploy/profile-scripts/watchlist_auto_exit.py`(每日淘汰门槛)