experiment(rotation): 同大类扩充与纳指vs标普替换对比实验

技术修复:
- SOCKS5代理IPv6问题:socks5:// → socks5h:// (hybrid_source.py, yfinance_source.py)

目录整理:
- scripts/ → 仅保留策略入口(daily_scheduler, run_rotation, run_cci_screener)
- 实验脚本移至 tests/experiments/
- 工具脚本移至 tests/utils/
- 实验记录新增 docs/experiments/
- results/ 添加到 gitignore

实验结果:

实验001 - 同大类扩充(添加标普500):
├─ 累计收益: 1467.35% → 1176.26% (-291%)
├─ CAGR: 48.10% → 43.82% (-4.28%)
├─ 调仓次数: 459 → 501 (+42次)
└─ 结论: 添加同大类标的不增加跨类分散,反而侵蚀收益

实验002 - 纳指vs标普替换对比:
├─ 累计收益: 1467.35% → 1118.77% (-348%)
├─ CAGR: 48.10% → 42.87% (-5.22%)
├─ Sharpe: 2.21 → 2.08 (-0.13)
├─ MaxDD: -17.33% → -15.14% (+2.18%)
└─ 结论: 纳指100优于标普500,成长风格更适合动量策略

策略建议:
- 保持纳指100作为美股大类代表
- 不添加同大类新标的(避免类内切换成本)
- 新增标的应优先考虑新大类(增加跨类分散)
This commit is contained in:
2026-05-06 20:43:38 +08:00
parent a4e8a6050e
commit 6b59855c28
20 changed files with 1086 additions and 2 deletions

View File

@@ -0,0 +1,197 @@
# 实验记录 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*

View File

