Phase 3: OrderBook 深度撮合

周期: 2 周 | 优先级: 🟡 中 | 风险: 中


1. 目标

实现基于 OrderBook 深度的精确撮合逻辑,提升大单撮合的真实性。

1.1 核心目标

  • ✅ OrderBook 深度撮合算法

  • ✅ 部分成交逻辑

  • ✅ 市场冲击模型(可选)

  • ✅ 滑点估算优化


2. 实施内容

2.1 OrderBook 深度撮合(5 天)

  • 文件*: backtrader/brokers/obbroker.py

class OrderBookBroker(TickBroker):
    """基于 OrderBook 深度的撮合 Broker"""

    params = (
        ('use_orderbook', True),
        ('max_depth_levels', 10),
        ('market_impact', False),
        ('impact_factor', 0.0001),
    )

    def __init__(self):
        super().__init__()
        self._ob_channels = {}

    def register_orderbook_channel(self, symbol, channel):
        """注册 OrderBook 通道"""
        self._ob_channels[symbol] = channel

    def match_with_orderbook(self, order, orderbook):
        """使用 OrderBook 撮合订单"""
        if order.isbuy():
            return self._match_buy_order(order, orderbook)
        else:
            return self._match_sell_order(order, orderbook)

    def _match_buy_order(self, order, ob):
        """买单撮合 - 穿透 asks"""
        remaining = order.executed.remsize
        total_cost = 0.0
        fills = []

        for price, qty in ob.asks[:self.p.max_depth_levels]:
            if remaining <= 0:
                break

# 检查价格条件
            if order.exectype == Order.Limit and price > order.price:
                break

# 计算成交量
            fill_qty = min(remaining, qty)
            fill_price = price

# 应用滑点
            if self.p.market_impact:
                fill_price = self._apply_market_impact(
                    price, fill_qty, qty, 'buy'
                )

            fills.append((fill_price, fill_qty))
            total_cost += fill_price *fill_qty
            remaining -= fill_qty

# 执行成交
        if fills:
            avg_price = total_cost / (order.executed.remsize - remaining)
            filled_size = order.executed.remsize - remaining
            self._execute_order(order, avg_price, filled_size, ob.timestamp)
            return True

        return False

    def _apply_market_impact(self, price, fill_qty, level_qty, side):
        """应用市场冲击"""
        impact_ratio = fill_qty / level_qty
        impact = price*self.p.impact_factor*impact_ratio

        if side == 'buy':
            return price + impact
        else:
            return price - impact

```bash

- *测试**: `tests/phase3/test_orderbook_matching.py`

- --

### 2.2 市场冲击模型(3 天)

- *文件**: `backtrader/brokers/impact_models.py`

```python
class MarketImpactModel:
    """市场冲击模型基类"""

    def calculate_impact(self, order_size, level_size, price):
        raise NotImplementedError

class LinearImpactModel(MarketImpactModel):
    """线性冲击模型"""

    def __init__(self, factor=0.0001):
        self.factor = factor

    def calculate_impact(self, order_size, level_size, price):
        ratio = order_size / level_size
        return price *self.factor*ratio

class SquareRootImpactModel(MarketImpactModel):
    """平方根冲击模型(更真实)"""

    def __init__(self, factor=0.001):
        self.factor = factor

    def calculate_impact(self, order_size, level_size, price):
        ratio = order_size / level_size
        return price*self.factor* (ratio ** 0.5)

```bash

- --

## 3. 交付物

- [ ] `backtrader/brokers/obbroker.py`
- [ ] `backtrader/brokers/impact_models.py`
- [ ] `tests/phase3/` - 完整测试套件
- [ ] Phase 3 完成报告

- --

## 4. 验收标准

- [ ] OrderBook 深度撮合准确
- [ ] 大单滑点合理
- [ ] 与真实交易所对比验证
- [ ] 回归测试 100%通过

- --

## 5. 时间表

| 任务 | 工作量 |

|------|--------|

| OrderBook 深度撮合 | 5  |

| 市场冲击模型 | 3  |

| 测试与验证 | 4  |

| 文档 | 2  |

- *总计**: 14 2