# ETF轮动策略核心逻辑 V2

## 📊 策略概览

基于**加权动量因子**的跨市场ETF轮动策略，通过量化评分自动选择表现最优的ETF组合进行投资。V2版本核心升级：**跨大类强制分散化选股**，确保持仓在不同资产类别间均衡配置，避免集中在单一市场。

---

## 🎯 候选池配置

### 覆盖市场（7大类，11只标的）

| 大类 (market) | 标的 | 信号源代码 | 交易ETF | 数据来源 |
|---|---|---|---|---|
| **A股 (A)** | 创业板指 | 399006.SZ | 159915.SZ | Tushare |
| **A股 (A)** | 中证红利低波 | H30269.CSI | 512890.SH | Tushare |
| **美股 (US)** | 纳指100 | NDX | 513100.SH | YFinance |
| **日本 (JP)** | 日经225 | N225 | 513520.SH | YFinance |
| **欧洲 (EU)** | 德国DAX | GDAXI | 513030.SH | YFinance |
| **港股 (HK)** | 恒生指数 | HSI | 159920.SZ | YFinance |
| **港股 (HK)** | 恒生科技 | HSTECH.HK | 513130.SH | YFinance |
| **商品 (COMMODITY)** | 黄金 | AU.SHF | 518880.SH | Tushare/期货 |
| **商品 (COMMODITY)** | 原油 | CL.NYM | 160723.SZ | YFinance |
| **商品 (COMMODITY)** | 有色金属(铜) | CU.SHF | 159980.SZ | Tushare/期货 |
| **固收 (BOND)** | 30年国债 | 931862.CSI | 511090.SH | Tushare |

### 双轨数据架构
- **信号源（指数/期货）**：用于计算动量因子得分，决定选哪些标的
- **交易标的（ETF）**：用于计算实际收益，所有ETF均在A股场内交易
- 商品类标的使用期货价格作为信号源（AU.SHF→黄金ETF，CL.NYM→原油ETF，CU.SHF→有色ETF），保证信号来源的纯粹性

---

## 🧮 得分计算逻辑

### 因子类型：加权线性回归动量 (weighted_momentum)

#### 核心公式
```
得分 = 年化收益率 × R²
```

#### 计算步骤
1. **取对数收益**：`y = ln(价格序列)`（过去25个交易日）
2. **构造权重**：`weights = linspace(1, 2, 25)`（近期权重2.0，远期权重1.0，线性递增）
3. **加权线性回归**：`slope, intercept = polyfit(x, y, 1, w=weights)`
4. **年化收益率**：`annualized_returns = exp(slope × 250) - 1`
5. **加权R²**：
   ```
   y_pred = slope × x + intercept
   ss_res = Σ(weights × (y - y_pred)²)
   ss_tot = Σ(weights × (y - weighted_mean(y))²)
   R² = 1 - ss_res / ss_tot
   ```
6. **最终得分**：`score = annualized_returns × R²`

#### 得分含义
- **正值**：上升趋势，值越大代表趋势越强且越稳定
- **负值**：下降趋势（会被过滤，不参与选股）
- **接近0**：无明显趋势或趋势不稳定

### 崩盘过滤机制
在得分计算后，对最近3个交易日进行崩盘检测：
- **条件1**：最近3天中任一天跌幅 > 5%
- **条件2**：连续3天下跌，且累计跌幅 > 5%

满足任一条件 → **得分强制清零**，该标的当日不参与选股。

### V1 vs V2 因子对比

| 维度 | V1 (slope_r2) | V2 (weighted_momentum) |
|---|---|---|
| 输入数据 | 归一化价格 | 对数价格 |
| 回归方式 | 等权线性回归 | 加权线性回归（近期权重更高） |
| 得分公式 | `slope × R² × 10000` | `年化收益率 × R²` |
| 权重分配 | 所有交易日等权 | 近期权重2.0，远期权重1.0 |
| 崩盘过滤 | 无 | 有（连续3天跌>5%清零） |

