feat(engine): 添加事件驱动回测引擎

- backtest/engine.py: 事件驱动回测引擎核心,支持 K 线推进/订单撮合/权益曲线
- backtest/models.py: 回测数据模型(订单/成交/持仓/账户快照)
- backtest/README.md: 回测模块使用说明
- backtest/STRATEGY.md: 策略开发指南与最佳实践
- backtest/TIMEFRAME_COMPARISON*.md: 多周期回测对比分析报告
This commit is contained in:
Rekey
2026-06-12 10:26:53 +08:00
parent 212f6fedad
commit 4da520c14b
7 changed files with 1175 additions and 0 deletions
+178
View File
@@ -0,0 +1,178 @@
# 牛熊自适应趋势跟踪策略
## 概述
通过识别市场所处的牛熊状态,自适应地选择做多或做空方向,在震荡市中空仓等待。
核心思想:**牛市不逆势做空,熊市不逆势做多。**
---
## 市场状态判定(3 法投票)
每根 4h K 线收盘后,用以下三种方法独立判定当前市场状态:
### 方法 1EMA200 斜率
```
计算:EMA200 近 20 根 K 线的变化率
判定:斜率 > +0.2% → 牛
斜率 < -0.2% → 熊
其他 → 震荡
```
EMA200 向上倾斜说明长期趋势向上,向下倾斜说明长期趋势向下。
### 方法 2:价格 vs EMA200
```
判定:当前收盘价 > EMA200 → 牛
当前收盘价 < EMA200 → 熊
```
最直接的趋势判定——价格在年线上方就是多头市场。
### 方法 3ATH 回撤
```
追踪历史最高价 (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 年盈利,熊市不亏钱,牛市吃足利润。
---
## 设计要点
1. **跨周期一致性**:所有信号在同一 4h 周期上,不跨级,避免多时间框架的延迟叠加
2. **状态优先于信号**:先判断能做哪个方向,再在该方向上找入场点
3. **止损不反手**:止损后空仓等下一个信号,避免震荡市中反复被止损
4. **少即是多**:3 种判定方法刚好覆盖趋势方向、当前价格位置、极端状态三个不冗余的维度
---
## 代码位置
- 策略实现:`engine/example/regime_all.py`
- 多空引擎:`engine/example/long_short.py`LongShortEngine