Task #6 — 行业 ETF 轮动 · Brief v0
Author: @RayDario
Pairs with: Task #4 全天候 brief (shares macro overlay) + Kaite mandate (#mini-cypress:509fb538)
Status: v0 — for Kaite verification + @JimSimons data/backtest spec
---
0. 一页摘要
A 股 行业 ETF 月度轮动, 三层信号 (趋势 + 相对强度 + 拥挤/风险) + macro overlay (复用 Task #4 regime 标签)。
**目标** (Kaite locked): 年化 12-18%, MDD ≤ 20%
**Universe**: 申万一级 31 行业 ETF (有可投 ETF 的, 约 25-27 个), 不进概念 ETF (v1 讨论)
**调仓**: 月度, 持有 Top-N (N=5 默认), Equal weight
**关键不做**:
- 不日频 / 周频调仓 (吃交易成本不偿失)
- 不单纯 momentum (regime shift 时 lag 严重 — 见 §6 失败模式)
- 不进概念 ETF v0 (容量小, 折溢价大)
- 不做 行业内 stock picking (那是 Task #5)
**关键做**:
- 三层信号融合 (趋势 + RS + 风险) → 选 Top-N
- macro overlay 加层 (regime 4 选 2-3 个倾斜行业)
- 严格风控 (单行业 ≤ 25%, 单次换仓 ≤ 全组合 40%)
---
1. Framework 综合
1.1 学术 anchor
- **Jegadeesh-Titman (1993)**: cross-sectional momentum (12-1 月)
- **Asness (2013)**: value + momentum everywhere — momentum 在多市场多资产稳健
- **Faber (2007 GTAA)**: trend filter (10M moving average) + momentum + crash protection
- **Antonacci (2014 dual momentum)**: absolute momentum (vs cash) + relative momentum (vs peers)
- **国内研究**: 东方证券金工 / 中信证券金工 / 申万宏源 等 行业轮动 系列报告 — 公开报告显示三层信号 + macro overlay 是行业共识
1.2 mini-cypress 设计原则
- **不是单 momentum**: pure momentum 在 regime shift 时 (e.g. 2024-09-24 政策转向) 滞后严重
- **不是单 fundamental**: 行业基本面变化慢, 月度调仓用不上
- **是 trend + RS + risk + macro overlay 四要素融合**, 让信号互相补 (trend 抓动量, RS 抓相对位置, risk 防回撤, macro overlay 校 regime)
1.3 与 Task #4 全天候 的关系
- **全天候**: core 底仓, 跨资产 (股 / 债 / 商品), 风险均衡, 低波动 (vol 6-8%)
- **ETF 轮动**: satellite alpha, 股内行业 rotation, 中等波动 (vol 15%)
- **共享 macro overlay**: 复用 Task #4 §3 的 4 regime 标签 (节省研究 + 提高 portfolio 一致性)
- **不共享 universe**: 全天候用宽基 ETF, 轮动用 行业 ETF (不冲突)
---
2. Universe 定义
2.1 申万一级 31 行业 (2021 新版分类)
基础: 申万一级行业 2021 改版后 31 个行业。
**可投 (有 broad ETF, 规模 ≥ 5 亿, 日均成交 ≥ 5000 万)**: ~25-27 个
**不可投 / 流动性差 / 无 ETF**: 综合 / 部分小众如 美容护理
2.2 v0 ETF 标的池 (JimSimons 数据层用)
按"规模优先 + 跟踪误差 + 流动性"原则, 每行业选 1 主代理:
| # | 申万一级 | 主代理 ETF | 代码 | 备代理 |
|---|---|---|---|---|
| 1 | 电子 | 国泰 半导体 ETF | 512760 | 华夏 半导体 (512480) |
| 2 | 计算机 | 华夏 计算机 ETF | 159998 | 国泰 计算机 (512720) |
| 3 | 通信 | 华夏 5G 通信 ETF | 515050 | 通信 ETF (515880) |
| 4 | 传媒 | 鹏华 传媒 ETF | 159805 | 嘉实 中证传媒 (512980) |
| 5 | 国防军工 | 国泰 军工 ETF | 512660 | 富国 军工 (512560) |
| 6 | 汽车 | 国泰 智能汽车 ETF | 159801 | 鹏华 汽车 (516110) |
| 7 | 机械设备 | 华夏 机械 ETF | 159886 | — |
| 8 | 电力设备 (含新能源) | 华夏 中证新能源车 ETF | 515030 | 华泰柏瑞 中证光伏 (515790) |
| 9 | 化工 (基础化工) | 国泰 中证化工 ETF | 159870 | — |
| 10 | 钢铁 | 国泰 中证钢铁 ETF | 515210 | — |
| 11 | 有色金属 | 国泰 中证有色 ETF | 159980 (能源不是, 用 512400 有色) | 华夏 有色 (516650) |
| 12 | 煤炭 | 国泰 中证煤炭 ETF | 515220 | — |
| 13 | 建筑材料 | 国联安 中证建材 ETF | 159745 | — |
| 14 | 建筑装饰 | 国寿安保 中证建筑 ETF | 516970 | — |
| 15 | 房地产 | 华夏 房地产 ETF | 515160 | — |
| 16 | 银行 | 华宝 中证银行 ETF | 512800 | 华夏 银行 (515020) |
| 17 | 非银金融 | 华宝 中证证券 ETF | 512000 | 华夏 证券 ETF (512880) |
| 18 | 食品饮料 | 鹏华 酒 ETF | 512690 (酒 ETF) | 招商 食品 (515170) |
| 19 | 家用电器 | 华夏 家电 ETF | 159996 | — |
| 20 | 纺织服装 | 国联安 纺织 ETF (流动性差, 候选) | 159825 | — |
| 21 | 轻工制造 | (流动性差, 候选用 中证 1000 / 中小盘代理) | — | — |
| 22 | 医药生物 | 国泰 中证 医药 ETF | 512010 | 华宝 医疗 (512170) |
| 23 | 农林牧渔 | 国泰 农业 ETF | 159825 | — |
| 24 | 商贸零售 | (无主流 ETF, v0 不进) | — | — |
| 25 | 社会服务 | (无主流 ETF, v0 不进) | — | — |
| 26 | 公用事业 | 国泰 中证 公用事业 ETF | 159611 | — |
| 27 | 交通运输 | (无主流 ETF, v0 暂不进) | — | — |
| 28 | 环保 (新分类) | 国寿安保 中证环保 ETF | 516300 | — |
| 29 | 美容护理 (新) | (无 ETF, v0 不进) | — | — |
| 30 | 综合 | 跳过 | — | — |
| 31 | 银行 / 非银金融 (已列) | — | — | — |
**v0 实际 universe ≈ 24-26 个**, 准确名单由 JimSimons 在 数据层落地时按"规模 + 流动性"再筛, 在 task thread 报告最终入选名单。
2.3 benchmark
- 沪深 300 ETF (510300) — 用于相对强度 RS 计算
- 中证 800 (515800) — 备用 (覆盖更全)
2.4 v0 不进的 (v1 讨论)
- 概念 ETF: AI / 半导体设备 / 储能 / 创新药 / 元宇宙 等 — 容量小, 申赎限制, 折溢价波动大
- 主题 ETF: ESG / 央企 / 共同富裕 等
- 行业内细分 ETF: e.g. "5G 通信" 已包含在通信里, 不重复
- 行业基金 (主动管理): 不在 ETF 轮动范围内
---
3. 三层信号 spec (JimSimons 回测可执行)
3.1 趋势信号 (Trend)
对每个 ETF i, 计算月度:
- **T_short_i**: 过去 60 日累计收益率
- **T_med_i**: 过去 120 日累计收益率
- **T_long_i**: 过去 250 日累计收益率
- **T_ma_slope_i**: 60 日 MA 当前值 vs 30 天前 60 日 MA → 上行 +1, 下行 -1, 否则 0
- **T_composite_i** = (T_short_i 分数 z 标准化) × 0.3 + (T_med_i z) × 0.4 + (T_long_i z) × 0.2 + T_ma_slope_i × 0.1
3.2 相对强度信号 (RS)
- **RS_250_i** = ETF i 过去 250 日收益 - 沪深 300 过去 250 日收益
- **RS_rank_i** = RS_250_i 在 universe 内 cross-section rank (1 = best)
3.3 拥挤/风险信号 (Risk)
- **vol_60_i** = ETF i 过去 60 日年化波动率
- **dd_60_i** = ETF i 过去 60 日 max drawdown (负数, 越小越差)
- **turnover_60_i** = ETF i 过去 60 日日均换手率
- **risk_score_i** = -1 × (vol_60_i z 标准化) × 0.4 + (dd_60_i z) × 0.4 + (-1 × turnover_60_i z, 因换手过高 = 拥挤) × 0.2
- **风险评分越高越好** (低 vol / 浅 DD / 适度换手)
3.4 综合 score
- **score_i** = T_composite_i × 0.4 + (-RS_rank_i 标准化, 让 rank 高变 z 大) × 0.4 + risk_score_i × 0.2
3.5 选股规则
- Top-N (N=5) by score_i
- Equal weight (20% each)
- 月度再平衡
3.6 退出规则 (在月度再平衡之外)
- 持仓 ETF score 跌出 Top-10 → 下次月度强制退出
- 持仓 ETF 单月跌幅 > 15% → 即时退出 (next day open)
- 持仓 ETF 跌破 250 日 MA + RS_rank 跌出 universe 前 50% → 即时退出
---
4. Macro Overlay (复用 Task #4 regime 标签)
4.1 Regime → 行业偏好映射
| Regime | 偏好 +20% 加权 行业 | 规避 -20% 减权 行业 |
|---|---|---|
| R1 复苏 (Growth ↑ Inflation ↓) | 早周期: 银行 / 房地产 / 汽车 / 家电 / 建材 / 非银金融 | 防御: 医药 / 公用事业 |
| R2 过热 (Growth ↑ Inflation ↑) | 资源周期: 有色 / 钢铁 / 煤炭 / 化工 / 机械 | 利率敏感: 房地产 / 银行 |
| R3 滞胀 (Growth ↓ Inflation ↑) | 防御 + 稳通胀: 食品饮料 / 医药 / 公用事业 / 农林牧渔 / 黄金 (跨 Task #4) | 周期: 钢铁 / 有色 / 汽车 |
| R4 衰退 (Growth ↓ Inflation ↓) | 防御 + 高股息 + 利率敏感: 银行 (高股息) / 公用事业 / 红利 / 医药 | 周期 + 成长: 有色 / 电子 / 计算机 |
4.2 应用方式
- 月度计算 Top-N 时, score_i 在 regime 偏好行业上乘 1.2, 在 regime 规避行业上乘 0.8
- 这样 Top-N 名单受 regime 影响但不强制 (信号本身仍有决定权)
- 避免 regime label 错误时整个组合受灾
4.3 Regime 切换的 churn 控制
- 当 regime 切换发生, 当月不重新洗牌, 等下一个月度再平衡再 apply 新 overlay (减少 churn)
---
5. Position sizing + 再平衡
5.1 持仓规模
- Top-N = 5, equal weight (20% each)
- N=5 是基础, 回测中可测 N=3, N=5, N=7, N=10 对比 (作为 robustness test)
- 单行业 cap ≤ 25% NAV (防止某 ETF 极端拉升导致权重溢出)
5.2 现金 / 防御
- 默认 0% 现金 (Top-N 满仓)
- 触发**全市场风控**时: 沪深 300 跌破 250 日 MA + 国家级负面事件 (e.g. 流动性危机) → 仓位减至 60%, 现金 + 红利 ETF 替代
5.3 调仓频率
- **月度** (每月最后一个交易日决策, 下一个月第一个交易日执行)
- 不日频, 不周频
- 急触发 (单 ETF 跌幅 > 15%, 或 跌破 250 MA + RS rank 出前 50%) 即时退出
5.4 单次调仓 cap
- 单次月度调仓 总换手 cap ≤ 40% NAV
- 如新名单与旧名单变化超过 40%, 优先换 score 最低的旧持仓, 保留其余
5.5 交易成本预算
- 假设单边 ETF 交易成本 ~10 bp (含佣金 + 冲击)
- 月度 40% 换手 × 2 (单边) × 10 bp = 0.8% / 月 ≈ 9.6% / 年 (annualized cost)
- 这是合理上限 (我们用月度而非周度就是为了控制此项)
---
6. 失败模式备忘
6.1 Regime shift 时 momentum lag (核心风险)
- 风险: pure momentum 在 regime 切换时损失严重 (e.g. 2024-09-24 政策转向, 防御股突然弱, 成长股突然强, momentum 模型还在持有防御)
- 应对: §4 macro overlay 给 score 加 regime bias; 但 overlay 也不会瞬时调整 (依赖 regime label, label 本身有 2 月 lag)
- **接受**: 这是 momentum 策略的本质问题, 不可完全消除, 只能缓解
- **监测**: OOS-B (2024-09-24 至 2025-06-30) 表现是核心 KPI
6.2 拥挤交易踩踏
- 风险: 行业 ETF 在某个 hot 主题被基金追逐, 单 ETF 流动性骤降 (e.g. 2021 新能源)
- 应对: §3.3 拥挤信号 (turnover 过高反扣分) 提前减权; §5.4 单次换仓 cap 防止追高
- 监测: 单 ETF 持仓 vs 该 ETF 流通份额 比例 ≤ 1% (避免大额冲击)
6.3 概念 ETF 替代主题 (诱惑)
- 风险: 概念 ETF 信号好看但容量差, 想用进 universe
- 应对: v0 不进, v1 严格 capacity + 折溢价 滤波后讨论
6.4 行业分类调整 (申万 reform)
- 风险: 2021 申万一级 从 28 → 31, 历史数据需要重新映射
- 应对: JimSimons 在数据层处理 — 早期用旧 28 分类, 2021-08 之后用 31 分类, 期间映射保持一致性
6.5 政策黑天鹅
- 风险: 个别 行业被政策定点打压 (e.g. 2021 教育 / 互联网, 2024 房地产)
- 应对: 信号自然会让排名跌出 Top-N → 月度调仓退出; 急触发规则 (单月 -15%) 也会触发即时退出
- **不预判政策**: 林颖颖 framework 一致, 我们不主观规避行业, 让信号说话
6.6 信号过拟合
- 风险: 三层信号权重 (0.4 / 0.4 / 0.2) 是我拍的, IS 过拟合
- 应对: 回测中测多组权重 (0.3/0.5/0.2 / 0.5/0.3/0.2 / 0.4/0.4/0.2 等) 看稳健性; 选 OOS 表现最稳的, 不选 IS 收益最高的
---
7. JimSimons 数据 + 回测 spec
7.1 数据层
拉取 §2.2 中所有 ETF 标的 + benchmark:
- ETF 日线 OHLCV + 复权
- ETF 规模 / 跟踪误差 / 折溢价 (月度)
- 沪深 300 / 中证 800 日线 (benchmark)
- **复用 Task #4 的 macro signal** (PMI / CPI / PPI / 工业增加值 / 社融) — 无需重复拉
- 历史: 2018-01-01 至今 (部分 ETF 上市晚, 上市后回测起)
- 落地: ~/data/mini-cypress/rqdata/etf_industry/2018-2026/
7.2 回测任务
- regime label 复用 Task #4 输出 (调用 JimSimons Task #4 输出)
- 三层信号 + macro overlay → score → Top-N (N=5)
- 月度调仓, 急触发即时退出
- 全市场风控触发 → 仓位减至 60%
7.3 OOS 拆分
- IS: 2018-01-01 至 2023-12-31 (ETF 历史普遍较短, 比 Task #4 IS 起点稍晚)
- OOS-A / B / C: 与 Task #4 同 (2024-01-01 至 2024-09-23 / 2024-09-24 至 2025-06-30 / 2025-07-01 至今)
7.4 输出指标 (每个 OOS 段独立)
- 年化 / vol / Sharpe / Sortino / Calmar
- max DD + recovery 时长
- 月度换手率 + 总交易成本
- 单行业最长持有时长 / 切换次数
- vs 沪深 300 / 中证 800 / 等权 ETF 比较 (alpha / IR)
- regime 切换前后表现 (验证 macro overlay 是否真有效)
- 不同 N (3/5/7/10) sensitivity
- 不同信号权重 (0.3/0.5/0.2 等) sensitivity
7.5 Failure case (回测异常时 ping 我)
- IS 年化 > 25% → overfit, 检查信号权重 / N
- IS Sharpe > 2.0 → 异常高, 检查交易成本是否计入
- OOS-A 年化 > 15% → 检查是否未捕捉 2024 上半年震荡
- OOS-B 年化 < 沪深 300 alpha → macro overlay 失效
---
8. 给 @Kaite 的 verification 请求
8.1 信号 + Top-N + 调仓
- 三层信号权重 0.4 / 0.4 / 0.2 (趋势 / RS / 风险) 是我拍的, 你有偏好吗?
- Top-N = 5, equal weight — 你接受还是建议不等权 / 不同 N?
- 月度调仓 — 你接受还是建议双周 / 季度?
8.2 Macro overlay
- §4.1 我对 4 regime 偏好的行业映射, 你有补充 / 修改?
- ±20% 加权幅度是否合适? (大了会过 overlay, 小了 overlay 无效)
8.3 Universe
- v0 不进概念 ETF — 你接受?
- 申万一级 31 行业, 实际 ~24-26 有 ETF — JimSimons 落地后我会同步最终名单给你, 是否有具体行业你点名必须 in / out?
8.4 触发规则
- 急触发: 单月 -15% / 跌破 250 MA + RS 出前 50% → 即时退出 (next day) — 你接受?
- 全市场风控: 沪深 300 跌破 250 MA + 流动性危机 → 仓位减至 60% — 你接受?
- 单次换仓 cap 40% NAV — 你接受?
---
9. 与其他 task 的接口
- **Task #4 全天候**: 共享 macro regime 标签; ETF 轮动不与全天候持仓重叠 (全天候用宽基 ETF, 轮动用行业 ETF)
- **Task #5 领头羊**: 同为 A 股, 但 Task #5 是 stock-picking, Task #6 是 ETF 轮动 — 不冲突, 可并存
- **Task #7 可转债**: 不重叠
- **Task #8 组合层**: ETF 轮动占组合 **资金权重 25% / 风险预算 ~30%** (per Kaite 锁定 + 我初版)