第八章:做市商风险管理:VaR与CVaR在做市中的应用、最大回撤控制、尾部风险防范、压力测试场景设计
做市这行,说白了就是在刀尖上跳舞。你赚的是流动性溢价,但随时可能被黑天鹅咬一口。我见过太多同行,策略赚了半年,一天就亏回去了。为什么?风险管理没做到位。
今天这一章,咱们就聊聊做市商的风险管理。我会把VaR、CVaR、最大回撤、尾部风险、压力测试这些概念,结合我踩过的坑,掰开了讲清楚。
8.1 VaR:你每天最多亏多少?
VaR,全称Value at Risk,风险价值。它回答一个问题:在给定的置信水平下,你的头寸在未来一段时间内,最大可能亏损是多少?
举个例子。假设你的做市账户有100万U,日VaR(95%置信水平)是5万U。意思是:在95%的情况下,你一天亏损不会超过5万U。剩下5%的情况,亏损可能超过5万。
计算VaR有三种主流方法:
- 参数法(方差-协方差法):假设收益率服从正态分布。算起来快,但市场哪有那么乖?
- 历史模拟法:直接用过去N天的收益率分布,取第5%分位数。简单粗暴,我比较常用。
- 蒙特卡洛模拟法:随机生成大量价格路径,模拟未来分布。精度高,但计算量大。
我个人习惯用历史模拟法。为什么?因为它不需要假设分布形态。做市商面对的订单流,尾部往往比正态分布厚得多。你用参数法,容易低估风险。
核心要点:VaR不是万能的。它只告诉你“大概率亏多少”,但亏的那5%里,可能亏掉你全部本金。这就是VaR的盲区。
8.2 CVaR:关注那5%的噩梦
CVaR,也叫条件风险价值或期望损失。它计算的是:当亏损超过VaR阈值时,平均会亏多少?
还是刚才的例子。95% VaR是5万U。CVaR可能是8万U。意思是:一旦亏损超过5万U,平均亏损是8万U。这个数字比VaR更可怕,也更真实。
我在做市策略里,同时监控VaR和CVaR。VaR用来设止损线,CVaR用来评估策略的尾部风险暴露。如果CVaR是VaR的2倍以上,说明你的策略在极端行情下非常脆弱。这时候我会主动降低仓位,或者加对冲。
我的经验:做市商不要只看VaR。我曾经有个策略,VaR看起来很小,但CVaR是VaR的3倍。结果一次闪崩,直接亏掉两周利润。从那以后,我强制要求CVaR/VaR比率不超过1.5。
8.3 最大回撤控制:活下来比什么都重要
最大回撤,就是从净值最高点到最低点的跌幅。做市商最怕什么?不是亏钱,是亏到无法翻身。
我给自己定了个铁律:单日最大回撤不超过账户净值的5%,周回撤不超过10%。一旦触发,强制减仓50%,直到回撤修复。
控制回撤的几个实用方法:
- 动态仓位管理:盈利时加仓,亏损时减仓。别跟市场较劲。
- 多品种分散:别把所有资金押在一个币对上。我一般同时做5-10个交易对。
- 止损硬约束:在代码里写死止损逻辑,不要手动干预。情绪会害了你。
警告:最大回撤控制不是事后诸葛亮。你得在策略上线前就定好规则。我曾经见过一个团队,回撤30%了还在扛,最后爆仓。记住:做市商的第一目标是活着,不是赚钱。
8.4 尾部风险防范:黑天鹅来了怎么办?
尾部风险,就是那些概率极小、但一旦发生就毁灭性的事件。比如312暴跌、LUNA归零、FTX暴雷。做市商最怕这个。
怎么防范?我总结了三板斧:
- 压力测试:模拟极端行情,看你的策略能不能扛住。后面会细讲。
- 期权对冲:买一些价外看跌期权,相当于给账户上保险。成本不高,但关键时刻能救命。
- 预留现金:永远保留20%以上的现金。别满仓干。流动性枯竭时,现金就是王。
我曾经在2020年312之前,账户里留了30%的U。那天BTC从8000跌到3800,我的做市策略亏了不少,但因为有现金,我还能在底部接货,后面几天就赚回来了。如果当时满仓,可能已经出局了。
8.5 压力测试场景设计
压力测试,就是故意制造极端行情,看你的策略会不会崩。我一般设计这么几个场景:
| 场景 | 描述 | 预期影响 |
|---|---|---|
| 闪崩 | 价格在1分钟内下跌20% | 库存亏损、流动性枯竭 |
| 流动性枯竭 | 买卖价差扩大10倍,深度减少90% | 无法平仓、滑点巨大 |
| 交易所宕机 | API断开30分钟 | 无法撤单、无法对冲 |
| 多币种联动暴跌 | BTC、ETH同时跌15% | 相关性风险爆发 |
每个场景,我都会跑一遍回测。如果策略在某个场景下亏损超过20%,我就得重新设计。别等到真发生了才后悔。
压力测试的核心逻辑:不是预测未来,而是验证你的策略在最坏情况下能不能活下来。活下来,才有机会赚钱。
8.6 知识体系总览
下面这张图,是我做风险管理时脑子里始终绷着的一根弦。你可以把它当成你的风控地图:
这张图把风险管理拆成了五个维度。你想想看,任何一个维度出问题,都可能让你一夜回到解放前。所以,别偷懒,每个维度都得有对应的策略和代码实现。
8.7 代码实现:一个简单的VaR计算器
下面是我写的一个简易VaR/CVaR计算函数。你可以直接拿去用,改改参数就能跑。
import numpy as np
import pandas as pd
def calculate_var_cvar(returns, confidence=0.95):
"""
计算VaR和CVaR
:param returns: 收益率序列 (numpy array or pandas Series)
:param confidence: 置信水平,默认95%
:return: VaR, CVaR
"""
# 排序收益率
sorted_returns = np.sort(returns)
# 计算VaR
var_index = int((1 - confidence) * len(sorted_returns))
var = -sorted_returns[var_index]
# 计算CVaR:取尾部所有收益率的均值
tail_returns = sorted_returns[:var_index]
cvar = -np.mean(tail_returns)
return var, cvar
# 示例:模拟1000天的收益率
np.random.seed(42)
daily_returns = np.random.normal(0.001, 0.02, 1000) # 均值0.1%,标准差2%
var_95, cvar_95 = calculate_var_cvar(daily_returns, 0.95)
print(f"95% VaR: {var_95:.4f} (即每天亏损不超过 {var_95*100:.2f}%)")
print(f"95% CVaR: {cvar_95:.4f} (即尾部平均亏损 {cvar_95*100:.2f}%)")
这段代码很简单,但很实用。我把它集成到了我的做市策略监控面板里,每5分钟算一次。一旦VaR或CVaR超过阈值,系统会自动报警。
小提示:实际生产中,收益率序列要用滑动窗口,比如过去30天的数据。别用全量历史,市场结构会变。我一般用60天窗口,每天滚动更新。
8.8 避坑指南
最后,分享几个我踩过的坑,希望能帮你少走弯路:
- 别只看VaR:VaR告诉你95%的情况,但做市商死在剩下的5%。一定要同时看CVaR。
- 压力测试别偷懒:我见过有人只测一个场景,结果市场暴跌时流动性也枯竭了,双重打击。多设计几个场景,覆盖闪崩、流动性枯竭、交易所故障。
- 回撤控制要自动化:别指望手动止损。行情剧烈时,你根本来不及反应。把逻辑写死在代码里。
- 尾部风险不是小概率:在加密市场,黑天鹅比你想的频繁。312、519、FTX暴雷,哪次不是尾部事件?永远假设最坏情况会发生。
嗯,这一章的内容就到这里。风险管理听起来枯燥,但它是做市商的护身符。没有它,你赚再多钱也是给市场打工。记住:活下来,比什么都重要。