Files
etf/docs/experiments/20260621_011_科创板ETF接入测试.md

172 lines
4.7 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. 背景描述
### 问题发现
在轮动策略回测中,尝试将科创板指数(000688.SH)作为A股风险资产替代创业板时数据获取失败
```
x 588000.SH: HTTP 404
```
### 根因分析
数据源 `tushare_source.py` 中的 `_is_etf_code()` 方法仅识别以下ETF代码前缀
- `51xxxx.SH` (上交所ETF)
- `52xxxx.SH` (上交所ETF)
- `15xxxx.SZ` (深交所ETF)
- `16xxxx.SZ` (深交所ETF)
科创板ETF代码格式为 `58xxxx.SH`不在识别列表中导致Tushare API无法正确识别ETF类型。
---
## 2. 实验设置
### 2.1 数据源修复验证
**测试内容**验证Tushare是否支持科创板ETF数据获取
**测试代码**:使用 `.env` 中的 TUSHARE_TOKEN 直接调用 Tushare API
**测试标的**
| 标的 | 类型 | 代码 |
|------|------|------|
| 科创50ETF | ETF | 588000.SH |
| 科创板指 | 指数 | 000688.SH |
| 其他科创板ETF | ETF | 588080.SH, 588050.SH, 588060.SH |
### 2.2 收益对比实验
**对比场景**
| 版本 | A股风险资产配置 |
|------|----------------|
| 创业板版(基准) | 仅创业板指(399006.SZ) |
| 科创板版(测试) | 仅科创板指(000688.SH) |
| 双A股版 | 创业板指 + 科创板指 |
**回测参数**
```yaml
backtest:
start_date: '2020-01-10'
factor:
n_days: 25
type: slope_r2
rotation:
select_num: 1
weight: rank
diversified: true
```
---
## 3. Commit代码版本
### 修复提交
```
7f2a968 fix(datasource): ETF代码识别支持科创板(58)和沪市新ETF(56)前缀
```
### 修改内容
文件:`datasource/tushare_source.py`
```python
def _is_etf_code(self, code: str) -> bool:
"""判断是否为ETF代码"""
# ETF代码51xxxx.SH, 52xxxx.SH, 56xxxx.SH, 58xxxx.SH(科创板), 15xxxx.SZ, 16xxxx.SZ
import re
if not re.match(r'^\d{6}\.(SZ|SH)$', code):
return False
prefix = code[:2]
return prefix in ['51', '52', '56', '58', '15', '16']
```
**新增前缀**
- `58` - 科创板ETF (如 588000.SH 科创50ETF)
- `56` - 沪市新ETF (如 560150.SH 红利低波ETF泰康)
---
## 4. 实验结果
### 4.1 数据源验证结果
| 标的代码 | 数据条数 | 状态 |
|---------|---------|------|
| 588000.SH | 1355 rows | ✅ 成功 |
| 000688.SH | 1565 rows | ✅ 成功 |
| 588080.SH | 1355 rows | ✅ 成功 |
**结论**Tushare `fund_daily` 接口完全支持科创板ETF数据获取问题在于项目代码识别逻辑。
### 4.2 收益对比结果
| 指标 | 创业板版 | 科创板版 | 双A股版 |
|------|---------|---------|---------|
| **年化收益率** | 48.51% | 45.00% | **38.95%** |
| **累计收益率** | 1053.08% | 894.46% | **664.12%** |
| **最大回撤** | -26.33% | -26.33% | -26.80% |
| **夏普比率** | 1.34 | 1.27 | **1.14** |
| **卡尔曼比率** | 1.84 | 1.71 | **1.45** |
| **胜率** | 54.91% | 55.06% | 54.56% |
| **调仓次数** | 182 | 189 | 205 |
### 4.3 收益差异分析
| 对比项 | 年化收益差异 | 累计收益差异 |
|--------|------------|------------|
| 创业板版 vs 科创板版 | -3.51% | -158.62% |
| 创业板版 vs 双A股版 | **-9.56%** | **-388.96%** |
| 科创板版 vs 双A股版 | -6.05% | -230.34% |
---
## 5. 结论与建议
### 5.1 代码层面结论
**修复有效**:添加 `58``56` 前缀后科创板ETF数据获取成功
### 5.2 配置层面结论
**不建议科创板替代创业板**
- 创业板版年化收益 48.51% > 科创板版 45.00%
**不建议创业板+科创板双配置**
- 双A股版收益最低38.95%),比创业板版下降 9.56%
### 5.3 原因分析
双A股配置收益下降的原因
1. **组内竞争**创业板和科创板同为高波动A股资产在同一组内竞争出线名额
2. **信号稀释**资产池从11个增至12个优质信号被稀释
3. **相关性高**:创业板与科创板走势高度相关,分散化效果有限
### 5.4 最终建议
| 配置方案 | 推荐程度 | 年化收益 |
|---------|---------|---------|
| **创业板单配置** | ✅ 推荐 | 48.51% |
| 科创板单配置 | ⚠️ 不推荐 | 45.00% |
| 创业板+科创板双配置 | ❌ 不推荐 | 38.95% |
---
## 6. 附录
### ETF代码前缀完整列表
| 前缀 | 交易所 | 类型 | 示例 |
|------|-------|------|------|
| 51 | 上交所 | ETF | 518880.SH (黄金ETF) |
| 52 | 上交所 | ETF | 520030.SH |
| 56 | 上交所 | 新ETF | 560150.SH (红利低波ETF泰康) |
| 58 | 上交所 | 科创板ETF | 588000.SH (科创50ETF) |
| 15 | 深交所 | ETF | 159915.SZ (创业板ETF) |
| 16 | 深交所 | ETF | 160723.SZ (原油ETF) |
### 相关文件
- 修复代码:`datasource/tushare_source.py#L326-L333`
- 配置文件:`rotation/config_simple.yaml`
- 实验结果:`rotation/results/cyb_kcb_dual/comparison_*.json`