BOCPD 参数调优:适配分钟级快进快出交易
BOCPD 参数调优:适配分钟级快进快出交易
日期:2026-03-11
涉及文件:src/trading/momentum_filter.py
关联设计文档:docs/开仓动量过滤器设计方案_v5.1.md
1. 背景
1.1 问题现象
2026-03-11 00:07:18 出现一条硬拦截日志:
🚫 动量过滤(硬拦截) | KAS/USDC:USDC|XRP/USDC:USDC long | alt腿: Layer0-BOCPD趋势机制: P(trending)=1.194>0.75
从 KAS 5 分钟 K 线图观察,00:07 前后价格在 0.0300~0.0306 区间震荡,并无明显趋势。属于误杀(假阳性)。
1.2 根因分析
原始参数是按小时级交易设计的,与本系统的实际特征不匹配:
| 维度 | 原始参数假设 | 系统实际 |
|---|---|---|
| 持仓周期 | 数小时 | 大部分 ≤30 分钟(6 根 5min K 线) |
| 信号来源 | 长周期趋势 | 短暂价差异常(暴跌/暴涨导致的协整偏离) |
| 需要的遗忘速度 | 慢(记住数小时前的趋势) | 快(1 小时前的趋势已无关) |
具体到 KAS case:
- 16:30→22:30 存在一段约 6 小时的持续下跌(~0.0308→0.0300)
- 原始
hazard_rate=0.01(期望机制长度 8.3 小时),导致 BOCPD 在 00:07 仍未"翻篇" - 原始
drift_threshold=0.0002过于敏感,微小波动即被判为趋势 P(trending)=1.194超过 1.0,存在数值溢出 bug
2. 参数变更
2.1 变更总览
| 参数 | 变更前 | 变更后 | 影响范围 |
|---|---|---|---|
hazard_rate |
0.01 | 0.05 | _BOCPD.__init__、MomentumFilter.__init__ |
drift_threshold |
0.0002 | 0.0005 | _BOCPD.__init__、MomentumFilter.__init__ |
max_run |
200 | 60 | _BOCPD.__init__、MomentumFilter._update_internals |
trend_probability 返回值 |
无 clamp | clamp [0, 1] | _BOCPD.trend_probability |
2.2 hazard_rate:0.01 → 0.05
含义:每根 K 线发生机制切换(变点)的先验概率。
推导:
期望机制长度 = 1 / hazard_rate
0.01 → 100 根 = 8.3 小时 ← 原始:记忆太长,数小时前的趋势仍在影响
0.05 → 20 根 = 1.7 小时 ← 调整后:趋势结束 ~30 分钟即可翻篇
为什么是 0.05 而不是更大?
- 0.03(2.8h):可接受但偏慢,趋势结束后仍需 ~1 小时才能遗忘
- 0.05(1.7h):匹配 ≤30 分钟持仓节奏,翻篇速度与交易频率一致
- 0.10(50min):过于敏感,真实趋势还没确认就被重置,漏报率高
2.3 drift_threshold:0.0002 → 0.0005
含义:判定为"有经济意义的漂移"的最小 5 分钟对数收益率阈值。BOCPD 检测每段机制的均值漂移 |μ_r| 是否超过此值。
推导:
30 分钟累积影响 = drift_threshold × 6 根
0.0002 × 6 = 0.12% ← 原始:对 30 分钟配对交易几乎无损,但频繁触发拦截
0.0005 × 6 = 0.30% ← 调整后:30 分钟累积 0.3%,开始对配对交易有实质影响
0.001 × 6 = 0.60% ← 过高:真正危险的趋势也会被放过
2.4 max_run:200 → 60
含义:BOCPD 维护的最大运行长度(追踪多远的历史)。
推导:
200 根 = 16.7 小时 ← 原始:对分钟级交易毫无意义,浪费计算
60 根 = 5.0 小时 ← 调整后:覆盖所有相关历史绰绰有余
额外收益:
- 计算量降低 70%(每次 update 从 O(200) → O(60))
- 截断更早 → 归一化更稳定 → 修复
P(trending) > 1的根源
2.5 trend_probability clamp
问题:max_run 截断后重归一化存在浮点累积误差,极端情况下 P(trending) 可能略超 1.0(如 KAS case 的 1.194)。
修复:
# 修改前
return total
# 修改后
return min(1.0, max(0.0, total))
3. 对 KAS case 的预期效果
原始参数下的时间线:
16:30 ──── 下跌开始 ──── 22:30 ──── 转为震荡 ──── 00:07
↑
P(trending)=1.194 → 误杀
调整后:
16:30 ──── 下跌开始 ──── 22:30 ──── 转为震荡 ──── 23:00~23:30
↑
H=0.05 → ~30min 内翻篇
00:07
↑
震荡已持续 1.5h
P(trending) 回落至低位 → 放行
4. 参数联动影响
BOCPD 的 trend_prob 通过跨层共享机制影响 Layer 1 和 Layer 2:
Layer 0 输出 trend_prob
├→ Layer 2 CUSUM 阈值修正:trend_prob > 0.5 时降低阈值(更严格)
└→ Layer 1 ER 阈值修正:trend_prob > 0.5 时降低阈值(更严格)
参数调整后 trend_prob 整体偏低(震荡时更快回落),Layer 1/2 的跨层修正幅度也会相应减小,整体拦截率略有下降。这与"分钟级快进快出、减少误杀"的目标一致。
5. 参数对照速查
# ── 调整前(小时级交易) ──
_BOCPD(hazard_rate=0.01, max_run=200, drift_threshold=0.0002)
# 期望机制 8.3h | 追踪 16.7h | 漂移灵敏度 0.02%/根
# ── 调整后(分钟级快进快出) ──
_BOCPD(hazard_rate=0.05, max_run=60, drift_threshold=0.0005)
# 期望机制 1.7h | 追踪 5.0h | 漂移灵敏度 0.05%/根
6. 后续观察建议
- 监控调整后的硬拦截率变化:预期下降,但不应降为 0(仍需拦住真趋势)
- 关注是否出现漏拦截的 case:真实趋势中开仓导致亏损
- 如果漏报增多,可微调
hazard_rate至 0.03~0.04(在灵敏度和稳定性间进一步平衡) P(trending)不应再出现 >1 的情况(已 clamp 修复)