4. 存货风险模型:做市商的存货成本、最优报价策略

做市商这活儿,表面看是赚买卖价差,实际上是在跟存货风险打交道。我做了这么多年,见过太多人只盯着那点手续费,结果被存货风险一把拖垮。说白了,你手里囤了一堆资产,价格一波动,账面浮亏比赚的价差还多。

这一章,我们就来拆解存货风险模型。我会从最基础的存货成本讲起,然后推导最优报价策略。嗯,这部分数学有点多,但我会尽量用白话讲清楚。

4.1 存货成本:做市商真正的敌人

做市商的存货成本,不是指你买资产花了多少钱。而是指你持有存货期间,价格波动带来的潜在损失。我习惯把它拆成三块:

  • 价格风险成本:资产价格朝不利方向变动,导致存货贬值。这是最直接的。
  • 机会成本:资金被存货占用,错过了其他交易机会。你想想看,如果资金空仓,可能赚得更多。
  • 流动性成本:存货太多,想平仓时发现市场深度不够,只能打折卖。我在项目中遇到过,某次做市一个冷门币种,手里囤了10万个,结果想出货时,买单深度只有几百个,硬是砸了三个小时才出完。

核心公式:存货成本 = 价格风险成本 + 机会成本 + 流动性成本

这个公式看起来简单,但每个分项的计算都很讲究。后面我们会逐一展开。

4.2 存货风险的数学建模

做市商的存货风险,本质上是一个随机过程问题。我习惯用库存模型来刻画。假设你做市某个资产,当前库存为 I,资产价格服从几何布朗运动:

dS = μS dt + σS dW

其中 μ 是漂移率,σ 是波动率,dW 是维纳过程。那么你的存货价值变化就是:

dV = I * dS = I * (μS dt + σS dW)

这里有个关键点:存货价值的变化不仅取决于价格波动,还取决于你的库存量 I。库存越大,风险敞口越大。

为什么会这样?因为做市商不是被动持仓,而是主动调整报价来管理库存。你想想看,如果库存为正(手里有货),你应该降低买价、提高卖价,鼓励别人买你的货,减少库存。反之亦然。

4.3 最优报价策略:从理论到实践

最优报价策略的核心,就是在价差收益和存货风险之间找平衡。我建议用以下框架来推导:

  1. 定义目标函数:最大化期望收益,同时惩罚存货风险。
  2. 建立动态规划方程:考虑未来所有可能的价格路径。
  3. 求解最优报价:得到买价和卖价的表达式。

具体来说,假设做市商的目标是最大化以下效用函数:

U = E[∫ e^(-ρt) * (π(t) - λ * I(t)^2) dt]

其中 π(t) 是瞬时利润,I(t) 是库存,λ 是风险厌恶系数,ρ 是折现率。这个公式的意思是:你既要赚利润,又要控制库存风险,而且库存风险是平方惩罚——库存越大,惩罚越重。

通过求解HJB方程(Hamilton-Jacobi-Bellman),可以得到最优报价:

参数 最优买价 最优卖价
基础价格 S - δ/2 S + δ/2
库存调整项 - γ * I - γ * I
最终报价 S - δ/2 - γI S + δ/2 - γI

这里 δ 是基础价差,γ 是库存调整系数,I 是当前库存。注意看:当库存为正时,买价和卖价都下调了。这意味着你更愿意卖货,而不是买货。当库存为负时,报价上调,鼓励买入。

实战技巧:我个人习惯把 γ 设成波动率的函数。波动率越大,γ 越大,库存调整越激进。因为高波动时,存货风险更大,需要更快地回归中性库存。

4.4 避坑指南:我曾经踩过的坑

讲几个我亲身经历过的教训:

  • 过度调整报价:我曾经在某个币种上,因为库存为正,把卖价压得太低,结果被套利者一把扫光。后来我加了限幅,报价调整不超过基础价差的50%。
  • 忽略流动性分层:不同交易所的流动性不同,最优报价策略也要调整。在深度好的交易所,可以激进一点;在深度差的交易所,要保守。
  • 忘记更新参数:市场环境在变,波动率、成交量都在变。我建议每5分钟重新计算一次最优报价参数,而不是用固定的值。

重要提醒:存货风险模型假设价格是连续的,但现实中可能出现跳空。比如某个项目突然出利空,价格直接跌20%。这时候你的存货模型会完全失效。所以一定要设置止损线,当库存亏损超过某个阈值时,强制平仓。

4.5 知识体系:存货风险模型的核心逻辑

下面这张图,是我自己梳理的存货风险模型知识体系。你可以把它当作一个思维导图来用:

存货风险模型 存货成本 价格风险成本 机会成本 流动性成本 数学建模 几何布朗运动 HJB方程 动态规划 最优报价策略 基础价差 库存调整项 风险厌恶系数 核心目标:在价差收益与存货风险之间找到最优平衡 动态调整报价 实时监控库存 设置止损阈值

4.6 实战案例:一个简单的Python实现

最后,我贴一段代码。这是我早期做市时用的一个简化版存货风险模型。虽然现在用更复杂的版本了,但这个框架依然适用:

import numpy as np

class InventoryModel:
    def __init__(self, base_spread=0.001, risk_aversion=0.1, volatility=0.5):
        self.base_spread = base_spread  # 基础价差
        self.risk_aversion = risk_aversion  # 风险厌恶系数
        self.volatility = volatility  # 波动率
        self.inventory = 0  # 当前库存
        
    def optimal_quotes(self, mid_price):
        # 库存调整系数,与波动率正相关
        gamma = self.risk_aversion * self.volatility
        
        # 基础买价和卖价
        bid = mid_price - self.base_spread / 2
        ask = mid_price + self.base_spread / 2
        
        # 库存调整
        bid_adjusted = bid - gamma * self.inventory
        ask_adjusted = ask - gamma * self.inventory
        
        return bid_adjusted, ask_adjusted
    
    def update_inventory(self, trade_quantity):
        self.inventory += trade_quantity
        # 限制库存范围,防止过度积累
        self.inventory = np.clip(self.inventory, -1000, 1000)

# 使用示例
model = InventoryModel(base_spread=0.002, risk_aversion=0.2, volatility=0.3)
bid, ask = model.optimal_quotes(mid_price=100.0)
print(f"最优报价: 买价={bid:.4f}, 卖价={ask:.4f}")

代码说明:这个模型虽然简单,但抓住了核心——库存调整项 γI。实际生产中,你还需要加入成交量预测、订单簿深度等因素。我建议先从这个小模型开始,逐步迭代。

嗯,存货风险模型就讲到这里。记住一句话:做市商不是赌方向,而是管库存。把库存管好了,价差就是你的稳定收益。


公众号:蓝海资料掘金营,微信deep3321