第二章:库存计量与监控——实时库存计算、库存价值评估与监控仪表盘设计
做市商这行,说白了就是跟库存打交道。你策略再牛,订单流再顺,库存管不好,一样白搭。我见过太多交易员,赚了几天的利润,一次库存失衡就全吐回去了。
这一章,咱们聊聊库存怎么算、怎么估值、怎么盯。嗯,都是实战里每天要用的东西。
2.1 实时库存计算:别等到收盘才发现不对劲
实时库存计算,听起来简单?不就是「买入减卖出」嘛。但实际做起来,坑不少。
我个人的习惯是,把库存拆成三层来算:
- 名义库存:所有成交的净头寸。这个最简单,交易所直接给。
- 有效库存:扣除掉已挂单但未成交的部分。你挂了个卖单,虽然没成交,但那个位置已经被占用了。
- 风险库存:考虑对冲后的净敞口。比如你同时持有BTC现货和永续合约空单,那风险库存就是两者相抵后的值。
核心公式:
实时库存 = 初始库存 + Σ(买入量) - Σ(卖出量) - Σ(撤单量) + Σ(被动成交调整)
这里有个细节——被动成交调整。什么意思?你挂的买单被吃掉了,那是主动成交。但如果你挂的是maker单,被对手方吃掉,那成交时间点和你的挂单时间点可能差了好几秒。这期间,你的库存显示是错的。
我曾经踩过的坑:有一次,我挂了一大批maker买单,系统显示库存为0。结果行情突变,所有买单瞬间被吃掉,库存直接飙到上限。风控警报响了,我才发现——实时库存没把挂单量算进去。从那以后,我强制要求系统每100ms刷新一次「挂单占用库存」这个字段。
2.2 库存价值评估:LIFO、FIFO还是加权平均?
库存数量算清楚了,下一步就是估值。你手里有100个ETH,成本是多少?这直接决定了你的盈亏计算和保证金占用。
常用的三种方法,我一个个说。
2.2.1 FIFO(先进先出)
最早买入的,最先卖出。适合现货交易,逻辑清晰。
// FIFO 计算示例
class FIFOInventory:
def __init__(self):
self.queue = [] # (数量, 价格)
def buy(self, qty, price):
self.queue.append((qty, price))
def sell(self, qty):
cost = 0
while qty > 0 and self.queue:
avail_qty, price = self.queue[0]
take = min(qty, avail_qty)
cost += take * price
qty -= take
self.queue[0] = (avail_qty - take, price)
if self.queue[0][0] == 0:
self.queue.pop(0)
return cost
2.2.2 LIFO(后进先出)
最后买入的,最先卖出。适合做市商,因为最近成交的价格最能反映当前市场。
// LIFO 计算示例
class LIFOInventory:
def __init__(self):
self.stack = [] # (数量, 价格)
def buy(self, qty, price):
self.stack.append((qty, price))
def sell(self, qty):
cost = 0
while qty > 0 and self.stack:
avail_qty, price = self.stack[-1]
take = min(qty, avail_qty)
cost += take * price
qty -= take
self.stack[-1] = (avail_qty - take, price)
if self.stack[-1][0] == 0:
self.stack.pop()
return cost
2.2.3 加权平均
所有持仓按平均成本计算。简单粗暴,适合高频交易场景。
// 加权平均计算
class WeightedAvgInventory:
def __init__(self):
self.total_qty = 0
self.total_cost = 0
def buy(self, qty, price):
self.total_cost += qty * price
self.total_qty += qty
def sell(self, qty):
avg_price = self.total_cost / self.total_qty if self.total_qty else 0
cost = qty * avg_price
self.total_qty -= qty
self.total_cost -= cost
return cost
我的建议:做市商最好用LIFO。为什么?因为你的库存周转极快,最近成交价最能反映真实盈亏。FIFO适合长期持有者,加权平均适合不想纠结细节的团队。但如果你做高频,LIFO是唯一选择。
2.3 库存监控仪表盘设计:一眼看出问题
数据算好了,怎么展示?我见过很多团队,数据全堆在屏幕上,花花绿绿,但交易员根本来不及看。
仪表盘设计,核心就一句话:让异常在0.5秒内被捕捉到。
2.3.1 核心指标
| 指标 | 说明 | 告警阈值 |
|---|---|---|
| 当前库存量 | 各币种净头寸 | ±上限的80% |
| 库存价值 | 按LIFO计算的市值 | 超过总资产的30% |
| 库存周转率 | 每小时换手次数 | 低于5次/小时 |
| 未实现盈亏 | 当前市值 vs 成本 | 亏损超过2% |
| 挂单占用率 | 挂单量/总库存 | 超过50% |
2.3.2 可视化布局
我个人习惯用三栏布局:
- 左栏:实时库存数字,大号字体,红色绿色显示方向
- 中栏:库存价值曲线,带LIFO/FIFO对比线
- 右栏:告警列表,按严重程度排序
下面这张图,是我自己设计的库存监控核心逻辑。你看一眼就明白了。
2.3.3 告警规则设计
告警不是越多越好。我见过有人设了50条告警,结果交易员全屏蔽了。
我的原则是:只告警那些你真正会去处理的事情。
- P0级:库存超过上限的90%,必须立即减仓
- P1级:库存周转率低于3次/小时,需要检查策略是否失效
- P2级:未实现亏损超过1%,提醒关注但不强制操作
注意:告警频率要控制。同一个告警,5分钟内不要重复触发。否则交易员会麻木,真出事了反而没人管。
2.4 实战中的几个细节
最后,分享几个我在项目中积累的小经验:
- 库存数据要双写:内存里一份,数据库里一份。万一进程挂了,重启后还能恢复。
- 估值方法要统一:整个团队用同一种方法,否则对账的时候会疯掉。
- 仪表盘要支持自定义:每个交易员关注的指标不一样,别搞一刀切。
嗯,库存计量和监控这块,说白了就是「算清楚、看得见、能反应」。做到这三点,你的做市业务就稳了一半。
一句话总结:库存管理不是事后算账,而是实时博弈。你的仪表盘,就是你的战场地图。