第十章:风险管理:VaR与CVaR在做市中的应用、库存风险度量、极端行情下的风险控制

做市商这行,说白了就是跟风险打交道。你赚的每一分钱,本质上都是承担风险的补偿。我见过太多同行,策略回测漂亮得不行,一上线就爆仓——不是策略不行,是风险管理没跟上。

今天咱们聊聊做市商最核心的三个风险维度:市场风险(用VaR和CVaR量化)、库存风险(你手里囤了多少货)、以及极端行情下的生存法则

1. VaR:你最多亏多少?

VaR(Value at Risk)是个很直观的概念——在给定置信水平和持有期内,最大可能损失是多少。比如95%置信度下,日VaR是10万,意思就是:100天里,只有5天亏损会超过10万。

听起来不错?但有个坑——VaR不告诉你超过阈值后到底会亏多少。我2015年做美股做市时,某天VaR显示99%置信度下只亏5万,结果那天市场闪崩,实际亏损是50万。为什么?因为VaR假设收益服从正态分布,但真实市场有厚尾。

核心公式:
参数法VaR = Z_α × σ × √T × 头寸规模
其中Z_α是置信水平对应的分位数(95%→1.645,99%→2.326)

实际做市时,我一般用历史模拟法,不用参数法。原因很简单——参数法假设太强,历史模拟法直接拿过去500天的收益率排序,取第5%分位点。代码实现也很直接:

import numpy as np

def historical_var(returns, confidence=0.95):
    """
    历史模拟法计算VaR
    returns: 日收益率序列
    confidence: 置信水平
    """
    sorted_returns = np.sort(returns)
    index = int((1 - confidence) * len(sorted_returns))
    return -sorted_returns[index]

# 假设你有1000万头寸,日收益率数据
daily_returns = np.random.normal(0, 0.02, 500)  # 模拟数据
var_95 = historical_var(daily_returns, 0.95)
print(f"95% VaR: {var_95:.2%}")  # 输出百分比形式

嗯,这里要注意——VaR的持有期要和你的交易频率匹配。做市商通常是高频,用1小时甚至10分钟的VaR更合理。我习惯用滚动窗口,比如过去200个10分钟收益,实时更新VaR。

2. CVaR:VaR的补丁

CVaR(Conditional VaR),也叫Expected Shortfall,解决的就是VaR那个「尾部风险盲区」问题。它计算的是:当损失超过VaR时,平均会亏多少

举个例子:95% VaR是10万,CVaR可能是15万。这意味着,在那些最坏的5%日子里,平均亏损是15万。

我的经验: 做市商应该同时监控VaR和CVaR。如果两者差距很大(比如CVaR是VaR的2倍以上),说明你的组合有严重的尾部风险,需要减仓或加对冲。
def historical_cvar(returns, confidence=0.95):
    """
    历史模拟法计算CVaR
    """
    sorted_returns = np.sort(returns)
    index = int((1 - confidence) * len(sorted_returns))
    tail_returns = sorted_returns[:index]
    return -np.mean(tail_returns)

cvar_95 = historical_cvar(daily_returns, 0.95)
print(f"95% CVaR: {cvar_95:.2%}")

我曾经在某个做市项目里,VaR一直控制在2%以内,但CVaR飙到了6%。当时没在意,结果遇到一次流动性枯竭,直接亏了8%。从那以后,我把CVaR作为硬性风控指标——VaR可以超,CVaR绝对不能超

3. 库存风险:你手里囤了多少「炸弹」?

做市商的核心矛盾是什么?你既要提供流动性(接单),又不想持有太多库存。库存风险说白了就是:你手里囤的资产,价格跌了怎么办?

我一般用三个指标衡量库存风险:

  • 库存价值:当前持仓的总市值。这个最直观,但不够精细。
  • 库存Beta:持仓相对于大盘的敏感度。Beta=2意味着大盘跌1%,你的库存可能跌2%。
  • 库存集中度:单一资产占总库存的比例。我给自己定的红线是:任何单一资产不超过总库存的20%。

实际操作中,我会实时计算一个库存风险评分