---

## 📦 选股逻辑：跨大类强制分散化 (diversified=true)

### 核心机制：两步筛选

**第一步：类内竞争** —— 每个 `market` 大类只保留得分最高的1只标的（大类冠军）

```
A股:      创业板指 vs 红利低波     → 选1只冠军
港股:      恒生指数 vs 恒生科技     → 选1只冠军
商品:      黄金 vs 原油 vs 有色金属  → 选1只冠军
美股/日本/欧洲/固收: 各1只，自动成为冠军
```

**第二步：跨类排序** —— 从最多7个大类冠军中，按得分从高到低选 Top 3

```
最终持仓 = Top 3 大类冠军（等权33%）
```

### 具体示例

某日各标的得分：

| 大类 | 标的 | 得分 | 类内排名 |
|---|---|---|---|
| A | 创业板指 | 2.5 | ✓ 冠军 |
| A | 红利低波 | 1.8 | ✗ 淘汰 |
| US | 纳指100 | 4.7 | ✓ 冠军 |
| JP | 日经225 | 3.5 | ✓ 冠军 |
| HK | 恒生科技 | 1.2 | ✓ 冠军 |
| HK | 恒生指数 | 0.8 | ✗ 淘汰 |
| COMMODITY | 黄金 | 3.1 | ✓ 冠军 |
| COMMODITY | 原油 | -0.5 | ✗ 负分过滤 |

→ 大类冠军：纳指100(4.7) > 日经225(3.5) > 黄金(3.1) > 创业板指(2.5) > 恒生科技(1.2)
→ 选 Top 3：**纳指100 + 日经225 + 黄金**（各33%）

### 为什么使用分散化？

实证对比（11只标的，2019-2026）：

| 指标 | diversified=true | diversified=false | 差异 |
|---|---|---|---|
| CAGR | 46.45% | 44.19% | +2.26% |
| Sharpe | 2.22 | 2.13 | +0.09 |
| 最大回撤 | -17.33% | -18.12% | 改善0.79% |
| Calmar | 2.68 | 2.44 | +0.24 |

关键差异在2022年（+17.63%）：`false` 模式集中持有3只商品，商品回调时同步下跌；`true` 模式强制分散到不同大类，有效对冲单一资产类别风险。

---

## ⏱️ 调仓控制

### 调仓触发条件
每日检查，同时满足以下条件才触发调仓：

1. **最低持仓期**：距上次调仓 ≥ 1个交易日（`rebalance_days = 1`）
2. **得分改善检查**：
   - 多品种模式：`新组合总得分 / 旧组合总得分 - 1 ≥ 0%`（`rebalance_threshold = 0.0`）
   - 即：只要新组合得分更高就调仓
3. **目标信号有效**：目标组合不为空（所有标的得分为负时不调仓，继续持有）

### T+1执行机制
- T日收盘后计算因子得分，生成信号（`信号_raw`）
- 信号向后移位1天（`shift(1)`）作为T+1日的执行信号
- **运行时间**：T+1日上午9:00（北京时间），因美股/期货数据凌晨才可用

### 交易成本
- **成本率**：0.1%（双边，含佣金+滑点）
- **扣除方式**：按换手率比例扣除
  - `换手率 = 新增品种数 / 旧持仓品种数`
  - `成本 = 换手率 × 0.1%`
  - 例如：3只持仓换1只 → 换手率1/3 → 成本0.033%

---

## 🛡️ 溢价率控制

### 机制说明
跨境ETF（港股/美股）在A股交易时可能出现溢价（ETF价格 > 净值），溢价过高时买入风险大。

### 控制配置

| 市场类型 | 启用 | 阈值 | 模式 |
|---|---|---|---|
| A股 | 否 | — | — |
| 港股 | 是 | 10% | filter（完全排除） |
| 美股 | 是 | 10% | filter（完全排除） |
| 商品 | 否 | — | — |
| 固收 | 否 | — | — |

