# 科创板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`