def inventory_risk_score(positions, market_prices, beta_threshold=1.5):
    """
    计算库存风险评分
    positions: 持仓字典 {symbol: quantity}
    market_prices: 当前市场价格 {symbol: price}
    """
    total_value = sum(qty * market_prices[sym] for sym, qty in positions.items())
    weighted_beta = 0
    max_concentration = 0
    
    for sym, qty in positions.items():
        value = qty * market_prices[sym]
        weight = value / total_value
        # 假设每个资产有预计算的beta
        beta = get_asset_beta(sym)  # 需要外部数据
        weighted_beta += weight * beta
        max_concentration = max(max_concentration, weight)
    
    # 评分:beta越高、集中度越高,风险越大
    score = (weighted_beta / beta_threshold) * 0.6 + (max_concentration / 0.2) * 0.4
    return min(score, 1.0)  # 归一化到0-1
避坑指南: 我曾经在某个山寨币上赚了钱,仓位越滚越大,集中度到了35%。结果项目方出负面新闻,价格半小时跌了40%,我亏掉了之前一个月的利润。现在我的规则是:任何盈利仓位,必须逐步减仓,绝不让盈利变成库存风险

4. 极端行情下的风险控制

这才是做市商真正的生死考验。平时VaR、CVaR算得再好,遇到黑天鹅事件,所有模型都会失效。我经历过三次极端行情,总结出几条铁律:

4.1 熔断机制:自动停交易

我每个做市策略都配了三层熔断

  • 第一层(警告):瞬时亏损超过当日利润的50%,自动减仓50%。
  • 第二层(暂停):亏损超过总资金的2%,暂停所有新开仓,只允许平仓。
  • 第三层(清仓):亏损超过5%,强制平掉所有库存,转为现金。

你可能会问:清仓了还怎么做市?活着比赚钱重要。2020年3月那次流动性危机,很多做市商就是因为没及时清仓,直接破产了。

4.2 波动率调整:动态缩小报价宽度

极端行情下,波动率会飙升。这时候如果你还按正常价差报价,就是送钱给市场。我习惯用波动率乘数动态调整:

def adjust_spread(base_spread, volatility, vol_threshold=0.05):
    """
    根据波动率调整报价价差
    """
    if volatility < vol_threshold:
        return base_spread  # 正常市场
    else:
        # 波动率每超过阈值1%,价差扩大20%
        multiplier = 1 + (volatility - vol_threshold) / vol_threshold * 0.2
        return base_spread * min(multiplier, 3.0)  # 最多扩大3倍

4.3 库存上限:硬性止损

不管什么情况,库存价值不得超过总资金的30%。这是死命令,代码里写死的,连我自己都不能改。为什么?因为极端行情下,你很容易觉得「再扛一扛就回来了」——这种心态会害死你

5. 知识体系总览

下面这张图是我自己梳理的风险管理框架,你可以对照着检查自己的系统:

做市商风险管理框架 市场风险 库存风险 极端行情控制 VaR(参数法/历史模拟法) CVaR(尾部风险度量) 压力测试(情景分析) 库存价值与Beta 集中度限制(≤20%) 库存风险评分模型 三层熔断机制 波动率动态调整 硬性库存上限(30%) 核心原则:先活下来,再赚钱 VaR/CVaR用于日常监控,库存风险用于仓位管理,极端行情控制是最后防线

6. 实战中的几个坑

最后分享几个我踩过的坑,希望能帮你省点学费:

  1. 别迷信VaR:它只是个统计工具,不是预言。我见过有人把VaR当止损线用,结果市场连续波动,VaR天天被突破,最后亏麻了。
  2. 库存风险要实时监控:别等收盘了再算。我系统里每秒钟更新一次库存风险评分,超过阈值自动报警。
  3. 极端行情下,流动性会消失:你的止损单可能根本成交不了。所以熔断机制要提前设好,别指望手动操作。
  4. 回测要包含极端行情:我习惯把2015年A股股灾、2020年3月流动性危机、2022年Luna崩盘这些数据都加进去,看看策略能不能扛住。
一个小技巧: 我每天开盘前会做一次「心理压力测试」——假设今天市场跌20%,我的库存会亏多少?如果这个数字让我睡不着觉,那就减仓。听起来很主观?但做市商这行,有时候直觉比模型更管用。

风险管理不是限制你赚钱,而是让你能持续地赚钱。记住:市场永远在,机会永远有,但你的本金只有一次。


无相订单流研究社 微信Lucian808555