设计文档: 新增正收益beta EMA约束条件
设计文档: 新增正收益beta EMA约束条件
Context
当前开仓信号由负收益率K线的beta序列驱动(strategy.py:_calculate_beta_series()),仅筛选 ETH return < 0 的K线计算beta。用户要求新增正收益率K线的beta计算,并用正负收益beta的EMA对比作为开仓拦截条件:如果负收益beta的EMA >= 正收益beta的EMA,则拦截开仓(即ETH下跌放大效应超过或等于上涨放大效应时,不宜做多)。
修改文件
1. src/trading/strategy.py
a) 新增 _calculate_positive_beta_series() 方法(约在 _calculate_beta_series 之后)
- 逻辑与
_calculate_beta_series()镜像,但筛选eth_bar.return_pct > 0 - BTC return <= 0 时(ETH涨BTC跌,弱相关),beta 封顶 3.0
- BTC return > 0 时,beta =
eth_return / btc_return - 同样使用
negative_return_count(10) 作为数量要求,max_lookback_bars(100) 作为回溯上限 - 返回
list[float] | None(不足10个返回 None)
b) 修改 check_signal() 方法(~line 92-138)
在现有两个条件检查之后,新增:
- 调用
_calculate_positive_beta_series()获取正收益beta序列 - 若序列为 None(正收益K线不足10根),跳过此约束,不拦截
- 计算
positive_ema_beta = EMA(positive_betas, span=ema_span)和positive_mean_beta = mean(positive_betas) - 新增条件3:
cond_positive_beta = ema_beta < positive_ema_beta(负收益EMA严格小于正收益EMA才放行) - 三个条件全部满足才触发开仓信号
c) 更新 EntrySignal dataclass(~line 26-31)
新增字段:
positive_ema_beta: float— 正收益beta的EMApositive_mean_beta: float— 正收益beta的mean(备用)
d) 更新日志输出
check_signal()内的日志增加条件3状态和正收益beta值get_signal_snapshot()增加positive_ema_beta、positive_mean_beta、cond_positive_beta字段
2. src/trading/orchestrator.py
_log_signal_status() 方法(~line 234-291)
- 日志中增加正收益beta EMA的显示(如果 snapshot 中有该字段)
不需要修改的文件
config.py— 复用现有negative_return_count(10) 和ema_span(5),无需新增配置orchestrator.py的开仓执行逻辑 — 仅消费EntrySignal,无需改动risk_manager.py— 此约束在策略层实现,不涉及风控层
验证
- 日志中应能看到
条件3(负EMA<正EMA)的 ✅/❌ 状态 - 当负收益beta EMA >= 正收益beta EMA 时,开仓信号不触发
- 当正收益K线不足10根时,条件3默认通过,不阻断
get_signal_snapshot()返回的 dict 中包含positive_ema_beta、positive_mean_beta