拓端tecdat:R語言GARCH建模常用軟件包比較、擬合標准普爾SP 500指數波動率時間序列和預測可視化


原文鏈接:http://tecdat.cn/?p=24441

原文出處:拓端數據部落公眾號

我們研究波動聚集,以及使用單變量 GARCH(1,1) 模型對其進行建模。

波動聚集

波動聚集——存在相對平穩時期和高波動時期的現象——是市場數據的一個看似普遍的屬性。對此沒有普遍接受的解釋。GARCH(廣義自回歸條件異方差)模型 波動聚集。圖 1 是波動率的 garch 模型的示例。

圖 1:根據 garch(1,1) 模型估計的 2011 年底之前的標准普爾 500 指數波動率

顯然,波動性隨時間變化。圖 1 是波動率模型,而不是真正的波動率。但如果我們有一張真實波動率的圖片,它看起來會非常像圖 1。

數據需求

提供給 garch 估計的數據是每日數據。你可以使用每周或每月的數據,但這將使數據中的一些波動變得平滑。

你可以用garch處理日內數據,但這變得很復雜。 一天中的波動有季節性。 季節性在很大程度上取決於交易發生的特定市場,也可能取決於特定資產。 一個例子是看盤中的風險值。

圖1沒有顯示真實的波動性,因為我們從來沒有觀察過波動性。 波動性曾經只是間接地暴露在我們面前。 所以我們試圖估計一些未知的東西。

圖 2 是一個原型 garch 模型圖。

圖 2:“無噪音”garch 模型圖

garch 的觀點是波動率上升然后衰減,直到出現另一個峰值。很難在圖 1 中看到這種行為,因為時間軸太緊湊了,因此在圖 3 中更加明顯。

圖 3:由 garch(1,1) 模型估計的 MMM 波動率。

當然,在真實數據中,有各種規模的沖擊,而不僅僅是大的沖擊。

請注意,來自公告的波動性(與沖擊相反)是反過來的--波動性隨着公告時間的臨近而增加,然后在公告結果出來后消失。

對Garch模型的估計主要是對衰減速度的估計。 它所看到的衰減是非常嘈雜的,所以它希望看到大量的數據。 大量的數據是指它希望有數以萬計的每日觀測數據。

有兩個原因不能給它大量的觀測數據。
 

  • 你沒有那么多觀察數據
  • 市場隨時間變化

所以有一個折中的方法。每天 2000 次觀察往往不無道理。

如果你每天的觀測值少於1000個,那么估計就不可能給你提供很多關於參數的真實信息。 最好是選擇一個 "合理的 "模型。 這將是一個具有大約正確的持久性的模型(見下文),α1參數在0和0.1之間,β1參數在0.9和1之間。

估計

我們使用 GARCH(1,1) 模型;不是因為它是最好的,因為它是最常用的。

Garch 模型幾乎總是通過最大似然估計。結果證明這是一個非常難的優化問題。假設你有足夠重要的數據,即使是最好的 garch 實現也需要關注優化。

我們知道,收益率沒有正態分布,它們有長尾。 假設長尾完全是由於arch效應造成的,這是完全合理的,在這種情況下,在arch模型中使用正態分布將是正確的做法。 然而,使用長尾分布的可能性,結果是給出一個更好的擬合(幾乎總是如此)。 t分布似乎做得很好。
 

自相關

如果模型正確解釋了波動聚集,則平方標准化殘差將不存在自相關。通常進行 Ljung-Box 檢驗來檢驗這種自相關性。

下面是假設 MMM 收益率正態分布的擬合輸出(在本例中實際上是 Box-Pierce):

如果你習慣於看擬合度檢驗的p值,你可能會注意到一些奇怪的東西。 檢驗表明,我們用4個參數過度擬合了1547個觀測值。  我不這么認為。

更好的解釋是,盡管檢驗是非常穩健的,但對這種極端的數據來說,檢驗並不穩健。 這樣檢驗平方殘差可能會產生反作用。 一個有信息量的檢驗是關於平方標准化殘差的行列。

持久性

garch模型的持久性與沖擊后大的波動率衰減的速度有關。對於garch(1,1)模型來說,關鍵的統計數字是兩個主要參數(alpha1和beta1,我們在這里使用的符號)的總和。

α1和β1的總和應該小於1。 如果總和等於1,那么我們就有一個指數衰減模型。

