第十二章:风险管理体系: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}")

我个人习惯用历史模拟法。为什么?因为它不需要假设收益率服从正态分布。基差收益率的分布,你想想看,经常有厚尾特征。正态分布会低估风险。

我的经验:历史模拟法至少用500个交易日的数据。太少了,尾部估计不准。我一般用1000天。

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}")
注意:蒙特卡洛模拟的计算量很大。如果你有100个品种,每个模拟10000次,那就是100万次计算。我建议只在关键风控节点用,比如每周做一次全面压力测试。

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%
我的习惯:仓位限制不是死的。当市场波动率上升时,我会主动降低仓位。比如VIX指数超过30,所有仓位减半。

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个标准差以上的波动。
血的教训:我曾经有一次,觉得某个基差机会特别好,把杠杆加到了7倍。结果第二天一个跳空,直接打到止损线。那次亏了30%。从那以后,我再也不超过5倍杠杆。

12.5 知识体系总览

下面这张图,是我做风险管理时的核心框架。你可以把它当成你的风控地图。

基差交易风险管理体系 风险管理体系 VaR计算 压力测试 仓位限制 杠杆控制 历史模拟法 参数法 蒙特卡洛模拟 情景分析 敏感性分析 单品种限制 策略层面限制 相关性限制 杠杆计算 动态调整 保证金管理 核心目标:在控制风险的前提下,最大化收益 活下来,才能赚钱

这张图把风险管理拆成了四个模块。每个模块之间是相互关联的。比如,VaR算出来风险大了,你就要降低仓位和杠杆。压力测试发现某个情景很危险,你就要调整仓位限制。

最后说一句:风险管理不是束缚你赚钱的枷锁,而是保护你活下去的铠甲。我见过太多人,策略很牛,但风控一塌糊涂,最后被市场淘汰。

记住:在基差交易里,活得久比赚得快更重要