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 修复)

Read more

跑步的技巧(滚动落地)

“滚动落地(rolling contact / rolling foot strike)”不是一种教条式的“脚法”,而是一种 让冲击沿着整只脚、整条后链逐级传递的落地机制。 它的核心不是“你先用哪儿着地”,而是: 你的脚落地之后,冲击是不是像轮子一样滚过去,而不是像锤子一样砸下去。 这就是滚动落地的本质。 一、什么叫“滚动落地”? 你可以把它理解成两种完全不同的落地方式: 1. 砸地(撞击式) 脚像锤子一样拍到地上: * 要么后跟先砸 * 要么前掌先戳 * 冲击集中在一个点 * 一个结构瞬间吃掉大部分载荷 结果就是: * 后跟砸 → 膝盖难受 * 前掌戳 → 前脚掌磨烂 * 都不是长跑友好模式 这叫 撞击式着地(impact strike)。 2. 滚地(滚动式) 脚像轮胎一样“滚”过地面: * 不是某一点硬砸 * 而是外侧中足先轻触 * 再向前滚到前掌 * 最后从大脚趾蹬离

By SHI XIAOLONG

AMI的优越性

世界模型(World Models)的具体例子 如下,我按类型分类,便于理解。每类都附带实际实现、演示效果和应用场景。 1. Yann LeCun / Meta 的 JEPA 系列(最直接对应“世界模型”概念) 这些是 LeCun 主张的非生成式抽象预测世界模型代表。 * I-JEPA(Image JEPA,2023) 输入一张图像,模型把不同区域(context 和 target)编码成抽象表示,然后预测 target 的表示(不在像素级别重建)。 例子:给定一张遮挡了部分物体的图片,模型能预测“被遮挡物体的大致位置和属性”,构建对物体持久性和空间关系的理解。 这是一个“原始世界模型”,能学习物理常识(如物体不会凭空消失)。 * V-JEPA / V-JEPA 2(Video JEPA,

By SHI XIAOLONG

什么是:“世界模型(World Models)”

世界模型(World Models) 是人工智能领域的一个核心概念,尤其在 Yann LeCun 等研究者推动的下一代 AI 架构中占据中心位置。它指的是 AI 系统在内部构建的对现实世界的抽象模拟或内部表示,让机器能够像人类或动物一样“理解”物理世界、预测未来、规划行动。 简单比喻 想象你闭上眼睛也能“看到”房间里的物体会如何移动、碰撞或掉落——这就是你大脑里的世界模型。AI 的世界模型就是类似的“数字孪生”(digital twin)或“内部模拟器”:它不是简单记住数据,而是学习世界的动态、因果关系和物理直觉(如重力、物体持久性、遮挡、因果等)。 为什么需要世界模型? 当前主流的大型语言模型(LLM) 擅长处理文本(统计模式预测),但存在根本局限: * 缺乏对物理世界的真正理解 → 容易“幻觉”、无法可靠规划。 * 样本效率低 → 人类/

By SHI XIAOLONG

K线周期可配置化设计方案

K线周期可配置化设计方案 1. 背景与目标 当前 Beta 套利策略的 K 线周期硬编码为 "1h",分散在多个文件中。需要: 1. 将 K 线周期从 1h 改为 2h 2. 提取为环境变量 BETA_ARB_KLINE_INTERVAL,使其可在 .env 中配置 2. 影响范围分析 2.1 需要修改的文件(共 6 个) 文件 硬编码位置 修改内容 src/trading/config.py BetaArbConfig dataclass 新增 kline_interval 字段,

By SHI XIAOLONG