📑 本文目录
ETF轮动动量策略回测七星高照量化

七星高照ETF轮动策略本地化回测:年化32%背后的真相


引言:60倍策略到底有多神

聚宽社区有一个流传甚广的ETF轮动策略——“七星高照”,原作者声称实现了60倍收益。策略核心是39只跨资产ETF池中,通过七层过滤+震荡期切换+动态滤波器,每日选出动量最强的1只ETF满仓轮动。

这个策略到底能不能复现?回测表现是否真实可靠?本文将其从聚宽/Ptrade平台完整移植到本地DuckDB数据环境,忠实保留全部策略逻辑后运行6.5年回测,并执行严格的参数鲁棒性测试。

策略原理:七层过滤的精密机器

七星高照的核心设计思想是:动量+多重过滤。不是简单地追涨杀跌,而是在动量信号之上叠加多层风控机制,层层筛选后只留下”最健康”的趋势标的。

ETF池设计

策略使用39只ETF,覆盖六大资产类别:

类别数量代表标的
大宗商品6只黄金ETF、豆粕ETF、白银LOF、原油、有色、能源化工
国际市场10只纳指、标普500、道琼斯、日经225、德国30、法国等
港股5只恒生科技、中概互联、恒生ETF、港股红利
A股指数9只沪深300、中证500、创业板、科创50、中证1000等
风格4只红利低波、创业板成长、价值、自由现金流
债券3只可转债ETF、国债ETF、城投债ETF

这个设计的精妙之处在于跨资产轮动:股市下跌时资金可能流向黄金或债券,海外市场走强时可以切换到纳指/标普500。传统A股策略只能做多做空,而ETF池天然实现了”全球资产配置+动量择时”。

动量评分:加权对数回归

策略不使用简单的涨幅排名,而是采用更稳健的加权对数回归斜率

  • 取最近25个交易日的收盘价
  • 对价格取自然对数
  • 用线性权重(1到2递增,越近期权重越大)做加权最小二乘回归
  • 斜率年化得到预期收益率
  • 乘以R²(趋势稳定性)得到最终得分

公式描述:score = (exp(slope x 250) - 1) x R²

R²的作用是惩罚”大起大落”的标的。一个平稳上涨的ETF得R²接近1,而暴涨暴跌的标的R²会显著下降,从而降低排名。这使得策略倾向于选择趋势稳定的品种。

七层过滤机制

选出得分最高的ETF之前,每只标的要经过七道关卡:

层级过滤条件作用
第1层盈利保护:从近1日最高点回撤超5%避免持有正在回调的标的
第2层溢价率过滤(实盘专用,回测关闭)防止买入高溢价ETF
第3层成交量放量过滤:年化收益超100%时检查是否异常放量避免追高
第4层短期动量过滤:10日年化收益为负则排除排除短期走弱的标的
第5层得分范围:score在0到100之间排除异常值
第6层近3日单日跌幅超3%直接排除避开正在暴跌的标的
第7层动态滤波器(拉普拉斯/高斯)趋势确认

震荡期机制:自适应滤波器切换

这是策略最有特色的设计。策略会监控沪深300ETF(风险基准)的状态,根据市场环境切换不同的滤波器:

进入震荡期条件(任一触发):

  • 乖离率过大:价格偏离20日均线超过10%
  • RSI超买回落:前日RSI高于75,当日回落至60以下

退出震荡期条件(任一触发):

  • 从20日低点上涨超过3%
  • 企稳信号:价格站上均线+回升+回撤收窄+RSI回升,连续2天
  • 强制退出:震荡期满15个交易日

两种滤波器的区别:

  • 正常期使用拉普拉斯滤波器(指数加权一阶低通),响应速度快,适合趋势行情
  • 震荡期使用高斯滤波器(高斯核加权),更保守,过滤掉波动剧烈的标的

滤波器不仅检查价格是否在滤波线之上,还要求滤波线的斜率(趋势方向)为正,双重确认趋势。

本地化实现

数据来源

