源文件:research/quant_digests/2026-04-19_2132_bbtouch-oppositeband-maker-shell.md
README.md + src/perps_trading.py + tests/test_signals.py + tests/test_stop_logic.py + config/accounts.json)+ Binance USDⓈ-M 15m/5m portability probe(BTC/ETH/SOL)EMA200 还没坏时,价格短暂戳穿 Bollinger 外轨,后面更容易先回到带内、再朝对侧 band 修复一段先回答 base alpha:这篇东西的 base alpha 很清楚,是 raw alpha,而且是能直接落地成完整策略的那种。
主材料是 GitHub 仓库 vitor-chagas/dex-trading-bot(创建于 2026-03-21,Python)。repo 自己给出的核心壳很完整:
5m K 线;EMA200 上方;EMA200 下方;target_risk_pct / leverage / stop_loss_pct 算出来。这就不是“有个 signal,别的你自己补”的半成品,而是把 entry / exit / stop / maker-vs-taker / sizing / live-loop 都写出来了。
更关键的是,repo README 里把它说成“Bollinger Band mean-reversion strategy with EMA trend filter”,而源码/测试把交易逻辑拆得很干净:
tests/test_signals.py 明确测了 下轨+EMA 上方做多 / 上轨+EMA 下方做空;tests/test_stop_logic.py 明确测了 固定 stop 和 inverted band → breakeven;src/perps_trading.py 里则把这条线包成了 maker-first 的完整执行壳。对 desk 来说,真正值得 intake 的不是“又一个 BB 策略”,而是: > 顺大势、吃小过冲、用对侧 band 做动态回补退出。
15m/5m 数据上做最小 portability probe,结果显示:15m 版更稳,5m 版要给它更长一点持有窗才像真 edge。最关键的数据点(均为扣除 roundtrip 8 bps 成本后):
15m all-signals,持有 4 bars(约 1h):n=2870,mean≈+2.5 bps,胜率约 52.4%。15m all-signals,持有 8 bars(约 2h):n=2870,mean≈+4.2 bps,胜率约 54.0%。15m all-signals,持有 12 bars(约 3h):n=2870,mean≈+4.5 bps,胜率约 54.9%。5m all-signals,持有 6 bars(约 30m):n=4820,mean≈-1.2 bps,说明太快拿利润不够。5m all-signals,持有 12 bars(约 1h):n=4820,mean≈+0.8 bps,刚过盈亏平衡。5m all-signals,持有 24 bars(约 2h):n=4820,mean≈+6.4 bps,胜率约 64.1%,是这轮 probe 最像 pocket 的窗口。5m / 24-bar 分币结果:BTC≈+6.1 bps、ETH≈+3.6 bps、SOL≈+9.5 bps,说明这条线不只在 BTC 上站得住。保守一点读,这组结果在说:
15m parent shell,或者 5m 上但愿意拿到 ~2h 的顺势回归壳;这轮值得保留,不是因为“又遇到一个均值回归”,而是因为它刚好补的是我们现在需要的那种 完整策略壳:
EMA200 方向过滤;换句话说,这条线不是“解释文”,而是已经足够像一个 可实盘拆件: 你可以把 signal 留着,也可以直接把 execution/exit/sizing 抽出来给别的 mean-reversion 家族复用。
EMA200 是主过滤:只做顺势那一边;2.5%,配置里也出现 3%~4% 变体)target_risk_pct / (leverage × stop_pct) 直接算vitor-chagas/dex-trading-botklines,无需 API key5m / 15m K 线公开可取BTCUSDT / ETHUSDT / SOLUSDTBB(20, 2) + EMA200 + 2.5% stoplow <= lower_band 且 close > EMA200high >= upper_band 且 close < EMA200time stop8 bps15m:持有 4 / 8 / 12 bars5m:持有 6 / 12 / 24 bars15m 比 5m 更像 parent shell。 它在 1h~3h 都还能留正净值,不像很多 15m 假信号那样一拉长就死掉。5m 不是不能做,但不能太急。 30m 基本不够,1h 只是刚过线,愿意拿到 2h 时才开始有明显 pocket。因为这里最核心的问题“到底做什么”已经完全说得清楚: > 顺着 EMA200 的大方向,在价格戳到 Bollinger 外轨时反向接回归,优先吃回到对侧 band 的那一段。
这本身就是完整的 raw alpha 叙事,不是单纯在告诉你“市场不好别做”或“仓位要缩小”。 而且 repo 把 entry / exit / stop / sizing / execution 都给了,所以它比一般“只给信号、不给交易结构”的素材更值得优先 intake。
band_width_pct 分桶,看窄带假信号能不能被砍掉。15m parent + 5m child execution 拆开。 比起直接拿 5m 裸做,也许更该用 15m 决定方向与 admission,再在 5m 里做更细的挂单和止损。2.0% / 2.5% / 3.0% / 4.0%,因为 repo README 和 live config 已经暗示这条线对 stop 宽度很敏感。envelope / lower-band / oversold fade 家族是近亲;但它的独特价值在于:退出逻辑和执行逻辑明显更完整,值得单独存成策略壳。klines endpoint(无需 API key)reports/artifacts/quant_digests/2026-04-19_bb_ema_oppositeband_probe.py5m 事件面板:reports/artifacts/quant_digests/2026-04-19_bb_ema_oppositeband_5m_events.csv5m 汇总:reports/artifacts/quant_digests/2026-04-19_bb_ema_oppositeband_5m_summary.csv5m router 事件(实验性):reports/artifacts/quant_digests/2026-04-19_bb_ema_oppositeband_5m_router_top1_events.csv15m 事件面板:reports/artifacts/quant_digests/2026-04-19_bb_ema_oppositeband_15m_events.csv15m 汇总:reports/artifacts/quant_digests/2026-04-19_bb_ema_oppositeband_15m_summary.csv15m router 事件(实验性):reports/artifacts/quant_digests/2026-04-19_bb_ema_oppositeband_15m_router_top1_events.csvreports/artifacts/quant_digests/2026-04-19_bb_ema_oppositeband_summary.json