Files
etf/docs/experiments/仓位分配逻辑修改分析.md
aszerW e0d6f81ea1 docs: 仓位分配逻辑修改分析文档
- 记录动态权重vs固定仓位逻辑对比
- 分析收益下降原因(4479%→1678%)
- 说明固定仓位设计意义与改进方向
2026-05-16 00:31:14 +08:00

4.0 KiB
Raw Blame History

仓位分配逻辑修改分析

一、修改背景

问题当选出的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 配置