バリュー・アット・リスク(VaR)

Rで学ぶGARCHモデル

Kris Boudt

Professor of finance and econometrics

バリュー・アット・リスク(VaR)

  • 一般的なダウンサイドリスク指標:5% VaR。リターン分布の5%分位は、最悪5%の局面での最良リターンを表す。
    年ごとの日次リターン分布
Rで学ぶGARCHモデル

年ごとの日次リターン分布

Rで学ぶGARCHモデル

先読みアプローチが必要

  • ローリング窓の分位は後ろ向き:
    • 事後: 過去1年の日次リターンでの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を下回ると、VaR超過(exceedance)が発生します: $ R_t \ < {VaR}_t$。

VaR超過の発生頻度をVaRカバレッジと呼びます。

# S&P 500のリターンと5%水準でのカバレッジの計算
mean(actual < garchVaR)
0.05159143
Rで学ぶGARCHモデル

VaRカバレッジとモデル検証

  • 損失確率 $\alpha$(例: 5%)のVaRに対するカバレッジの解釈:
    • 妥当な予測モデルでは、カバレッジは設定した確率 $\alpha$ に近い。
    • カバレッジが $\gg$ $\alpha$:超過が多すぎる → 予測分位が高すぎる(より負にすべき)。損失リスクを過小評価。
    • カバレッジが $\ll$ $\alpha$:超過が少なすぎる → 予測分位が低すぎる(負にしすぎ)。損失リスクを過大評価。
Rで学ぶGARCHモデル

性能を悪化させる要因

distribution.model = "std" を distribution.model = "sstd" の代わりに使用:

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 = "sGARCH")

ではなく

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

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 = 1000

ではなく

refit.every = 100:

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...