从本地DuckDB数据库(quant_v2.duckdb)读取39只ETF的日线数据。数据已做过前复权处理——ETF的拆分合并是回测杀手,例如513100(纳指ETF)在未复权数据中有-80.6%的虚假暴跌(1送5股合并),修复后降至-10%。

回测区间为2020年1月至2026年7月,共1579个交易日。采用动态ETF池:每个交易日只使用当天有数据且历史数据充足的ETF(2020年仅有约20只可用,2026年全部可用)。

回测设置

参数说明
回测区间2020-01 ~ 2026-076.5年
初始资金100万元
持仓数量1只满仓单只轮动
调仓频率每日盘后信号,次日开盘成交
佣金万2.5(最低5元)ETF免印花税
滑点千分之一单边
成交方式T+1开盘价信号日收盘计算,次日开盘买入
防御ETF511880(货币基金)无合格标的时避险

成交时序是最关键的防护:信号在T日收盘后计算,成交在T+1日开盘价执行,杜绝了”偷看未来”的前瞻偏差。

回测结果

整体表现

指标数值
总收益率(79个月)+516.3%
年化收益率+32.2%
Sharpe比率0.79
最大回撤-36.7%
Calmar比率0.88
年化波动率40.9%
月度胜率53%(42/79个月为正)
总交易次数827次(年化约127次)
总手续费310,855元(占初始资金3.1%/年)

100万元起步,6.5年后变成614万元。看起来很美,但先别急着上实盘。

逐年收益

年份收益率备注
2020-16.8%COVID冲击,策略首年亏损
2021+13.1%
2022+8.8%
2023+1.9%震荡市表现平庸
2024+71.6%ETF大牛市
2025+57.5%ETF大牛市
2026YTD+112.4%半年翻倍

6/7年正收益(86%),看起来很稳健。但注意到一个问题:2024-2026三年贡献了绝大部分收益。如果去掉这三年,2020-2023的年均收益仅约1.5%。策略的表现高度依赖于近三年的ETF大牛市。

持仓分布

ETF持仓天数占比
159985 豆粕ETF134天8.5%
513100 纳指ETF111天7.0%
159967 创业板成长99天6.3%
501018 南方原油92天5.8%
588080 科创5081天5.1%

持仓高度分散,Top5合计仅占33%。这说明策略频繁在不同资产类别间切换——豆粕(商品)、纳指(海外)、创业板(A股成长)、原油(能源)轮番登场,体现了跨资产轮动的设计意图。

震荡期触发频率

整个回测期间,震荡期状态切换了49次,震荡期总天数48天(占比3.0%)。这意味着策略绝大部分时间运行在正常期(拉普拉斯滤波器),震荡期机制使用率很低。防御ETF(货币基金)持仓40天(2.5%),空仓仅1天。

基准对比

基准年化收益策略超额
策略本身+32.2%
沪深300ETF B&H+25.1%+7.1pt/年
黄金ETF B&H+16.0%+16.2pt/年
纳指ETF B&H+21.3%+10.9pt/年

策略确实跑赢了主要基准。但要注意:最大回撤36.7%显著大于沪深300ETF的27.5%。策略承担了更高的波动来换取超额收益。

参数鲁棒性测试:揭示过拟合风险

这是整篇文章最重要的部分。好看的回测曲线可能只是参数过拟合的产物。

测试设计

对核心参数进行扰动测试,观察年化收益的稳定性:

配置年化Sharpe最大回撤正收益年
Baseline (LB=25)32.2%0.7936.7%6/7
LB=2013.2%0.3545.6%4/6
LB=3019.2%0.4851.6%5/6
LB=1518.8%0.1677.2%4/6
无震荡期14.1%0.3641.9%6/6
无盈利保护27.3%0.6740.5%5/6
无短期动量17.6%0.4542.5%6/6
无近3日跌幅21.2%0.5242.7%6/6
纯动量(全关)16.5%0.4039.3%5/6

关键发现

LB=25呈现孤立优势。 将动量回看周期从25天改为20天(仅差5天),年化收益从32.2%暴跌至13.2%。改为30天也只有19.2%。参数变化幅度远超15pt的鲁棒性阈值。

