12、库存风险管理:库存周转率、库存老化监控、库存对冲策略、库存清算机制
做市商最怕什么?不是行情剧烈波动,而是库存砸在手里出不去。
我见过太多团队,策略赚钱能力一流,最后却死在库存上。说白了,库存风险就是你的仓位变成了「烫手山芋」——想卖卖不掉,想对冲成本又太高。
这一章,我们专门聊聊库存风险怎么管。我会从四个维度展开:周转率、老化监控、对冲策略、清算机制。每个点我都会结合自己踩过的坑来讲。
12.1 库存周转率:你的资金在「转」还是「躺」?
库存周转率,衡量的是你手里的资产多久能换一轮。公式很简单:
库存周转率 = 成交总量 / 平均库存价值
举个例子。你每天做1个亿的成交量,平均库存是500万。那周转率就是20。这意味着你的库存一天能转20次。
我个人习惯把周转率分成三个档:
| 周转率 | 含义 | 风险等级 |
|---|---|---|
| > 50 | 库存极轻,流动性好 | 低风险 |
| 10 - 50 | 正常做市水平 | 中等风险 |
| < 10 | 库存积压,需要警惕 | 高风险 |
我在项目中遇到过一家做市团队,BTC库存周转率掉到了3以下。什么概念?就是他们手里的币,平均要躺4个月才能换一轮。后来行情一跌,直接亏掉全年利润。
监控周转率,我建议用滚动窗口计算。比如过去24小时的成交量除以当前库存。这样能实时反映库存状态,而不是看一个滞后的月均值。
12.2 库存老化监控:别让库存变成「陈年旧货」
库存老化,指的是某个仓位持有了多久。为什么重要?因为时间越长,风险越大。
你想想看,一个仓位如果挂了3天还没成交,说明什么?说明你的报价可能偏离市场了。或者这个品种本身流动性就很差。
我习惯把库存按「年龄」分组:
- 年轻库存(< 1小时):正常做市仓位,无需干预
- 中年库存(1 - 6小时):需要关注,检查报价是否合理
- 老年库存(6 - 24小时):必须触发预警,考虑主动平仓
- 古董库存(> 24小时):立即清算,不计成本
我曾经犯过一个错误。有一笔ETH库存挂了18个小时没成交,我总觉得「再等等,行情会回来的」。结果呢?第二天大盘跌了5%,那笔库存直接亏了8万美金。嗯,从那以后我再也不敢对老化库存心存侥幸。
实现老化监控,代码其实不复杂:
def check_inventory_aging(inventory):
for item in inventory:
age = current_time - item.open_time
if age > 24 * 3600:
trigger_liquidation(item) # 古董库存,直接清算
elif age > 6 * 3600:
send_alert(item) # 老年库存,发预警
elif age > 1 * 3600:
adjust_spread(item) # 中年库存,调整价差
12.3 库存对冲策略:别把所有鸡蛋放在一个篮子里
库存对冲,说白了就是拿一个品种的风险去抵消另一个品种的风险。做市商常用的对冲方式有几种:
12.3.1 品种内对冲
比如你手里有BTC的多头库存,同时做空BTC期货。这样价格涨跌对你影响不大,你赚的是价差和手续费。
我建议对冲比例控制在80%-120%之间。太低了对冲效果差,太高了又变成纯套利,失去了做市的意义。
12.3.2 跨品种对冲
有时候你找不到直接的期货对冲,可以用相关性高的品种。比如ETH和BTC,相关性通常在0.7以上。
但这里有个坑。相关性不是恒定的。我记得2020年3月12日那天,BTC和ETH的相关性一度跌到0.2。如果你按常规比例对冲,那天会亏得很惨。
12.3.3 期权对冲
如果你有期权工具,可以用买入看跌期权来保护库存。成本比期货对冲高,但好处是下行风险有限,上行收益不封顶。
我个人习惯在库存老化超过4小时时,买入平值看跌期权做保护。虽然花了点权利金,但心里踏实。
12.4 库存清算机制:最后的防线
清算机制,是库存风险管理的最后一道防线。当所有常规手段都失效时,你必须有一个自动化的清算流程。
我设计的清算机制分三级:
- 软清算:主动调整报价,把价差拉大,吸引对手方吃单。同时降低报价量,减少库存暴露。
- 硬清算:直接以市价单平仓。虽然会吃滑点,但能快速降低风险。
- 紧急清算:当库存超过最大容忍度时,不管价格多差,全部清掉。这个阈值我通常设在总资产的5%。
举个例子。假设你的总资产是100万美金,库存价值到了5万美金以上,紧急清算就会触发。系统会直接发市价单,把所有库存砸出去。
清算机制的代码实现,我建议做成独立模块,和主策略解耦。这样即使策略出问题,清算模块还能独立运行。
class LiquidationEngine:
def __init__(self, max_inventory_ratio=0.05):
self.max_ratio = max_inventory_ratio
def check_and_liquidate(self, portfolio):
inventory_value = portfolio.get_inventory_value()
total_asset = portfolio.get_total_asset()
if inventory_value / total_asset > self.max_ratio:
self.emergency_liquidate(portfolio)
elif inventory_value / total_asset > self.max_ratio * 0.8:
self.hard_liquidate(portfolio)
elif inventory_value / total_asset > self.max_ratio * 0.6:
self.soft_liquidate(portfolio)
这里有个细节。清算时要注意市场深度。如果市场深度不够,大额市价单会把价格打穿。我建议分批清算,每次只吃10%的深度,等价格恢复后再吃下一批。
嗯,库存风险管理就聊这么多。核心就一句话:库存是工具,不是资产。别让它成为你的负担。