可以用半衰期來表示持久性。 半衰期是log(0.5)/log(alpha1 + beta1),其中的單位將是收益率的頻率。 當α1+β1達到1時,半衰期就變成了無限。

為什么我們會得到具有無限持久性的估計? 持久性是通過觀察在樣本期間衰減的速度來估計的。 如果在樣本期間波動率有一個趨勢,那么估計者就會 "認為 "它從未看到完全的衰減。 樣本期越短,越有可能出現欺騙估計的趨勢。

無論參數估計值是多少,波動率的樣本內估計值看起來都很相似。 如果我們改變各自模型的參數估計值,圖 1 和圖 3 不會有太大變化。 但是當我們在樣本外進行預測時,參數就很重要了。

使用Garch

Garch 模型之所以有用,是因為以下兩點:

  • 你可以使用 garch 模型進行預測
  • 你可以使用 garch 模型進行模擬

預測

你預測的越遠,你的模型就越接近完美。Garch 模型並不是特別接近完美。如果你在一個月或更長時間的時間范圍內進行預測,那么效果可能不好。 如果你預測的是未來幾天,那么Garch應該是相當有用的。

模型的持久性是預測的關鍵驅動因素——它決定了預測進入無條件波動的速度。如果波動率確實存在很多持久性,並且你的模型准確地捕捉到了這種持久性,那么你將在很遠的地方獲得良好的預測。

有兩種不同的事情可以預測:

  • 預測期各時間點的波動率
  • 從周期開始到周期中每個時間點的平均波動率

例如,期權價格的波動率是到期前的平均波動率,而不是到期日的波動率。

因此,在預測時你需要了解兩件事:

  • 你想要哪個預測
  • 你得到哪個預測

模擬

garch 模擬需要:

  • garch 模型(包括參數值)
  • 模型的波動狀態
  • 標准化(方差 1)的分布

我們想要的波動狀態幾乎總是數據末尾的狀態。我們想利用當前的波動狀態並展望未來。

使用經驗分布——擬合模型的標准化殘差——通常是分布的最佳選擇。即使在使用經驗分布時,擬合模型時的分布假設也會產生影響。

估計程序“試圖”使殘差符合假設的分布。假設正態分布的模型的標准化殘差將比假設分布相同數據的模型的殘差更接近正態分布。

模擬依賴於估計的參數,但不像預測那樣嚴重。 當我們模擬到更遠的未來時,模型誤差會加重。
 

R包

R 中的 garch 建模有多種選擇。沒有一種是完美的,使用哪種可能取決於你想要實現的目標。然而,rugarch 對於許多人來說, 它可能是最好的選擇。

rugarch

這具有擬合(即估計參數)、預測和模擬的功能。

以下是使用 Student t 分布進行擬合的示例:

  1.  
    ugarchspec(mean.modl, distriuion)
  2.  
    ugarchfit(ru, ret)
  3.  
    coef

  1.  
     
  2.  
    > # 繪制樣本內波動率估計值
  3.  
    > plot(sqrt(252) * sigma)

這個包中的優化可能是我討論的包中最復雜和最值得信賴的。

fGarch

我們將擬合與上述相同的 Student t 模型:

  1.  
    garchFit(sp5, cod.dit="std")
  2.  
    coef

 

  1.  
     
  2.  
    > # 繪制樣本內波動率估計值
  3.  
    > plot(sqrt(252) * gfit.fg@sigma.t, type="l")

tseries

這個包是第一個在 R 中包含公開可用的 garch 函數的包。它僅限於正態分布。

  1.  
    garch(sp5)
  2.  
    coef

  1.  
     
  2.  
    > # 繪制樣本內波動率估計值
  3.  
    > plot(sqrt(252) *fittedalus)

bayesGARCH

對Garch模型進行貝葉斯估計。

這個包所做的唯一模型是具有t分布誤差的garch(1,1)。 

bayesGARCH(sp5)

但是,此命令失敗並出現錯誤。如果我們以百分比形式給出收益率,則該命令確實有效:

bayesGARCH(sp5 * 100)

這也可能是最大似然估計的一個問題。 至少有一個Garch的實現在優化百分比收益而不是自然比例的收益方面要好得多。 你可以對優化做一個測試,就是在兩種規模的收益率上估計模型並比較結果。

不過,bayesGARCH函數並沒有給我們一個估計值。 它給我們的是一個矩陣,列對應於參數,行對應於馬爾科夫鏈蒙特卡洛。 這可以說是參數的(后驗)分布的一個樣本。

