Files
etf/docs/etf_rotation_framework.md
aszerW 2829f80427 feat(backtest): 消除前视偏差,实现动态ETF池重建
消除回测前视偏差(Look-Ahead Bias):
- 新增 ETFDataCache 本地缓存系统,预下载全量ETF(含已退市)基础信息和日线数据
- 改造 ETFUniverseBuilder 支持纯历史模式,每个时间点只使用当时可获得的数据
- 动量.py 新增 dynamic 模式,回测中每60交易日动态重建ETF候选池
- momentum_experiment.py 同步支持动态重建
- 新增 ETF筛选引擎文档和动态池方案文档

无前视偏差实验结果(6组对比,2015-2026):
  A: 全仓1只       CAGR=3.32%, MaxDD=-63.19%, Sharpe=0.26
  B: 等权3只       CAGR=3.40%, MaxDD=-49.72%, Sharpe=0.30 ← 最优
  C: 反波动率3只   CAGR=1.73%, MaxDD=-38.59%, Sharpe=0.21
  D: 等权5只       CAGR=2.77%, MaxDD=-42.39%, Sharpe=0.29
  E: 反波动率5只   CAGR=-0.37%, MaxDD=-19.56%, Sharpe=-0.03
  F: 动量>0全选等权 CAGR=2.02%, MaxDD=-43.27%, Sharpe=0.24

最优方案: B(等权3只)夏普、Calmar、CAGR三项均最高
2026-04-29 22:15:01 +08:00

11 KiB
Raw Blame History

ETF 动量轮动策略:筛选框架与多持仓实验分析

1. 系统概览

本系统从全市场 ETF 中,通过 5 层漏斗 筛选出低相关、高流动性、覆盖多资产类别的候选池,再以动量因子选出 Top-N 等权持仓。

全市场 ETF (~900+)
  │  Layer 0: 拉取全量基础信息
  ▼
  │  Layer 1: 上市≥1年 + 排除货币/杠杆 + 日均额≥5000万
  ▼  (~200+)
  │  Layer 2: 同一跟踪指数去重 (保留流动性最优)
  ▼  (~220)
  │  Layer 3: 三级分类链 → 10 大类资产标签
  ▼
  │  Layer 4: 类内等比分配预筛 (ENB × 3 预算)
  ▼  (~36)
  │  Layer 5: 相关性矩阵 + ENB → 贪心最大分散选择
  ▼  (9 只, ENB 驱动)
 候选池 → 动量打分 → Top-3 等权持仓

2. 五层漏斗详解

2.1 Layer 0 — 全量拉取

通过 Tushare fund_basic 获取全量上市 ETF字段包括

字段 用途
ts_code, name 标识
fund_type 一级分类 (股票型/债券型/商品型/REITs/货币市场型)
invest_type 二级分类 (黄金现货合约/白银期货型/被动指数型…)
benchmark 跟踪指数名称 (用于地域+行业判断)
list_date 上市日期

2.2 Layer 1 — 基础过滤

条件 阈值 目的
上市时间 ≥ 365 天 排除新基金,确保有足够历史数据
基金类型 排除货币型 不参与轮动
名称过滤 排除杠杆/反向/分级 避免衍生品风险
日均成交额 ≥ 5000 万元 (60 日均值) 保证流动性

2.3 Layer 2 — 同指数去重

从 ETF 名称提取核心指数名(去除基金公司前缀和 ETF/LOF/联接等后缀),同一指数只保留日均成交额最大的一只。

2.4 Layer 3 — 三级分类链

核心创新:不依赖纯关键词匹配,而是利用官方字段构建优先级分类链,覆盖率 100%。

classify(row):
  ┌─ 第1级: fund_type 硬判断
  │   REITs → REITs
  │   货币市场型 → 货币/现金
  │   商品型 → 商品
  │
  ├─ 第2级: invest_type 细分
  │   黄金现货合约 / 白银期货型 / 有色金属期货型
  │   能源化工期货型 / 豆粕期货型 / 原油主题基金 → 商品
  │   (fund_type=债券型) → 债券
  │
  ├─ 第3级: 商品名称优先 (防止 QDII 油气被误分到美股)
  │   name/benchmark 含 油气/原油/石油/能源行业 → 商品
  │
  ├─ 第4级: 地域判断 (benchmark + name)
  │   恒生/港股/H股 → 港股
  │   纳斯达克/标普500/道琼斯 → 美股
  │   日经/德国/越南/印度/全球 → 全球/其他
  │
  ├─ 第5级: A股内部细分
  │   沪深300/中证500/创业板… → A股宽基
  │   红利/央企/ESG/AI… → A股主题
  │   其余股票型/混合型 → A股行业
  │
  └─ 兜底: 货币/债券关键词 → 对应类别
         其他 → 未分类

