做市商实战案例一:比特币现货做市(Bitfinex平台)——策略设计、参数调优、回测与实盘

大家好,我是老李。在量化圈摸爬滚打了快十年,做过市商也有五年多了。今天咱们聊一个最经典的案例——在Bitfinex上做比特币现货做市。这个平台我太熟了,当年第一笔实盘做市单就是在这儿下的,记忆犹新。

说实话,很多人觉得做市商就是「低买高卖」,太天真了。你想想看,如果真这么简单,那满大街都是亿万富翁了。做市的核心是什么?是管理库存风险,是控制价差,是跟市场博弈。今天我就把压箱底的东西掏出来,跟各位好好聊聊。

一、策略设计:从零搭建一个做市机器人

做市策略说白了就三件事:报价、对冲、风控。我习惯把这三块拆开设计,这样调试起来方便。

1.1 报价逻辑

核心思路很简单:在买一和卖一价附近挂单,赚取价差。但怎么挂?挂多宽?这里头学问大了。

我常用的报价模型是这样的:

# 伪代码示例
mid_price = (bid + ask) / 2
spread = base_spread * (1 + k * volatility_factor)
bid_price = mid_price - spread / 2
ask_price = mid_price + spread / 2
order_size = base_size * (1 - inventory_ratio * 0.5)

这里有个关键点:价差不是固定的。市场波动大的时候,价差要拉宽,不然容易被吃掉。库存多了,挂单量要减少,避免风险暴露。这些参数怎么调?我后面会讲。

核心公式:价差 = 基础价差 × (1 + 波动率系数 × 波动率因子)

库存调整:挂单量 = 基础量 × (1 - 库存比例 × 0.5)

1.2 对冲逻辑

做市商最怕什么?单边行情。比特币一天涨20%不稀奇,如果你只做市不 hedging,库存风险能把你压垮。

我个人的做法是:在永续合约上做对冲。比如现货做多,永续做空,保持 delta 中性。具体比例怎么算?

# 对冲比例计算
hedge_ratio = 1.0  # 完全对冲
if market_trend == 'strong_up':
    hedge_ratio = 0.8  # 留点敞口吃趋势
elif market_trend == 'strong_down':
    hedge_ratio = 1.2  # 稍微超配对冲

嗯,这里要注意:完全对冲会损失利润,不完全对冲又有风险。我一般留10%-20%的敞口,具体看市场情绪。

1.3 风控逻辑

风控是底线。我曾经吃过亏,有一次比特币闪崩,库存瞬间亏了30%。从那以后,我加了三道防线:

  • 最大库存限制:总库存不超过账户净值的20%
  • 最大亏损限制:单日亏损超过5%自动暂停
  • 价差保护:价差低于阈值时撤单

警告:不要忽视风控!做市商不是赌徒,活下去比赚得多更重要。我见过太多人因为风控不到位,一夜回到解放前。

二、参数调优:让策略跑得更稳

参数调优是个技术活,也是个体力活。我一般分三步走:

2.1 参数范围确定

先凭经验定个大概范围。比如基础价差,比特币现货一般在0.01%-0.05%之间。波动率系数,我习惯用0.5-2.0。库存调整系数,0.3-0.7比较合理。

参数 最小值 最大值 步长
基础价差 0.01% 0.05% 0.005%
波动率系数 0.5 2.0 0.1
库存调整系数 0.3 0.7 0.05

2.2 网格搜索

参数范围定了,接下来就是暴力搜索。我写了个脚本,把所有参数组合跑一遍,看哪个组合的夏普比率最高。

# 网格搜索伪代码
best_sharpe = -999
best_params = None
for spread in spreads:
    for vol_coef in vol_coefs:
        for inv_coef in inv_coefs:
            sharpe = backtest(spread, vol_coef, inv_coef)
            if sharpe > best_sharpe:
                best_sharpe = sharpe
                best_params = (spread, vol_coef, inv_coef)

小技巧:别只看夏普比率。我还会看最大回撤、胜率、交易次数。有时候夏普高但回撤大,这种策略我一般不用。

