A股量化策略研究报告 — ML预测 + 移动止损15% + 20日再平衡(r20+t15)

中证800 · ML预测选股 · 个股移动止损 · 20日满仓再平衡 · +634.9% / 夏普 1.482(2019-12 ~ 2026-09)

一、核心结果Overview

在 ML预测(ML Top-30 + 排名缓冲60,季度调仓等权)之上叠加两条"怎么持有"的规则:个股 15% 移动止损 + 每 20 个交易日把幸存持仓连止损现金一起重新等权(现金回补)。选股层完全不变。

一句话定位:t15 截断崩塌个股,r20 让止损卖飞的钱 20 日内回去干活。全窗 +634.9%(较 ML预测 多 +78pp、较纯 r20 多 +38pp),回撤 −30.6% → −22.5%,2022 由 −9.2% 转正为 +10.1%;代价:2026 −12.3% ≈ ML预测(−13.8%),9 月止损生效但全年净改善仅约 1.5pp(月度明细见第二节热力图)。

二、收益曲线Equity Curves

五条净值曲线同一起点归一化。悬停查看逐日数值,点击图例切换系列。

净值增长(初始 = 1.00,线性/对数可切换)

r20+t15(本策略) · ML预测 · 纯t15 · 纯r20 · 基准中证800

回撤(自历史高点)

本策略最深约 −22.5%,同期 ML预测 约 −30.6%——止损+再平衡把深回撤切浅,是本策略相对 ML预测 的主要风险改善

三、策略原理与具体操作Methodology

策略分三层:选股层(ML预测,季度一次,不变)→ 防御层(t15 移动止损,每日盯盘)→ 仓位层(r20 再平衡,每 20 个交易日)。alpha 载体仍是选股,两层新增规则只改变持有方式。

三层结构

LAYER 1 · 每季度
ML预测 选股
ML 截面预测 top-30 入场 + 全市场排名 ≤60 缓冲留任,30 只等权建仓(与 ML预测 报告完全一致,本策略不改这一层)
→
LAYER 2 · 每日
t15 移动止损
每只票跟踪持有期最高收盘价;某日收盘 < 峰值 × 0.85 → 次日开盘卖出该票、变现金
→
LAYER 3 · 每20交易日
r20 满仓回补
把幸存持仓 + 止损攒下的现金一起重新等权——仓位重新打满(每只 1/幸存数),趋势年不损失复利
→
每季度
换书重来
下个信号日按 ML 排名 + 缓冲60 整书换仓,峰值/现金状态清零,重新开始

t15 移动止损的判定(峰值回撤,不是亏损幅度)

要素口径
峰值 peak入场后至今的最高收盘价(只升不降;被止损的票不再更新)
触发条件收盘价 < peak × 0.85 —— 即从持有期高点回撤 15%,与成本无关
执行触发次日开盘价卖出(收盘判定、次日执行,无偷价)
停止跟踪卖出后该票本季度不再买回(现金等待 LAYER 3 或季度换书)

与"固定止损"的区别:固定止损锚定入场价(亏 15% 才割);移动止损的锚跟着峰值抬升——票涨得越高止损线越高,先涨 30% 再回落的票会在 +10.5% 处离场,锁定大部分浮盈。2026 实测固定止损 s15 恶化到 −12.5%(割在反弹前),移动止损反而改善——前者锚不动,深跌后总割在底部区域。

止损线 = 峰值×0.85 峰值(跟踪新高) 触发→次日开盘卖 季度内时间 → 价格

一个季度的完整走法(示意)

T+0
季度信号日
30 只等权建仓,每只 1/30 ≈ 3.3%;每只票的峰值初始化为入场日收盘
→
T+37
3 只触发止损
从峰值回撤超 15%,次日开盘卖出 → 9.9% 仓位变现金;剩余 27 只各自浮动
→
T+40
20日再平衡
27 只 + 现金一起重新等权 → 每只 1/27 ≈ 3.7%,满仓回补
→
T+80
再次再平衡
期间又有票止损 → 剩余持仓再等权;盈利票的浮盈也被削回等权(再平衡溢价)
→
季末
换书
按新信号 ML 排名+缓冲60 换仓,全部峰值/止损状态清零

"现金回补" vs "保现金"——本策略的关键取舍

现金回补(本策略采用)

止损现金在下一个 20 日节点摊回幸存者,仓位恒满。趋势年(2024)止损卖飞的现金继续吃复利:同参数下 t12 组合现金回补 2024 +77.2% vs 保现金 +15.0%。

代价:震荡下跌年里"低位回补→再止损"的循环把回撤逐笔变现,2026 反而比不止损略差。

