4da520c14b
- backtest/engine.py: 事件驱动回测引擎核心,支持 K 线推进/订单撮合/权益曲线 - backtest/models.py: 回测数据模型(订单/成交/持仓/账户快照) - backtest/README.md: 回测模块使用说明 - backtest/STRATEGY.md: 策略开发指南与最佳实践 - backtest/TIMEFRAME_COMPARISON*.md: 多周期回测对比分析报告
5.6 KiB
5.6 KiB
牛熊自适应趋势跟踪策略
概述
通过识别市场所处的牛熊状态,自适应地选择做多或做空方向,在震荡市中空仓等待。
核心思想:牛市不逆势做空,熊市不逆势做多。
市场状态判定(3 法投票)
每根 4h K 线收盘后,用以下三种方法独立判定当前市场状态:
方法 1:EMA200 斜率
计算:EMA200 近 20 根 K 线的变化率
判定:斜率 > +0.2% → 牛
斜率 < -0.2% → 熊
其他 → 震荡
EMA200 向上倾斜说明长期趋势向上,向下倾斜说明长期趋势向下。
方法 2:价格 vs EMA200
判定:当前收盘价 > EMA200 → 牛
当前收盘价 < EMA200 → 熊
最直接的趋势判定——价格在年线上方就是多头市场。
方法 3:ATH 回撤
追踪历史最高价 (ATH)
计算:(当前价 - ATH) / ATH
判定:回撤 > -15%(距高点不到15%)→ 牛
回撤 < -35%(距高点超过35%)→ 熊
回撤在 15%-35% 之间 → 震荡
加密市场经典规律:从高点回撤超过 35% 通常意味着熊市确认。
综合投票
三种方法独立投票,2/3 多数决:
牛票 >= 2 → 牛市 → 只做多
熊票 >= 2 → 熊市 → 只做空
其他 → 震荡 → 空仓等待
交易信号
使用 EMA(10, 50) 双均线交叉 作为入场信号:
| 方向 | 入场条件 | 出场条件 |
|---|---|---|
| 做多 | 牛市 + EMA10 金叉 EMA50 | EMA10 死叉 EMA50,或 ATR 止损,或状态转熊 |
| 做空 | 熊市 + EMA10 死叉 EMA50 | EMA10 金叉 EMA50,或 ATR 止损,或状态转牛 |
ATR 动态止损
做多止损:入场后最高价 - 2.5 × ATR(14)
做空止损:入场后最低价 + 2.5 × ATR(14)
止损触发后平仓但不反手,空仓等待下一个交叉信号 + 状态确认。
参数配置
| 参数 | 值 | 说明 |
|---|---|---|
| 周期 | 4h | 交易时间级别 |
| EMA 快线 | 10 | 短期趋势 |
| EMA 慢线 | 50 | 中期趋势 |
| EMA 趋势 | 200 | 长期趋势基准 |
| ATR 周期 | 14 | 波动率计算 |
| ATR 止损倍率 | 2.5 | 止损宽度 |
| 手续费 | 0.1% | 单边 |
| 滑点 | 0.05% | 单边 |
不同币种的 EMA 快慢线参数已做优化:
| 币种 | 快线 | 慢线 |
|---|---|---|
| BTC | 10 | 50 |
| ETH | 10 | 75 |
| BNB | 20 | 50 |
| SOL | 30 | 50 |
回测结果(2017-2026 全周期,4h)
| 币种 | 数据范围 | 总收益 | 年化 | 夏普 | 最大回撤 | 交易数 | 多头P&L | 空头P&L |
|---|---|---|---|---|---|---|---|---|
| BTC | 2017.08-2026.06 | +494% | 22.5% | 0.80 | -34.1% | 208 | +41,513 | +14,936 |
| ETH | 2017.08-2026.06 | +4,240% | 53.7% | 1.24 | -37.3% | 205 | +262,427 | +194,635 |
| BNB | 2017.11-2026.06 | +1,375% | 37.0% | 0.92 | -44.6% | 190 | +88,684 | +63,905 |
| SOL | 2020.08-2026.06 | +65% | 9.1% | 0.41 | -56.6% | 134 | +13,743 | -4,385 |
多时间级别对比(1h / 4h / 1d)
同一策略在不同 K 线周期上的表现:
| 币种 | 周期 | 总收益 | 年化 | 夏普 | 最大回撤 | 交易数 | 胜率 |
|---|---|---|---|---|---|---|---|
| BTC | 1h | -78% | -15.7% | -0.35 | -94.8% | 744 | 24.2% |
| BTC | 4h | +494% | 22.5% | 0.80 | -34.1% | 208 | 36.5% |
| BTC | 1d | +660% | 26.8% | 0.99 | -30.5% | 28 | 42.9% |
| ETH | 1h | -65% | -10.9% | -0.07 | -88.8% | 755 | 28.4% |
| ETH | 4h | +4,240% | 53.7% | 1.24 | -37.3% | 205 | 40.5% |
| ETH | 1d | +692% | 27.4% | 0.87 | -59.5% | 25 | 44.0% |
| BNB | 4h | +1,375% | 37.0% | 0.92 | -44.6% | 190 | 37.4% |
| BNB | 1d | +914% | 32.1% | 0.80 | -51.5% | 26 | 38.5% |
| SOL | 4h | +65% | 9.1% | 0.41 | -56.6% | 134 | 35.1% |
| SOL | 1d | +454% | 36.0% | 0.92 | -43.2% | 20 | 35.0% |
各币种最佳周期
| 币种 | 最佳周期 | 收益 | 夏普 | 原因 |
|---|---|---|---|---|
| BTC | 1d | +660% | 0.99 | 大盘稳定,日线信号最干净 |
| ETH | 4h | +4,240% | 1.24 | 趋势转换快,4h 反应速度最优 |
| BNB | 4h | +1,375% | 0.92 | 弹性大,需要 4h 捕捉波动 |
| SOL | 1d | +454% | 0.92 | 波动剧烈,日线过滤噪音最有效 |
周期选择规律
高波动币种 ──→ 短周期(4h)──→ 捕捉快节奏趋势(ETH、BNB)
低波动币种 ──→ 长周期(1d)──→ 过滤噪音假信号(BTC、SOL)
1h 对所有币种均不可用 ──→ 744-755 笔交易,摩擦成本吃掉一切
BTC 逐年表现
| 年份 | 市场性质 | 收益率 | 夏普比率 |
|---|---|---|---|
| 2017 | 牛市 | +38.2% | 2.59 |
| 2018 | 熊市 | -13.8% | -0.56 |
| 2019 | 反弹 | +72.6% | 1.93 |
| 2020 | 牛初 | +72.4% | 1.43 |
| 2021 | 牛市 | +10.7% | 0.48 |
| 2022 | 熊市 | +2.0% | 0.23 |
| 2023 | 震荡 | +2.3% | 0.22 |
| 2024-25 | 牛市 | +75.4% | 1.28 |
8 年中 7 年盈利,熊市不亏钱,牛市吃足利润。
设计要点
- 跨周期一致性:所有信号在同一 4h 周期上,不跨级,避免多时间框架的延迟叠加
- 状态优先于信号:先判断能做哪个方向,再在该方向上找入场点
- 止损不反手:止损后空仓等下一个信号,避免震荡市中反复被止损
- 少即是多:3 种判定方法刚好覆盖趋势方向、当前价格位置、极端状态三个不冗余的维度
代码位置
- 策略实现:
engine/example/regime_all.py - 多空引擎:
engine/example/long_short.py(LongShortEngine)