4 min read

基于混合正态分布的 VaR 计算

一、引言

风险价值(Value at Risk, 简称 VaR )是金融风险管理中衡量市场风险的核心指标,其定义为:在一定置信水平下,某一金融资产或组合在未来特定时间段内可能遭受的最大潜在损失。传统 VaR 计算多假设资产收益率服从正态分布,但实际金融时间序列往往呈现 “尖峰厚尾” 特性(峰度高于正态分布,尾部概率更大),导致正态分布假设下的 VaR 低估尾部风险。

混合正态模型(Mixture of Normals Model)通过将收益率分布拟合为多个正态分布的加权组合,能够有效捕捉尖峰厚尾特征,从而更精准地估计 VaR。

本文详细介绍混合正态模型的构建、参数估计及 VaR 计算方法,并通过 R 语言进行实现。

二、混合正态模型理论模型定义

假设金融资产收益率X服从两成分混合正态分布,其概率密度函数(PDF)为:

\[ f(x; \Theta) = \alpha \cdot \phi(x; \mu_1, \sigma_1^2) + (1-\alpha) \cdot \phi(x; \mu_2, \sigma_2^2) \tag{1} \]

其中:

\(\Theta = (\alpha, \mu_1, \sigma_1^2, \mu_2, \sigma_2^2)\) 为待估参数;

\(\alpha \in (0,1)\) 是第一成分的权重;

\(\phi(x; \mu, \sigma^2) = \frac{1}{\sqrt{2\pi}\sigma} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)\) 为正态分布密度函数;

\(\mu_1\) , \(\mu_2\) 分别为两成分的均值;

\(\sigma_1^2\) , \(\sigma_2^2\) 分别为两成分的方差。

参数估计

我们可以采用极大似然估计(MLE)求解参数 \(\Theta\) 。设样本观测值为

\[ x_1, x_2, ..., x_n \]

则似然函数为:

\[ L(\Theta) = \prod_{i=1}^n \left[ \alpha \cdot \phi(x_i; \mu_1, \sigma_1^2) + (1-\alpha) \cdot \phi(x_i; \mu_2, \sigma_2^2) \right] \tag{2} \]

取对数似然函数并最大化:

\[ \ln L(\Theta) = \sum_{i=1}^n \ln\left[ \alpha \cdot \phi(x_i; \mu_1, \sigma_1^2) + (1-\alpha) \cdot \phi(x_i; \mu_2, \sigma_2^2) \right] \tag{3} \]

实际求解中,通常采用 EM 算法(期望最大化算法)迭代计算参数估计值。

基于混合正态模型的 VaR 计算

对于置信水平 \(1-\beta\) (如 95%、99%),VaR 定义为满足以下条件的损失阈值:

\[ P(X \leq -VaR) = \beta \tag{4} \]

其中 X 为资产收益率,负号表示损失(对多头头寸而言)。结合混合正态分布的累积分布函数(CDF),式(4)可写为:

\[ F(-VaR) = \alpha \cdot \Phi\left(-VaR; \mu_1, \sigma_1^2\right) + (1-\alpha) \cdot \Phi\left(-VaR; \mu_2, \sigma_2^2\right) = \beta \tag{5} \label{eq:mix-normal} \]

其中 \(\Phi(\cdot)\) 为正态分布的 CDF。

通过数值方法(如二分法)求解式 \(\eqref{eq:mix-normal}\) ,即可得到混合正态模型下的 VaR。

三、R 语言实证分析

以下通过 R 语言实现基于混合正态模型的 VaR 计算,使用quantmod获取金融数据,mixtools拟合混合正态模型。

  1. 加载所需包
# 安装并加载包
if (!require("quantmod")) install.packages("quantmod")
if (!require("mixtools")) install.packages("mixtools")
if (!require("ggplot2")) install.packages("ggplot2")
library(quantmod)
library(mixtools)
library(ggplot2)
  1. 获取金融数据并计算收益率

以特斯拉公司的股价为例,计算其对数收益率:

# 获取数据(近5年)
getSymbols("TSLA", from = "2023-01-01", to = "2025-01-01")
## [1] "TSLA"
tsla <- na.omit(Cl(TSLA))  # 提取收盘价并去除缺失值

# 计算对数收益率
returns <- diff(log(tsla))
returns <- na.omit(returns)  # 去除NA值
colnames(returns) <- "收益率"
  1. 拟合混合正态模型

使用 mixtools::normalmixEM1 拟合两成分混合正态分布:

# 拟合混合正态模型(2个成分)
set.seed(123)  # 设置随机种子,保证结果可复现
mix_model <- normalmixEM(returns, k = 2, maxit = 1000)
## number of iterations= 146
# 输出参数估计结果
cat("混合正态模型参数估计:\n")
## 混合正态模型参数估计:
cat(paste("权重 α =", round(mix_model$lambda[1], 4), "\n"))
## 权重 α = 0.839
cat(paste("成分1:均值 μ1 =", round(mix_model$mu[1], 6), 
          ",标准差 σ1 =", round(mix_model$sigma[1], 6), "\n"))