如果我們對持久性施加一個約束,我們可以得到一個更有用的分析。 我們通過為約束條件創建一個函數來做到這一點。
 

  1.  
     
  2.  
          pi[2] + pi[3] < .9986

這就是說超過兩年的半衰期是不合理的。然后我們使用該約束:

cotrl=list(adPrrdos=prieces))

現在我們從結果中進行選擇並計算分布中的半衰期:

然后繪制結果。

圖 3:MMM 波動率半衰期的貝葉斯估計

betategarch

該包擬合具有 t 分布誤差的 EGARCH 模型。

  1.  
    tegarch.est(sp5)
  2.  
    par

  1.  
    tegarch.fit(sp5, par)
  2.  
    plot(sqrt(252) * siga *
  3.  
    sd(epiln]))

 圖 4 將這個估計值與 garch(1,1)估計值進行了比較(來自 rugarch,但它們看起來都非常相似)。

圖 4: 由 garch(1,1) 模型(藍色)和 beta-t EGARCH 模型(紅色)估計的 MMM 波動率

dynamo

我認為在這個包中估計一個 garch 模型的方法是:

dm(sp~ garch(1,1))

AutoSEARCH

該包將為 ARCH 模型選擇最佳滯后。

rugarch 包中的 garch 模型

如何擬合和使用garch 模型。

模型

這模型通常比更常見的 garch(1,1) 模型效果更好。

圖 5 顯示了擬合標准普爾 500 指數的兩個模型對未來 20 天每天波動率的預測。模型對波動率的預測更為細致。

圖 5:使用模型(藍色)和具有方差目標(紅色)的 garch(1,1) 對每天的波動率預測

通常,你關心的是從現在到指定日期的平均波動率。這被稱為期限結構——圖 6 顯示了這一點。

圖 6:使用分量模型(藍色)和具有方差目標(紅色)的 garch(1,1) 預測標准普爾 500 指數的波動率期限結構

創建這些圖的代碼如下所示。

R代碼

該 rugarch 軟件包允許選擇擬合模型。

錯誤

首先這是我遇到的一個問題:

  SET_VECTOR_ELT() can only be applied to a 'list', not a 'symbol'

更新這些包可以解決問題。

卸載包后,我更新了 Rcpp 和 RcppArmadillo 包。仍然不能正常工作。

再次安裝 Rcpp 后,成功了。

模型被調用 "csGARCH" , rugarch 兩個額外的參數被稱為 eta11 (我的符號中的ρ)和 eta21 (φ)。它的分布和常數平均值是:

  1.  
    ugarchspec(mean.model, ditrbuton,
  2.  
      vriane.moel)

用途如下:

  1.  
    Warning message:
  2.  
    In .makefitmodel
  3.  
    NaNs produced

警告信息似乎是關於:

  1.  
    fit$coH
  2.  
    [1] NaN

估計系數和半衰期為:

> coef

  1.  
     
  2.  
    > halflife

 

具有方差目標的 garch(1,1) 模型的規范是:

  1.  
    ugarchspec(mean.moel, isrition,
  2.  
      varane.moel,
  3.  
      vrince.tgtng=TRUE))

預測

一旦模型擬合好,你就可以進行預測。

  1.  
    ugarchforecast()
  2.  
     

一旦我們得到了預測的波動率,我們就可以繪制它。生成圖5 的函數是:

  1.  
     
  2.  
        plot(1:20, spf}

圖 6 的函數是:

  1.  
     
  2.  
        plot(sqrt(cumsum(spe^2)/(1:20))

最受歡迎的見解

1.HAR-RV-J與遞歸神經網絡(RNN)混合模型預測和交易大型股票指數的高頻波動率

2.R語言中基於混合數據抽樣(MIDAS)回歸的HAR-RV模型預測GDP增長

3.波動率的實現:ARCH模型與HAR-RV模型

4.R語言ARMA-EGARCH模型、集成預測算法對SPX實際波動率進行預測

5.GARCH(1,1),MA以及歷史模擬法的VaR比較

6.R語言多元COPULA GARCH 模型時間序列預測

7.R語言基於ARMA-GARCH過程的VAR擬合和預測

8.matlab預測ARMA-GARCH 條件均值和方差模型

9.R語言對S&P500股票指數進行ARIMA + GARCH交易策略


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM