Files
etf/docs/experiments/20260506_001_同类扩充对比实验.md

197 lines
5.1 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.

# 实验记录 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*