2.3 稳健性检验

参数调好了,别急着实盘。先做稳健性检验:把参数稍微偏移一点,看策略表现会不会大幅波动。如果稍微一变就崩,说明参数过拟合了。

我习惯的做法是:用不同时间段的数据做交叉验证。比如用2023年数据调参,用2024年数据验证。如果两个时间段表现差不多,那这个参数就比较靠谱。

三、回测:验证策略的有效性

回测是检验策略的试金石。但回测也有坑,我踩过不少。

3.1 回测框架搭建

我用的是自己写的回测框架,基于Python。核心逻辑很简单:模拟订单簿,模拟成交,计算盈亏。

class Backtester:
    def __init__(self, data, params):
        self.data = data
        self.params = params
        self.pnl = 0
        self.inventory = 0
        
    def run(self):
        for tick in self.data:
            # 更新订单簿
            # 检查成交
            # 更新库存和盈亏
            pass

3.2 回测结果分析

回测跑完了,看什么指标?我一般关注这几个:

  • 年化收益率:10%-30%算正常
  • 夏普比率:2以上算优秀
  • 最大回撤:不超过5%
  • 交易次数:每天100-500次

回测结果示例:

年化收益率:18.5%

夏普比率:2.3

最大回撤:3.2%

日均交易次数:237次

3.3 回测陷阱

回测容易犯的错误,我列几个:

  • 未来函数:用了未来数据,回测结果虚高
  • 滑点忽略:实际成交价和挂单价有差距
  • 手续费忽略:做市商虽然手续费低,但不是零

注意:回测表现好不代表实盘也能赚钱。我见过太多回测年化50%的策略,实盘一跑就亏。原因?市场变了,或者回测有bug。

四、实盘:从模拟到真金白银

实盘是检验真理的唯一标准。但实盘和回测是两码事,我深有体会。

4.1 实盘部署

我习惯先小资金试水。比如账户里放1个BTC,先跑一周看看。没问题了再加仓。

# 实盘部署流程
1. 连接交易所API
2. 启动风控模块
3. 启动报价模块
4. 启动对冲模块
5. 监控运行状态

4.2 实盘常见问题

实盘跑起来,问题就来了。我遇到过这些:

  • API延迟:报价发出去,市场已经变了
  • 网络抖动:断线重连,订单状态丢失
  • 交易所故障:Bitfinex偶尔抽风,订单无法撤单

怎么解决?我一般加个监控系统,一旦异常就自动暂停。另外,多准备几个交易所,万一出问题可以切换。

4.3 实盘优化

实盘跑了一段时间,要持续优化。我每周会看一次数据,调整参数。比如市场波动率变了,价差要跟着调。库存管理也要动态调整。

经验之谈:实盘优化要小步快跑。每次只改一个参数,观察几天效果。别一次性改太多,出了问题都不知道是哪个参数导致的。

五、知识体系总览

说了这么多,我画了张图,把整个做市策略的框架梳理了一下。这样看起来更直观。

比特币现货做市策略框架 策略设计 • 报价逻辑:价差计算 • 对冲逻辑:Delta中性 • 风控逻辑:三道防线 • 库存管理:动态调整 参数调优 • 参数范围确定 • 网格搜索优化 • 夏普比率评估 • 稳健性检验 回测验证 • 回测框架搭建 • 结果指标分析 • 避免未来函数 • 滑点与手续费 实盘部署与优化 • 小资金试水 → 监控运行 → 持续优化 • 处理API延迟、网络抖动、交易所故障 核心原则 活下去比赚得多更重要 | 小步快跑 | 持续优化

这张图把整个做市策略的流程串起来了。从策略设计开始,到参数调优,再到回测验证,最后实盘部署。每一步都环环相扣,缺一不可。

好了,这一章就聊到这儿。做市商这条路不好走,但走通了,回报也是可观的。希望我的经验能帮到各位。有什么问题,欢迎交流。


专注资料整理