第三章:市场风险度量与限额管理
各位做套利的朋友,咱们今天聊点硬核的——风险度量与限额管理。
说实话,我见过太多套利团队,策略回测漂亮得不行,一上实盘就崩。为什么?说白了,就是没把风险当回事。你想想看,套利赚的是微薄价差,一次黑天鹅就能让你把半年的利润全吐回去。
我个人习惯,做任何策略之前,先问自己三个问题:亏多少?怎么亏?扛不扛得住? 今天我们就围绕这三个问题,把VaR、CVaR、最大回撤这些工具讲透。
3.1 VaR:最常用的风险度量,但别迷信它
VaR,全称Value at Risk,风险价值。简单说就是:在给定的置信水平和持有期内,最大可能损失是多少。
举个例子:某套利组合的日VaR(95%) = 10万元。意思是,有95%的把握,明天亏损不超过10万。听起来不错吧?但问题来了——剩下那5%呢?
计算VaR有三种常用方法:
| 方法 | 原理 | 适用场景 | 我的评价 |
|---|---|---|---|
| 历史模拟法 | 用历史收益率排序,取分位数 | 数据充足、市场稳定 | 简单粗暴,但历史会重演吗? |
| 参数法(方差-协方差) | 假设收益率服从正态分布 | 快速计算、组合VaR | 金融数据哪有那么乖? |
| 蒙特卡洛模拟 | 随机模拟大量路径 | 复杂衍生品、非线性风险 | 准,但慢。适合离线分析 |
我个人偏好历史模拟法,简单直接。但注意,样本窗口别太长也别太短。太长会把老黄历算进去,太短又捕捉不到极端事件。我一般用250个交易日(约一年)。
# Python示例:历史模拟法计算VaR
import numpy as np
def calculate_var(returns, confidence_level=0.95):
"""
计算历史模拟VaR
returns: 日收益率序列
confidence_level: 置信水平,默认95%
"""
sorted_returns = np.sort(returns)
index = int((1 - confidence_level) * len(sorted_returns))
var = -sorted_returns[index] # 取正值表示损失
return var
# 假设某套利组合的日收益率
daily_returns = np.random.normal(0.001, 0.02, 1000)
var_95 = calculate_var(daily_returns, 0.95)
print(f"95% VaR: {var_95:.4f}")
3.2 CVaR:补上VaR的短板
CVaR,也叫条件VaR或期望损失。它回答的是:当损失超过VaR时,平均会亏多少?
还是刚才那个例子。VaR告诉你95%的情况下亏不超过10万。CVaR告诉你:剩下那5%的情况,平均亏25万。这才是真正要命的数字。
def calculate_cvar(returns, confidence_level=0.95):
"""
计算CVaR(条件VaR)
"""
sorted_returns = np.sort(returns)
index = int((1 - confidence_level) * len(sorted_returns))
tail_returns = sorted_returns[:index]
cvar = -np.mean(tail_returns)
return cvar
cvar_95 = calculate_cvar(daily_returns, 0.95)
print(f"95% CVaR: {cvar_95:.4f}")
3.3 最大回撤:最直观的风险指标
最大回撤,就是从最高点到最低点的最大跌幅。为什么重要?因为回撤50%,需要涨100%才能回本。
我记得有个团队,策略年化收益30%,最大回撤40%。看起来收益不错吧?但客户受不了啊,回撤到30%的时候就赎回了,后面反弹全没吃到。所以,最大回撤不仅是数学问题,更是心理问题。
我个人习惯,套利策略的最大回撤控制在5%以内。超过这个数,说明策略可能出了问题,或者市场环境变了。
def calculate_max_drawdown(equity_curve):
"""
计算最大回撤
equity_curve: 净值曲线
"""
peak = np.maximum.accumulate(equity_curve)
drawdown = (equity_curve - peak) / peak
max_dd = np.min(drawdown)
return max_dd
# 模拟净值曲线
np.random.seed(42)
equity = 100 * np.exp(np.cumsum(np.random.normal(0.001, 0.02, 500)))
max_dd = calculate_max_drawdown(equity)
print(f"最大回撤: {max_dd:.2%}")
3.4 限额管理:三道防线
光度量风险不够,还得设限额。我把它分成三道防线:
第一道:敞口限额
说白了就是最多能押多少钱。套利交易中,我一般按净敞口和总敞口分别设限。比如:
- 单品种净敞口不超过总资金的5%
- 总敞口不超过总资金的200%(考虑杠杆)
- 同板块敞口不超过总资金的30%
第二道:杠杆限额
杠杆是把双刃剑。套利用杠杆放大收益,但也放大风险。我建议:
- 统计套利:杠杆不超过3倍
- 期现套利:杠杆不超过5倍(因为有对冲)
- 跨期套利:杠杆不超过4倍
为什么这么设?因为我见过有人用10倍杠杆做统计套利,一次模型失效直接爆仓。嗯,这里要注意,杠杆限额要动态调整,波动率高了就降杠杆。
第三道:集中度限额
鸡蛋别放一个篮子里。集中度限额包括:
- 单策略资金占比不超过20%
- 单交易所资金占比不超过40%
- 单品种价差组合不超过15%
3.5 压力测试与情景分析
VaR和限额管的是「正常市场」,但黑天鹅来了怎么办?这就需要压力测试。
我常用的几种情景:
- 历史重演: 比如2015年股灾、2020年原油暴跌。把当时的市场数据拿来,看策略会亏多少。
- 极端波动: 假设波动率突然放大3倍,流动性枯竭。套利价差可能瞬间拉大。
- 相关性突变: 平时不相关的品种突然同涨同跌。这是套利最怕的。
- 流动性危机: 假设某个合约突然没有对手盘,平不了仓。
我记得2020年3月,美股熔断那会儿,很多套利策略都崩了。为什么?因为平时稳定的相关性全乱了。黄金和原油一起跌,美债和美股一起跌。你想想看,套利赚的就是相关性稳定的钱,相关性一乱,全完。
# 压力测试示例:模拟波动率飙升
def stress_test(returns, vol_multiplier=3):
"""
压力测试:波动率放大
"""
stressed_returns = returns * vol_multiplier
var_stressed = calculate_var(stressed_returns, 0.95)
cvar_stressed = calculate_cvar(stressed_returns, 0.95)
return var_stressed, cvar_stressed
# 正常情况
normal_var = calculate_var(daily_returns, 0.95)
normal_cvar = calculate_cvar(daily_returns, 0.95)
# 压力情况(波动率放大3倍)
stressed_var, stressed_cvar = stress_test(daily_returns, 3)
print(f"正常: VaR={normal_var:.4f}, CVaR={normal_cvar:.4f}")
print(f"压力: VaR={stressed_var:.4f}, CVaR={stressed_cvar:.4f}")
3.6 实战框架:把风控落地
说了这么多,怎么落地?我给大家画个框架图:
这个框架的核心逻辑是:先度量,再设限,最后做压力测试。 三者缺一不可。
- 每日开盘前检查VaR和敞口是否超限
- 每周做一次压力测试,更新情景参数
- 每月复盘最大回撤,分析原因
- 每季度调整限额,适应市场变化
最后说一句:风控不是束缚,是保护。没有风控的套利,就像没有刹车的赛车——跑得快,死得也快。
公众号:蓝海资料掘金营,微信deep3321