@@ -0,0 +1,171 @@
# 实验记录 002: 纳指100 vs 标普500 替换对比
## 实验信息
| 项目 | 内容 |
|------|------|
| 实验编号 | 002 |
| 实验日期 | 2026-05-06 |
| 实验类型 | A/B对比测试替换场景 |
| 研究问题 | 将美股大类代表从纳指100替换为标普500后的绩效变化 |
---
## 1. 实验背景
### 与001实验的区别
| 实验 | 操作 | 类内竞争 | 标的数量 |
|------|------|---------|---------|
| 001 | **添加**标普500 | 有纳指vs标普 | 11→12 |
| 002 | **替换**纳指为标普 | 无 | 11→11 |
**002实验聚焦**:评估标的特性变化对策略绩效的影响(无类内切换干扰)
### 理论假设
```
纳指100 (NDX)
├─ 成分股100只科技龙头
├─ 风格:纯成长、高波动
├─ 动量特性:趋势强、涨跌幅大
└─ 与动量策略匹配度:高
标普500 (SPX)
├─ 成分股500只大盘股
├─ 风格:价值+成长混合、中波动
├─ 动量特性:趋势相对平缓
└─ 与动量策略匹配度:中
```
---
## 2. 实验设计
### A/B组配置
| 组别 | 美股大类标的 | 其他大类 |
|------|-------------|---------|
| **A组对照组** | 纳指100 (NDX) → 513100.SH | A股2、港股2、日本1、欧洲1、商品3、固收1 |
| **B组实验组** | 标普500 (SPX) → 513500.SH | 同A组 |
---
## 3. 回测结果
### 绩效对比
| 指标 | A组纳指100 | B组标普500 | 差异 |
|------|---------------|---------------|------|
| 美股标的 | 纳指100 | 标普500 | 替换 |
| **累计收益** | **1467.35%** | 1118.77% | **-348.58%** |
| **CAGR** | **48.10%** | 42.87% | **-5.22%** |
| **Sharpe** | **2.21** | 2.08 | **-0.13** |
| MaxDD | -17.33% | **-15.14%** | **+2.18%** ✓ |
| Calmar | 2.78 | **2.83** | +0.06 |
| 日胜率 | 56.45% | 56.22% | -0.23% |
| 调仓次数 | 459次 | 475次 | +16次 |
---
## 4. 关键发现
### 发现1纳指100累计收益显著更高
```
差距分析:
├─ 累计收益差距348.58%
├─ CAGR差距5.22%
└─ 原因纳指100成长性强动量信号更明显
```
### 发现2标普500回撤控制更好
```
风险指标:
├─ MaxDD改善2.18%(标普更稳定)
├─ Calmar略优+0.06
└─ 原因标普500波动率更低成分股更多元
```
### 发现3纳指100风险调整收益更优
```
Sharpe对比
├─ 纳指1002.21
├─ 标普5002.08
└─ 纳指虽波动大,但收益补偿足够
```
### 发现4调仓次数差异不大
```
替换场景(无类内竞争):
├─ 调仓次数差:仅+16次vs 001实验+42次
└─ 证明:替换比添加更稳定
```
---
## 5. 实验结论
### 核心结论
| 维度 | 结论 |
|-----|------|
| 收益能力 | 纳指100 **显著优于** 标普500 (+348%) |
| 风险控制 | 标普500 **略优于** 纳指100 (+2.18%) |
| 风险调整收益 | 纳指100 **优于** 标普500 (Sharpe +0.13) |
| 综合评价 | **保持纳指100** |
### 策略建议
```
当前策略建议保持纳指100作为美股大类代表
理由:
1. 动量策略本质是捕捉强趋势
2. 纳指100成长股特性使其动量信号更强
3. 累计收益差距显著1467% vs 1118%
4. 标普500虽更稳定但牺牲收益太大
例外情况可能考虑标普500
├─ 风险偏好极低,优先回撤控制
├─ 牛市末期或市场不确定性高时
└─ 需要降低组合整体波动率
```
---
## 6. 与001实验对比
| 实验 | 操作 | 收益变化 | 调仓变化 |
|------|------|---------|---------|
| 001添加 | 纳指 + 标普 | -291% | +42次 |
| 002替换 | 纳指 → 标普 | -348% | +16次 |
**洞察**
- 替换场景调仓更稳定(+16 vs +42
- 但收益损失更大(无纳指成长性补偿)
---
## 7. 相关文件
| 文件 | 说明 |
|-----|------|
| `tests/experiments/ab_test_ndx_vs_spx.py` | A/B测试脚本 |
| `results/ab_test_ndx_vs_spx.csv` | 测试结果数据 |
---
## 8. 后续研究方向
1. **纳指100 vs 其他美股成长指数**如罗素1000成长、MSCI美国成长
2. **不同市场周期表现**:牛市、熊市分别测试纳指和标普效果
3. **动态切换机制**:根据市场状态动态选择纳指或标普
---
*实验记录版本: v1.0*
*最后更新: 2026-05-06*

View File

@@ -0,0 +1,45 @@
# 实验记录索引
本目录用于保存 ETF 轮动策略研究中的有洞察的实验结果。
---
## 实验列表
| 编号 | 实验名称 | 日期 | 类型 | 核心发现 |
|------|---------|------|------|---------|
| [001](001_same_category_expansion_ab_test.md) | 同大类扩充对轮动策略的影响 | 2026-05-06 | A/B测试 | 添加同大类标的不增加跨类分散,反而因切换成本侵蚀收益 |
| [002](002_ndx_vs_spx_replacement.md) | 纳指100 vs 标普500替换对比 | 2026-05-06 | A/B测试 | 纳指100优于标普500收益+348%Sharpe+0.13),成长风格更适合动量 |
---
## 文档命名规范
```
格式: {编号}_{实验主题}.md
示例:
- 001_same_category_expansion_ab_test.md # 同大类扩充实验
- 002_new_category_diversification.md # 新大类分散化实验
- 003_rebalance_threshold_tuning.md # 调仓阈值调优实验
```
---
## 实验文档模板
每个实验文档应包含以下章节:
1. **实验信息** - 编号、日期、类型、研究问题
2. **实验背景** - 理论假设、研究动机
3. **实验设计** - A/B组配置、关键变量
4. **回测结果** - 数据、绩效对比表格
5. **关键发现** - 核心洞察、数据支撑
6. **实验结论** - 假设验证结果、策略建议
7. **技术修复记录** - 实验过程中发现的技术问题
8. **相关文件** - 脚本、数据文件引用
9. **后续研究方向** - 待探索的问题
---
*目录创建日期: 2026-05-06*