DCC-GARCH 的模擬
我想用 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 個總體步驟:
- 使用預定義參數的過濾算法模擬單變數 GARCH 動力學並恢復標準化殘差。之後,構造一個模擬的通用函式 $ d $ 具有不同參數集(或相同參數集)的 GARCH 模型。
- 使用 (1) 中的標準化殘差來模擬 DCC 動態並恢復相關結構。從施工中我們知道 $ \varepsilon_{t-1} \overset{iid}{\sim} N(0,1) $ 因此,您可以模擬 DCC 動態並在沒有 GARCH 組件的情況下取消相關性。
- 使用以下公式通過單變數變異數和相關結構恢復共變異數矩陣, $ \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 <- 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 <- function(params, sims){ multisim_res <- matrix(0L, nrow=sims, ncol = nrow(params)) multisim_sigma <- 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] <- matrix(GARCHSim(params[i,1], params[i,2], params[i,3], sims)[["stdres"]]) multisim_sigma[, i] <- 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 <- function(GARCH_params, a, b, sims){ stdres <- GARCHmultisim(GARCH_params, sims)[["res"]] Gsigs <- 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 <- array(0L, dim = c(ncol(Gsigs), ncol(Gsigs), nrow(Gsigs))) for(i in 1:ncol(Gsigs)){ msigma[i, i, ] <- Gsigs[, i] } # constructing the covariance matrix DCC_COVAR <- array(0, dim = c(ncol(Gsigs), ncol(Gsigs), nrow(Gsigs))) DCC_returns <- matrix(0, nrow = nrow(Gsigs), ncol = ncol(Gsigs)) for(i in 1:sims){ DCC_COVAR[,,i] <- msigma[,,i]^0.5 %*% aCor[,,i] %*% msigma[,,i]^0.5 # Getting returns: DCC_returns[i,] <- 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) }