返回金融系统设计
高频与风险科学 · 章节

06 - 市场风险

06-hft-risk-science/06-market-risk.md

06 - 市场风险

定位:给有10年金融经验的架构师/PM讲清楚"市场风险怎么量化、怎么建模、怎么落地" 目标:理解VaR三大方法论、ES/CVaR、波动率建模(GARCH)、极值理论(EVT)、压力测试 前提:你知道什么是收益率、标准差、正态分布,但不需要精通随机过程


一、核心概念与直觉

1.1 三大风险的定位

金融机构面临三大核心风险,它们的本质完全不同:

风险类型核心问题时间尺度典型例子
市场风险市场价格变动导致我亏多少?短期(天/周)股市暴跌、利率飙升、汇率剧变
信用风险对方还不了钱我亏多少?中长期(月/年)借款人违约、债券违约
操作风险内部失误/外部事件导致亏多少?任意系统故障、人为操作错误、欺诈

市场风险的核心特征

  • 风险来源是价格波动——股价、利率、汇率、商品价格
  • 影响是即时的——今天收盘价就能算出今天亏了多少
  • 双向的——价格上涨或下跌都可能带来损失(取决于你持有多头还是空头)

1.2 核心问题:未来可能亏多少?

这是市场风险管理的终极问题。VaR(Value at Risk)就是回答这个问题的核心工具。

用天气预报做类比

天气预报说:
  "95%的概率,明天降雨量不会超过50mm"

VaR说:
  "95%的概率,明天投资组合的损失不会超过100万"

两者都在说:
  "在某个概率下,坏事不会坏到什么程度"

注意两者也有同样的缺陷:
  天气预报不告诉你"如果超过50mm,会下多大"
  VaR不告诉你"如果超过100万,会亏多少"
  → 这就是ES/CVaR要回答的问题

1.3 市场风险在架构设计中的影响

你要设计的系统需要理解的市场风险概念
交易限额系统VaR计算、实时风险限额监控
投组风控系统协方差矩阵、组合VaR
衍生品估值系统波动率曲面、Greeks
压力测试系统情景生成、重估值引擎
风险报告系统日报/周报/月报的自动化生成
资本计量系统Basel内部模型法、ES替代VaR

二、VaR(Value at Risk)方法论

2.1 VaR的精确定义

定义:在给定的置信水平α和持有期T内,投资组合可能遭受的最大损失

数学表达:

P(Loss ≤ VaR_α) = α

即:损失小于或等于VaR的概率为α

三要素

  1. 置信水平α:通常95%或99%
  2. 持有期T:通常1天或10天
  3. VaR金额:一个具体的数字

例子

1天95% VaR = 100万

含义:
  在正常市场条件下,未来1天内
  有95%的概率,损失不会超过100万
  
换个说法:
  有5%的概率,损失会超过100万
  即平均每20个交易日,有1天损失可能超过100万

关键提醒:VaR说的是"不会超过"的上限,不是"一定会亏"。实际损失可能是0,可能是赚钱的,也可能是亏100万,也可能是亏500万(但VaR不关心亏500万这件事——ES才关心)。

2.2 参数法(方差-协方差法)

核心假设

假设投资组合收益率服从正态分布

正态分布的好处是:只需要两个参数(均值μ和标准差σ)就能完全描述分布。

单资产VaR公式

VaR_α = z_α × σ × √T × Position

其中:
  z_α = 标准正态分布的α分位数
      z_95% = 1.645    (95%置信水平)
      z_99% = 2.326    (99%置信水平)
  σ   = 日收益率的标准差(日波动率)
  √T  = 时间缩放因子(平方根法则)
  Position = 头寸市值

直觉解释:
  VaR = "几个标准差" × "波动率" × "时间调整" × "头寸大小"

单资产完整计算示例

已知:
  持有某股票 1000万
  日收益率标准差 σ = 2%
  求1天95% VaR

计算:
  VaR = 1.645 × 0.02 × √1 × 10,000,000
      = 1.645 × 0.02 × 10,000,000
      = 329,000

解读:
  在正常市场条件下
  95%的概率明天亏损不超过 32.9万

如果求10天99% VaR:
  VaR = 2.326 × 0.02 × √10 × 10,000,000
      = 2.326 × 0.02 × 3.162 × 10,000,000
      = 1,470,835

解读:
  99%的概率未来10天亏损不超过 147.1万

多资产组合VaR

当投资组合有多个资产时,需要考虑资产间的相关性