最终 10 大类A股宽基、A股行业、A股主题、港股、美股、全球/其他、商品、债券、REITs、货币/现金

2.5 Layer 4 — 类内等比分配

不使用固定的 INTRA_CLASS_LIMITS,改为数据驱动的等比分配:


\text{budget} = \text{ENB}_{\text{fallback}} \times \text{candidate\_multiplier}

\text{limit}_i = \min\bigl(n_i,\; \max(\text{min\_per\_class},\; \lfloor r_i \times \text{budget} \rceil)\bigr)

其中 r_i = n_i / \sum n_j 为第 i 类在筛选后样本中的占比,n_i 为该类可选 ETF 数量。

默认参数:ENB_fallback=12, candidate_multiplier=3.0, min_per_class=2,总预算约 36 只。

每类选取日均成交额最高的 limit_i 只。

2.6 Layer 5 — ENB 驱动 + 贪心选择

  1. 计算相关性矩阵:使用 120 个交易日收益率
  2. 确定目标池大小

\text{ENB} = \exp\!\Bigl(-\sum_{i=1}^{d} p_i \ln p_i\Bigr), \quad p_i = \frac{\lambda_i}{\sum_j \lambda_j}

其中 \lambda_i 为相关性矩阵的特征值 (Meucci 2009)。ENB 衡量的是候选池中独立风险因子的有效数量。

  1. 贪心选择
    • Step A每个大类先选入流动性最好的 1 只(确保覆盖)
    • Step B从剩余候选中贪心选取与已选集合最大相关系数最小的 ETF
    • 约束:最大相关系数 ≤ 0.85A股行业占比 ≤ 50%

3. 多持仓对比实验

3.1 实验设计

从 Layer 5 输出的 9 只候选池ENB 驱动版本)出发,使用动量策略打分,比较不同持仓数量和权重方案。

动量打分:自适应回看窗口 + 加权动量得分 + 崩溃过滤器 + 溢价率惩罚。得分在 (0, 6) 区间内视为有效正动量。

6 组实验

编号 持仓数 权重方案 说明
A 1 全仓 1 只(基准)
B 3 等权 (1/N) 每只 33.3%
C 3 反波动率 权重 ∝ 1/σ
D 5 等权 每只 20%
E 5 反波动率 权重 ∝ 1/σ
F 全部正动量 等权 所有得分>0 的 ETF 等权

反波动率权重公式


w_i = \frac{1/\sigma_i}{\sum_{j=1}^{N} 1/\sigma_j}

\sigma_i 为过去 20 个交易日的日收益率标准差。

3.2 实验结果

实验 CAGR 夏普比率 最大回撤 Calmar 盈利年
A: 全仓1只 20.41% 1.01 -29.65% 0.69 8/12
B: 等权3只 15.11% 1.23 -17.96% 0.84 10/12
C: 反波动率3只 10.03% 1.09 -12.37% 0.81 9/12
D: 等权5只 11.41% 1.14 -19.66% 0.58 10/12
E: 反波动率5只 2.68% 0.53 -8.68% 0.31 8/12
F: 动量>0全选等权 10.73% 1.13 -18.19% 0.59 10/12

3.3 关键发现

  1. 等权 3 只 (B) 综合最优:夏普 1.23最高、Calmar 0.84(最高)、盈利年 10/12并列最高
  2. 全仓 1 只 (A) 收益最高但波动最大CAGR 20.41%,但最大回撤 -29.65%
  3. 5 只持仓边际收益递减D 和 E 相比 B 和 CCAGR 大幅下降但回撤未明显改善
  4. 全选正动量 (F) ≈ 等权 5 只 (D):说明选优比全选更重要,动量 alpha 被稀释
  5. 反波动率权重降低收益:低波动资产权重更高,倾向持有债券/货币等低收益品种

4. 等权选 3 只的理论基础

4.1 从信息论角度√N 经验法则

当从 N 个候选中选取子集构建组合时,一个经典的经验法则是:


k^* = \lfloor \sqrt{N} \rceil

对于 N = 9 的候选池:


k^* = \sqrt{9} = 3

直觉\sqrt{N} 是分散化收益与集中度损失之间的平衡点。少于 \sqrt{N} 时分散不足,多于 \sqrt{N} 时每增加一只带来的边际方差下降不抵 alpha 稀释。

