波動率

DCC-GARCH 的模擬

  • August 21, 2021

我想用 DCC GARCH 模擬一些匯率。我知道這個包rmgarch,但我想自己編寫模擬程式碼。以下是模型的主要方程:

$ r_t = a_t $

$ a_t = H^{1/2}_{t} Z_t $

$ H_t = D_t R_t D_t $

$ R_t = Q^{-1}_t Q_t Q^{-1}_t $

$ Q_t = (1-a-b)\bar{Q} + a\epsilon_{t-1}\epsilon’{t-1} + b Q{t-1} $

我的問題是:如果我準備好了單變數 GARCH 參數 $ D_t $ , $ a $ 和 $ b $ 和 $ \bar{Q} $ 如何得到 $ \epsilon_{t-1} $ 執行模擬?以及執行它的步驟是什麼。

模擬 DCC-GARCH(1,1) 模型

鑑於您已經為 DCC-GARCH 模型定義了一組給定的正確參數,標準化殘差 $ \varepsilon_{t-1} $ 從單變數 GARCH 模型中恢復並輸入 DCC 結構以產生模擬的相關動態。DCC-GARCH 模型的模擬可以定義為 3 個總體步驟:

  1. 使用預定義參數的過濾算法模擬單變數 GARCH 動力學並恢復標準化殘差。之後,構造一個模擬的通用函式 $ d $ 具有不同參數集(或相同參數集)的 GARCH 模型。
  2. 使用 (1) 中的標準化殘差來模擬 DCC 動態並恢復相關結構。從施工中我們知道 $ \varepsilon_{t-1} \overset{iid}{\sim} N(0,1) $ 因此,您可以模擬 DCC 動態並在沒有 GARCH 組件的情況下取消相關性。
  3. 使用以下公式通過單變數變異數和相關結構恢復共變異數矩陣, $ \Sigma_t=D_t^{1/2}R_t D_t^{1/2} $ , 和 $ D_t = diag(\sigma_{i,t}^2) $

在整個答案中,程式碼將用R. 此外,程式碼將未經優化。

1. 模擬多個單變數 GARCH 模型

正式地讓我們在單變數設置中定義(貶低)回報,

$$ \begin{equation} r_t = \sigma_t \epsilon_t \iff \frac{r_t}{\sigma_t} = \epsilon_t, \end{equation} $$

在哪裡 $ \epsilon_t \overset{iid}{\sim}N(0,1) $ 是單變數標準化殘差。這進一步意味著 $ r_t \sim N(0, \sigma_t^2) $ ,我們將在模擬中使用它。單變數收益的變異數動態遵循 GARCH(1,1) 形式:

$$ \begin{equation} \sigma^2_t = \omega + \alpha r_{t-1}^2 + \beta \sigma^2_{t-1}. \end{equation} $$

模擬 GARCH 模型的方式,我們通過採樣初始化模擬 $ r_1 \sim N(0,\sigma^2_1) $ , 在哪裡 $ \sigma^2_1 = \frac{\omega}{1-\alpha - \beta} $ 是無條件變異數。之後,我們反復更新變異數動態並使用該rnorm()函式模擬收益。

該功能在名稱下方顯示,GARCHSim並已被廣泛評論。為了便於實現,我們構造了一個函式 ( GARCHmultisim),在一個函式呼叫中執行多個模擬。這裡,參數變數 ( params) 將是 $ d \times 3 $ 矩陣與 $ d $ 表示要模擬的 GARCH 模型的數量。該函式輸出具有維度的兩個矩陣的列表 $ sims \times d $ ,其中一個包含標準化殘差,另一個包含變異數。

2 + 3. 使用標準化殘差模擬 DCC 結構