这意味着LB=25可能是针对2020-2026这段特定历史数据的最优值——在实盘中,未来市场环境不一定延续这个特征。

震荡期机制贡献约18pt。 关闭震荡期后年化从32.2%降到14.1%,说明高斯/拉普拉斯滤波器切换是策略价值的重要来源。

各层过滤都有正向贡献。 去掉任何一层过滤都会降低收益,说明七层过滤的设计是合理的。其中盈利保护和短期动量贡献最大。

Guardrails检查

按照回测防护框架执行11项标准化检查:

检查项状态说明
B1 幸存者偏差通过ETF不存在退市问题
B2 交易日历通过使用实际交易日,动态ETF池
B3 数据范围通过39只ETF全有数据
B4 成交时序通过T日信号 → T+1开盘成交
B5 交易成本通过万2.5佣金+千1滑点+最低5元
B6 停牌处理通过停牌日不交易,用最近收盘价估值
B7 年化计算通过资金曲线法
B8 基准对比通过超额HS300 +7.1pt/年
B9 参数鲁棒性不通过LB=25孤立优势,变化幅度超15pt
B10 逐年一致通过6/7年正收益(但收益集中)
B11 样本外未做

B9不通过是核心风险。 策略对动量周期参数极其敏感,LB=25的优异表现可能是数据挖掘的结果。

数据局限

回测存在以下不可忽视的局限:

ETF复权残余。 虽然数据已做前复权,但仍有68次超过11%的跳空(主要来自分红日和小幅拆分),对动量计算有轻微影响。

无分钟数据。 原版策略在11:00盘中执行盈利保护检查,本地回测改为日频。日内回撤触发的保护逻辑无法完全还原。

ETF池动态化偏差。 2020年仅有约20只ETF有数据,2026年全部可用。早期可选标的少,后期增多——这相当于”事后知道哪些ETF会上市”,存在轻微的前瞻偏差。

改进建议

基于回测发现的问题,以下是可落地的改进方向:

加入换仓门槛。 当前年化127次交易过于频繁,手续费31万。建议设置20%的换仓门槛:新标的动量得分需比当前持仓高出20%才触发换仓。预期可将年交易次数从127降到约50次,年化摩擦成本从3.1%降到约1.2%。

测试持仓2-3只。 原版支持holdings_num参数。满仓单只ETF的波动率高达40.9%,如果改为持仓前3只等权分配,可以显著降低回撤(参考聚宽双池动量策略:持仓3只的Sharpe 1.37显著优于持仓1只的0.97)。

参数自适应。 与其固定LB=25,不如根据市场波动率动态调整:高波动期用较长窗口(30天),低波动期用较短窗口(20天),降低对单一参数的依赖。

验证更长时间段。 当前6.5年回测中2024-2026牛市贡献过大。如果能用2015-2019的数据做样本外验证(那段时间有股灾、熔断、蓝筹慢牛等不同市场环境),结论会更可信。

结论

七星高照策略在2020-2026年回测中实现了年化32.2%的收益,超额沪深300约7个百分点/年。策略的七层过滤设计确实有效——每一层都贡献了正向收益,震荡期机制的贡献尤其显著。

但参数鲁棒性测试揭示了一个不可回避的问题:LB=25呈现孤立优势,改为LB=20或LB=30都会导致收益大幅下降。这种参数敏感性强烈暗示过拟合——策略在历史数据上表现优异,但未来不一定能维持。

这不是说策略没有价值。相反,它的架构设计(跨资产轮动+多层过滤+自适应滤波器)提供了优秀的策略框架。关键是要认识到:好看的回测曲线不等于可靠的未来收益。实盘部署时,应该降低交易频率、分散持仓、并密切监控参数在全新市场环境下的表现。

回测代码和完整数据已开源,见文末文件路径。


相关阅读:

文件路径:

  • 回测脚本:/home/user/quant/scripts/qixing_etf_rotation_local.py
  • 回测结果:/home/user/quant/results/qixing_etf_rotation/
  • 原始策略来源:聚宽社区 post/73709(山红/king088/晨曦量化)

💬 评论