保现金(对照,未采用)

止损现金闲置到季度末。亏损年防御更好(现金天然抗跌),但趋势年损失全部复利——纯 t 族(无 r20)就是这个行为,全窗收益显著更低。

实测同帧:r20+t12 保现金 +232.8% vs 现金回补 +783.2%,差 550pp 全在趋势年。

为什么组合比单用强(机制互补)

规则单独用的问题组合后由谁补上
纯 t15(只止损)止损现金闲置到季度末——趋势年损失复利,2024 仅 +11.0%、2025 +58.0%止损日即回补 + 20 日节拍:组合 2024 +40.0%、2025 +75.8%
纯 r20(只再平衡)没有个股防御,崩塌票全程扛:2022 −10.4%、最大回撤 −31%t15 截断崩塌票:组合 2022 +10.1%(全实验最好)、最大回撤 −22.5%

四、逐次调仓记录Rebalance Explorer

五、全部成交明细Trade Blotter

六、对照实验Leaderboards

全部 lane 同帧同语义配对(信号行 + 事件日行 + 20日行;无逐日重发)。跨表绝对数可比。

T1 · 组合格子与组件对照

命名:r20+tXX-r = 20日再平衡 + XX%移动止损 + 现金回补;-p = 保现金;t15r0 = 只在止损日立即回补(无 20 日节拍)。分解阅读:t15r0(+602.8%)已拿到组合(+634.9%)的大部分——主要杠杆是"止损现金回不回补",20 日节拍再贡献约 +32pp(与纯 r20 的 +39.9pp 基本可加)。另注意旧口径(止损后每日重发整书)会美化纯 t 族防御并抬高费用,本表为统一事件日语义,纯 t 族数字低于早期实验记录属预期。

T2 · 移动止损宽度曲线(纯 t 族,保现金)

总收益随宽度先升后降(峰值 t20 +374.2%,t25 掉头);2026 随宽度单调恶化(t10 −11.7% → t25 −19.2%);最大回撤同步变深(t10 −22.5% → t25 −32.8%)。过宽的移动止损 = 全程吃回撤、卖在反弹前的地板上。样本内六档网格,相邻档位差异(如 t12 vs t15 的 2026)属噪声量级,不宜精读。

T3 · 总收益 ↔ 2026 防御的权衡边界

2026 是 ML 信号负 alpha 年:全网格 2026 最好也只有 −11.4%(纯 t15,vs ML预测 −13.8%)——防御的上限约 2pp,且要付出总收益或回撤的代价。r20 是被低估的 2026 选项:−12.1% 与最好的止损 lane 差距不足 1pp,总收益却保住 +596.6%,只是回撤和 2022 无改善。四档互不支配,是风险偏好 dial。

T4 · 已否决的相邻方向(实验依据)

方向实验结论
有盈利就不止损(t15ps)trailing 15% 但浮盈票跳过触发:+253.7%/夏普 1.416/2022 −7.0%/2026 −9.7%(旧口径+08-27 帧,同口径纯 t15 对照 +342.8%)全面差于 t15——86% 触发点在浮盈票上,"卖浮盈票"恰是防御来源;等跌破成本再止损失去意义
固定止损 s15/s20锚定入场价亏 15%/20% 即卖:2026 恶化到 −12.5%锚不动,深跌后割在反弹前,拒绝
回撤油门 dd12/dd20组合近峰值回撤破阈值全书减半仓V 型反转减仓在地板、恢复在半山腰,2026 −15.9%,拒绝
RL 名单 / DRL 配权RL 书 2026 全面劣于 ML预测(三相位 −14.9~−17.6% vs −14.0%),与 ML预测 书重合 61%(算法原理见第七节)同一 ML 池子负 alpha,换汤不换药;训练抽签 ±100pp 不可采

七、附:DRL 三算法速览A2C / PPO / DDPG

先看全景:权重中心架构(S→A→T→R 链)

整套系统的核心是一个以权重为中心的架构——目标组合权重向量是策略逻辑与下游执行之间的唯一接口契约:

wt = Rt( Tt( At( St( X≤t ) ) ) )

其中 S 为选股、A 为组合配权、T 为择时调整、R 为组合层风险叠加。每一步变换都保持契约——输入输出都是权重向量,因此任何模块都可以单独替换(例如把等权配权换成 DRL 配权器)而不动管线其余部分;同一张权重表在回测与实盘里以完全相同的方式流转执行。

