# 实验记录 001: 同大类扩充对轮动策略的影响

## 实验信息

| 项目 | 内容 |
|------|------|
| 实验编号 | 001 |
| 实验日期 | 2026-05-06 |
| 实验类型 | A/B对比测试 |
| 研究问题 | `diversified=true`模式下，添加同大类新标地对策略绩效的影响 |

---

## 1. 实验背景

### 理论假设

`diversified=true` 模式的选股逻辑：

```
Step 1: 类内竞争 → 每个 market 大类只保留得分最高的1只标的（大类冠军）
Step 2: 跨类排序 → 从大类冠军中按得分从高到低选 Top 3
```

**核心假设**：
- 添加同大类新标的不会增加跨大类分散度（每大类还是只输出1只）
- 可能增加类内切换频率，导致额外调仓成本
- 额外切换时机可能不理想，侵蚀收益

---

## 2. 实验设计

### A/B组配置

| 组别 | 标的数量 | 美股大类标的 | 其他大类 |
|------|---------|-------------|---------|
| **A组（对照组）** | 11只 | 纳指100 (NDX) | A股2、港股2、日本1、欧洲1、商品3、固收1 |
| **B组（实验组）** | 12只 | 纳指100 + 标普500 (SPX) | 同A组 |

### 关键差异

B组在美股大类（market="US"）中添加了标普500：
- A组：美股大类只有纳指100，自动成为大类冠军
- B组：美股大类有纳指100和标普500，需要类内竞争决定冠军

---

## 3. 回测结果

### 数据获取情况

修复了 `socks5://` → `socks5h://` 的代理问题后，所有 YFinance 数据成功获取：

```
✓ SSH 隧道已建立: socks5h://127.0.0.1:1080
下载 NDX (纳指100) - YFinance... ✓ 1845 条
下载 SPX (标普500) - YFinance... ✓ 1845 条
其他标的均成功获取
```

### 绩效对比

| 指标 | A组（无SPX） | B组（有SPX） | 差异 |
|------|-------------|-------------|------|
| 标的数量 | 11只 | 12只 | +1 |
| **累计收益** | **1467.35%** | 1176.26% | **-291.09%** |
| **CAGR** | **48.10%** | 43.82% | **-4.28%** |
| **Sharpe** | **2.21** | 2.06 | **-0.15** |
| MaxDD | -17.33% | -17.18% | +0.14%（略好） |
| **Calmar** | **2.78** | 2.55 | **-0.23** |
| 日胜率 | 56.45% | 56.11% | -0.34% |
| **调仓次数** | 459次 | 501次 | **+42次** |
| 年均调仓 | 66.0次 | 72.1次 | +6.1次 |

---

## 4. 关键发现

### 发现1：跨类分散不变

添加标普500后，美股大类在最终持仓中的占比不变：
- 美股大类始终只有1只冠军进入Top3候选池
- 跨大类分散度没有增加

### 发现2：调仓次数增加

- B组调仓次数增加42次（从459→501）
- 类内切换更频繁（纳指100 ↔ 标普500）
- 额外调仓成本侵蚀收益

### 发现3：绩效反而变差

```
B组绩效全面下滑：
├─ 累计收益 -291%
├─ CAGR -4.28%
├─ Sharpe -0.15
├─ Calmar -0.23
└─ 原因：类内切换时机不佳 + 额外调仓成本
```

### 发现4：类内切换逻辑

美股大类竞争示例：
```
某日得分：
纳指100: 4.7 → 美股冠军（持有纳指ETF）
标普500: 3.5 → 淘汰

另一天得分：
纳指100: -1.0（下跌）
标普500: 2.5 → 美股冠军（切换到标普ETF）

问题：切换时机可能滞后，错过最佳窗口
```

---

## 5. 实验结论

### 核心结论

| 假设 | 实证结果 |
|-----|---------|
| 添加同大类标的**不增加跨类分散** | ✓ **验证通过** |
| 可能**增加调仓次数** | ✓ **验证通过**（+42次） |
| 额外切换**可能侵蚀收益** | ✓ **验证通过**（累计收益-291%） |

### 策略建议

```
diversified=true 模式下的标的池优化策略：

✗ 不要盲目添加同大类新标的
   → 可能增加切换频率，侵蚀收益
   → 每大类保持1-2只代表性标的即可

✓ 应该添加新大类（增加跨类分散）
   → 印度、越南、短债等新大类
   → 真正扩大 Top 3 候选池
   → 提升跨大类分散度

✓ 类内标的选择原则
   → 选择该大类最具代表性的标的
   → 避免风格过度细分导致频繁切换
   → 例：美股选纳指100即可（成长代表）
```

---

## 6. 技术修复记录

### 代理问题修复

本次实验过程中发现了 SSH SOCKS5 隧道的 IPv6 问题：

**问题**：
```python
# 原配置（失败）
proxy_url = "socks5://127.0.0.1:1080"
# 本地DNS解析 → IPv6地址 → SSH隧道拒绝IPv6 → 连接失败
```

**修复**：
```python
# 新配置（成功）
proxy_url = "socks5h://127.0.0.1:1080"
# 'h'表示远程DNS解析 → 代理服务器只用IPv4 → 连接成功
```

**修改文件**：
- `core/datasource/hybrid_source.py`
- `core/datasource/yfinance_source.py`

---

## 7. 相关文件

| 文件 | 说明 |
|-----|------|
| `tests/experiments/ab_test_spx.py` | A/B测试脚本 |
| `results/ab_test_spx.csv` | 测试结果数据 |
| `docs/轮动策略核心逻辑_v2.md` | 策略核心逻辑文档 |

---

## 8. 后续研究方向

1. **新大类扩充实验**：添加印度NIFTY、短债等新大类，验证跨类分散效果
2. **类内切换时机分析**：深入分析纳指100 vs 标普500切换的具体时间点
3. **最佳大类数量研究**：多少个大类是最优配置？

---

*实验记录版本: v1.0*
*最后更新: 2026-05-06*