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

301 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 衡量的是候选池中**独立风险因子**的有效数量。
3. **贪心选择**
- 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 层次聚类相关性优化