📑 本文目录
七星高照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-07 | 6.5年 |
| 初始资金 | 100万元 | |
| 持仓数量 | 1只 | 满仓单只轮动 |
| 调仓频率 | 每日 | 盘后信号,次日开盘成交 |
| 佣金 | 万2.5(最低5元) | ETF免印花税 |
| 滑点 | 千分之一 | 单边 |
| 成交方式 | T+1开盘价 | 信号日收盘计算,次日开盘买入 |
| 防御ETF | 511880(货币基金) | 无合格标的时避险 |
成交时序是最关键的防护:信号在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 豆粕ETF | 134天 | 8.5% |
| 513100 纳指ETF | 111天 | 7.0% |
| 159967 创业板成长 | 99天 | 6.3% |
| 501018 南方原油 | 92天 | 5.8% |
| 588080 科创50 | 81天 | 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.79 | 36.7% | 6/7 |
| LB=20 | 13.2% | 0.35 | 45.6% | 4/6 |
| LB=30 | 19.2% | 0.48 | 51.6% | 5/6 |
| LB=15 | 18.8% | 0.16 | 77.2% | 4/6 |
| 无震荡期 | 14.1% | 0.36 | 41.9% | 6/6 |
| 无盈利保护 | 27.3% | 0.67 | 40.5% | 5/6 |
| 无短期动量 | 17.6% | 0.45 | 42.5% | 6/6 |
| 无近3日跌幅 | 21.2% | 0.52 | 42.7% | 6/6 |
| 纯动量(全关) | 16.5% | 0.40 | 39.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/晨曦量化)