diff --git a/docs/experiments/仓位分配逻辑修改分析.md b/docs/experiments/仓位分配逻辑修改分析.md new file mode 100644 index 0000000..2e712ef --- /dev/null +++ b/docs/experiments/仓位分配逻辑修改分析.md @@ -0,0 +1,130 @@ +# 仓位分配逻辑修改分析 + +## 一、修改背景 + +**问题**:当选出的Top3动量标的中存在得分小于0的标的时,仓位如何分配? + +**原逻辑**:按实际持仓数量等权分配,选出2只时每只权重50%,选出1只时权重100%。 + +**问题分析**:原逻辑在标的数量不足时放大了风险敞口,不符合"严格按动量筛选,不满仓则部分现金"的策略意图。 + +--- + +## 二、修改内容 + +**修改文件**:`framework/execution/__init__.py` + +**修改方法**: +- `_calculate_daily_returns()` - 收益计算逻辑 +- `_apply_trade_cost()` - 交易成本计算逻辑 + +--- + +## 三、核心逻辑对比 + +| 方面 | 原逻辑(动态权重) | 新逻辑(固定仓位) | +|------|---------------------|---------------------| +| **仓位分配** | 按实际持仓数量等权 | 按 `select_num` 固定等权 | +| **权重公式** | `weight = 1 / len(codes)` | `weight = 1 / select_num` | +| **缺失处理** | 无缺失概念 | 缺失仓位用现金替代 | +| **收益计算** | `np.mean(returns)` | `sum(ret × unit_weight)` | + +--- + +## 四、具体示例(select_num=3) + +### 仓位分配对比 + +| 场景 | 原逻辑权重分配 | 新逻辑权重分配 | +|------|----------------|----------------| +| **选出3只** | 每只 33.3% | 每只 33.3% + 现金 0% | +| **选出2只** | 每只 **50%** ← 放大! | 每只 33.3% + 现金 **33.3%** | +| **选出1只** | **100%** ← 极度放大! | 33.3% + 现金 **66.7%** | +| **空仓** | 无收益 | 现金 100% | + +### 收益计算示例 + +假设某日选出2只标的,纳指涨+2%,日经涨+1%: + +| 逻辑 | 计算方式 | 收益结果 | +|------|----------|----------| +| **原逻辑** | `(2% + 1%) / 2` | **1.5%** | +| **新逻辑** | `(2% + 1%) / 3 + 0` | **1.0%** | +| **差异** | - | **-0.5% (-33%)** | + +假设某日选出1只标的,纳指涨+2%: + +| 逻辑 | 计算方式 | 收益结果 | +|------|----------|----------| +| **原逻辑** | `2% / 1` | **2%** | +| **新逻辑** | `2% / 3 + 0 + 0` | **0.67%** | +| **差异** | - | **-1.33% (-67%)** | + +--- + +## 五、回测结果对比 + +| 指标 | 原逻辑 | 新逻辑 | 变化 | +|------|--------|--------|------| +| 累计收益 | 4479.14% | 1677.51% | **↓62.6%** | +| 最终净值 | 45.79 | 17.78 | **↓61.2%** | + +### 收益下降原因分析 + +**数据统计**: +- 总回测天数:3501天 +- 持有3只标的:3213天(91.8%) +- 持有2只标的:263天(7.5%) +- 持有1只标的:25天(0.7%) + +**影响测算**: +- 8.2%时间(288天)持有少于3只标的 +- 原逻辑在这些天放大权重: + - 2只时:权重从33.3%→50%,波动放大50% + - 1只时:权重从33.3%→100%,波动放大200% +- 新逻辑保持固定权重,空缺部分现金收益为0 + +--- + +## 六、设计意义 + +### 原逻辑问题 + +1. ❌ **风险敞口不稳定**:标的数量不足时风险放大 +2. ❌ **单标的集中风险**:选出1只时,100%风险集中在单一标的 +3. ❌ **收益波动不稳定**:不同仓位状态下波动率差异大 + +### 新逻辑优势 + +1. ✅ **稳定风险敞口**:每只标的固定33.3%权重 +2. ✅ **现金避险机制**:空缺仓位用现金替代,降低风险 +3. ✅ **符合策略意图**:严格按动量筛选,负分标的过滤后缺位用现金填充 + +--- + +## 七、结论与建议 + +### 当前状态 + +修改已生效,commit: `444dc0e refactor(execution): 改为固定仓位分配逻辑` + +### 验证建议 + +1. 对比两种逻辑在不同市场环境下的表现 +2. 分析固定仓位对回撤控制的效果 +3. 评估现金替代部分的收益损失是否值得风险降低 + +### 改进方向 + +如果需要进一步提升收益,可考虑: +- 降低 `min_score` 阈值(如-0.5),允许轻度负分标的参与 +- 增加"相对动量"逻辑:即使负分,大类排名靠前也保留 +- 添加分散度约束:强制保持至少2只标的,避免单一标的风险 + +--- + +## 八、相关文件 + +- `framework/execution/__init__.py` - BacktestExecutor 收益计算 +- `strategies/shared/signals/selectors.py` - TopNSelector 选股逻辑 +- `strategies/rotation/config.yaml` - min_score 配置 \ No newline at end of file