| name | bb-scalper |
| description | BB 双向套利策略:加密合约 10x 杠杆布林带均值回归。布林带收窄=横盘→在下轨买、上轨卖;三重过滤器(1h趋势/RSI/BB甜区)确认碗平放,轨对轨止盈(RR 2:1~4:1)。含实时WebSocket模拟盘(paper)、历史回测(simulate/backtest_daily)、币安永续实盘CLI(trade_exec)。触发:'bb套利'、'布林带'、'bollinger'、'横盘策略'、'NEAR'、'回测'、'模拟盘'、'paper trading'。 |
| author | Daniel Li |
🎯 BB 双向套利策略 — 完整策略文档
版本: v2.0 三重过滤 | 更新: 2026-08-11
定位: 加密合约 10x 杠杆双向套利 Skill
适配币种: USDT 永续合约(主流优先)
零、一句话说清楚
布林带收窄 = 横盘震荡 → 在下轨买、上轨卖;在上轨卖、下轨买。
不赌方向,只吃区间振荡的统计优势。
一、策略直觉:硬币在碗里滚
想象一个碗——左边是下轨、右边是上轨。硬币在里面滚来滚去:
上轨 ═══════════ 🔴 做空入场 ────
│ │
│ 价格在碗里来回弹 │
│ │
下轨 ═══════════ 🟢 做多入场 ─────
做多逻辑:硬币滚到碗左边(%B < 0.15)→ 大概率弹回去 → 买入,等它滚到右边再卖
做空逻辑:硬币滚到碗右边(%B > 0.85)→ 大概率弹回去 → 卖出,等它滚到左边再买
但市场的碗会变形——有时变窄(没空间赚)、有时倾斜(趋势中不能做)。所以需要三重过滤器确认碗是稳定平的。
二、核心数学:为什么「轨对轨」是唯一解
❌ 错误方案:止盈放中轨(我们踩的第一个坑)
做多: 入场=下轨 → 止盈=中轨 → 收益=1σ
止损=下轨下面 → 风险=1σ + 缓冲
RR = 1σ / (1σ + 0.15%) < 1 ← 永远亏多赚少!
扫了 20 个币,15 个在震荡,RR 没一个超过 1.1。 数学死结,不是参数问题。
✅ 正确方案:轨对轨(解法一)
做多: 入场=下轨 → 止盈=上轨 → 收益=2σ
止损=下轨外 0.15% → 风险 ≈ 1σ + 0.15%
RR = 2σ / (1σ + 0.15%) ≈ 2:1 到 4:1 ✅
一句话:止盈必须放到对侧轨道——吃整个区间,而不是只吃到中轨。
三、三重过滤器(v2.0 核心)
🔴 过滤器一:趋势过滤
检查:1h K 线的布林带中轨斜率
做多: 1h 中轨不能明显下行(斜率 > -0.06%)
做空: 1h 中轨不能明显上行(斜率 < +0.06%)
斜率 < 0.03% = 走平 ✅ 最优
斜率 0.03%-0.06% = 弱趋势,顺方向可以做
斜率 > 0.06% = 明确趋势,禁止逆势
为什么:碗底在下陷 → 硬币碰到底不会弹 → 假突破扫止损。趋势过滤就是确认碗是平放的。
实际效果:刚才扫码,ETH/SOL/BTC/INJ 四个币做空信号全被「1h 中轨上行」拦下——这些恰好是 v1.0 里连续止损 6-8 根的元凶。
🟡 过滤器二:RSI 确认
检查:价格是否已经超买/超卖
做多: RSI < 55 才做(不在高位接盘)
RSI 30-45 加分(超卖反弹概率大)
做空: RSI > 45 才做(不在低位砸盘)
RSI 55-70 加分(超买回落概率大)
直觉:下轨 + RSI 70 = 趋势刚启动、还会继续跌,买就是接飞刀。
🟢 过滤器三:BB 甜区
检查:布林带宽度是否合适
< 0.8%: 太窄 → 10x 利润不够覆盖滑点+手续费 → 跳过
0.8-2.5%: 甜区 → 可以做
> 2.5%: 太宽 → 不是真横盘,是波动行情 → 跳过
各币宽度速查:
| 宽度 | 币种例子 | 判断 |
|---|
| 0.71% | XRP | ❌ 太窄 |
| 0.87% | BTC | ⚠️ 刚够线 |
| 0.88% | AVAX | ✅ 甜区 |
| 1.13% | NEAR | ✅ 甜区中心 |
| 2.75% | ATOM | ❌ 太宽 |
| 47.5% | TUT | ❌ 崩溃行情 |
四、动态宽度适配(🎯 进阶)
当前固定甜区 0.8-2.5%。但能否根据 BB 宽度动态调整而非一刀切?
分析
BB宽度 1%: 10x 杠杆 → 轨对轨 10% 收益 | 止损 1.5% | RR 6.7:1
BB宽度 2%: 10x 杠杆 → 轨对轨 20% 收益 | 止损 2.3% | RR 8.7:1
BB宽度 3%: 10x 杠杆 → 轨对轨 30% 收益 | 止损 3.2% | RR 9.4:1
RR 数字看上去更好看,但物理上不成立:
-
宽度越大 → 越不是真横盘。3% 宽度的振荡区间,价格从下轨走到上轨需要更多时间 → 中途转向概率大增 → 实际胜率暴跌
-
止损距离变大。0.15% × 3% = 更大的绝对止损 → 单笔亏损变大 → 连续止损的杀伤力更大
-
市场在 2-3% 宽度时通常不是 RANGING,是 TRENDING 的早期阶段——RSI 已经给出方向,趋势过滤大概率拒掉
结论
| BB 宽度 | 状态 | 策略结论 |
|---|
| < 0.8% | 太窄 | 不做。等待 BB 张口。 |
| 0.8-1.5% | 最优 | NEAR 级别,标准策略 |
| 1.5-2.5% | 可做 | 接受更低胜率(~25-30%),但 RR 更高 |
| 2.5-4% | 观望 | 等收窄到 2.5% 以下再入场 |
| > 4% | 不做 | 波动行情,非套利模式 |
建议:当前 v2.0 的 0.8-2.5% 甜区是最优的——已经覆盖了最稳定的横盘区间。拓宽到 3-4% 会引入大量假信号,反而降低净收益。先在小范围验证,数据说话。
五、回测数据
表现汇总
| 币种 | 回测期 | 信号 | 胜率 | 均盈 | 均亏 | 累计 PnL |
|---|
| NEAR | 168h | 31 | 35% | +13.2% | -2.5% | +95.4% |
| DOGE | 72h | 9 | 44% | +7.8% | -2.5% | +18.6% |
| INJ | 72h | 13 | 23% | +11.3% | -2.5% | +9.0% |
TUTUSDT 反例
| 指标 | TUTUSDT | NEARUSDT |
|---|
| BB 宽度 | 47.5% | 1.13% |
| 信号数 | 100 | 31 |
| 胜率 | 1% | 35% |
| 本金 $100 | $-69(穿仓) | +$95 |
| 死因 | 宽度超大 + 单边下跌 = 被 BB 伪信号反复止损 | |
六、交易参数表
| 参数 | 值 | 说明 |
|---|
| BB 周期 | 20 | 20 根 K 线 |
| BB 标准差 | 2.0 | 2σ 布林带 |
| 入场触发 | %B < 0.15 (做多) / > 0.85 (做空) | 价格逼近轨道 |
| 止盈 | 对侧轨道(轨对轨) | 2σ 空间 |
| 止损 | 入场轨外 0.15% | 紧止损 |
| 杠杆 | 10x | 固定 |
| 单笔风险 | 2% of 本金 | |
| 最大仓位 | $100 名义价值 | |
| SL 冷却 | 连续止损后 3 根 K 线 | 防集群止损 |
| 最大持仓 | 12 根 K 线(3h) | 超时强制平仓 |
七、脚本框架
projects/bb-scalper/
├── SKILL.md ← 你正在读的(策略文档)
├── cli/
│ ├── kline_fetch.py → 查询合约 K 线数据
│ ├── trade_exec.py → 对接币安交易接口(入场/止盈/止损)
│ ├── trade_log.py → 记录 + 统计交易记录
│ └── simulate.py → 模拟交易(不实际下单)
├── core/
│ ├── strategy.py → 策略核心逻辑(BB + 三重过滤)
│ └── filters.py → 趋势/RSI/甜区过滤器
└── config.yaml → 可调参数(甜区/杠杆/仓位等)
CLI 接口设计
python cli/kline_fetch.py --symbol NEARUSDT --interval 15m --limit 100
python cli/kline_fetch.py --scan
python cli/trade_exec.py --symbol NEARUSDT --side LONG \
--entry 1.592 --tp 1.610 --sl 1.589 --qty 6
python cli/trade_log.py --list
python cli/trade_log.py --summary
python cli/trade_log.py --export-csv trades.csv
python cli/simulate.py --symbol NEARUSDT --hours 168
python cli/simulate.py --paper
八、风险说明
| 风险 | 应对 |
|---|
| 假突破扫止损(65%频率) | 紧止损(-2.5%),小亏频繁但不致命 |
| 大行情打破区间 | 趋势过滤拦截 + 冷却机制 |
| 滑点(止损跳空) | 仅做主流合约(USDT 永续流动性好) |
| 手续费 | 轨对轨利润(~10%)远大于手续费(0.04%) |
| 过度交易 | 三重过滤 ≥ 筛掉 60% 噪音信号 |
九、使用原则
- 仅用于横盘震荡市场。趋势行情中 BB 套利 = 送钱。
- 模拟盘验证优先。先用
simulate.py --paper 跑一周,确认表现再实盘。
- 分散币种。不要只押一个币,NEAR/AVAX/INJ 各分一部分。
- 每次执行前跑一次 scan。确认三重过滤仍然通过。
- 当 BB 宽度 > 4% 或 RSI 极端时暂停。等市场平静再入场。
十、选币准则(月/周线过滤,🎯 2026-08-11 验证)
从 30/60/90 天回测 + 月线/周线分析得出。选币比参数更重要——同样策略,
横盘质量好的币月赚 500-1400%,差的币回撤 50%+ 拿不住。
核心规律
- 「月线震荡」≠「适合」。ETH/LINK 月净向≈0 但月振幅 44-49%,是"大振幅波动"不是"横盘"——BB 套利照样反复止损(ETH 90 天回撤 53%)。
- 真横盘 = 小振幅 + 温和方向。月线振幅 < 50% 且 |净向| < 25% 才适合。
- 振幅比方向更重要。月振幅 < 40% 的币(BTC/BNB)回撤天然低;月振幅 > 100%(NEAR 168%)波动大,短期好长期回撤飙。
- 高回撤 ≠ 高收益可接受。LINK(+739%回撤57%)/ARB(+636%回撤50%)/LTC(+401%回撤61%)——实盘会腰斩,多数人拿不住。
选币评分表(按月线)
| 月线特征 | 判断 | 示例 |
|---|
| 振幅 < 40% + |净向| < 15% | ✅ 首选,横盘最稳 | BTC / BNB |
| 振幅 < 50% + |净向| < 25% | ✅ 适合 | SOL / XRP |
| 振幅 < 60% + 单一方向下行 | ⚠️ 可做,注意趋势过滤 | DOT / ATOM |
| 振幅 > 100% 或 |净向| > 40% | ❌ 波动/趋势行情,避开 | NEAR / INJ |
| 振幅 40-50% 但 |净向|≈0 | ⚠️ 大振幅震荡,伪横盘 | ETH / LINK |
操作流程
A. 全市场扫描(🎯 2026-08-13 新增,替代手工选币)
币安 USDT 永续合约 527 个,逐个人工看太慢。用「预筛 → 深度分析 → 推荐」三级漏斗:
- 轻量预筛 527 个 → 30 个候选
- 拉币安
exchangeInfo,筛掉无流动性(24h 成交额过低)、非 USDT 永续、非 TRADING 状态的
- 筛掉价格异常(市值太小/买卖盘太薄)的币
- 只留流动性好、可交易的合约
- 深度分析 30 个 → 推荐 3-5 个
- 布林带维度:7 天 15m BB 宽度是否持续在甜区(0.8%-2.5%)且稳定(标准差低);%B 能反复触轨(<0.15 或 >0.85)
- 趋势/动量维度:7 天 1h 中轨斜率接近 0(|斜率|<0.03%);30 天净方向温和(|净向|<10%);振幅适中(10-40%);RSI 中枢 40-60
- 回测维度:跑
cli/backtest_daily.py --days 7/30,看累计 PnL 正、最大回撤 < 20%、日均交易 ≥ 2、有交易天数占比高
- 交叉验证:三个维度(布林带 + 趋势 + 回测)一致看好的币才入选;任一维度明显矛盾(如回测好但趋势强)则降级
- 启动 testnet 模拟盘:
python3 cli/paper_testnet.py --symbols <推荐币> --capital 500 跑 7 天验证
B. 月线过滤(原方法,作为补充确认)
- 拉月线(6 根)算振幅 = (最高-最低)/起点 与净向 = (现价-起点)/起点
- 筛掉振幅 > 60% 或 |净向| > 30% 的币
- 对剩余币跑
cli/backtest_daily.py --days 30 --min-daily 2 看最大回撤 < 20% 且日均交易 ≥ 2
- 每次入场前仍跑
scan 确认 15m 三重过滤通过(选币是长期过滤,15m 是入场过滤)
天枢 · 2026-08-11