為 DCC 結構建構濾波器算法或多或少與 GARCH 模型的過程相同。我們需要更新 $ Q_t $ 對於每個時間點,然後重建以下相關矩陣 $ R_t = \tilde{Q}_t^{-1/2} Q_t \tilde{Q}_t^{-1/2} $ 和 $ \tilde{Q_t} $ 包含的對角元素 $ Q_t $ . 然後我們可以重構共變異數矩陣, $ \Sigma_t $ ,使用第 3 點中的關係。

我們進一步建模 $ Q_t $ 遵循一個類似 GARCH(1,1) 的結構,我們強加弱平穩性(即。 $ a+b<1 $ ) 為了保證 $ Q_t $ 是肯定的並且暗示 $ R_t $ 是正定的: $$ \begin{equation*} Q_t = \bar{Q} (1-a-b) + a (\eta_{t-1}\eta_{t-1}^\intercal) + b Q_{t-1}, \end{equation*} $$

在哪裡 $ \bar{Q} $ 是多元標準化殘差的無條件共變異數矩陣 $ \eta_t $ . 我們可以恢復以下兩個參數

$$ \begin{align*} \bar{Q} &= \frac{1}{T} \sum_{t=1}^{T} \eta_t \eta_t^\intercal\ \eta_t &= D_t^{-\frac{1}{2}} r_t \sim N(0, R_t), \end{align*} $$ 我們將在模擬過程中使用它。該函式已命名DCCsim,可以在程式碼片段的末尾找到。

圖解說明

我提供了一個模擬雙變數 DCC-GARCH(1,1) 模型的圖形說明,其任意參數由下式給出:

$$ \omega_{1}=0.02, \quad \alpha_1 = 0.08, \quad \beta_1 = 0.89, \quad \omega_{2}=0.02, \quad \alpha_2 = 0.05, \quad \beta_2 = 0.94, \quad a=0.1, \quad b=0.89, $$

和 $ \omega_i, : \alpha_i, : \beta_i $ 為了 $ i=1,2 $ 是第一個和第二個 GARCH 過程的參數,下面也分別用紅色和綠色表示。

模擬

