第十二章:风险管理体系:VaR计算、压力测试、仓位限制与杠杆控制
做基差交易这些年,我最大的感悟是什么?
不是策略多赚钱,而是活下来。
你策略再牛,一次黑天鹅就能把你打回原形。我见过太多同行,赚了三年,一夜归零。所以这一章,咱们聊聊风险管理。说白了,就是给你的交易上保险。
12.1 VaR计算:你的风险到底有多大?
VaR,Value at Risk,风险价值。听起来高大上,其实很简单:在某个置信水平下,未来一段时间内,你的最大可能亏损是多少。
举个例子。我算出来95%置信水平下,日VaR是50万。意思是:100天里,有95天我的亏损不会超过50万。剩下5天?嗯,那5天可能亏得你怀疑人生。
计算VaR,主流方法有三种。我一个个说。
12.1.1 历史模拟法
这个方法最直观。把过去N天的收益率排序,取第5%分位数。
import numpy as np
import pandas as pd
def historical_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
# 示例:假设我们有过去500天的基差收益率数据
np.random.seed(42)
daily_returns = np.random.normal(0.001, 0.02, 500) # 模拟数据
var_95 = historical_var(daily_returns)
print(f"95%置信水平下的日VaR: {var_95:.4f}")
我个人习惯用历史模拟法。为什么?因为它不需要假设收益率服从正态分布。基差收益率的分布,你想想看,经常有厚尾特征。正态分布会低估风险。
12.1.2 参数法(方差-协方差法)
这个方法假设收益率服从正态分布。计算均值和标准差,然后查表。
from scipy.stats import norm
def parametric_var(returns, confidence_level=0.95):
"""
参数法计算VaR
"""
mu = np.mean(returns)
sigma = np.std(returns)
z_score = norm.ppf(1 - confidence_level)
var = -(mu + z_score * sigma)
return var
var_param = parametric_var(daily_returns)
print(f"参数法VaR: {var_param:.4f}")
参数法计算快,但有个致命问题:它假设收益率是正态分布。基差交易里,这个假设经常不成立。我遇到过几次,参数法算出来VaR只有50万,实际亏损到了200万。嗯,从那以后,我对参数法就多留了个心眼。
12.1.3 蒙特卡洛模拟法
这个方法最灵活,也最耗计算资源。生成大量随机路径,模拟未来可能的价格走势。
def monte_carlo_var(returns, confidence_level=0.95, n_simulations=10000, horizon=1):
"""
蒙特卡洛模拟法计算VaR
"""
mu = np.mean(returns)
sigma = np.std(returns)
# 模拟未来收益率
simulated_returns = np.random.normal(mu, sigma, (n_simulations, horizon))
portfolio_returns = np.sum(simulated_returns, axis=1)
var = -np.percentile(portfolio_returns, (1 - confidence_level) * 100)
return var
var_mc = monte_carlo_var(daily_returns)
print(f"蒙特卡洛VaR: {var_mc:.4f}")
12.2 压力测试:别等黑天鹅来了再后悔
VaR告诉你的是「正常情况」下的风险。但市场不正常的时候呢?
压力测试就是干这个的。我把它分成两类:情景分析和敏感性分析。
12.2.1 情景分析
设定一些极端但可能发生的情景,看看你的组合会怎样。
| 情景 | 描述 | 基差变化 | 预期亏损 |
|---|---|---|---|
| 2008年金融危机 | 流动性枯竭,基差急剧扩大 | +5% ~ +15% | -20% ~ -40% |
| 2020年3月流动性危机 | 所有资产被抛售,基差瞬间拉大 | +3% ~ +8% | -15% ~ -25% |
| 2022年能源危机 | 商品基差剧烈波动 | +2% ~ +10% | -10% ~ -30% |
| 极端升水 | 近月合约暴涨,远月不动 | -5% ~ -10% | -10% ~ -20% |
我曾经在2020年3月吃过亏。当时基差策略跑得好好的,突然流动性没了。所有基差同时扩大,多空两头亏。嗯,那次之后,我把流动性压力测试加到了每日风控流程里。
12.2.2 敏感性分析
看看单个风险因子变化时,你的组合会怎样。
def sensitivity_analysis(portfolio, factor_name, shock_range):
"""
敏感性分析
portfolio: 投资组合
factor_name: 风险因子名称
shock_range: 冲击范围,如[-0.1, -0.05, 0, 0.05, 0.1]
"""
results = []
for shock in shock_range:
# 对组合施加冲击
pnl = portfolio.apply_shock(factor_name, shock)
results.append({
'shock': shock,
'pnl': pnl,
'pnl_pct': pnl / portfolio.total_value
})
return results
12.3 仓位限制:别把鸡蛋放在一个篮子里
仓位限制,说白了就是单品种、单策略、单市场的最大敞口。
我见过最惨的案例:一个朋友,全仓押注某个品种的基差回归。结果那个品种出了个政策,基差直接翻倍。他爆仓了。嗯,仓位管理没做好,再好的策略也是白搭。
12.3.1 单品种仓位限制
我一般这样设:
- 单个品种最大仓位:总资金的10%
- 单个品种最大杠杆:3倍
- 相关品种合计:不超过总资金的30%
为什么这么设?你想想看,如果两个品种的相关性很高,比如螺纹钢和热卷,它们同时出问题的概率很大。所以我把它们算在一起。
12.3.2 策略层面仓位限制
基差交易策略有很多种:跨期套利、跨品种套利、期现套利。每种策略的风险特征不一样。
| 策略类型 | 最大仓位 | 最大杠杆 | 止损线 |
|---|---|---|---|
| 跨期套利 | 40% | 5倍 | -8% |
| 跨品种套利 | 30% | 3倍 | -6% |
| 期现套利 | 20% | 2倍 | -4% |
| 统计套利 | 10% | 2倍 | -5% |
12.4 杠杆控制:用多少杠杆,心里要有数
杠杆是把双刃剑。用好了,收益翻倍。用不好,一夜归零。
我见过有人用10倍杠杆做基差交易。结果基差反向波动了3%,他直接爆仓。3%的波动在基差交易里,其实很常见。
12.4.1 杠杆的计算
杠杆 = 总头寸名义价值 / 自有资金
def calculate_leverage(positions, capital):
"""
计算总杠杆
positions: 持仓列表,每个元素包含合约乘数、价格、手数
capital: 自有资金
"""
total_notional = 0
for pos in positions:
notional = pos['multiplier'] * pos['price'] * pos['quantity']
total_notional += notional
leverage = total_notional / capital
return leverage
# 示例
positions = [
{'multiplier': 10, 'price': 5000, 'quantity': 10}, # 螺纹钢
{'multiplier': 50, 'price': 4000, 'quantity': 5}, # 铜
]
capital = 500000
lev = calculate_leverage(positions, capital)
print(f"当前杠杆: {lev:.2f}倍")
12.4.2 杠杆控制原则
我总结了几条铁律:
- 总杠杆不超过5倍。这是红线,过了就砍仓。
- 动态调整。波动率越高,杠杆越低。我一般用ATR来调整。
- 留足保证金。至少保证能扛住2个标准差以上的波动。
12.5 知识体系总览
下面这张图,是我做风险管理时的核心框架。你可以把它当成你的风控地图。
这张图把风险管理拆成了四个模块。每个模块之间是相互关联的。比如,VaR算出来风险大了,你就要降低仓位和杠杆。压力测试发现某个情景很危险,你就要调整仓位限制。
最后说一句:风险管理不是束缚你赚钱的枷锁,而是保护你活下去的铠甲。我见过太多人,策略很牛,但风控一塌糊涂,最后被市场淘汰。
记住:在基差交易里,活得久比赚得快更重要。