在 R 中使用 GARCH(1,1) 提前 2 天預測風險價值
假設我有一個特斯拉的 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 預測/預測。現在您可以執行以下遞歸過程來獲取您的預測:
- 通過滾動或擴展視窗擬合 GARCH(1,1) 模型,
- 得到估計 $ (\hat{\omega},\hat{\alpha}_1, \hat{\beta}_1, \hat{\mu}) $ 在每個時間點 $ t $ ,
- 計算提前兩步的 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 預測。這些通常可以使用類似的遞歸方案來恢復。我希望這能提供一些見解。