4.2 从动量文献角度Top Decile / Top Tercile

Jegadeesh & Titman (1993, 2001) 的经典动量策略将资产按动量排序后分为 3~10 组,持有最强的一组


\text{Top Group Size} = \frac{N}{D}

其中 D 为分组数。当 $D = 3$(三分位法)时:


k = \frac{N}{3} = \frac{9}{3} = 3

Top Tercile (前 1/3) 是动量文献中最常用的分组方式之一,在回测中稳健地跑赢其他分位。

4.3 从等权理论角度DeMiguel (2009)

DeMiguel, Garlappi & Uppal (2009) 在 "Optimal Versus Naive Diversification: How Inefficient is the 1/N Portfolio?" 中证明:

在估计误差存在的情况下,简单的 1/N 等权组合在样本外表现优于大多数均值-方差优化模型,除非样本量 T 满足:

T > \frac{N(N+1)}{2} \cdot c

其中 c 依赖于资产的夏普比率差异。

对于 $N = 3$$T > 6c$(很容易满足);对于 $N = 9$$T > 45c$(需要更长数据)。

结论在小池子N=9 候选、k=3 持仓)的场景下,等权是理论最优的权重方案。

4.4 从方差分解角度:边际分散效应递减

等权组合的方差为:


\sigma_p^2 = \frac{1}{k}\bar{\sigma}^2 + \frac{k-1}{k}\overline{\text{Cov}}

其中 \bar{\sigma}^2 为平均方差,\overline{\text{Cov}} 为平均协方差。

k 求导:


\frac{\partial \sigma_p^2}{\partial k} = -\frac{1}{k^2}(\bar{\sigma}^2 - \overline{\text{Cov}})

边际方差下降 $\propto 1/k^2$,呈二次递减:

k 边际方差下降 (相对于 k=1)
1 → 2 -25.0\%
2 → 3 -11.1\%
3 → 4 -6.3\%
4 → 5 -4.0\%

从 k=1 到 k=3方差下降约 $\frac{2}{3}(\bar{\sigma}^2 - \overline{\text{Cov}})$覆盖了可分散风险的大部分k>3 后边际效益显著递减。

4.5 综合公式

给定候选池大小 N 和目标风险调整收益最大化,推荐持仓数:


\boxed{k^* = \max\!\Big(2,\; \min\!\big(\lfloor\sqrt{N}\rceil,\; \lfloor N/3 \rfloor\big)\Big)}
候选池 N √N N/3 k*
6 2.4 → 2 2 2
9 3.0 → 3 3 3
12 3.5 → 4 4 4
16 4.0 → 4 5 4
20 4.5 → 5 6 5

5. 完整策略流程总结

┌────────────────────────────────────────┐
│  Layer 0-5: 五层漏斗筛选 (~月频重建)    │
│  输出: N 只低相关候选池 (当前 N=9)       │
└──────────────┬─────────────────────────┘
               ▼
┌────────────────────────────────────────┐
│  动量打分 (日频/周频)                    │
│  自适应回看 + 加权动量 + 崩溃过滤        │
│  输出: 各 ETF 动量得分                   │
└──────────────┬─────────────────────────┘
               ▼
┌────────────────────────────────────────┐
│  选出 Top-k 持仓                        │
│  k = min(√N, N/3) = 3                  │
│  仅选得分 > 0 的 ETF                    │
└──────────────┬─────────────────────────┘
               ▼
┌────────────────────────────────────────┐
│  等权配置 (1/k)                         │
│  每只 33.3%,换仓时计算换手成本          │
└────────────────────────────────────────┘

6. 参考文献

  • Meucci, A. (2009). "Managing Diversification." Risk, 22(5). — ENB (Effective Number of Bets) 公式来源
  • Jegadeesh, N. & Titman, S. (1993, 2001). "Returns to Buying Winners and Selling Losers." — 动量策略与 Top Tercile 方法
  • DeMiguel, V., Garlappi, L. & Uppal, R. (2009). "Optimal Versus Naive Diversification." Review of Financial Studies. — 1/N 等权优于均值-方差优化
  • Faber, M. (2007). "A Quantitative Approach to Tactical Asset Allocation." SSRN:962461. — GTAA 风险因子覆盖设计
  • Antonacci, G. (2014). "Dual Momentum Investing." SSRN:2042750. — 跨资产动量分散化
  • López de Prado, M. (2016). "Building Diversified Portfolios that Outperform." SSRN:2708678. — HRP 层次聚类相关性优化