阶段职能本报告 / 本仓库里的实例
S 选股决定持有哪些票(入场/留任名单)ML预测:ML top-30 入场 + 全市场排名 ≤60 缓冲留任(第一层,全部 lane 共用)
A 配权决定名单内每只票占多少权重等权 1/30(本报告全部 lane);把 A 换成 DRL 配权器 = 本节讲的三算法 lane("等权 → DRL"就是换这一层)
T 择时整体仓位的时点加减MA 择时 / defer 信号冻结 / 回撤油门 dd(均已实测否决,见 T4 与 2026 报告)
R 风险叠加组合层风险规则,仓位内再调整t15 移动止损 + r20 满仓再平衡——本报告新增的两条规则全部住在 R 层

这也是本报告实验方法的地基:13 条 lane 全部只改权重帧(换 S 的书、换 A 的权重、加 R 的规则行),回测引擎 run_cn_weight_backtest 语义一行不动——所以跨 lane 才能同帧同口径严格配对。而"T4 否决 RL lane"翻译成架构语言就是:把 A 层从等权换成 DRL,在当前数据规模下不产生超额——问题出在喂给 S 的信号池,不在 A 层用哪种算法。

共同框架:把交易变成"试错游戏"

三个算法共享同一套建模(env_portfolio.py 的 StockPortfolioEnv),差别只在"怎么用经验更新网络":

STATE · 状态 s
今天长什么样
每只票的技术指标 + 持仓状态 + 协方差结构前 10 个特征,约 260 维向量(agent.py 注释口径)
→
POLICY · 策略 π(a|s)
网络出动作
对每只票输出一个 [0,1] 分数,softmax 归一成组合权重;现金模式下多一个 CASH"票"(2026-10 加的显式现金资产)
→
REWARD · 奖励 r
赚了还是亏了
次日按权重结算,组合价值变化 ×1e-4 即奖励(扣 0.1% 交易成本,初始 100 万)
→
UPDATE · 更新
朝多拿奖励改
滚动窗口训练 + 验证段选优(train_and_select);三个算法的全部差别在这一步,见下

A2C · Advantage Actor-Critic

演员-评论家双网络,on-policy:Actor 输出动作,Critic 给当前状态估值 V(s);优势 = 实际回报 − 估值,衡量"这一步比该状态下的平均水平好多少",用它(而非原始回报)更新 Actor,削掉大部分方差。每 5 步就用最新轨迹更新一次:结构最简单、收敛快,但旧经验用完即弃,样本效率低、对学习率敏感。本仓库:n_steps=5、lr 2e-4、5 万步。

PPO · Proximal Policy Optimization

on-policy 策略梯度,当今工业 RL 的默认首选。核心是裁剪目标(clipped objective):新旧策略的输出比值被 clip 在一个窄带内,一次更新不许把策略改得太猛——相当于给梯度下降上了安全带,所以对超参宽容、训练稳。代价:每 2048 步才更新一次,同样不能重放旧数据。本仓库:n_steps=2048、batch 128、8 万步。

DDPG · Deep Deterministic Policy Gradient

三者中唯一 off-policy:确定性 Actor 直接输出连续权重(仓位配权天然连续,最贴合),Critic 学 Q(s,a);10 万条经验回放池反复重放旧数据 + 目标网络慢速跟随 → 样本效率最高。但出名地脆:Q 值高估会把策略带沟里,对随机种子极其敏感(后继 TD3/SAC 就是修它的,本管线未启用)。没有探索噪声的 DDPG 学不到任何东西。本仓库:buffer 100k、高斯噪声 σ=0.1、每 10 步训练一次、5 万步。

一表对比

A2CPPODDPG
学习范式on-policy 演员-评论家on-policy 策略梯度off-policy 演员-评论家
策略输出动作分布(随机)动作分布(随机)确定动作
核心机制优势函数降方差裁剪目标限制更新步长回放池 + 目标网络 + Q 学习
样本效率低低高(旧经验重放)
稳定性 / 调参中,对 lr 敏感最好(最宽容)最差(种子敏感,必须配探索噪声)
动作空间离散 / 连续均可离散 / 连续均可仅连续

on-policy vs off-policy:对金融数据意味着什么

金融 RL 有个先天约束:历史只有一条。A2C/PPO 每次更新都必须用"当前策略刚滚出来的新轨迹"——好在环境是回测模拟器,可以无限生成,但要付算力;DDPG 把走过的路存进回放池反复咀嚼,同一段历史能学很多遍,数据有限时最划算,代价是 Q 值高估等稳定性坑。注意:能无限生成数据 ≠ 信息无限——模拟器终究是同一段历史的重放,对这段历史过拟合的风险三个算法一视同仁。