程式

在 R 中使用 GARCH(1,1) 提前 2 天預測風險價值

  • March 25, 2022

假設我有一個特斯拉的 10 年數據集(範例),我正在計算滯後 2 的百分比變化:

tsla <- quantmod::getSymbols("TSLA", from = base::as.Date("2011-01-01"), to = base::as.Date("2022-01-31"), auto.assign = F)
tsla = as_tibble(tsla)
head(tsla)
d = tsla%>%
 dplyr::select(TSLA.Adjusted)%>%
 dplyr::mutate(Close = TSLA.Adjusted)%>%
 dplyr::mutate(y = as.numeric((Close - dplyr::lag(Close, 2)) / Close))%>%
 dplyr::select(Close,y)%>%
 tidyr::drop_na();d

看起來像這樣:

# A tibble: 2,786 × 2
  Close        y
  <dbl>    <dbl>
1  5.37  0.00783
2  5.58  0.0434 
3  5.65  0.0499 
4  5.69  0.0200 
5  5.39 -0.0475 
6  5.39 -0.0553 
7  5.24 -0.0282 
8  5.15 -0.0470 
9  5.13 -0.0226 
10  4.81 -0.0716 
# … with 2,776 more rows

現在我想用正常的創新來擬合 GARCH(1,1) 模型。

garnor1 = function(x){
 require(fGarch)
 t = length(x)
 fit = garchFit(~garch(1,1),data=x,trace=F,cond.dist="norm")
 m = fit@fitted
 cv = fit@sigma.t
 var = m+cv*qnorm(0.01) # low tail 
 return(var[t])
}

我成功的是,我可以估計到 2 天回報的較低風險價值 $ t $ . 這將給出一個數字,即到目前為止的 VaR(比如今天)。我到現在還好嗎?

如果是,我知道 VaR 是根據 $ t+2 $ 分位數值。這樣做我必須預測上述功能:

g11pre = function(x){
 require(fGarch)
 fit = garchFit(~garch(1,1),data=x,trace=F,cond.dist="norm")
 df=coef(fit)["shape"]
 p = predict(fit,2)
 m=p$meanForecast
cv=p$standardDeviation
 var=m+cv*qnorm(0.01)
 return(var[2])
}

最後一個預測功能我必須回測還是前一個?

編輯

對於預測功能的回測,我自己嘗試了一些東西。(為了完全理解它):

db=  d%>%
dplyr::mutate(back_lower = zoo::rollapplyr(y,252,FUN = g11pre,by = 21,fill=NA))%>%
 tidyr::fill(back_lower)%>%
 tidyr::drop_na()

我知道這看起來很奇怪。讓我解釋一下。我使用的是完整的 10 年數據集。估計期是前 252 天,然後滾動一個月 (21) 天。我對 2 天評估滾動不感興趣該模型。繪製回測結果:

p = ggplot() + 
 geom_line(data = db, aes(x =1:length(y) , y = y), color = "black") +
 geom_line(data = db, aes(x = 1:length(back_lower), y = back_lower), color = "red") +
 xlab('') +
 ylab('risk low')

這看起來像一個階梯圖(這就是它必須看起來的樣子)

在此處輸入圖像描述

**一般來說,根據參數 GARCH 框架預測風險價值 (VaR) 遵循單變數(點)預測的標準做法。**此外,我們總是對基於樣本外預測性能的 VaR 模型的準確性感興趣。

提前 2 天預測樣本外風險價值:

假設我們正站在時間 $ t $ 有資訊 $ \mathcal{F}t $ , 那麼對於一個常數均值模型 $ \mu $ ,我們可以為退貨過程定義一個單變數 GARCH(1,1) 框架 $ r{t+1} $ 作為:

