4.7 KiB
4.7 KiB
科创板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股版 | 创业板指 + 科创板指 |
回测参数:
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
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股配置收益下降的原因:
- 组内竞争:创业板和科创板同为高波动A股资产,在同一组内竞争出线名额
- 信号稀释:资产池从11个增至12个,优质信号被稀释
- 相关性高:创业板与科创板走势高度相关,分散化效果有限
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