第二章:库存计量与监控——实时库存计算、库存价值评估与监控仪表盘设计

做市商这行,说白了就是跟库存打交道。你策略再牛,订单流再顺,库存管不好,一样白搭。我见过太多交易员,赚了几天的利润,一次库存失衡就全吐回去了。

这一章,咱们聊聊库存怎么算、怎么估值、怎么盯。嗯,都是实战里每天要用的东西。

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对比线
  • 右栏:告警列表,按严重程度排序

下面这张图,是我自己设计的库存监控核心逻辑。你看一眼就明白了。

库存监控仪表盘核心逻辑 交易所数据流 成交 / 挂单 / 撤单 实时库存计算引擎 LIFO / FIFO / 加权平均 内存数据库 Redis / 本地缓存 告警引擎 阈值检查 / 风控规则 监控仪表盘展示层 左栏:数字面板 当前库存量 库存价值 未实现盈亏 中栏:趋势图 库存价值曲线 LIFO vs FIFO 周转率走势 右栏:告警列表 严重告警 警告信息 操作建议

2.3.3 告警规则设计

告警不是越多越好。我见过有人设了50条告警,结果交易员全屏蔽了。

我的原则是:只告警那些你真正会去处理的事情

  • P0级:库存超过上限的90%,必须立即减仓
  • P1级:库存周转率低于3次/小时,需要检查策略是否失效
  • P2级:未实现亏损超过1%,提醒关注但不强制操作

注意:告警频率要控制。同一个告警,5分钟内不要重复触发。否则交易员会麻木,真出事了反而没人管。

2.4 实战中的几个细节

最后,分享几个我在项目中积累的小经验:

  • 库存数据要双写:内存里一份,数据库里一份。万一进程挂了,重启后还能恢复。
  • 估值方法要统一:整个团队用同一种方法,否则对账的时候会疯掉。
  • 仪表盘要支持自定义:每个交易员关注的指标不一样,别搞一刀切。

嗯,库存计量和监控这块,说白了就是「算清楚、看得见、能反应」。做到这三点,你的做市业务就稳了一半。

一句话总结:库存管理不是事后算账,而是实时博弈。你的仪表盘,就是你的战场地图。

专注资料整理