## 成分1:均值 μ1 = 0.001422 ,标准差 σ1 = 0.027839
cat(paste("成分2:均值 μ2 =", round(mix_model$mu[2], 6), 
          ",标准差 σ2 =", round(mix_model$sigma[2], 6), "\n"))
## 成分2:均值 μ2 = 0.008931 ,标准差 σ2 = 0.063941
  1. 定义混合正态分布的 CDF 及 VaR 计算函数
# 混合正态分布的累积分布函数(CDF)
mix_normal_cdf <- function(x, alpha, mu1, sigma1, mu2, sigma2) {
  alpha * pnorm(x, mean = mu1, sd = sigma1) + 
  (1 - alpha) * pnorm(x, mean = mu2, sd = sigma2)
}

# 用二分法求解VaR
var_mixture_normal <- function(conf_level, alpha, mu1, sigma1, mu2, sigma2, data) {
  beta <- 1 - conf_level  # 尾概率
  # 确定搜索区间(基于数据的极值)
  lower <- min(data) * 2
  upper <- 0  # VaR为损失,对应收益率分布的左侧尾部
  # 二分法迭代求解
  for (i in 1:1000) {
    mid <- (lower + upper) / 2
    cdf_val <- mix_normal_cdf(mid, alpha, mu1, sigma1, mu2, sigma2)
    if (cdf_val < beta) {
      lower <- mid
    } else {
      upper <- mid
    }
    if (abs(cdf_val - beta) < 1e-6) break  # 精度满足时停止
  }
  return(-upper)  # 返回VaR(损失值为正)
}
  1. 计算 VaR 并与传统方法对比
# 计算95%和99%置信水平下的VaR
conf_levels <- c(0.95, 0.99)
var_results <- sapply(conf_levels, function(cl) {
  var_mixture_normal(conf_level = cl,
                     alpha = mix_model$lambda[1],
                     mu1 = mix_model$mu[1],
                     sigma1 = mix_model$sigma[1],
                     mu2 = mix_model$mu[2],
                     sigma2 = mix_model$sigma[2],
                     data = returns)
})

# 输出VaR结果
cat("\n混合正态模型VaR计算结果:\n")
## 
## 混合正态模型VaR计算结果:
for (i in 1:length(conf_levels)) {
  cat(paste(conf_levels[i] * 100, "%置信水平下的VaR =", 
            round(var_results[i], 6), "\n"))
}
## 95 %置信水平下的VaR = 0.052193 
## 99 %置信水平下的VaR = 0.090665
# 与传统正态分布假设下的VaR对比
var_normal_95 <- quantile(returns, probs = 0.05)  # 正态假设下95% VaR
var_normal_99 <- quantile(returns, probs = 0.01)  # 正态假设下99% VaR
cat("\n传统正态分布假设下的VaR:\n")
## 
## 传统正态分布假设下的VaR:
cat(paste("95%置信水平下的VaR =", round(-as.numeric(var_normal_95), 6), "\n"))
## 95%置信水平下的VaR = 0.051618
cat(paste("99%置信水平下的VaR =", round(-as.numeric(var_normal_99), 6), "\n"))
## 99%置信水平下的VaR = 0.091924
  1. 可视化结果
# 绘制收益率分布直方图及混合正态模型拟合曲线
p <- ggplot(data = as.data.frame(returns), aes(x = 收益率)) +
  geom_histogram(aes(y = after_stat(density)), 
                 bins = 50, 
                 fill = "lightblue", 
                 color = "black", 
                 alpha = 0.7) +
  stat_function(fun = function(x) {  # 混合正态模型密度曲线
    mix_model$lambda[1] * dnorm(x, 
                                mean = mix_model$mu[1], 
                                sd = mix_model$sigma[1]) +
    mix_model$lambda[2] * dnorm(x, 
                                mean = mix_model$mu[2], 
                                sd = mix_model$sigma[2])
  }, color = "red", linewidth = 1) +
  geom_vline(xintercept = -var_results[1], 
             color = "blue", 
             linetype = "dashed", 
             linewidth = 1) +
  geom_vline(xintercept = -var_results[2], 
             color = "purple", 
             linetype = "dashed", 
             linewidth = 1) +
  labs(title = "特斯拉收益率分布与混合正态模型拟合",
       x = "对数收益率", y = "密度") +
  theme_minimal()
print(p)

四、结论

混合正态模型通过捕捉金融数据的尖峰厚尾特性,能够更准确地估计 VaR,相比传统正态分布假设更贴合实际风险特征。

实证结果显示,在高置信水平(如 99%)下,混合模型计算的 VaR 通常更高,更能反映极端损失的可能性,为风险管理提供更稳健的参考。实际应用中,可根据数据特征调整混合成分数量(如 3 个成分),或结合其他统计方法(如 GARCH 模型)进一步优化波动率的动态特性。


  1. 上述代码中,normalmixEM 可能需要多次迭代才能收敛,若结果不稳定可调整 maxit 参数;VaR 计算的二分法精度可通过迭代次数或误差阈值调整。↩︎