### 溢价率计算
```
溢价率 = ETF收盘价 / ETF单位净值 - 1
```

- 净值数据通过 Tushare `fund_nav` 接口获取
- `filter` 模式：溢价超阈值的标的直接从当日候选池排除
- `penalize` 模式（可选）：对高溢价标的得分乘以惩罚系数（0.5）

---

## 📡 跨市场数据对齐

### 基准日历
以**A股交易日历**为基准，所有标的数据对齐到该日历。

### 数据对齐策略
1. **A股指数/期货**：Tushare直连获取，天然对齐A股交易日
2. **非A股标的**（港美股等）：
   - 各标的按自身交易日历计算因子得分
   - 计算完成后，通过 `ffill`（前向填充）对齐到A股交易日
   - 例：周一A股开盘但美股假期 → 使用上周五美股数据
3. **数据质量检查**：对齐后缺失率 > 50% 的标的自动剔除

### 数据源路由

| 数据类型 | 数据源 | 代理方式 |
|---|---|---|
| A股指数 (.SH/.SZ/.CSI) | Tushare | 直连（清除代理） |
| 期货 (AU.SHF/CU.SHF) | Tushare fut_daily | 直连 |
| 港股/美股/欧日 | YFinance | SSH隧道(SOCKS5) |
| 原油 (CL.NYM) | YFinance (CL=F) | SSH隧道 |
| ETF价格 | Tushare fund_daily | 直连 |
| ETF净值 | Tushare fund_nav | 直连 |
| 基准指数 | Tushare | 直连 |

---

## 📈 回测绩效（2019-02 ~ 2026-04）

| 维度 | V2配置 |
|---|---|
| 累计收益 | 1473% |
| CAGR | 46.42% |
| Sharpe | 2.22 |
| 最大回撤 | -17.33% |
| Calmar | 2.68 |
| 日胜率 | 56.48% |
| 基准(沪深300) | CAGR 5.23% |
| 最大回撤区间 | 2020-02-13 ~ 2020-03-23 |

---

## 📋 策略特点总结

| 维度 | V1配置 | V2配置 |
|---|---|---|
| **候选池** | 22只（以A股行业为主） | 11只（全球7大类精选） |
| **市场覆盖** | A股17 + 港1 + 美1 + 商品1 + 加密2 | A股2 + 美1 + 日1 + 欧1 + 港2 + 商品3 + 固收1 |
| **因子类型** | slope_r2 | weighted_momentum（加权，近期权重更高） |
| **崩盘过滤** | 无 | 有（3天跌>5%得分清零） |
| **持仓数量** | 5只（等权20%） | 3只（等权33%） |
| **选股模式** | 纯Top N | 跨大类分散化（每类Top1→全局Top3） |
| **调仓频率** | 每日评估 | 每日评估 |
| **交易成本** | 0.1% | 0.1%（按换手率比例扣除） |
| **溢价控制** | 港3%/美2% | 港美统一10%（filter模式） |
| **数据源** | Tushare + YFinance + CCXT | Tushare + YFinance（去掉加密货币） |
| **基准指数** | 沪深300 | 沪深300 |

---

## 💡 V2核心优势

1. **全球分散**：7大类资产覆盖全球主要市场，降低单一市场/经济体风险
2. **强制分散化**：diversified模式确保持仓跨大类配置，避免同类资产集中
3. **期货信号+ETF交易**：商品类使用期货价格作为信号源，ETF作为交易载体，两者分离
4. **加权动量**：近期数据权重更高，对趋势变化更敏感
5. **崩盘保护**：短期暴跌自动清零得分，避免追接下跌中的飞刀
6. **全A股可交易**：所有标的均有对应的A股场内ETF，无需境外账户

---

*文档版本：V2.0*
*更新时间：2026-04-30*
*对应配置：config/strategies/rotation.yaml*
