4. 存货风险模型:做市商的存货成本、最优报价策略
做市商这活儿,表面看是赚买卖价差,实际上是在跟存货风险打交道。我做了这么多年,见过太多人只盯着那点手续费,结果被存货风险一把拖垮。说白了,你手里囤了一堆资产,价格一波动,账面浮亏比赚的价差还多。
这一章,我们就来拆解存货风险模型。我会从最基础的存货成本讲起,然后推导最优报价策略。嗯,这部分数学有点多,但我会尽量用白话讲清楚。
4.1 存货成本:做市商真正的敌人
做市商的存货成本,不是指你买资产花了多少钱。而是指你持有存货期间,价格波动带来的潜在损失。我习惯把它拆成三块:
- 价格风险成本:资产价格朝不利方向变动,导致存货贬值。这是最直接的。
- 机会成本:资金被存货占用,错过了其他交易机会。你想想看,如果资金空仓,可能赚得更多。
- 流动性成本:存货太多,想平仓时发现市场深度不够,只能打折卖。我在项目中遇到过,某次做市一个冷门币种,手里囤了10万个,结果想出货时,买单深度只有几百个,硬是砸了三个小时才出完。
核心公式:存货成本 = 价格风险成本 + 机会成本 + 流动性成本
这个公式看起来简单,但每个分项的计算都很讲究。后面我们会逐一展开。
4.2 存货风险的数学建模
做市商的存货风险,本质上是一个随机过程问题。我习惯用库存模型来刻画。假设你做市某个资产,当前库存为 I,资产价格服从几何布朗运动:
dS = μS dt + σS dW
其中 μ 是漂移率,σ 是波动率,dW 是维纳过程。那么你的存货价值变化就是:
dV = I * dS = I * (μS dt + σS dW)
这里有个关键点:存货价值的变化不仅取决于价格波动,还取决于你的库存量 I。库存越大,风险敞口越大。
为什么会这样?因为做市商不是被动持仓,而是主动调整报价来管理库存。你想想看,如果库存为正(手里有货),你应该降低买价、提高卖价,鼓励别人买你的货,减少库存。反之亦然。
4.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 知识体系:存货风险模型的核心逻辑
下面这张图,是我自己梳理的存货风险模型知识体系。你可以把它当作一个思维导图来用:
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