做市商实战案例一:比特币现货做市(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 实盘优化
实盘跑了一段时间,要持续优化。我每周会看一次数据,调整参数。比如市场波动率变了,价差要跟着调。库存管理也要动态调整。
经验之谈:实盘优化要小步快跑。每次只改一个参数,观察几天效果。别一次性改太多,出了问题都不知道是哪个参数导致的。
五、知识体系总览
说了这么多,我画了张图,把整个做市策略的框架梳理了一下。这样看起来更直观。
这张图把整个做市策略的流程串起来了。从策略设计开始,到参数调优,再到回测验证,最后实盘部署。每一步都环环相扣,缺一不可。
好了,这一章就聊到这儿。做市商这条路不好走,但走通了,回报也是可观的。希望我的经验能帮到各位。有什么问题,欢迎交流。