一些評論

  • DCC 模型中的相關結構取決於 GARCH 模型的殘差。本質上,單變數 GARCH 模型不擷取依賴結構,因此它將包含在殘差中。然而,殘差遵循單變數標準高斯分佈(並且是iid),因此沒有任何相關結構。這意味著無條件相關趨向於零,因為 $ sims \rightarrow \infty $ .
  • 您還可以在 DCC 模型中模擬具有動態相關性的多元正態變數,其中相關性是根據現實世界的股票價格估計的(也就是說,您可以使用 R 中的 mvrnorm 函式和基於不同相關性的變化的共變異數矩陣),或者您可以嘗試對殘差使用替代分佈。
  • 恆定條件相關(CCC DCC_COVAR)模型通過重建共變異數矩陣(acor``mQ
  • 由於相關性和波動性動態的分離,單變數 GARCH 模型中的任何擴展都是有效的。

上述實現提供了一個基本的仿真框架。因此,可能有更有效的方法來在 DCC 結構中建構真實的模擬相關性,或者完全替代的方法來模擬這個模型。我希望這至少能為您和未來的讀者提供一些見解


程式碼附錄

程式碼如下所示。

# Univariate GARCH simulation
GARCHSim &lt;- function(omega, alpha, beta, sims) {
 #sims (integer): Number of simulations performed. 
 
 ## initialize the vector of simulated returns and variances
 ret = numeric(sims)
 sigma2 = numeric(sims)
 
 ## initialize the variance at time t = 1 with the unconditional variance.
 sigma2[1] = omega/(1.0 - alpha - beta)

 ## sample the first observations
 ret[1] = rnorm(1, mean = 0, sd = sqrt(sigma2[1]))
 
 ## loop over sims.
 for (t in 2:sims) {
   #update volatility
   sigma2[t] = omega + alpha * ret[t - 1]^2 + beta * sigma2[t - 1]

   # sample new observarion
   ret[t] = rnorm(1, mean = 0, sd = sqrt(sigma2[t]))
 }
 
 ## we return a list with three components: the sampled returns, the variance, 
 ## and the standardized residuals. 
 lOut = list()
 lOut[["ret"]] = ret
 lOut[["sigma2"]] = sigma2

 # gives standardized residuals for demeaned returns. 
 lOut[["stdres"]] = ret/sqrt(sigma2)
 
 return(lOut)
} 



# Multiple simulations of the GARCH model.
GARCHmultisim &lt;- function(params, sims){

 multisim_res &lt;- matrix(0L, nrow=sims, ncol = nrow(params))
 multisim_sigma &lt;- matrix(0L, nrow=sims, ncol = nrow(params))

 # rows in parameter matrix determines amount of garch simulations.
 for(i in 1:nrow(params)){

   # matrix() transforms it into a vector. 
   multisim_res[, i] &lt;- matrix(GARCHSim(params[i,1], params[i,2], params[i,3], sims)[["stdres"]])
   multisim_sigma[, i] &lt;- matrix(GARCHSim(params[i,1], params[i,2], params[i,3], sims)[["sigma2"]])
   
 }

 lOut = list()

 lOut[["res"]] = multisim_res
 lOut[["sigma"]] = multisim_sigma

 return(lOut)
}



# Simulation for the Dynamic Conditional Correlations (DCC).
DCCsim &lt;- function(GARCH_params, a, b, sims){

 stdres &lt;- GARCHmultisim(GARCH_params, sims)[["res"]]

 Gsigs &lt;- GARCHmultisim(GARCH_params, sims)[["sigma"]]

 mQ = cor(stdres)
 iN = ncol(stdres)
 iT = nrow(stdres)
 
 # initialize the array for the correlations
 aCor = array(0, dim = c(iN, iN, iT))

 # initialize the array for the Q matrices
 aQ = array(0, dim = c(iN, iN, iT))
 
 ## initialization at the unconditional cor
 aCor[,, 1] = mQ
 aQ[,,1] = mQ

 # main loop
 for (t in 2:iT) {
   # update the Q matrix
   aQ[,, t] = mQ * (1 - a - b) + a * t(stdres[t - 1, , drop = FALSE]) %*%
   stdres[t - 1, , drop = FALSE] + b * aQ[,,t - 1]
   
   ## Compute the correlation as Q_tilde^{-1/2} Q Q_tilde^{-1/2} 
   aCor[,, t] = diag(sqrt(1/diag(aQ[,, t]))) %*% aQ[,, t] %*% 
   diag(sqrt(1/diag(aQ[,, t]))) 
   
   }

   #Getting univariate variance matrix D_t:

   msigma &lt;- array(0L, dim = c(ncol(Gsigs), ncol(Gsigs), nrow(Gsigs)))

   for(i in 1:ncol(Gsigs)){

     msigma[i, i, ] &lt;- Gsigs[, i]

   }

   # constructing the covariance matrix
   DCC_COVAR &lt;- array(0, dim = c(ncol(Gsigs), ncol(Gsigs), nrow(Gsigs)))

   DCC_returns &lt;- matrix(0, nrow = nrow(Gsigs), ncol = ncol(Gsigs))
   for(i in 1:sims){

     DCC_COVAR[,,i] &lt;- msigma[,,i]^0.5 %*% aCor[,,i] %*% msigma[,,i]^0.5

     # Getting returns:
     DCC_returns[i,] &lt;- mvrnorm(1, rep(0,ncol(Gsigs)), DCC_COVAR[,,i])

   }

 lOut = list()

 # correlations
 lOut[["aCor"]] = aCor
 
 # univariate variances
 lOut[["Gsigs"]] = Gsigs
 
 # covariances
 lOut[["DCC_COVAR"]] = DCC_COVAR
 
 # returns
 lOut[["DCC_returns"]] = DCC_returns

 return(lOut)
}

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