风险价值(VaR)

在 R 中构建 GARCH 模型

Kris Boudt

Professor of finance and econometrics

风险价值(VaR)

  • 常用的下行风险度量:5% VaR。收益分布的 5% 分位数代表最差 5% 情景下的"最好"收益。
    按年份的日收益分布
在 R 中构建 GARCH 模型

按年份的日收益分布

在 R 中构建 GARCH 模型

需要前瞻性方法

  • 滚动窗口分位数是回溯性的:
    • 事后问题:过去一年日收益的 5% 分位数是多少?
    • 事前问题:未来收益预测分布的 5% 分位数是多少?
  • 前瞻性风险管理使用 GARCH 估计的预测分位数。
  • 方法:对 ugarchroll 对象使用 quantile()
在 R 中构建 GARCH 模型

使用 ugarchroll 获取预测的 5% 分位数的流程

ugarchspec(): 指定所用的 GARCH 模型

garchspec <- ugarchspec(mean.model = list(armaOrder = c(1, 0)),
                        variance.model = list(model = "gjrGARCH"),
                        distribution.model = "sstd")

ugarchroll(): 在滚动样本上估计 GARCH 模型

garchroll <- ugarchroll(garchspec, data = sp500ret, n.start = 2500, 
                        refit.window = "moving", refit.every = 100)

quantile(): 计算预测分位数

garchVaR <- quantile(garchroll, probs = 0.05)

你也可以选择其他损失概率:1% 和 2.5% 也常用

在 R 中构建 GARCH 模型

损失概率 5% 的 VaR 图

actual <- xts(as.data.frame(garchroll)$Realized, time(garchVaR))
VaRplot(alpha = 0.05, actual = actual, VaR = garchVaR)

按年份的日收益分布

在 R 中构建 GARCH 模型

超限与 VaR 覆盖率

当实际收益小于预测的风险价值时,发生一次 VaR 超限:$ R_t \ < {VaR}_t$。

VaR 超限的发生频率称为 VaR 覆盖率。

# 计算标普500收益在5%概率水平下的覆盖率
mean(actual < garchVaR)
0.05159143
在 R 中构建 GARCH 模型

VaR 覆盖率与模型校验

  • 在损失概率为 $\alpha$(如 5%)时对覆盖率的解读:
    • 有效的预测模型,其覆盖率应接近所用的概率水平 $\alpha$。
    • 若覆盖率 $\gg$ $\alpha$:超限过多,预测分位数应更负。低估了亏损风险。
    • 若覆盖率 $\ll$ $\alpha$:超限过少,预测分位数过负。高估了亏损风险。
在 R 中构建 GARCH 模型

削弱性能的因素

distribution.model = "sstd" 改为 distribution.model = "std"

garchspec <- ugarchspec(mean.model = list(armaOrder = c(1, 0)),
                        variance.model = list(model = "gjrGARCH"),
                        distribution.model = "std")

滚动估计并预测 5% VaR:

garchroll <- ugarchroll(garchspec, data = sp500ret, n.start = 2500, 
                        refit.window = "moving", refit.every = 100)
garchVaR <- quantile(garchroll, probs = 0.05)
mean(actual < garchVaR) # returns 0.05783233
在 R 中构建 GARCH 模型

进一步恶化

variance.model = list(model = "gjrGARCH")

改为

variance.model = list(model = "sGARCH")

garchspec <- ugarchspec(mean.model = list(armaOrder = c(1, 0)),
                        variance.model = list(model = "sGARCH"),
                        distribution.model = "std")

滚动估计并预测 5% VaR:

garchroll <- ugarchroll(garchspec, data = sp500ret, n.start = 2500, 
                        refit.window = "moving", refit.every = 100)
garchVaR <- quantile(garchroll, probs = 0.05)
mean(actual < garchVaR) # returns 0.06074475
在 R 中构建 GARCH 模型

更进一步的恶化

refit.every = 100

改为

refit.every = 1000

garchspec <- ugarchspec(mean.model = list(armaOrder = c(1, 0)),
                        variance.model = list(model = "sGARCH"),
                        distribution.model = "std")
garchroll <- ugarchroll(garchspec, data = sp500ret, n.start = 2500, 
                        refit.window = "moving", refit.every = 1000)
garchVaR <- quantile(garchroll, probs = 0.05)
mean(actual < garchVaR) # returns 0.06199293
在 R 中构建 GARCH 模型

下行风险意味着关注预测分位数。

在 R 中构建 GARCH 模型

Preparing Video For Download...