diff --git a/docs/experiments/011_kcb_etf_integration_test.md b/docs/experiments/011_kcb_etf_integration_test.md new file mode 100644 index 0000000..ee01e85 --- /dev/null +++ b/docs/experiments/011_kcb_etf_integration_test.md @@ -0,0 +1,172 @@ +# 科创板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` \ No newline at end of file