$$ \begin{align*} r_{t+1} \vert \mathcal{F}{t} &= \mu + \varepsilon{t+1}\ \varepsilon_{t+1} &= \sigma_{t+1} \cdot z_{t+1}\ \sigma^2_{t+1} &= \omega + \alpha_1 \varepsilon_{t}^2 + \beta_1 \sigma_{t}^2, \end{align*} $$ 在哪裡 $ z_t \overset{iid}{\sim} D(0,1) $ (在您的情況下是高斯分佈)。它是創新的標準化分佈, $ z_t $ , 這決定了即將到來的參數 VaR 方程中的分位數。然後是當時的 VaR $ t+1 $ 鑑於過濾 $ \mathcal{F}_t $ 可以定義為(相當於提前 1 步的 VaR):

$$ VaR_{t+1\vert t}^\alpha = \mu + \sigma_{t+1\vert t}\cdot\Phi^{-1}_\alpha\left(0,1\right) $$ 請注意,在某些情況下,我們會否定上述計算,以獲得正的 VaR 估計。在承擔名義金額的損失時,這是有道理的。然而,可以通過遞歸預測方案獲得提前兩步的 VaR 預測:

$$ VaR_{t:t+2\vert t}^\alpha = \mu + \sigma_{t:t+2\vert t}\cdot\Phi^{-1}\alpha\left(0,1\right), \tag{1} $$ 我們觀察到高斯 VaR 框架中唯一可預測的對像是條件波動過程。請注意,提前兩步的條件波動率預測, $ \sigma{t:t+2\vert t} $ , 通過利用時間的預測來恢復 $ t+1 $ . 利用 GARCH(1,1) 的多步遞歸預測由下式給出的事實(參見此連結第 449 頁):

$$ \mathbb{E}\left[\sigma_{t+h}^2 \vert \mathcal{F}t\right] = \sum{i=0}^{h-1} (\alpha_1 + \beta_1)^i \cdot \omega + (\alpha_1+\beta_1)^{h-1}(\alpha_1 \varepsilon_t^2+\beta_1 \sigma^2_t) $$

我們得到 $ t+2 $ :

$$ \begin{align*} \sigma^2_{t:t+2\vert t}&:=\mathbb{E}\left[\sigma_{t+2}^2 \vert \mathcal{F}t\right] \ &= \omega + (\alpha_1 + \beta_1) \mathbb{E}\left[\sigma{t+1}^2\vert \mathcal{F}_t\right]\ &= \omega + (\alpha_1+\beta_1)\omega + (\alpha_1+\beta_1) \alpha_1 \varepsilon_t^2 + (\alpha_1+\beta_1) \beta_1 \sigma_t^2. \end{align*} $$ 將其插入 $ (1) $ 在 GARCH(1,1) 框架中產生 2 步提前 VaR 預測/預測。現在您可以執行以下遞歸過程來獲取您的預測:

  1. 通過滾動或擴展視窗擬合 GARCH(1,1) 模型,
  2. 得到估計 $ (\hat{\omega},\hat{\alpha}_1, \hat{\beta}_1, \hat{\mu}) $ 在每個時間點 $ t $ ,
  3. 計算提前兩步的 VaR 預測, $ VaR_{t:t+2\vert t}^\alpha $ .

替代方法:

除了上述方法,您可以將 GARCH(1,1) 模型擬合到每兩天採樣一次的稀疏採樣回報上,即。 $ {r_t,r_{t+2},r_{t+4},\ldots} $ .

這將每兩天產生一次有條件的波動率。然後是提前 1 步的 VaR 預測, $ VaR_{t+1\vert t}^\alpha $ , 定義在 $ (1) $ 為您提供未來 2 天的 VaR 估計值。

這種方法很容易實施,因為您可以遵循大多數關於他們如何定義提前 1 步預測的文獻,而無需額外的推導。對於這個問題,你可以從這裡提供的程式碼中得到一些啟發R但是,他們只估計樣本內的 VaR,而不是樣本外的)


如果要指定時變平均模型 $ \mu_t $ ,那麼您還需要 2 步提前條件預測 $ \mu_{t+2\vert t} $ 以恢復您的 VaR 預測。這些通常可以使用類似的遞歸方案來恢復。我希望這能提供一些見解。

引用自:https://quant.stackexchange.com/questions/70182