4.0 KiB
4.0 KiB
仓位分配逻辑修改分析
一、修改背景
问题:当选出的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只时,100%风险集中在单一标的
- ❌ 收益波动不稳定:不同仓位状态下波动率差异大
新逻辑优势
- ✅ 稳定风险敞口:每只标的固定33.3%权重
- ✅ 现金避险机制:空缺仓位用现金替代,降低风险
- ✅ 符合策略意图:严格按动量筛选,负分标的过滤后缺位用现金填充
七、结论与建议
当前状态
修改已生效,commit: 444dc0e refactor(execution): 改为固定仓位分配逻辑
验证建议
- 对比两种逻辑在不同市场环境下的表现
- 分析固定仓位对回撤控制的效果
- 评估现金替代部分的收益损失是否值得风险降低
改进方向
如果需要进一步提升收益,可考虑:
- 降低
min_score阈值(如-0.5),允许轻度负分标的参与 - 增加"相对动量"逻辑:即使负分,大类排名靠前也保留
- 添加分散度约束:强制保持至少2只标的,避免单一标的风险
八、相关文件
framework/execution/__init__.py- BacktestExecutor 收益计算strategies/shared/signals/selectors.py- TopNSelector 选股逻辑strategies/rotation/config.yaml- min_score 配置