Hummingbot 第9章:做市策略详解
做市(Market Making)是 Hummingbot 最核心的功能。本章深入讲解 Pure Market Making 策略的各项参数和优化技巧。
Pure Market Making 策略
Pure Market Making(PMM)是 Hummingbot 最成熟的策略,通过在交易对两侧同时挂出买单和卖单来赚取价差。
策略原理
市场价格: 50,000 USDT
买单 (Bid) 卖单 (Ask)
┌────────┐ ┌────────┐
│ 0.01 │ │ 0.01 │
│ @ │ │ @ │
│ 49,750 │ │ 50,250 │
│ -0.5% │ │ +0.5% │
└────────┘ └────────┘
│ │
└──────── 价差 1% ──────┘
每次买卖成交获利 = 价差 - 手续费
核心参数详解
strategy: pure_market_making
exchange: binance
trading_pair: BTC-USDT
# 价差参数
bid_spread: 0.5 # 买单价差(%),相对于中间价
ask_spread: 0.5 # 卖单价差(%),相对于中间价
# 订单参数
order_amount: 0.01 # 每笔订单数量(基础币种)
order_levels: 1 # 订单层级数
order_level_spread: 1.0 # 层级之间的价差增量(%)
order_level_amount: 0.01 # 每层级的订单数量
# 刷新参数
order_refresh_time: 60 # 订单自动刷新间隔(秒)
order_refresh_tolerance_pct: 0.2 # 刷新容忍偏差(%)
filled_order_delay: 60 # 成交后等待时间(秒)
# 超时参数
max_order_age: 300 # 订单最大存活时间(秒)
# 高级参数
split_order_levels_enabled: false # 是否拆分订单层级
split_order_levels: 1 # 拆分份数
双向报价
订单层级系统
多层级订单可以覆盖更广的价格范围:
层级 3: 卖 0.01 @ 51,250 (+2.5%)
层级 2: 卖 0.01 @ 50,750 (+1.5%)
层级 1: 卖 0.01 @ 50,250 (+0.5%)
────────────────────────────
中间价: 50,000
────────────────────────────
层级 1: 买 0.01 @ 49,750 (-0.5%)
层级 2: 买 0.01 @ 49,250 (-1.5%)
层级 3: 买 0.01 @ 48,750 (-2.5%)
配置多层级做市:
order_levels: 3 # 买卖各 3 层
order_level_spread: 0.5 # 层级间价差 0.5%
order_level_amount: 0.01 # 每层数量
order_override:
# 手动覆盖特定订单
order_1:
side: buy
price: 49750
amount: 0.02 # 第一层更大的数量
order_2:
side: buy
price: 49500
amount: 0.015
order_3:
side: buy
price: 49250
amount: 0.01
订单管理
订单刷新策略
Hummingbot 提供多种订单刷新模式:
# 按时间刷新
order_refresh_time: 60 # 每 60 秒取消所有订单并重新挂单
# 按价格变动刷新
order_refresh_tolerance_pct: 0.2 # 价格变动超过 0.2% 时刷新
# 组合策略:时间和价格双重触发
# 两种条件满足任一即刷新
订单超时管理
# 订单超时设置
max_order_age: 300 # 订单最多存活 5 分钟
# 超时后自动取消并重新挂单
# 避免订单在极端行情下被长时间挂在不合理价格
成交后行为
# 买单成交后的处理
filled_order_delay: 60 # 等待 60 秒再重新挂单
# 双向成交平衡
# 当买单成交后,Hummingbot 会调整价格
# 使得卖出方向更容易成交,恢复库存平衡
库存风险
库存偏斜
库存偏斜(Inventory Skew)是管理库存风险的核心功能:
inventory_skew_enabled: true # 启用库存偏斜
inventory_target_base_pct: 50.0 # 目标基础币种占比 50%
inventory_range_multiplier: 1.0 # 范围倍数
# 工作原理:
# 当 BTC 库存超过 50% 目标时:
# - 降低买单价(减少买入)
# - 降低卖单价(鼓励卖出)
# 当 BTC 库存低于 50% 目标时:
# - 提高买单价(鼓励买入)
# - 提高卖单价(减少卖出)
库存偏斜示例
# 库存偏斜计算逻辑示例
target_ratio = 0.5 # 50% BTC
current_btc_value = 0.05 * 50000 # 0.05 BTC * $50,000 = $2,500
current_usdt = 1000
total_value = 3500
current_ratio = 2500 / 3500 # 71.4%
# 偏差 = 当前比例 - 目标比例 = 21.4%
# Hummingbot 会将买单调低,卖单价调高
# 促使库存回归目标比例
止损保护
# 止损参数
stop_loss_spread: 5.0 # 当价格偏离超过 5% 时触发止损
price_ceiling: 100000 # 价格上限(高于此价停止买入)
price_floor: 10000 # 价格下限(低于此价停止卖出)
# 止损触发后的行为:
# - 取消所有挂单
# - 停止策略运行
# - 记录日志
做市参数调优
价差优化策略
| 市场状况 | 建议价差 | 建议层级 | 建议订单量 |
|---|---|---|---|
| 高波动(波动率 > 3%) | 1.0% - 2.0% | 2-3 层 | 正常 50% |
| 中等波动(波动率 1-3%) | 0.5% - 1.0% | 2 层 | 正常 75% |
| 低波动(波动率 < 1%) | 0.2% - 0.5% | 1-2 层 | 正常 100% |
| 重大新闻事件 | 暂停策略 | — | — |
基于波动率的动态调优
# 动态价差调整示例
def calculate_dynamic_spread(volatility: float) -> tuple:
"""根据波动率计算动态价差"""
# 基础价差
base_spread = 0.5
# 波动率因子
vol_factor = 1 + (volatility * 10)
# 限制价差范围
min_spread = 0.2
max_spread = 2.0
adjusted_spread = base_spread * vol_factor
adjusted_spread = max(min_spread, min(max_spread, adjusted_spread))
return adjusted_spread
性能指标监控
| 指标 | 健康范围 | 说明 |
|---|---|---|
| 成交率 | 20% - 40% | 每轮刷新中成交的比例 |
| 价差收益率 | > 0.1% | 扣除手续费后的净收益 |
| 库存偏离度 | < 20% | 当前库存与目标库存的偏差 |
| 订单存活时间 | < 刷新周期的 80% | 订单在刷新前成交的比例 |
常见调优问题
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 无人成交 | 价差太小 | 增大 bid_spread / ask_spread |
| 成交太多亏损 | 价差不够覆盖手续费 | 确保价差 > 手续费率 × 2 |
| 库存偏移严重 | 趋势行情持续 | 启用 inventory_skew_enabled |
| 频繁刷新 | tolerance_pct 太小 | 增大 order_refresh_tolerance_pct |