VaR_portfolio = z_α × √(w'Σw) × Portfolio_Value

其中:
  w  = 权重向量(每个资产占总组合的比例)
  Σ  = 协方差矩阵(N×N矩阵,描述N个资产间的协方差)
  w' = w的转置

√(w'Σw) = 组合波动率(考虑了所有资产的相关性)

协方差矩阵示例(2个资产):

假设:
  资产A: 权重60%, 日波动率2%
  资产B: 权重40%, 日波动率3%
  A和B的相关系数 ρ = 0.5

协方差矩阵 Σ:
  Σ = [σ_A²        ρ·σ_A·σ_B]   = [0.0004   0.0003]
      [ρ·σ_A·σ_B   σ_B²      ]     [0.0003   0.0009]

w = [0.6, 0.4]

w'Σw = 0.6² × 0.0004 + 2 × 0.6 × 0.4 × 0.0003 + 0.4² × 0.0009
     = 0.000144 + 0.000144 + 0.000144
     = 0.000432

组合波动率 = √0.000432 = 2.078%

组合VaR(1天95%) = 1.645 × 0.02078 × 10,000,000 = 341,831

对比:
  如果不考虑分散化,简单加总VaR = 0.6×329,000 + 0.4×493,500 = 394,800
  考虑分散化后VaR = 341,831
  分散化效应 = 394,800 - 341,831 = 52,969(节省了约13%)

关键洞察:资产相关性越低,分散化效应越大。如果ρ=1(完全正相关),组合VaR等于各资产VaR之和。如果ρ=-1(完全负相关),VaR可以降到0。这就是分散投资的数学基础。

参数法的优缺点

维度评价
优点计算简单快速——只需要均值、方差和协方差
优点可解释性强——VaR有封闭解
优点适合大规模组合——只要有协方差矩阵
缺点正态假设在尾部失效——实际收益率有肥尾
缺点低估极端损失——3σ事件的实际概率远高于正态分布预测
缺点不能处理非线性产品(如期权)

2.3 历史模拟法

核心思想

不做任何分布假设,直接用过去N天的实际收益率来模拟可能的损失。

步骤:
1. 收集过去N天(如500天)的收益率序列:r_1, r_2, ..., r_500
2. 用每天的收益率重新估值当前组合:
     PnL_i = Portfolio × r_i    (第i天情景下的盈亏)
3. 将500个PnL从小到大排序
4. 取第α%分位数作为VaR

例如95% VaR,500个样本:
  排序后取第25个最差的值(500 × 5% = 25)
  这个值就是VaR

完整计算示例

假设持有1000万的股票指数,用过去10天收益率模拟:

日期        收益率     PnL (万)
Day 1      +1.2%     +12.0
Day 2      -0.8%      -8.0
Day 3      +0.5%      +5.0
Day 4      -2.1%     -21.0  ← 第2差
Day 5      +0.3%      +3.0
Day 6      -1.5%     -15.0  ← 第3差
Day 7      +0.9%      +9.0
Day 8      -3.0%     -30.0  ← 最差
Day 9      +0.1%      +1.0
Day 10     -0.2%      -2.0

排序(从最差到最好):
-30.0, -21.0, -15.0, -8.0, -2.0, +1.0, +3.0, +5.0, +9.0, +12.0

10天样本,90% VaR = 第1个最差值 = 30万
(10 × 10% = 1,取第1个)

实际中通常用500-1000天数据,这里简化演示

加权历史模拟法

标准历史模拟法假设"过去每天的权重相同",但直觉告诉我们近期数据更有参考价值

加权方法:
  w_i = λ^(N-i) × (1-λ) / (1-λ^N)

  λ = 衰减因子(0 < λ < 1)
  通常 λ = 0.97 ~ 0.99

效果:
  λ = 0.97 时:
    昨天的权重 ≈ 今天 × 0.97
    10天前的权重 ≈ 今天 × 0.97^10 ≈ 今天 × 0.74
    100天前的权重 ≈ 今天 × 0.97^100 ≈ 今天 × 0.048

好处:
  近期市场发生了剧烈波动 → 加权后VaR会迅速上升
  标准方法则要等好几个月才能反映

历史模拟法的优缺点

维度评价
优点无分布假设——不管是肥尾还是偏态,历史数据本身就包含了这些特征
优点能捕捉非线性关系——期权等复杂产品可以直接重估值
优点直觉简单——"过去发生过,未来可能再发生"
缺点依赖历史数据长度——500天样本只有25个5%分位数的数据点
缺点隐含假设"历史会重演"——如果极端事件没有在历史窗口中出现,VaR就低估了
缺点数据窗口影响大——包含2008年则VaR偏高,不包含则偏低
缺点尾部估计不稳定——极端分位数的估计波动很大

2.4 蒙特卡洛模拟法

核心思想

通过随机模拟大量可能的未来价格路径,计算每条路径下的盈亏,从而构建损失分布。

步骤:
1. 假设资产价格遵循某个随机过程(如几何布朗运动)
2. 生成N条随机路径(如10,000条)
3. 计算每条路径末端的组合价值
4. 与当前价值对比得到N个PnL
5. 从N个PnL中取VaR

几何布朗运动(GBM)

最常用的资产价格模型,假设价格变化的对数收益率服从正态分布:

连续形式:
  dS = μ·S·dt + σ·S·dW

  S  = 当前价格
  μ  = 漂移率(期望收益率)
  σ  = 波动率
  dW = 维纳过程增量(标准正态 × √dt)

离散模拟(用于编程):
  S_{t+Δt} = S_t × exp((μ - σ²/2)·Δt + σ·√Δt·Z)

  Z ~ N(0,1)  标准正态随机数
  Δt = 时间步长(如1/252表示1个交易日)

代码示意(TypeScript风格伪代码)

/**
 * 蒙特卡洛VaR模拟
 */
function monteCarloVaR(params: {
  currentPrice: number;
  position: number;       // 持有数量
  mu: number;             // 年化漂移率
  sigma: number;          // 年化波动率
  days: number;           // 持有期(天)
  numSimulations: number; // 模拟次数
  confidenceLevel: number;// 置信水平
}): number {
  const { currentPrice, position, mu, sigma, days, numSimulations, confidenceLevel } = params;
  const dt = days / 252;  // 年化时间步长
  const pnlArray: number[] = [];

  for (let i = 0; i < numSimulations; i++) {
    // 生成标准正态随机数
    const z = generateStandardNormal();
    
    // GBM模拟终端价格
    const simulatedPrice = currentPrice * Math.exp(
      (mu - sigma * sigma / 2) * dt + sigma * Math.sqrt(dt) * z
    );
    
    // 计算盈亏
    const pnl = (simulatedPrice - currentPrice) * position;
    pnlArray.push(pnl);
  }

  // 排序取分位数
  pnlArray.sort((a, b) => a - b);
  const varIndex = Math.floor(numSimulations * (1 - confidenceLevel));
  
  return -pnlArray[varIndex]; // 返回正数表示损失
}

// 使用示例
const var95 = monteCarloVaR({
  currentPrice: 100,
  position: 100000,
  mu: 0.08,               // 8%年化收益
  sigma: 0.20,             // 20%年化波动率
  days: 1,
  numSimulations: 100000,
  confidenceLevel: 0.95
});
// var95 ≈ 20.7万(与参数法结果接近:1.645 × 0.20/√252 × 100 × 100000 ≈ 20.7万)

蒙特卡洛法的优缺点

维度评价
优点能处理任意复杂的产品——期权、结构化产品、路径依赖产品
优点能使用任意分布——不局限于正态分布
优点能模拟多步路径——路径依赖产品需要
缺点计算量大——10000次模拟 × 每次重估值所有资产
缺点精度依赖模拟次数——模拟次数翻4倍,精度才翻1倍(√N收敛)
缺点依赖模型假设——GBM假设不一定正确

三种方法对比总结

           简单度    计算速度    尾部捕捉    非线性产品    分布假设
参数法      ★★★★★   ★★★★★     ★★☆☆☆      ★☆☆☆☆      需要(正态)
历史模拟    ★★★★☆   ★★★★☆     ★★★★☆      ★★★★☆      不需要
蒙特卡洛    ★★☆☆☆   ★★☆☆☆     ★★★★☆      ★★★★★      需要(可选任意)

实际使用:
  银行日常风控报告 → 参数法(快)
  监管资本计量     → 历史模拟法(合规要求)
  衍生品组合       → 蒙特卡洛(必须)
  最佳实践         → 多种方法并行,交叉验证

2.5 ES(Expected Shortfall) / CVaR(Conditional VaR)

VaR的致命缺陷

VaR有一个致命问题:它不告诉你"如果超过VaR会亏多少"

两个投资组合可能有相同的VaR,但尾部风险完全不同:

组合A(正态分布):
  95% VaR = 100万
  超过VaR后的损失:101万, 105万, 110万(尾部集中)

组合B(肥尾分布):
  95% VaR = 100万  ← 一样!
  超过VaR后的损失:150万, 300万, 1000万(尾部发散)

VaR说两个组合"风险一样"——这显然是错的

ES的定义

ES_α = E[Loss | Loss > VaR_α]

即:在损失超过VaR的条件下,损失的期望值(平均值)

直觉:
  VaR问:"最坏的5%情况的门槛在哪里?"
  ES问:"最坏的5%情况平均有多坏?"

ES的计算

方法一:参数法(正态分布下)
  ES_α = σ × φ(z_α) / (1 - α)
  
  其中 φ 是标准正态密度函数
  z_95% = 1.645, φ(1.645) = 0.1031
  ES_95% = σ × 0.1031 / 0.05 = σ × 2.063

  对比:VaR_95% = σ × 1.645
  所以在正态分布下,ES_95% / VaR_95% = 2.063 / 1.645 ≈ 1.25
  → ES比VaR大约25%

方法二:历史模拟法
  将VaR以下的所有损失取平均值
  
  例如500天数据,5%分位 = 25天
  ES = 这25天损失的平均值

方法三:蒙特卡洛
  取所有超过VaR的模拟结果的平均值

数值示例

沿用历史模拟法的例子(10天数据,简化演示):

排序后PnL(万):
  -30.0, -21.0, -15.0, -8.0, -2.0, +1.0, +3.0, +5.0, +9.0, +12.0

90% VaR(10%分位)= 第1个 = 30.0万

ES = -30.0 万(只有1个数据点在尾部,所以ES = VaR = 30万)

如果用20天数据,80% VaR对应第4差的值:
  假设最差4个PnL为:-30, -21, -15, -12
  VaR = 12万
  ES = (30 + 21 + 15 + 12) / 4 = 19.5万
  → ES(19.5万) > VaR(12万)

一致性风险度量的四个公理

ES是一致性风险度量(Coherent Risk Measure),VaR不是。

一个好的风险度量应该满足四个公理:

1. 单调性(Monotonicity)
   如果A的损失在任何情况下都≤B → ρ(A) ≤ ρ(B)
   "更安全的东西,风险度量应该更小"

2. 正齐次性(Positive Homogeneity)
   ρ(λX) = λ·ρ(X),λ>0
   "头寸翻倍,风险翻倍"

3. 平移不变性(Translation Invariance)
   ρ(X + c) = ρ(X) - c
   "加入无风险资产c,风险减少c"

4. 次可加性(Subadditivity) ← 关键!
   ρ(A+B) ≤ ρ(A) + ρ(B)
   "组合的风险 ≤ 各部分风险之和"
   → 分散投资不应该增加风险

VaR违反第4条(次可加性)!
  可以构造出 VaR(A+B) > VaR(A) + VaR(B) 的例子
  这意味着VaR可能得出"分散投资增加风险"的荒谬结论

ES满足所有四条 → 所以Basel III要求用ES替代VaR

Basel III的转变

Basel II → VaR(99%,10天)
  问题:低估尾部风险,2008危机暴露

Basel III / FRTB → ES(97.5%,可变持有期)
  改进:
  1. 用ES替代VaR → 捕捉尾部风险
  2. 97.5% ES ≈ 99% VaR(在正态分布下大致对应)
  3. 引入可变持有期 → 流动性差的资产用更长持有期
  4. 引入Default Risk Charge(DRC) → 单独处理信用违约风险

三、波动率建模

3.1 为什么要建模波动率?

VaR的核心输入是波动率σ。波动率估计得准不准,直接决定VaR准不准。

但波动率不是常数——它随时间变化:

  • 平时波动率10%
  • 2008年金融危机时波动率飙到80%
  • 2020年3月新冠恐慌时VIX从15飙到82

波动率的三个典型特征

  1. 聚集性(Clustering):大波动后面跟大波动,小波动后面跟小波动
  2. 均值回归:极端波动率最终会回到长期均值
  3. 非对称性(杠杆效应):下跌时波动率上升更快(因为恐慌>贪婪)

3.2 历史波动率

最简单的方法:直接计算历史收益率的标准差。

给定N天收益率序列 r_1, r_2, ..., r_N

σ = √(1/(N-1) × Σ(r_i - r̄)²)

其中 r̄ = Σr_i / N(均值,通常假设为0简化计算)

年化:σ_annual = σ_daily × √252

例:
  过去20天日收益率:+0.5%, -0.3%, +1.2%, -0.8%, ...
  计算标准差 = 0.8%(日)
  年化波动率 = 0.8% × √252 = 12.7%

缺陷:所有历史数据等权重。10天前的暴跌和昨天的暴跌被同等对待。但直觉告诉我们:昨天的暴跌对预测明天波动率更重要。

3.3 EWMA(指数加权移动平均)

公式

σ²_t = λ·σ²_{t-1} + (1-λ)·r²_{t-1}

其中:
  σ²_t   = 今天的波动率估计(方差)
  σ²_{t-1} = 昨天的波动率估计
  r²_{t-1}  = 昨天的收益率平方(代理实际波动)
  λ       = 衰减因子,RiskMetrics推荐 λ = 0.94

直觉解释

今天的波动率 = 94%的"昨天的波动率估计" + 6%的"昨天实际的波动"

→ 如果昨天没什么大事(r小),波动率缓慢衰减
→ 如果昨天暴跌(r大),波动率急剧上升
→ 自动实现了"近期数据权重更高"

展开递推看权重衰减

展开递推:
  σ²_t = (1-λ)·r²_{t-1} + λ·(1-λ)·r²_{t-2} + λ²·(1-λ)·r²_{t-3} + ...

第k天前的权重 = (1-λ)·λ^(k-1)

λ = 0.94 时:
  昨天(k=1):    权重 = 6.00%
  2天前(k=2):   权重 = 5.64%
  5天前(k=5):   权重 = 4.69%
  10天前(k=10): 权重 = 3.47%
  20天前(k=20): 权重 = 1.90%
  50天前(k=50): 权重 = 0.29%

等效窗口长度 ≈ 1/(1-λ) = 1/0.06 ≈ 17天
→ 大约等价于用17天的历史波动率,但近期权重更高

EWMA vs 历史波动率

               简单历史波动率           EWMA(λ=0.94)
等效窗口      你设定的N天              ≈17天(但是加权的)
反应速度      慢(需要等旧数据退出窗口)  快(昨天暴跌今天就反映)
实现复杂度    简单                      同样简单(递推公式)
存储          需要N天数据               只需要σ²_{t-1}一个值
参数          窗口长度N                 衰减因子λ

3.4 GARCH(1,1)模型

动机

EWMA是GARCH的特例。GARCH增加了一个重要特性:长期均值回归

EWMA的问题:波动率只会衰减或上升,没有一个"锚"。GARCH引入了常数项ω,使波动率在长期会回到一个稳定水平。

公式

GARCH(1,1):
  σ²_t = ω + α·r²_{t-1} + β·σ²_{t-1}

其中:
  ω = 常数项(决定长期波动率水平)
  α = ARCH项系数(昨天实际波动的反应程度)
  β = GARCH项系数(昨天波动率估计的持续程度)

约束条件:
  α ≥ 0, β ≥ 0, ω > 0
  α + β < 1    ← 保证平稳性(波动率不会爆炸到无穷)

长期波动率(无条件方差):
  σ²_long = ω / (1 - α - β)
  
  推导:在稳态下 σ²_t = σ²_{t-1} = σ²_long
  σ²_long = ω + α·E[r²] + β·σ²_long
  因为 E[r²] ≈ σ²_long
  σ²_long = ω + (α + β)·σ²_long
  σ²_long × (1 - α - β) = ω
  σ²_long = ω / (1 - α - β)

EWMA是GARCH的特例

令 ω = 0, α = 1-λ, β = λ

GARCH: σ²_t = 0 + (1-λ)·r²_{t-1} + λ·σ²_{t-1}
       = λ·σ²_{t-1} + (1-λ)·r²_{t-1}
       = EWMA公式

所以EWMA就是 ω=0 的GARCH
→ 没有长期均值(α+β=1,"单位根")
→ 波动率冲击永远不会消退

计算示例

假设 GARCH(1,1) 参数估计结果:
  ω = 0.000002
  α = 0.08
  β = 0.91

验证平稳性:α + β = 0.99 < 1 ✓

长期波动率:
  σ²_long = 0.000002 / (1 - 0.99) = 0.0002
  σ_long  = √0.0002 = 0.01414 = 1.414%(日)
  年化    = 1.414% × √252 = 22.4%

假设昨天 r_{t-1} = -3%(暴跌),σ_{t-1} = 1.5%

今天波动率:
  σ²_t = 0.000002 + 0.08 × (-0.03)² + 0.91 × (0.015)²
       = 0.000002 + 0.08 × 0.0009 + 0.91 × 0.000225
       = 0.000002 + 0.000072 + 0.000205
       = 0.000279

  σ_t = √0.000279 = 1.67%

对比昨天的1.5% → 今天升到1.67%(因为昨天暴跌了)

如果接下来几天市场平稳(r ≈ 0):
  σ² 会慢慢从0.000279衰减回长期值0.0002
  半衰期 ≈ ln(2) / ln(1/(α+β)) = ln(2) / ln(1/0.99) ≈ 69天
  → 大约69个交易日波动率回到一半

波动率聚集(Volatility Clustering)

GARCH为什么能捕捉波动率聚集?

当昨天有大波动(|r_{t-1}|大):
  α·r²_{t-1} 变大 → σ²_t 变大 → 预测今天波动率也高

当昨天很平静(|r_{t-1}|小):
  α·r²_{t-1} 很小 → σ²_t 主要由 β·σ²_{t-1} 决定
  如果之前波动率就低,今天预测也低

→ "大波动后面跟大波动"自然出现

这是金融市场的经典实证发现(Mandelbrot 1963)

GARCH族扩展

标准GARCH的缺陷:α·r² 对正收益和负收益的反应相同
但实际中:下跌对波动率的冲击 > 上涨对波动率的冲击(杠杆效应)

EGARCH(指数GARCH):
  ln(σ²_t) = ω + α·(|z_{t-1}| - E|z|) + γ·z_{t-1} + β·ln(σ²_{t-1})
  γ < 0 → 负收益(z<0)时波动率上升更多
  优点:无需约束参数为正(因为取了对数)

GJR-GARCH(门限GARCH):
  σ²_t = ω + (α + γ·I_{r<0})·r²_{t-1} + β·σ²_{t-1}
  I_{r<0} = 指示函数,r<0时为1
  γ > 0 → 负收益时额外增加 γ·r² 的波动率
  → 直观简单,应用最广

TGARCH:
  类似GJR-GARCH但建模的是σ而非σ²

参数估计:最大似然估计(MLE)

给定收益率序列 r_1, r_2, ..., r_T
在正态分布假设下:

对数似然函数:
  L = -T/2 × ln(2π) - 1/2 × Σ[ln(σ²_t) + r²_t/σ²_t]

其中 σ²_t 由GARCH递推式计算

最大化L → 得到ω, α, β的最优估计

实际中用数值优化(L-BFGS等)求解
通常用统计软件(Python的arch包/R的rugarch包)

3.5 隐含波动率

概念

历史波动率和GARCH都是"向后看"(用历史数据)。隐含波动率是"向前看"——从期权价格反推市场对未来波动率的预期。

Black-Scholes期权定价公式:
  C = S·N(d₁) - K·e^(-rT)·N(d₂)
  
  d₁ = [ln(S/K) + (r + σ²/2)·T] / (σ·√T)
  d₂ = d₁ - σ·√T

在这个公式中:
  S(股价)、K(行权价)、r(无风险利率)、T(到期时间) 都是已知的
  C(期权价格) 也是市场可观测的
  唯一未知的就是 σ(波动率)

从C反解σ → 这个σ就是隐含波动率(Implied Volatility, IV)
→ 只能数值求解(牛顿法)

波动率微笑(Volatility Smile)

如果Black-Scholes的正态分布假设是对的:
  所有行权价K对应的IV应该相同

但实际上:

IV
 |
 |  \                    /
 |    \                /
 |      \            /
 |        \________/
 |
 +──────────────────── K/S
      OTM Put   ATM   OTM Call

→ 深度虚值期权的IV更高
→ 形成"微笑"形状(股票市场更像"偏斜"——左边更高)

原因:
  市场认为极端下跌的概率 > 正态分布的预测
  → 深度OTM Put的IV更高(保险需求大)
  → 反映了真实世界的肥尾特征

波动率曲面

把不同行权价K和不同到期日T的IV画在三维图上:

    IV
    ↑
    |   ╱‾‾‾‾╲
    |  ╱      ╲
    | ╱        ╲
    |╱__________╲___→ K
   ╱
  T

→ 这就是波动率曲面(Volatility Surface)
→ 是衍生品定价和风控的核心输入
→ 需要每天更新(从期权市场数据构建)

四、极值理论(EVT)

4.1 为什么需要EVT?

正态分布严重低估尾部风险。

事件类型          正态分布预测概率      实际发生频率
───────────────────────────────────────────────
3σ事件(日跌3%)    0.27%               每月约1次
4σ事件(日跌4%)    0.006%              每年约2-3次
5σ事件(日跌5%)    0.00006%            实际每几年1次
6σ事件(日跌6%)    0.0000002%          不该发生...
───────────────────────────────────────────────

2008年金融危机中:
  2008年10月15日,标普跌9% ≈ 7σ事件
  在正态分布下概率 ≈ 10^(-12)
  相当于宇宙年龄也不该发生一次

1987年黑色星期一:
  单日跌22% ≈ 25σ事件
  正态分布下概率 ≈ 10^(-135)
  → 正态分布在尾部完全失效

"正态分布是骗人的。它让你以为灾难几乎不可能发生。"
  — Nassim Taleb

EVT(极值理论) 的目标:用专门描述极端事件的数学工具来建模尾部,取代正态分布的尾部。

4.2 广义帕累托分布(GPD)与POT方法

POT(Peaks Over Threshold)方法

核心思想:
  不建模整个分布——只建模超过某个阈值u的极端损失

数学基础(Pickands-Balkema-de Haan定理):
  对于一大类分布,超过阈值u的超额部分X-u的条件分布
  当u足够大时,近似服从广义帕累托分布(GPD)

GPD的CDF:
  G_ξ,β(x) = 1 - (1 + ξx/β)^(-1/ξ)    当 ξ ≠ 0
            = 1 - exp(-x/β)              当 ξ = 0

参数:
  ξ(形状参数/尾部指数):
    ξ > 0 → 肥尾分布(Pareto型,尾部衰减慢,如金融数据)
    ξ = 0 → 指数分布(轻尾,如正态分布的尾部)
    ξ < 0 → 有界尾部(如均匀分布,有上界)
  
  β(尺度参数):
    控制分布的"宽度"

阈值u的选择

阈值u的选择是POT方法最关键也最主观的步骤

选太低:非极端数据混入,GPD拟合不好
选太高:数据太少,估计不精确

方法一:Mean Excess Plot(均值超额图)

  Mean Excess Function: e(u) = E[X - u | X > u]
  
  对于GPD分布:e(u) = (β + ξu) / (1 - ξ)
  → e(u)是u的线性函数!

  做法:
  1. 对不同的u值,计算超过u的样本的平均超额
  2. 画 e(u) vs u
  3. 找到图形开始呈线性的点 → 那就是合适的u

           e(u)
            |    /
            |   / ← 线性区域:GPD成立
            |  /
            | /
            |/_____ ← 非线性:u太小
            +────────── u
                  ↑选这里

方法二:经验法则
  通常取样本的90%-95%分位数作为阈值
  例如1000天数据,取第50-100个最大损失作为极端值

GPD参数估计与VaR/ES计算

假设GPD参数估计结果:ξ = 0.3, β = 0.01, 阈值u = 2%
超过阈值的样本比例 p_u = 50/1000 = 5%

VaR_α = u + β/ξ × [(n/k × (1-α))^(-ξ) - 1]

其中:n = 总样本数, k = 超过阈值的样本数

ES_α = VaR_α/(1-ξ) + (β - ξ·u)/(1-ξ)

ξ > 0(肥尾)时的关键影响:
  ξ越大 → 尾部越厚 → VaR和ES越大
  当ξ ≥ 0.5时,方差不存在(极端肥尾)
  当ξ ≥ 1时,均值不存在(超级肥尾)

4.3 GEV(广义极值分布)与块极大值方法

Block Maxima方法

核心思想:
  把数据分成若干"块"(如每月一块)
  取每块中的最大值(极端值)
  这些极大值的分布近似GEV

Fisher-Tippett-Gnedenko定理:
  块极大值在适当标准化后收敛到GEV分布

GEV的CDF:
  H_ξ(x) = exp(-(1 + ξ·(x-μ)/σ)^(-1/ξ))

三个家族:
  ξ = 0 → Gumbel分布(轻尾,如正态分布的极值)
  ξ > 0 → Fréchet分布(肥尾,如金融收益率的极值)
  ξ < 0 → Weibull分布(有界尾部)

POT vs Block Maxima

              POT(GPD)                   Block Maxima(GEV)
数据使用      所有超过阈值的数据          每块只用1个极大值
数据效率      高(用更多极端数据)         低(丢弃大量数据)
主观选择      阈值u的选择                块大小的选择
理论基础      条件超额分布→GPD            块极大值分布→GEV
实际推荐      更常用(数据效率高)         在极端值很稀少时使用

4.4 Copula(连接函数)

问题:多资产的联合尾部依赖

单个资产的尾部风险用EVT处理
但投资组合有多个资产——它们的极端事件是否同时发生?

2008年:几乎所有资产类别同时暴跌("所有相关性趋向于1")
正常时期:资产相关性可能只有0.3
危机时期:相关性飙升到0.8+

→ 需要建模"联合尾部依赖"
→ Copula是解决这个问题的工具

Copula的核心思想

Sklar定理(Copula理论基石):

任意多元联合分布F(x₁, x₂, ..., x_n)都可以分解为:
  F(x₁, ..., x_n) = C(F₁(x₁), ..., F_n(x_n))

其中:
  F_i(x_i) = 第i个变量的边际分布(CDF)
  C(...)   = Copula函数(连接函数)

直觉:
  Copula把"每个变量长什么样"和"变量之间怎么关联"分开了

  边际分布:描述每个资产的收益率分布(可以是任意分布)
  Copula:描述资产之间的依赖结构(相关性的广义化)

→ 可以给每个资产用GPD建模尾部
→ 用Copula描述它们的联合行为

常见Copula类型

1. Gaussian Copula(高斯连接函数)
   C(u₁, u₂) = Φ₂(Φ⁻¹(u₁), Φ⁻¹(u₂); ρ)
   
   参数:相关系数矩阵
   特点:尾部独立——极端事件不会同时发生
   致命缺陷:2008年CDO危机的罪魁祸首之一
   
   David Li的Gaussian Copula CDO模型:
     假设违约相关性用Gaussian Copula描述
     → 尾部独立假设导致CDO高级层风险被严重低估
     → 所有高级层被评为AAA
     → 2008年全部暴雷

2. t-Copula(t分布连接函数)
   C(u₁, u₂) = t₂(t⁻¹_ν(u₁), t⁻¹_ν(u₂); ρ, ν)
   
   参数:相关系数ρ + 自由度ν
   特点:尾部相关——ν越小尾部相关性越强
   优势:比Gaussian Copula更好地捕捉"危机时所有资产一起跌"
   推荐:金融风控首选

3. Clayton Copula
   C(u₁, u₂) = (u₁^(-θ) + u₂^(-θ) - 1)^(-1/θ)
   
   特点:下尾相关 + 上尾独立
   适用:下跌风险建模——"一起跌但不一定一起涨"
   直觉:暴跌时联动,暴涨时各自为政

4. Gumbel Copula
   特点:上尾相关 + 下尾独立
   适用:极端上涨情景(相对少用于风控)

Copula在风控中的应用

应用方式:
  1. 用EVT(GPD)建模每个资产的边际分布(特别是尾部)
  2. 用Copula(推荐t-Copula)建模资产间的依赖关系
  3. 蒙特卡洛模拟 → 生成联合极端情景 → 计算组合VaR/ES

优势:
  相比参数法(正态分布 + 线性相关系数):
  ✓ 能建模肥尾(GPD)
  ✓ 能建模尾部相关性(t-Copula)
  ✓ 能建模非对称相关性(Clayton)

代价:
  × 计算复杂
  × 参数估计困难(特别是高维Copula)
  × 模型风险——选错Copula类型后果严重

五、压力测试

5.1 为什么需要压力测试?

VaR和ES回答的是"正常到中等极端"情况下的风险
压力测试回答的是"极端到不可思议"情况下的风险

VaR/ES的局限:
  - 基于历史数据或模型假设
  - 如果"黑天鹅"从未发生过,VaR/ES捕捉不到
  - 模型假设可能在极端情况下完全失效

压力测试的价值:
  - 不依赖统计模型
  - 直接构造"如果XX发生了会怎样"
  - 覆盖VaR/ES覆盖不到的情景

监管要求:
  - Basel要求银行定期进行压力测试
  - 2010年后美联储CCAR/DFAST → 系统性银行必须通过压力测试
  - 欧洲EBA也有类似要求

5.2 历史情景法

用真实发生过的危机重新估值当前投资组合

常用历史情景:

| 情景 | 时间 | 主要冲击 | 持续时间 |
|------|------|---------|---------|
| 1987黑色星期一 | 1987.10 | 美股单日-22% | 1天 |
| 亚洲金融危机 | 1997-1998 | 亚洲货币暴跌、股市崩盘 | 数月 |
| LTCM崩溃 | 1998.8-9 | 信用利差飙升、流动性枯竭 | 数周 |
| 互联网泡沫 | 2000-2002 | 纳斯达克跌-78% | 2年 |
| 2008全球金融危机 | 2008.9-2009.3 | 全面崩溃 | 6个月 |
| 2020新冠恐慌 | 2020.2-3 | 标普-34%、VIX=82 | 5周 |
| 2022加息风暴 | 2022.1-12 | 股债双杀、加密崩盘 | 全年 |

方法:
  1. 提取该历史时期内各风险因子的变化量
     例如2008年情景:
       股票: -40%
       利率: -200bp
       信用利差: +500bp
       汇率(EURUSD): +15%
       波动率(VIX): +300%
  
  2. 将这些变化量施加到当前投资组合
  3. 重新估值所有头寸
  4. 计算总损失

优点:
  情景真实可信("确实发生过")
  易于向管理层和监管解释

缺点:
  只覆盖已发生过的危机
  "下一次危机不会是上一次的重演"

5.3 假设情景法

由风险管理团队构造极端但合理(extreme but plausible)的假设情景

构造原则:
  ✓ 极端但不荒谬("利率+300bp"合理,"利率+3000bp"不合理)
  ✓ 考虑因子间的相关性(利率上升→股市下跌→信用利差扩大)
  ✓ 覆盖当前组合最大的风险暴露

常见假设情景模板:

情景1:利率冲击
  短端利率: +300bp
  长端利率: +200bp(曲线走平)
  信用利差: +100bp
  股票:     -15%

情景2:股市崩盘
  全球股票: -40%
  波动率:   +200%
  信用利差: +300bp
  利率:     -100bp(避险→国债被买)

情景3:新兴市场危机
  新兴市场股票: -50%
  新兴市场货币: -30%
  大宗商品:    -40%
  利率(发达):  -50bp

情景4:流动性枯竭
  所有资产流动性降低
  买卖价差扩大5-10倍
  无法在正常时间内平仓
  → 被迫以极大折扣抛售

5.4 逆向压力测试

传统压力测试:给定情景 → 计算损失
逆向压力测试:给定损失水平 → 反推需要什么情景

例如:
  "什么情况下我们会亏损超过资本金的30%?"
  
  反推:
    可能需要股票跌50% + 利率升500bp + 信用利差升800bp
    同时所有hedge失效
    同时市场流动性枯竭

价值:
  帮助识别"什么可以杀死我们"
  强制思考"不可能的事情"
  更好的业务连续性规划

5.5 压力测试在架构设计中的影响

系统架构需求:

1. 重估值引擎
   - 需要对所有持仓按压力情景重新估值
   - 线性产品(股票/债券):直接乘以冲击因子
   - 非线性产品(期权):需要全面重新定价
   - 计算量大 → 可能需要分布式计算/GPU加速

2. 情景管理
   - 存储和管理几十到上百个压力情景
   - 情景版本控制
   - 情景审批流程

3. 报告系统
   - 压力测试结果的自动化报告
   - 与VaR/ES报告的整合
   - 监管报告格式要求

4. 触发机制
   - 日常运行(每日/每周)
   - 事件驱动运行(市场大跌时自动触发)
   - Ad-hoc运行(管理层要求的临时压力测试)

六、工程落地要点

6.1 VaR计算系统架构

两种模式:

模式一:批量VaR(End-of-Day)
  ┌─────────┐     ┌──────────┐     ┌───────────┐     ┌──────────┐
  │ 持仓数据 │────→│ 市场数据  │────→│ VaR引擎   │────→│ 风险报告  │
  │ (T日收盘)│     │ (收益率/  │     │ (参数法/  │     │ (VaR/ES  │
  │          │     │  协方差)  │     │  历史模拟/ │     │  /限额)  │
  └─────────┘     └──────────┘     │  蒙特卡洛)│     └──────────┘
                                    └───────────┘
  运行时间:每天收盘后
  SLA:2小时内出报告
  适用:监管报告、风险限额检查

模式二:准实时VaR(Intraday)
  ┌─────────┐     ┌──────────┐     ┌───────────┐     ┌──────────┐
  │ 实时持仓 │────→│ 实时行情  │────→│ 增量VaR   │────→│ 风险仪表盘│
  │ (每笔交易│     │ (每秒更新)│     │ (参数法   │     │ (实时限额 │
  │  更新)   │     │           │     │  增量计算)│     │  监控)   │
  └─────────┘     └──────────┘     └───────────┘     └──────────┘
  
  延迟要求:秒级
  通常只用参数法(快)
  蒙特卡洛实时做不了 → 用预计算+插值近似

6.2 协方差矩阵的计算和存储

挑战:N个资产 → N×N的矩阵

资产数    矩阵大小         存储量
100       10,000           ~80KB
1000      1,000,000        ~8MB
10000     100,000,000      ~800MB

计算挑战:
  - 用历史数据估计:需要T > N(样本数 > 资产数),否则矩阵奇异
  - 大矩阵可能不正定(数值问题)→ 需要正定化处理
  - 每天更新 → 增量更新比全量更新高效

实际方案:
  1. 因子模型降维:1000个资产用30个因子描述 → 30×30矩阵
  2. RiskMetrics方法:EWMA估计协方差,逐日增量更新
  3. 分块存储:按资产类别分块,跨类别用低分辨率
  4. 缓存策略:协方差矩阵T日有效,T+1日重新计算

6.3 蒙特卡洛模拟的并行化

蒙特卡洛天然适合并行化——每条路径独立

CPU并行:
  10000条路径 / 8核 = 每核1250条
  现代CPU可以在秒级完成简单资产的模拟

GPU加速:
  NVIDIA CUDA:10000条路径可以同时运行
  加速比:10-100倍
  适用场景:期权组合(每条路径需要重新定价)

分布式计算:
  Spark/Ray等框架
  将路径分配到多台机器
  最终汇总结果

随机数生成:
  伪随机数:Mersenne Twister(标准选择)
  低差异序列(准蒙特卡洛):Sobol/Halton序列
    → 收敛速度比伪随机更快(O(1/N) vs O(1/√N))
    → 适合中等维度(<100维)的问题

6.4 风险报告自动化

日报模板:
  ┌────────────────────────────────────────┐
  │           Daily Risk Report            │
  │           Date: 2026-04-13             │
  ├────────────────────────────────────────┤
  │ 1. Portfolio Summary                   │
  │    Total NAV:  $1,234,567,890         │
  │    Daily PnL:  -$2,345,678 (-0.19%)   │
  │                                        │
  │ 2. VaR Summary                         │
  │    1-Day 95% VaR: $12,345,678 (1.0%)  │
  │    1-Day 99% VaR: $18,234,567 (1.5%)  │
  │    10-Day 99% ES: $45,678,901 (3.7%)  │
  │                                        │
  │ 3. VaR Utilization                     │
  │    VaR Limit:   $20,000,000           │
  │    Current VaR: $12,345,678 (62%)     │
  │    Status: GREEN                       │
  │                                        │
  │ 4. Stress Test Results                 │
  │    2008 Scenario: -$98,765,432 (-8%)  │
  │    Rate +300bp:   -$45,678,901 (-4%)  │
  │    Equity -40%:   -$67,890,123 (-5%)  │
  │                                        │
  │ 5. VaR Backtesting                     │
  │    99% VaR Exceedances (250 days): 3  │
  │    Expected: 2.5                       │
  │    Traffic Light: GREEN                │
  └────────────────────────────────────────┘

Backtesting(回测检验):
  如果99% VaR的突破次数 > 预期太多 → 模型有问题
  Basel "交通灯"规则:
    绿灯:0-4次突破(250天窗口)→ 正常
    黄灯:5-9次突破 → 需要调查
    红灯:10+次突破 → 必须修正模型

七、常见误区与面试重点

7.1 常见误区

误区1:"VaR是最大损失"
  ✗ VaR不是最大损失——它是"在某个概率下的损失上限"
  ✗ 实际损失可以远超VaR(这就是ES存在的意义)

误区2:"99% VaR比95% VaR安全很多"
  ✗ 99% VaR只比95% VaR大约40%(正态分布下2.326/1.645=1.41)
  ✗ 但99%对应的尾部数据更少,估计更不稳定

误区3:"VaR越低越好"
  ✗ VaR低可能是因为"分散化效应"(好事)
  ✗ 也可能是因为"模型低估了风险"(坏事)
  ✗ VaR需要配合回测检验来判断准确性

误区4:"GARCH模型能预测波动率"
  ✗ GARCH预测的是条件方差(下一期的方差)
  ✗ 预测精度随时间衰减——超过几天后基本回到长期均值
  ✗ 但对于日度风控已经足够

误区5:"Copula解决了相关性问题"
  ✗ Copula只是一个更灵活的工具
  ✗ 选错Copula类型 → 风险可能比用简单相关系数更大
  ✗ Gaussian Copula在2008年的教训

误区6:"压力测试就是极端VaR"
  ✗ 压力测试不是统计方法——是"如果……会怎样"的分析
  ✗ 不需要概率——情景本身就是假设的
  ✗ VaR和压力测试是互补的,不是替代的

7.2 面试高频问题

Q: 解释VaR的三种计算方法的优缺点
A: 参数法快但假设正态(尾部失效),历史模拟无假设但依赖历史窗口,
   蒙特卡洛灵活但计算密集。实际中多种方法并行。

Q: 为什么Basel III用ES替代VaR?
A: VaR不满足次可加性(分散化可能增加VaR),且不衡量尾部严重程度。
   ES满足一致性风险度量四公理,能捕捉"超过VaR后平均亏多少"。

Q: GARCH和EWMA的区别?
A: EWMA是ω=0的GARCH特例,没有长期均值回归。GARCH有常数项ω,
   波动率冲击最终会消退回长期水平。

Q: 什么是Copula?为什么Gaussian Copula在2008年出了问题?
A: Copula将边际分布和依赖结构分离。Gaussian Copula假设尾部独立
   (极端事件不同时发生),但2008年所有资产同时暴跌,导致基于
   Gaussian Copula定价的CDO高级层全部违约。

Q: 如何设计一个市场风险系统的架构?
A: 需要考虑:批量vs实时两种模式、协方差矩阵的高效计算和存储、
   蒙特卡洛的并行化、压力测试引擎、风险报告自动化、VaR回测
   检验。关键取舍是精度vs速度(参数法快但粗,MC精但慢)。

八、延伸阅读

经典教材

  • John Hull - Options, Futures, and Other Derivatives — 市场风险和衍生品的标准教材
  • Philippe Jorion - Value at Risk — VaR方法论的圣经
  • Alexander McNeil - Quantitative Risk Management — EVT和Copula的最佳参考
  • Ruey Tsay - Analysis of Financial Time Series — GARCH族模型的全面介绍

论文

  • Engle (1982) - Autoregressive Conditional Heteroskedasticity — ARCH模型原始论文
  • Bollerslev (1986) - Generalized ARCH — GARCH模型原始论文
  • Artzner et al. (1999) - Coherent Measures of Risk — 一致性风险度量的四公理
  • Li (2000) - On Default Correlation: A Copula Function Approach — Gaussian Copula CDO定价

在线资源

  • RiskMetrics Technical Document — EWMA和VaR方法论的工业标准
  • Basel Committee: Minimum capital requirements for market risk (FRTB) — 最新监管要求
  • Kevin Dowd - Measuring Market Risk — 免费在线版

九、与已有笔记的关联

关联笔记矩阵:

本笔记主题              已有笔记                    关联点
─────────────────────────────────────────────────────────
VaR计算系统架构    →    03-risk-engine              风控引擎的市场风险模块
波动率建模         →    02-statistical-arbitrage     时间序列分析基础
蒙特卡洛模拟       →    03-latency-engineering       计算密集型任务的并行化
压力测试架构       →    05-clearing-settlement       清算系统的压力测试需求
Copula/EVT        →    04-credit-risk-modeling       信用组合的联合违约建模
协方差矩阵存储     →    Arch Day 100+               分布式存储架构

本笔记重点回顾:
  → VaR三方法的trade-off是面试核心考点
  → ES替代VaR的原因(一致性风险度量)是高频考点
  → GARCH的直觉(波动率聚集+均值回归)需要能讲清楚
  → Copula的Gaussian vs t选择影响是2008危机的核心教训
  → 压力测试的工程落地需要理解重估值引擎架构