A股动量轮动策略实验策略概述
概述
股市有风险,投资需谨慎
本项目仅供学习使用,不作为投资建议
策略背景
动量轮动(Momentum Rotation)是量化投资领域经典的趋势跟踪策略,核心思想是”追涨杀跌”——即买入近期表现强势的资产,卖出表现弱势的资产。这一策略基于市场非完全有效假说,认为价格趋势在中短期内具有持续性。
在A股市场中,由于投资者结构以散户为主、情绪波动较大,板块和风格轮动特征明显。传统的买入持有策略往往承受较大回撤,而纯粹的动量策略又可能在震荡市中频繁打脸。本策略试图在两者之间取得平衡:通过趋势过滤控制大亏风险,通过动量打分捕捉上涨机会,通过多资产轮动降低单一资产暴露。
策略核心逻辑
本策略采用双层结构设计:
- 风险资产层:在质量成长、价值、红利低波、红利质量、黄金等ETF之间进行动量打分和动态配置,主要考虑A股用户可执行和相对弱相关性
- 短融承接层:以短融ETF(511360)作为资金蓄水池,承接无风险资产可配时的空仓、风控退出资金、以及过热约束后的剩余仓位
核心规则可概括为:趋势过滤定进退,动量打分定权重,过热风控防追高,回撤控制保本金。
策略特点
| 特点 | 说明 |
|---|---|
| 低频交易 | 月度主调仓,不做日内交易,适合上班族跟投 |
| 趋势过滤 | MA200均线+均线斜率双重过滤,避免左侧抄底 |
| 动态底仓 | 根据有效广度自动调整短融底仓比例(10%~100%) |
| 分批建仓 | 新增仓位先建50%,满足条件再补满,降低追高风险 |
| 自适应风控 | 回撤阈值根据波动率、趋势强度、流动性动态调整 |
| 过热约束 | BIAS20偏离度监控,极端行情下限制追涨 |
回测表现概要
| 年度 | 策略收益率 | 策略最大回撤 | 策略夏普 | 510300收益率 | 510300最大回撤 | 510300夏普 |
|---|---|---|---|---|---|---|
| 2020 | 3.15% | -3.09% | 0.84 | 31.11% | -18.22% | 1.19 |
| 2021 | 2.81% | -0.17% | 7.96 | -5.24% | -18.52% | -0.13 |
| 2022 | -3.47% | -4.63% | -1.38 | -21.37% | -29.53% | -1.05 |
| 2023 | 7.16% | -2.04% | 1.96 | -10.71% | -21.30% | -0.72 |
| 2024 | 9.91% | -4.53% | 1.71 | 20.11% | -13.13% | 0.85 |
| 2025 | 19.98% | -3.90% | 2.29 | 25.20% | -10.62% | 1.37 |
| 2026YTD | 0.75% | -10.88% | 0.58 | -4.91% | -7.63% | -0.78 |
特别提示:2022年全年亏损是本策略回测期内唯一亏损全年,当年沪深300下跌约21.4%,策略亏损约3.5%,体现了一定的防御性。但需注意,历史回测不代表未来收益,策略仍可能在极端行情中出现较大回撤。另2026年回撤偏大主要受黄金回调影响
适用场景与风险提示
适合的投资者:
- 追求稳健增值,不愿承受剧烈波动的长期投资者
- 认同趋势跟踪理念,能接受阶段性踏空的投资者
- 有基本ETF交易经验,能理解策略逻辑的执行者
主要风险:
- 趋势失效风险:震荡市中频繁打脸,连续小额亏损累积
- 黑天鹅风险:突发利空导致流动性枯竭,风控机制失效
- 参数失效风险:市场环境结构性变化导致历史规律不再适用
- 执行风险:ETF停牌、溢价折价比率过大等实操问题
详细策略
1. 策略定位
本策略是一个低频、日频信号、月度主调仓的跨资产轮动策略。组合结构分为两层:
- 风险资产层:在风险资产池内做趋势过滤、动量打分和风险调整分配。
- 短融承接层:用
511360作为默认承接资产,承接底仓、风控卖出、过热约束后剩余仓位和执行尾差。
策略目标是以统一规则在权益风格 ETF 与黄金 ETF 之间轮动,并通过动态短融底仓、过热约束、分批建仓和月内回撤风控控制回撤。
2. 资产池
2.1 风险资产
159606:质量成长562320:价值563020:红利低波159209:红利质量518660:黄金
2.2 短融承接资产
511360:短融
511360 统一承担以下角色:
- 无合格风险资产时的默认配置资产
- 动态短融底仓的承接资产
- 风险资产上限截断后的剩余仓位承接资产
- 过热约束后未能执行的新增仓位承接资产
- 月内风控卖出后的承接资产
- 整手取整、费用扣减和未完全配置资金的默认承接资产
3. 数据与口径
3.1 信号计算口径
信号优先使用各资产的 bench_symbol 序列:
159606:930939562320:000919563020:H30269159209:932315518660:AU9999511360:H11014
优先顺序如下:
- 若配置了
bench_symbol,优先用bench_symbol + bench_type计算信号。 - 若基准序列不可得,则退回 ETF 自身前复权收盘价序列。
- 任一回退都应在报告中记录。
3.2 交易执行口径
- 信号和指标使用信号计算基准序列。
- 买卖成交、持仓盈亏和执行价格使用 ETF 实际可交易价格。
- 真实可交易轨下,若某 ETF 在执行日不可交易或尚无真实可交易历史,则该资产月度目标仓位直接转入
511360。
3.3 历史不足处理
- 若某资产在当前时点无法取得足够历史以计算信号,则该资产当期不参与准入、不参与打分、不参与配置。
- 若全部风险资产都无法形成有效信号,则组合为:
- 风险资产合计
0% 511360 = 100%
- 风险资产合计
4. 调仓节奏
4.1 月度主调仓
- 调仓频率:每月一次
- 信号日:每月第一个执行交易日前最近一个交易日收盘后
- 执行日:每月第一个交易日开盘
4.2 月内风控检查
- 检查频率:每个交易日收盘后
- 若触发风控,则在下一个交易日开盘执行
- 不做盘中风控,不做日内交易
4.3 分批建仓补仓检查
- 对已进入首段建仓状态的资产,每个交易日收盘后检查是否满足补仓确认条件
- 满足条件后,于下一交易日开盘补至完整目标仓位
5. 指标定义
对每个资产,基于信号序列计算:
[ MA20_t = mean(P_{t-19:t}) ]
[ MA200_t = mean(P_{t-199:t}) ]
[ MA200_shift_t = MA200_{t-20} ]
[ R3M = \frac{P_t}{P_{t-63}} - 1,\quad R6M = \frac{P_t}{P_{t-126}} - 1,\quad R9M = \frac{P_t}{P_{t-189}} - 1 ]
[ Score_i = 0.5 \times R6M_i + 0.3 \times R3M_i + 0.2 \times R9M_i ]
[ Vol60_i = Std(ret_{1d, t-59:t}) \times \sqrt{252} ]
[ BIAS20_i = \frac{P_t}{MA20_t} - 1 ]
6. 风险资产准入规则
6.1 开仓与持有采用不同阈值
若某资产当前实际权重大于 0,视为持有状态;否则视为新开仓状态。
新开仓阈值
- 分数阈值:
Score > 0.03 - 趋势缓冲:
P_t > MA200_t × 1.01
持有阈值
- 分数阈值:
Score > 0.015 - 趋势缓冲:
P_t > MA200_t
6.2 趋势过滤
无论是新开仓还是持有,均需满足:
[ MA200_t > MA200_shift_t ]
即 200 日均线本身向上。
6.3 准入条件
某风险资产在当期进入风险资产桶,当且仅当同时满足:
- 满足对应状态下的价格相对
MA200条件 - 满足
MA200_t > MA200_shift_t Score高于对应状态阈值Vol60可计算且有效
形式化地:
[ EligibleAssets = {i \mid trend_pass_i = true,\ Score_i > threshold_i,\ Vol60_i\ 有效} ]
若 EligibleAssets 为空,则:
- 风险资产桶权重为
0 511360 = 100%
7. 风险资产桶与动态短融底仓
7.1 风险资产原始强度
对每个通过准入的风险资产:
[ Strength_i = \max(Score_i - threshold_i, 0)^{1.5} ]
[ RawWeight_i = \frac{Strength_i}{Vol60_i} ]
其中 threshold_i 为该资产当期实际使用的开仓阈值或持有阈值。
7.2 有效广度
本策略启用有效广度,且启用动态相关性聚类。
参数如下:
- 相关性窗口:
90个交易日 - 相关性阈值:
0.85 - 最小有效历史:
20个交易日
静态父簇定义为:
equity:159606 / 562320 / 563020 / 159209gold:518660
有效广度的计算原则:
- 若动态聚类可计算,则按合格资产之间的收益率相关性连通分量数量计算。
- 若动态聚类不可计算,则退回静态父簇数量。
- 历史不足的资产按静态簇或单资产独立计数。
7.3 动态短融底仓
先按有效广度设定基础短融底仓:
| 有效广度 | 短融底仓 |
|---|---|
| 0 | 100% |
| 1 | 50% |
| 2 | 30% |
| 3 | 25% |
| 4 | 10% |
| 5及以上 | 10% |
然后计算合格风险资产的平均超额分数:
[ AvgExcessScore = mean(Score_i - threshold_i),\ i \in EligibleAssets ]
若:
[ AvgExcessScore \le 0.03 ]
则短融底仓额外加 10%。
最终:
[ RiskBucketWeight = 1 - ShortBondFloorWeight ]
7.4 组合状态收缩
本策略启用组合状态过滤,仅对 equity 父簇生效。
若以下任一条件满足,则风险资产桶总权重再乘以 0.85:
equity簇广度占比低于40%equity簇当前平均Vol60相对其历史基线中位数均值高于1.20倍
即:
[ RiskBucketWeight \leftarrow RiskBucketWeight \times 0.85 ]
被收缩掉的仓位回到 511360。
8. 风险资产分配规则
8.1 分配模式
当前分配模式为 cluster_risk_budget。
分配顺序如下:
- 先按
RawWeight汇总到父簇 - 对父簇预算施加簇上限
- 再在簇内按
RawWeight比例分配到单资产
8.2 父簇上限
父簇上限如下:
equity:55%gold:45%
这里的上限是对整个风险资产桶预算的约束,而不是对全组合总权重的约束。
8.3 单资产默认上限
每个风险资产的默认总组合权重上限为:
[ 40% ]
若某资产超过该上限,则:
- 先截断至上限
- 超出部分按未封顶资产的
RawWeight再分配 - 若其余风险资产均已封顶或无可分配对象,则剩余仓位转入
511360
9. 过热约束
9.1 过热指标
过热指标使用 BIAS20。
历史阈值采用扩展样本,并且只允许使用 t-1 及以前的数据:
- 一级过热阈值:
BIAS20历史90%分位数 - 二级过热阈值:
BIAS20历史97.5%分位数 - 最少有效样本数:
252
样本不足时,当期不启用过热约束。
9.2 一级过热
若某资产当期为一级过热,且目标权重大于当前实际权重,则:
- 仅执行
50%的新增仓位 - 该资产当期有效上限降为
25%
9.3 二级过热
若某资产当期为二级过热,且目标权重大于当前实际权重,则:
- 禁止新增仓位
- 该资产当期有效上限降为
25%
9.4 存量仓位处理
当前配置启用了过热存量降温。实际结果上:
- 只要资产进入过热状态,当期有效上限统一按
25%处理 - 若目标权重高于
25%,最终目标权重强制截断到25% - 由此产生的剩余仓位统一转入
511360
10. 月度主调仓执行顺序
月度主调仓按以下顺序生成目标仓位:
- 计算全部风险资产的趋势过滤结果
- 计算全部风险资产的动量分数
- 按开仓/持有两套阈值判定准入
- 计算
Strength与RawWeight - 计算有效广度、动态短融底仓和风险资产桶总权重
- 应用组合状态收缩
- 按父簇预算和簇上限分配风险资产权重
- 应用过热约束
- 应用单资产上限
- 得到最终目标权重
最终目标权重必须满足:
- 全部权重非负
- 总和为
100%
11. 分批建仓与冷却期
11.1 分批建仓适用范围
当前配置启用分批建仓,适用于以下两类新增风险仓位:
- 纯新开仓
- 已持有资产在月度主调仓中出现“大幅加仓”
“大幅加仓”定义为满足以下任一条件:
- 单资产目标权重相对当前权重的增量大于
8% - 本次月调仓风险资产桶总权重相对当前组合提升大于
12%
11.2 首段建仓
当月度主调仓触发分批建仓时:
- 首次只执行“当前权重 + 新增目标仓位的
50%” - 尚未执行的新增仓位继续留在
511360 - 若当前权重为
0,则退化为“只执行最终目标权重的50%”
11.3 补仓条件
首段建仓完成后,至少等待 3 个交易日,再检查补仓确认条件。
满足以下条件时,于下一交易日开盘补至完整目标权重:
- 收盘价高于
MA20 R3M > 0
若任一条件不满足,则继续等待后续交易日再次检查;未补足仓位持续保留在 511360,直到满足条件或被下一次月调仓覆盖。
11.4 冷却期
若某资产因月内风控触发全退出,则该资产进入冷却期。
当前冷却期为 15 个交易日。冷却期内:
- 月度主调仓即使重新给出正目标仓位,也不允许重建仓位
- 该部分仓位继续保留在
511360
冷却期结束后,下一次月度主调仓才可重新启动建仓流程。
12. 月内回撤风控
12.1 适用范围
月内回撤风控仅作用于风险资产:
159606562320563020159209518660
511360 不参与月内回撤风控。
12.2 持仓周期锚定
每个风险资产独立维护持仓周期。
规则如下:
- 持仓从
0变为正数时,开启新持仓周期 - 持仓降为
0时,结束该持仓周期 - 部分减仓不重置持仓周期
- 只要持仓未归零,
high_since_entry和风控状态持续沿用
12.3 回撤定义
对每个持仓中的风险资产,维护:
[ HighSinceEntry_i = 本轮持仓周期内最高收盘价 ]
[ Drawdown_i = \frac{HighSinceEntry_i - Close_i}{HighSinceEntry_i} ]
12.4 基础阈值
| 资产 | DD1_base | DD2_base |
|---|---|---|
159606 | 10% | 15% |
562320 | 8% | 12% |
563020 | 8% | 12% |
159209 | 8% | 12% |
518660 | 6% | 10% |
12.5 自适应阈值引擎
当前启用自适应回撤阈值。
风险分数特征:
vol_rank:过去504个交易日内Vol60的历史分位trend_weak:clip(-R3M / 0.15, 0, 1)liq_rank:过去252个交易日内,20日成交量中位数的历史分位
风险分数:
[ RiskScore_i = 0.50 \times vol_rank_i + 0.35 \times trend_weak_i + 0.15 \times (1 - liq_rank_i) ]
若部分特征不可得,则按可用特征权重归一化。
阈值乘数:
[ Multiplier_i = clip(1.15 - 0.45 \times RiskScore_i,\ 0.75,\ 1.15) ]
动态阈值:
[ DD1_{dyn,i} = clip(DD1_{base,i} \times Multiplier_i,\ 0.8 \times DD1_{base,i},\ 1.2 \times DD1_{base,i}) ]
[ DD2_{dyn,i} = clip(DD2_{base,i} \times Multiplier_i,\ 0.8 \times DD2_{base,i},\ 1.25 \times DD2_{base,i}) ]
并强制:
[ DD2_{dyn,i} \ge DD1_{dyn,i} + 0.02 ]
数据分层:
- Tier A:
vol + trend + liq - Tier B:
vol + trend - Tier C:
vol - Tier D:历史不足或关键字段缺失,退回基础阈值
实际生效阈值定义为:
- Tier A / B / C:使用
DD1_dyn / DD2_dyn - Tier D:使用
DD1_base / DD2_base
12.6 风控动作梯级
当前退出梯级为:
[ [0.67,\ 0.34,\ 0.00] ]
对应三段触发边界:
- 第 1 档:
Drawdown > DD1_act - 第 2 档:
Drawdown > DD_mid,其中
[ DD_mid = DD1_{act} + \frac{DD2_{act} - DD1_{act}}{2} ]
- 第 3 档:
Drawdown > DD2_act
动作含义:
- 第 1 档触发后,仓位降至原持仓的
67% - 第 2 档触发后,仓位降至原持仓的
34% - 第 3 档触发后,全部退出
12.7 早期减仓确认条件
当前配置要求前两档减仓必须至少满足以下任一确认条件:
- 收盘价低于
MA20 R3M < 0
若确认条件不满足,则前两档减仓暂不执行;最终退出档不要求该确认条件。
12.8 风控后的资金去向
月内风控卖出释放的仓位统一转入 511360。
月内风控只做降档,不做月内自动补回。是否恢复仓位,只能在后续月度主调仓时重新评估。
13. 同日优先级
若同一执行日同时存在:
- 待执行月度主调仓
- 待执行月内风控
则月度主调仓优先,原待执行风控动作取消,并在当日收盘后基于新持仓重新进入风控监控。
14. 交易执行口径
14.1 成交价格
- 月度主调仓、分批补仓、月内风控,统一按下一交易日开盘价执行
- 不追价,不做盘中二次下单
14.2 交易成本
- 单边佣金:
0.03% - 单边滑点:
0.02%
买入按:
[ BuyPrice_{effective} = OpenPrice \times (1 + 0.0002) ]
卖出按:
[ SellPrice_{effective} = OpenPrice \times (1 - 0.0002) ]
14.3 整手与尾差
- ETF 默认按
100份整手向下取整 - 若为理论代理轨,可放宽为
1份 - 因整手取整、费用和目标值误差形成的剩余资金,优先补买
511360 - 若剩余资金不足以买入
511360的最小交易单位,或511360当日不可交易,则保留现金
14.4 月度免调仓阈值
月度主调仓对单资产启用免调仓阈值:
[ |TargetWeight - CurrentWeight| < 0.5% ]
满足时该资产当次月调仓不下单。该规则只适用于月度主调仓,不适用于月内风控卖出。
14.5 不可交易处理
若执行日出现无有效开盘价、停牌、涨跌停无法成交或其他不可交易情形,则:
- 当日该笔订单视为未成交
- 未成交买单对应资金保持现金或原
511360状态 - 未成交卖单对应仓位保持原持仓状态
- 到下一次规则触发时再重新计算目标仓位
15. 当前正式参数摘要
| 项目 | 当前值 |
|---|---|
| 新开仓分数阈值 | 0.03 |
| 持有分数阈值 | 0.015 |
| 新开仓趋势缓冲 | 1% |
| 持有趋势缓冲 | 0% |
| 分数幂次 | 1.5 |
| 波动率窗口 | 60 |
| 动量窗口 | 63 / 126 / 189 |
| 风险资产默认单资产上限 | 40% |
| 过热后单资产上限 | 25% |
| 父簇上限 | equity 55% / gold 45% |
| 组合状态收缩乘数 | 0.85 |
| 广度弱阈值附加底仓 | AvgExcessScore <= 0.03 时 +10% |
| 过热分位阈值 | 90% / 97.5% |
| 过热最少样本 | 252 |
| 分批建仓首段比例 | 50% |
| 大幅加仓阈值 | 单资产 +8% 或 风险桶 +12% |
| 补仓等待期 | 3 个交易日 |
| 全退后冷却期 | 15 个交易日 |
| 月度免调仓阈值 | 0.5% |
| 单边佣金 | 0.03% |
| 单边滑点 | 0.02% |
| 最小交易单位 | 100 份 |