最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

R語言用多元ARMA,GARCH ,EWMA, ETS,隨機波動率SV模型對金融時間序列數(shù)據(jù)建模

2021-04-03 15:25 作者:拓端tecdat  | 我要投稿

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

?

本文將說明單變量和多變量金融時間序列的不同模型,特別是條件均值和條件協(xié)方差矩陣、波動率的模型。

均值模型

本節(jié)探討條件均值模型。

iid模型

我們從簡單的iid模型開始。iid模型假定對數(shù)收益率xt為N維高斯時間序列:

均值和協(xié)方差矩陣的樣本估計量分別是樣本均值

和樣本協(xié)方差矩陣

我們從生成數(shù)據(jù)開始,熟悉該過程并確保估計過程給出正確的結果(即完整性檢查)。然后使用真實的市場數(shù)據(jù)并擬合不同的模型。

讓我們生成合成iid數(shù)據(jù)并估算均值和協(xié)方差矩陣:

  1. # 生成綜合收益數(shù)據(jù)

  2. X <- rmvnorm(n = T, mean = mu, sigma = Sigma)

  3. # 樣本估計(樣本均值和樣本協(xié)方差矩陣)

  4. mu_sm <- colMeans(X)

  5. Sigma_scm <- cov(X)

  6. # 誤差

  7. norm(mu_sm ? ? - mu, "2")

  8. #> [1] 2.44

  9. norm(Sigma_scm - Sigma, "F")

  10. #> [1] 70.79

現(xiàn)在,讓我們針對不同數(shù)量的觀測值T再做一次:

  1. # 首先生成所有數(shù)據(jù)


  2. X <- rmvnorm(n = T_max, mean = mu, sigma = Sigma)

  3. # 現(xiàn)在遍歷樣本的子集


  4. for (T_ in T_sweep) {

  5. ?# 樣本估算

  6. ?mu_sm <- colMeans(X_)

  7. ?Sigma_scm <- cov(X_)

  8. ?# 計算誤差

  9. ?error_mu_vs_T ? ?<- c(error_mu_vs_T, ? ?norm(mu_sm ? ? - mu, "2"))

  10. ?error_Sigma_vs_T <- c(error_Sigma_vs_T, norm(Sigma_scm - Sigma, "F"))

  11. # 繪圖

  12. plot(T_sweep, error_mu_vs_T,

  13. ? ? main = "mu估計誤差",

  1. plot(T_sweep, error_Sigma_vs_T

  2. ? ? main = "Sigma估計中的誤差", ylab = "誤差"

單變量ARMA模型

對數(shù)收益率xt上的ARMA(p,q)模型是

其中wt是均值為零且方差為σ2的白噪聲序列。模型的參數(shù)是系數(shù)?i,θi和噪聲方差σ2。

請注意,ARIMA(p,d,q)模型是時間差分為d階的ARMA(p,q)模型。因此,如果我們用xt代替對數(shù)價格,那么先前的對數(shù)收益模型實際上就是ARIMA(p,1,q)模型,因為一旦對數(shù)價格差分,我們就獲得對數(shù)收益。

rugarch生成數(shù)據(jù)?

我們將使用rugarch包??生成單變量ARMA數(shù)據(jù),估計參數(shù)并進行預測。

首先,我們需要定義模型:

  1. # 指定具有給定系數(shù)和參數(shù)的AR(1)模型

  2. #>

  3. #> *----------------------------------*

  4. #> * ? ? ? ARFIMA Model Spec ? ? ? ? ?*

  5. #> *----------------------------------*

  6. #> Conditional Mean Dynamics

  7. #> ------------------------------------

  8. #> Mean Model ? ? ? ? ? : ARFIMA(1,0,0)

  9. #> Include Mean ? ? : TRUE

  10. #>

  11. #> Conditional Distribution

  12. #> ------------------------------------

  13. #> Distribution : ?norm

  14. #> Includes Skew ? ?: ?FALSE

  15. #> Includes Shape ? : ?FALSE

  16. #> Includes Lambda ?: ?FALSE


  17. #> ? ? ? ? ?Level Fixed Include Estimate LB UB

  18. #> mu ? ? ? ?0.01 ? ? 1 ? ? ? 1 ? ? ? ?0 NA NA

  19. #> ar1 ? ? ?-0.90 ? ? 1 ? ? ? 1 ? ? ? ?0 NA NA

  20. #> ma ? ? ? ?0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  21. #> arfima ? ?0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  22. #> archm ? ? 0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  23. #> mxreg ? ? 0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  24. #> sigma ? ? 0.20 ? ? 1 ? ? ? 1 ? ? ? ?0 NA NA

  25. #> alpha ? ? 0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  26. #> beta ? ? ?0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  27. #> gamma ? ? 0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  28. #> eta1 ? ? ?0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  29. #> eta2 ? ? ?0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  30. #> delta ? ? 0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  31. #> lambda ? ?0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  32. #> vxreg ? ? 0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  33. #> skew ? ? ?0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  34. #> shape ? ? 0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  35. #> ghlambda ?0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  36. #> xi ? ? ? ?0.00 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  37. fixed.pars

  38. #> $mu

  39. #> [1] 0.01

  40. #>

  41. #> $ar1

  42. #> [1] -0.9

  43. #>

  44. #> $sigma

  45. #> [1] 0.2


  46. true_params

  47. #> ? ?mu ? ar1 sigma

  48. #> ?0.01 -0.90 ?0.20

然后,我們可以生成時間序列:


  1. # 模擬一條路徑


  2. apath(spec, n.sim = T)


  3. # 轉(zhuǎn)換為xts并繪圖

  4. plot(synth_log_returns, main = "ARMA模型的對數(shù)收益率"

  5. plot(synth_log_prices, main = "ARMA模型的對數(shù)價格"

ARMA模型

現(xiàn)在,我們可以估計參數(shù)(我們已經(jīng)知道):

  1. # 指定AR(1)模型

  2. arfimaspec(mean.model = list(armaOrder = c(1,0), include.mean = TRUE))

  3. # 估計模型


  4. #> ? ? ? ? ? mu ? ? ? ? ?ar1 ? ? ? ?sigma

  5. #> ? ? ? 0.0083 ? ? ?-0.8887 ? ? ? 0.1987


  6. #> ? ?mu ? ar1 sigma

  7. #> ?0.01 -0.90 ?0.20


我們還可以研究樣本數(shù)量T對參數(shù)估計誤差的影響:

  1. # 循環(huán)


  2. for (T_ in T_sweep) {

  3. ?estim_coeffs_vs_T <- rbind(estim_coeffs_vs_T, coef(arma_fit))

  4. ?error_coeffs_vs_T <- rbind(error_coeffs_vs_T, abs(coef(arma_fit) - true_params)/true_params)



  5. # 繪圖

  6. matplot(T_sweep, estim_coeffs_vs_T,

  7. ? ? ? ?main = "估計的ARMA系數(shù)", xlab = "T", ylab = "值",

  1. matplot(T_sweep, 100*error_coeffs_vs_T,

  2. ? ? ? ?main = "估計ARMA系數(shù)的相對誤差", xlab = "T", ylab = "誤差 (%)",

首先,真正的μ幾乎為零,因此相對誤差可能顯得不穩(wěn)定。在T = 800個樣本之后,其他系數(shù)得到了很好的估計。

ARMA預測

為了進行健全性檢查,我們現(xiàn)在將比較兩個程序包?Forecast?和?rugarch的結果


  1. # 指定具有給定系數(shù)和參數(shù)的AR(1)模型

  2. spec(mean.model = list(armaOrder = c(1,0), include.mean = TRUE),

  3. ? ? ? ? ? ? ? ? ? ? ? ? ? ? fixed.pars = list(mu = 0.005, ar1 = -0.9, sigma = 0.1))

  4. # 生成長度為1000的序列

  5. arfima(arma_fixed_spec, n.sim = 1000)@path$seriesSim

  6. # 使用 rugarch包指定和擬合模型

  7. spec(mean.model = list(armaOrder = c(1,0), include.mean = TRUE))


  8. # 使用包“ forecast”擬合模型


  9. #> ARIMA(1,0,0) with non-zero mean

  10. #>

  11. #> Coefficients:

  12. #> ? ? ? ? ? ar1 ? ?mean

  13. #> ? ? ? -0.8982 ?0.0036

  14. #> s.e. ? 0.0139 ?0.0017

  15. #>

  16. #> sigma^2 estimated as 0.01004: ?log likelihood=881.6

  17. #> AIC=-1757.2 ? AICc=-1757.17 ? BIC=-1742.47

  18. # 比較模型系數(shù)


  19. #> ? ? ? ? ?ar1 ? ?intercept ? ? ? ?sigma

  20. #> -0.898181148 ?0.003574781 ?0.100222964


  21. #> ? ? ? ? ? mu ? ? ? ? ?ar1 ? ? ? ?sigma

  22. #> ?0.003605805 -0.898750138 ?0.100199956

確實,這兩個軟件包給出了相同的結果。

ARMA模型選擇?

在先前的實驗中,我們假設我們知道ARMA模型的階數(shù),即p = 1和q = 0。實際上,階數(shù)是未知的,因此必須嘗試不同的階數(shù)組合。階數(shù)越高,擬合越好,但這將不可避免地導致過度擬合。已經(jīng)開發(fā)出許多方法來懲罰復雜性的增加以避免過度擬合,例如AIC,BIC,SIC,HQIC等。


  1. # 嘗試不同的組合


  2. # 查看排名

  3. #> ? ?AR MA Mean ARFIMA ? ? ? ? BIC converged

  4. #> 1 ? 1 ?0 ? ?1 ? ? ?0 -0.38249098 ? ? ? ? 1

  5. #> 2 ? 1 ?1 ? ?1 ? ? ?0 -0.37883157 ? ? ? ? 1

  6. #> 3 ? 2 ?0 ? ?1 ? ? ?0 -0.37736340 ? ? ? ? 1

  7. #> 4 ? 1 ?2 ? ?1 ? ? ?0 -0.37503980 ? ? ? ? 1

  8. #> 5 ? 2 ?1 ? ?1 ? ? ?0 -0.37459177 ? ? ? ? 1

  9. #> 6 ? 3 ?0 ? ?1 ? ? ?0 -0.37164609 ? ? ? ? 1

  10. #> 7 ? 1 ?3 ? ?1 ? ? ?0 -0.37143480 ? ? ? ? 1

  11. #> 8 ? 2 ?2 ? ?1 ? ? ?0 -0.37107841 ? ? ? ? 1

  12. #> 9 ? 3 ?1 ? ?1 ? ? ?0 -0.36795491 ? ? ? ? 1

  13. #> 10 ?2 ?3 ? ?1 ? ? ?0 -0.36732669 ? ? ? ? 1

  14. #> 11 ?3 ?2 ? ?1 ? ? ?0 -0.36379209 ? ? ? ? 1

  15. #> 12 ?3 ?3 ? ?1 ? ? ?0 -0.36058264 ? ? ? ? 1

  16. #> 13 ?0 ?3 ? ?1 ? ? ?0 -0.11875575 ? ? ? ? 1

  17. #> 14 ?0 ?2 ? ?1 ? ? ?0 ?0.02957266 ? ? ? ? 1

  18. #> 15 ?0 ?1 ? ?1 ? ? ?0 ?0.39326050 ? ? ? ? 1

  19. #> 16 ?0 ?0 ? ?1 ? ? ?0 ?1.17294875 ? ? ? ? 1

  20. #選最好的


  21. armaOrder

  22. #> AR MA

  23. #> ?1 ?0

在這種情況下,由于觀察次數(shù)T = 1000足夠大,因此階數(shù)被正確地檢測到。相反,如果嘗試使用T = 200,則檢測到的階數(shù)為p = 1,q = 3。

ARMA預測?

一旦估計了ARMA模型參數(shù)?i? ^ i和θ^j,就可以使用該模型預測未來的值。例如,根據(jù)過去的信息對xt的預測是

并且預測誤差將為xt-x ^ t = wt(假設參數(shù)已被估計),其方差為σ2。軟件包?rugarch?使對樣本外數(shù)據(jù)的預測變得簡單:

  1. # 估計模型(不包括樣本外)


  2. coef(arma_fit)

  3. #> ? ? ? ? ? mu ? ? ? ? ?ar1 ? ? ? ?sigma

  4. #> ?0.007212069 -0.898745183 ?0.200400119

  5. # 整個樣本外的預測對數(shù)收益

  6. forecast_log_returns <- xts(arma_fore@forecast$seriesFor[1, ], dates_out_of_sample)

  7. # 恢復對數(shù)價格

  8. prev_log_price <- head(tail(synth_log_prices, out_of_sample+1), out_of_sample)


  9. # 對數(shù)收益圖

  10. plot(cbind("fitted" ? = fitted(arma_fit),


  11. # 對數(shù)價格圖

  12. plot(cbind("forecast" = forecast_log_prices,


  13. ? ? main = "對數(shù)價格預測", legend.loc = "topleft")

多元VARMA模型

對數(shù)收益率xt上的VARMA(p,q)模型是

其中wt是具有零均值和協(xié)方差矩陣Σw的白噪聲序列。該模型的參數(shù)是矢量/矩陣系數(shù)?0,Φi,Θj和噪聲協(xié)方差矩陣Σw。

?

比較

讓我們首先加載S&P500:


  1. # 加載標普500數(shù)據(jù)


  2. head(SP500_index_prices)

  3. #> ? ? ? ? ? ? ?SP500

  4. #> 2012-01-03 1277.06

  5. #> 2012-01-04 1277.30

  6. #> 2012-01-05 1281.06

  7. #> 2012-01-06 1277.81

  8. #> 2012-01-09 1280.70

  9. #> 2012-01-10 1292.08

  10. # 準備訓練和測試數(shù)據(jù)


  11. logreturns_trn <- logreturns[1:T_trn]

  12. logreturns_tst <- logreturns[-c(1:T_trn)]

  13. # 繪圖

  14. { plot(logreturns,

  15. ?addEventLines(xts("訓練"

現(xiàn)在,我們使用訓練數(shù)據(jù)(即,對于t = 1,…,Ttrnt = 1,…,Ttrn)來擬合不同的模型(請注意,通過指示排除了樣本外數(shù)據(jù)?out.sample = T_tst)。特別是,我們將考慮iid模型,AR模型,ARMA模型以及一些ARCH和GARCH模型(稍后將對方差建模進行更詳細的研究)。


  1. # 擬合i.i.d.模型


  2. coef(iid_fit)

  3. #> ? ? ? ? ? mu ? ? ? ?sigma

  4. #> 0.0005712982 0.0073516993

  5. mean(logreturns_trn)

  6. #> [1] 0.0005681388

  7. sd(logreturns_trn)

  8. #> [1] 0.007360208

  9. # 擬合AR(1)模型


  10. coef(ar_fit)

  11. #> ? ? ? ? ? ?mu ? ? ? ? ? ar1 ? ? ? ? sigma

  12. #> ?0.0005678014 -0.0220185181 ?0.0073532716

  13. # 擬合ARMA(2,2)模型


  14. coef(arma_fit)

  15. #> ? ? ? ? ? ?mu ? ? ? ? ? ar1 ? ? ? ? ? ar2 ? ? ? ? ? ma1 ? ? ? ? ? ma2 ? ? ? ? sigma

  16. #> ?0.0007223304 ?0.0268612636 ?0.9095552008 -0.0832923604 -0.9328475211 ?0.0072573570

  17. # 擬合ARMA(1,1)+ ARCH(1)模型


  18. coef(arch_fit)

  19. #> ? ? ? ? ? ?mu ? ? ? ? ? ar1 ? ? ? ? ? ma1 ? ? ? ? omega ? ? ? ?alpha1

  20. #> ?6.321441e-04 ?8.720929e-02 -9.391019e-02 ?4.898885e-05 ?9.986975e-02

  21. #擬合ARMA(0,0)+ARCH(10)模型


  22. coef(long_arch_fit)

  23. #> ? ? ? ? ? mu ? ? ? ?omega ? ? ? alpha1 ? ? ? alpha2 ? ? ? alpha3 ? ? ? alpha4 ? ? ? alpha5

  24. #> 7.490786e-04 2.452099e-05 6.888561e-02 7.207551e-02 1.419938e-01 1.909541e-02 3.082806e-02

  25. #> ? ? ? alpha6 ? ? ? alpha7 ? ? ? alpha8 ? ? ? alpha9 ? ? ?alpha10

  26. #> 4.026539e-02 3.050040e-07 9.260183e-02 1.150128e-01 1.068426e-06

  27. # 擬合ARMA(1,1)+GARCH(1,1)模型


  28. coef(garch_fit)

  29. #> ? ? ? ? ? ?mu ? ? ? ? ? ar1 ? ? ? ? ? ma1 ? ? ? ? omega ? ? ? ?alpha1 ? ? ? ? beta1

  30. #> ?6.660346e-04 ?9.664597e-01 -1.000000e+00 ?7.066506e-06 ?1.257786e-01 ?7.470725e-01

我們使用不同的模型來預測對數(shù)收益率:

  1. # 準備預測樣本外周期的對數(shù)收益


  2. # i.i.d.模型預測

  3. forecast(iid_fit, n.ahead = 1, n.roll = T_tst - 1)

  4. ? ? ? ? ? ? ? ? ? ? ? ? ?dates_out_of_sample)

  5. # AR(1)模型進行預測

  6. forecast(ar_fit, n.ahead = 1, n.roll = T_tst - 1)

  7. ? ? ? ? ? ? ? ? ? ? ? ? dates_out_of_sample)

  8. # ARMA(2,2)模型進行預測

  9. forecast(arma_fit, n.ahead = 1, n.roll = T_tst - 1)

  10. ? ? ? ? ? ? ? ? ? ? ? ? ? dates_out_of_sample)

  11. # 使用ARMA(1,1)+ ARCH(1)模型進行預測

  12. forecast(arch_fit, n.ahead = 1, n.roll = T_tst - 1)

  13. ? ? ? ? ? ? ? ? ? ? ? ? ? dates_out_of_sample)

  14. # ARMA(0,0)+ARCH(10)模型預測

  15. forecast(long_arch_fit, n.ahead = 1, n.roll = T_tst - 1)

  16. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?dates_out_of_sample)

  17. # ARMA(1,1)+GARCH(1,1)模型預測

  18. forecast(garch_fit, n.ahead = 1, n.roll = T_tst - 1)

  19. ? ? ? ? ? ? ? ? ? ? ? ? ? ?dates_out_of_sample)

我們可以計算不同模型的預測誤差(樣本內(nèi)和樣本外):


  1. print(error_var)

  2. #> ? ? ? ? ? ? ? ? ? ? ? ? ? in-sample out-of-sample

  3. #> iid ? ? ? ? ? ? ? ? ? ?5.417266e-05 ?8.975710e-05

  4. #> AR(1) ? ? ? ? ? ? ? ? ?5.414645e-05 ?9.006139e-05

  5. #> ARMA(2,2) ? ? ? ? ? ? ?5.265204e-05 ?1.353213e-04

  6. #> ARMA(1,1) + ARCH(1) ? ?5.415836e-05 ?8.983266e-05

  7. #> ARCH(10) ? ? ? ? ? ? ? 5.417266e-05 ?8.975710e-05

  8. #> ARMA(1,1) + GARCH(1,1) 5.339071e-05 ?9.244012e-05

我們可以觀察到,隨著模型復雜度的增加,樣本內(nèi)誤差趨于變?。ㄓ捎跀M合數(shù)據(jù)的自由度更高),盡管差異可以忽略不計。重要的實際上是樣本外誤差:我們可以看到,增加模型復雜度可能會得出較差的結果。就預測收益的誤差而言,似乎最簡單的iid模型已經(jīng)足夠了。

最后,讓我們展示一些樣本外誤差的圖表:


  1. plot(error,

  2. ? ? main = "不同模型收益預測的樣本外誤差",

請注意,由于我們沒有重新擬合模型,因此隨著時間的發(fā)展,誤差越大(對于ARCH建模尤其明顯)。

滾動窗口比較

讓我們首先通過一個簡單的示例比較靜態(tài)預測與滾動預測的概念:

  1. #ARMA(2,2)模型

  2. spec <- spec(mean.model = list(armaOrder = c(2,2), include.mean = TRUE))

  3. # 靜態(tài)擬合和預測

  4. ar_static_fit <- fit(spec = spec, data = logreturns, out.sample = T_tst)


  5. #滾動擬合和預測

  6. modelroll <- aroll(spec = spec, data = logreturns, n.ahead = 1,


  7. # 預測圖

  8. plot(cbind("static forecast" ?= ar_static_fore_logreturns,

  9. ? ? main = "使用ARMA(2,2)模型進行預測", legend.loc = "topleft")

  10. # 預測誤差圖


  11. plot(error_logreturns, col = c("black", "red"), lwd = 2,

  12. ? ? main = "ARMA(2,2)模型的預測誤差", legend.loc = "topleft")

我們可以清楚地觀察到滾動窗口過程對時間序列的影響。

現(xiàn)在,我們可以在滾動窗口的基礎上重做所有模型的所有預測:

  1. # 基于i.i.d.模型的滾動預測

  2. roll(iid_spec, data = logreturns, n.ahead = 1, forecast.length = T_t

  3. # AR(1)模型的滾動預測

  4. roll(ar_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst,

  5. # ARMA(2,2)模型的滾動預測

  6. roll(arma_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst,

  7. # ARMA(1,1)+ ARCH(1)模型的滾動預測

  8. roll(arch_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst,

  9. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? refit.every = 50, refit.win

  10. # ARMA(0,0)+ ARCH(10)模型的滾動預測

  11. roll(long_arch_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst,

  12. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?refit.every = 50,

  13. # ARMA(1,1)+ GARCH(1,1)模型的滾動預測

  14. roll(garch_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst,

  15. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?refit.every = 50, refit.window

讓我們看看滾動基準情況下的預測誤差:


  1. print(rolling_error_var)

  2. #> ? ? ? ? ? ? ? ? ? ? ? ? ? in-sample out-of-sample

  3. #> iid ? ? ? ? ? ? ? ? ? ?5.417266e-05 ?8.974166e-05

  4. #> AR(1) ? ? ? ? ? ? ? ? ?5.414645e-05 ?9.038057e-05

  5. #> ARMA(2,2) ? ? ? ? ? ? ?5.265204e-05 ?8.924223e-05

  6. #> ARMA(1,1) + ARCH(1) ? ?5.415836e-05 ?8.991902e-05

  7. #> ARCH(10) ? ? ? ? ? ? ? 5.417266e-05 ?8.976736e-05

  8. #> ARMA(1,1) + GARCH(1,1) 5.339071e-05 ?8.895682e-05

和一些圖表:


  1. plot(error_logreturns,

  2. ? ? main = "不同模型的滾動預測誤差", legend.loc = "topleft"

我們看到,現(xiàn)在所有模型都擬合了時間序列。此外,我們在模型之間沒有發(fā)現(xiàn)任何顯著差異。

我們最終可以比較靜態(tài)誤差和滾動誤差:

  1. barplot(rbind(error_var[, "out-of-sample"], rolling_error_var[, "out-of-sample"])

  2. ? ? ? ?col = c("darkblue", "darkgoldenrod"),

  3. ? ? ? ?legend = c("靜態(tài)預測", "滾動預測"),


我們可以看到,滾動預測在某些情況下是必須的。因此,實際上,我們需要定期進行滾動預測改進。

方差模型

ARCH和GARCH模型

對數(shù)收益率殘差wt的ARCH(m)模型為

其中zt是具有零均值和恒定方差的白噪聲序列,而條件方差σ2t建模為

其中,m為模型階數(shù),ω> 0,αi≥0為參數(shù)。

GARCH(m,s)模型使用σ2t上的遞歸項擴展了ARCH模型:

其中參數(shù)ω> 0,αi≥0,βj≥0需要滿足∑mi =1αi+ ∑sj = 1βj≤1的穩(wěn)定性。

rugarch生成數(shù)據(jù)?

首先,我們需要定義模型:

  1. # 指定具有給定系數(shù)和參數(shù)的GARCH模型

  2. #>

  3. #> *---------------------------------*

  4. #> * ? ? ? GARCH Model Spec ? ? ? ? ?*

  5. #> *---------------------------------*

  6. #>

  7. #> Conditional Variance Dynamics ? ?

  8. #> ------------------------------------

  9. #> GARCH Model ? ? ?: sGARCH(1,1)

  10. #> Variance Targeting ? : FALSE

  11. #>

  12. #> Conditional Mean Dynamics

  13. #> ------------------------------------

  14. #> Mean Model ? ? ? : ARFIMA(1,0,0)

  15. #> Include Mean ? ? : TRUE

  16. #> GARCH-in-Mean ? ? ? ?: FALSE

  17. #>

  18. #> Conditional Distribution

  19. #> ------------------------------------

  20. #> Distribution : ?norm

  21. #> Includes Skew ? ?: ?FALSE

  22. #> Includes Shape ? : ?FALSE

  23. #> Includes Lambda ?: ?FALSE

  24. #> ? ? ? ? ? Level Fixed Include Estimate LB UB

  25. #> mu ? ? ? ?0.005 ? ? 1 ? ? ? 1 ? ? ? ?0 NA NA

  26. #> ar1 ? ? ?-0.900 ? ? 1 ? ? ? 1 ? ? ? ?0 NA NA

  27. #> ma ? ? ? ?0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  28. #> arfima ? ?0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  29. #> archm ? ? 0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  30. #> mxreg ? ? 0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  31. #> omega ? ? 0.001 ? ? 1 ? ? ? 1 ? ? ? ?0 NA NA

  32. #> alpha1 ? ?0.300 ? ? 1 ? ? ? 1 ? ? ? ?0 NA NA

  33. #> beta1 ? ? 0.650 ? ? 1 ? ? ? 1 ? ? ? ?0 NA NA

  34. #> gamma ? ? 0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  35. #> eta1 ? ? ?0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  36. #> eta2 ? ? ?0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  37. #> delta ? ? 0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  38. #> lambda ? ?0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  39. #> vxreg ? ? 0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  40. #> skew ? ? ?0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  41. #> shape ? ? 0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  42. #> ghlambda ?0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  43. #> xi ? ? ? ?0.000 ? ? 0 ? ? ? 0 ? ? ? ?0 NA NA

  44. #> $mu

  45. #> [1] 0.005

  46. #>

  47. #> $ar1

  48. #> [1] -0.9

  49. #>

  50. #> $omega

  51. #> [1] 0.001

  52. #>

  53. #> $alpha1

  54. #> [1] 0.3

  55. #>

  56. #> $beta1

  57. #> [1] 0.65

  58. true_params

  59. #> ? ? mu ? ?ar1 ?omega alpha1 ?beta1

  60. #> ?0.005 -0.900 ?0.001 ?0.300 ?0.650

然后,我們可以生成收益率時間序列:

  1. # 模擬一條路徑


  2. hpath(garch_spec, n.sim = T)


  3. #> ?num [1:2000, 1] 0.167 -0.217

  4. # 繪圖對數(shù)收益


  5. { plot(synth_log_returns, main = "GARCH模型的對數(shù)收益", lwd = 1.5)

  6. ?lines(synth_volatility

GARCH

現(xiàn)在,我們可以估計參數(shù):

  1. # 指定一個GARCH模型

  2. ugarchspec(mean.model = list(armaOrder = c(1,0)

  3. # 估計模型


  4. coef(garch_fit)

  5. #> ? ? ? ? ? ?mu ? ? ? ? ? ar1 ? ? ? ? omega ? ? ? ?alpha1 ? ? ? ? beta1

  6. #> ?0.0036510100 -0.8902333595 ?0.0008811434 ?0.2810460728 ?0.6717486402


  7. #> ? ? mu ? ?ar1 ?omega alpha1 ?beta1

  8. #> ?0.005 -0.900 ?0.001 ?0.300 ?0.650

  9. # 系數(shù)誤差


  10. #> ? ? ? ? ? mu ? ? ? ? ?ar1 ? ? ? ?omega ? ? ? alpha1 ? ? ? ?beta1

  11. #> 0.0013489900 0.0097666405 0.0001188566 0.0189539272 0.0217486402

我們還可以研究樣本數(shù)量T對參數(shù)估計誤差的影響:

  1. # 循環(huán)


  2. for (T_ in T_sweep) {

  3. ?garch_fit

  4. ?error_coeffs_vs_T <- rbind(error_coeffs_vs_T, abs((coef(garch_fit) - true_params)/true_params))

  5. ?estim_coeffs_vs_T <- rbind(estim_coeffs_vs_T, coef(garch_fit))


  6. # 繪圖

  7. matplot(T_sweep, 100*error_coeffs_vs_T,

  8. ? ? ? ?main = "估計GARCH系數(shù)的相對誤差", xlab = "T", ylab = "誤差 (%)",


真實的ω幾乎為零,因此誤差非常不穩(wěn)定。至于其他系數(shù),就像在ARMA情況下一樣,μ的估計確實很差(相對誤差超過50%),而其他系數(shù)似乎在T = 800個樣本后得到了很好的估計。

GARCH結果比較?

作為健全性檢查,我們現(xiàn)在將比較兩個軟件包?fGarch?和?rugarch的結果


  1. # 指定具有特定參數(shù)值的ARMA(0,0)-GARCH(1,1)作為數(shù)據(jù)生成過程

  2. garch_spec

  3. #生成長度為1000的數(shù)據(jù)


  4. path(garch_fixed_spec, n.sim = 1000)@path$

  5. # 使用“ rugarch”包指定和擬合模型


  6. rugarch_fit <- ugarchfit(spec = garch_spec, data = x)

  7. # 使用包“ fGarch”擬合模型

  8. garchFit(formula = ~ garch(1, 1), data = x, trace = FALSE)

  9. # 比較模型系數(shù)

  10. #> ? ? ? ? mu ? ? ?omega ? ? alpha1 ? ? ?beta1

  11. #> 0.09749904 0.01395109 0.13510445 0.73938595

  12. #> ? ? ? ? mu ? ? ?omega ? ? alpha1 ? ? ?beta1

  13. #> 0.09750394 0.01392648 0.13527024 0.73971658

  14. # 比較擬合的標準偏差

  15. print(head(fGarch_fi

  16. #> [1] 0.3513549 0.3254788 0.3037747 0.2869034 0.2735266 0.2708994

  17. print(head(rugar

  18. #> [1] 0.3538569 0.3275037 0.3053974 0.2881853 0.2745264 0.2716555

確實,這兩個軟件包給出了相同的結果。

使用rugarch包進行GARCH預測?

一旦估計出GARCH模型的參數(shù),就可以使用該模型預測未來的值。例如,基于過去的信息對條件方差的單步預測為

給定ω^ /(1-∑mi =1α^ i-∑sj =1β^ j)。軟件包?rugarch?使對樣本外數(shù)據(jù)的預測變得簡單:

  1. # 估計模型,不包括樣本外



  2. garch_fit

  3. coef(garch_fit)

  4. #> ? ? ? ? ? ?mu ? ? ? ? ? ar1 ? ? ? ? omega ? ? ? ?alpha1 ? ? ? ? beta1

  5. #> ?0.0034964331 -0.8996287630 ?0.0006531088 ?0.3058756796 ?0.6815452241

  6. # 預測整個樣本的對數(shù)收益


  7. garch_fore@forecast$sigmaFor[1, ]

  8. # 對數(shù)收益圖

  9. plot(cbind("fitted" ? = fitted(garch_fit),

  10. ? ? main = "合成對數(shù)收益預測", legend.loc = "topleft")

  1. #波動率對數(shù)收益圖

  2. plot(cbind("fitted volatility" ? = sigma(garch_fit),

  3. ? ? main = "預測合成對數(shù)收益率的波動性", legend.loc = "topleft")

不同方法

讓我們首先加載S&P500:


  1. # 加載標準普爾500指數(shù)數(shù)據(jù)


  2. head(SP500_index_prices)

  3. #> ? ? ? ? ? ? ?SP500

  4. #> 2008-01-02 1447.16

  5. #> 2008-01-03 1447.16

  6. #> 2008-01-04 1411.63

  7. #> 2008-01-07 1416.18

  8. #> 2008-01-08 1390.19

  9. #> 2008-01-09 1409.13

  10. # 準備訓練和測試數(shù)據(jù)


  11. x_trn <- x[1:T_trn]

  12. x_tst <- x[-c(1:T_trn)]

  13. # 繪圖

  14. { plot(x, main = "收益"

  15. ?addEventLines(xts("訓練", in

常數(shù)

讓我們從常數(shù)開始:

  1. plot(cbind(sqrt(var_constant), x_trn)

  2. ? ? main = "常數(shù)")

移動平均值

現(xiàn)在,讓我們使用平方收益的移動平均值:


  1. plot(cbind(sqrt(var_t), x_trn),

  2. ? ? main = "基于簡單滾動平方均值的包絡線(時間段=20)



EWMA

指數(shù)加權移動平均線(EWMA):

請注意,這也可以建模為ETS(A,N,N)狀態(tài)空間模型:


  1. plot(cbind(std_t, x_trn),

  2. ? ? main = "基于平方EWMA的包絡")


乘法ETS

我們還可以嘗試ETS模型的不同變體。例如,具有狀態(tài)空間模型的乘性噪聲版本ETS(M,N,N):


  1. plot(cbind(std_t, x_trn), col = c("red", "black")

  2. ? ? main = "基于平方的ETS(M,N,N)的包絡"


ARCH

現(xiàn)在,我們可以使用更復雜的ARCH建模:


  1. plot(cbind(std_t, x_trn), col = c("red", "black")

  2. ? ? main = "基于ARCH(5)的包絡")


GARCH

我們可以將模型提升到GARCH:


  1. plot(cbind(std_t, x_trn), col = c("red", "black")

  2. ? ? main = "基于GARCH(1,1)的包絡")


SV隨機波動率

最后,我們可以使用隨機波動率建模:

或者,等效地,


  1. plot(cbind(std_t, x_trn), col = c("red", "black"),

  2. ? ? main = "基于隨機波動率的包絡分析")


比較

現(xiàn)在,我們可以比較每種方法在樣本外期間的方差估計中的誤差:


  1. #> ? ? ? ? ? MA ? ? ? ? EWMA ? ETS(M,N,N) ? ? ?ARCH(5) ? GARCH(1,1) ? ? ? ? ? SV

  2. #> 2.204965e-05 7.226188e-06 3.284057e-06 7.879039e-05 6.496545e-06 6.705059e-06

  3. barplot(error_all, main = "樣本外方差估計中的誤差"

滾動窗口比較

六種方法的滾動窗口比較:MA,EWMA,ETS(MNN),ARCH(5),GARCH(1,1)和SV。

  1. ?

  2. #滾動窗口

  3. lookback <- 200

  4. len_tst <- 40

  5. for (i in seq(lookback, T-len_tst, by = len_tst)) {


  6. ?# MA

  7. ?var_t <- roll_meanr(x_trn^2, n = 20, fill = NA)

  8. ?var_fore <- var(x_trn/sqrt(var_t), na.rm = TRUE) * tail(var_t, 1)

  9. ?error_ma <- c(error_ma, abs(var_fore - var_tst))

  10. ?

  11. ?# EWMA


  12. ?error_ewma <- c(error_ewma, abs(var_fore - var_tst))

  13. ?

  14. ?# ETS(M,N,N)


  15. ?error_ets_mnn <- c(error_ets_mnn, abs(var_fore - var_tst))

  16. ?

  17. ?# ARCH


  18. ?error_arch <- c(error_arch, abs(var_fore - var_tst))

  19. ?

  20. ?# GARCH


  21. ?error_garch <- c(error_garch, abs(var_fore - var_tst))

  22. ?

  23. ?# SV


  24. ?error_sv <- c(error_sv, abs(var_fore - var_tst))

  25. }


  26. barplot(error_all, main = "方差估計誤差",

多元GARCH模型

出于說明目的,我們將僅考慮恒定條件相關(CCC)和動態(tài)條件相關(DCC)模型,因為它們是最受歡迎的模型。對數(shù)收益率殘差wt建模為

其中zt是具有零均值和恒定協(xié)方差矩陣II的iid白噪聲序列。條件協(xié)方差矩陣Σt建模為

其中Dt = Diag(σ1,t,...,σN,t)是標準化噪聲向量C,協(xié)方差矩陣ηt=C-1wt(即,它包含等于1的對角線元素)。

基本上,使用此模型,對角矩陣Dt包含一組單變量GARCH模型,然后矩陣C包含序列之間的一些相關性。該模型的主要缺點是矩陣C是恒定的。為了克服這個問題,DCC被提議為

其中Ct包含等于1的對角元素。要強制等于1的對角元素,Engle將其建模為

Qt具有任意對角線元素并遵循模型

我們將生成數(shù)據(jù),估計參數(shù)和預測。

從加載多元ETF數(shù)據(jù)開始:

  • SPDR S&P 500 ETF

  • 20年以上國債ETF

  • IEF:7-10年期國債ETF


  1. # 下載數(shù)據(jù)

  2. prices <- xts()


  3. head(prices)

  4. #> ? ? ? ? ? ? ? ? SPY ? ? ?TLT ? ? ?IEF

  5. #> 2013-01-02 127.8779 99.85183 93.65224

  6. #> 2013-01-03 127.5890 98.49886 93.17085

  7. #> 2013-01-04 128.1493 98.88306 93.21463

  8. #> 2013-01-07 127.7991 98.92480 93.26714

  9. #> 2013-01-08 127.4314 99.57622 93.49468

  10. #> 2013-01-09 127.7553 99.48438 93.54719

  11. # 繪制三個對數(shù)價格序列

  12. plot(log(prices)

  13. ? ? main = "三個ETF的對數(shù)價格", legend.loc = "topleft")

首先,我們定義模型:


  1. # 指定i.i.d.單變量時間序列模型

  2. ugarch_spec

  3. # 指定DCC模型

  4. spec( multispec(replicate(spec, n = 3))

  5. ? ?

接下來,我們擬合模型:

  1. # 估計模型


  2. #>

  3. #> *---------------------------------*

  4. #> * ? ? ? ? ?DCC GARCH Fit ? ? ? ? ?*

  5. #> *---------------------------------*

  6. #>

  7. #> Distribution ? ? ? ? : ?mvnorm

  8. #> Model ? ? ? ? ? ? ? ?: ?DCC(1,1)

  9. #> No. Parameters ? ? ? : ?44

  10. #> [VAR GARCH DCC UncQ] : [30+9+2+3]

  11. #> No. Series ? ? ? ? ? : ?3

  12. #> No. Obs. ? ? ? ? ? ? : ?1007

  13. #> Log-Likelihood ? ? ? : ?12198.4

  14. #> Av.Log-Likelihood ? ?: ?12.11

  15. #>

  16. #> Optimal Parameters

  17. #> -----------------------------------

  18. #> ? ? ? ? ? ? ? Estimate ?Std. Error ? t value Pr(>|t|)

  19. #> [SPY].omega ? 0.000004 ? ?0.000000 ?11.71585 0.000000

  20. #> [SPY].alpha1 ?0.050124 ? ?0.005307 ? 9.44472 0.000000

  21. #> [SPY].beta1 ? 0.870051 ? ?0.011160 ?77.96041 0.000000

  22. #> [TLT].omega ? 0.000001 ? ?0.000001 ? 0.93156 0.351563

  23. #> [TLT].alpha1 ?0.019716 ? ?0.010126 ? 1.94707 0.051527

  24. #> [TLT].beta1 ? 0.963760 ? ?0.006434 149.79210 0.000000

  25. #> [IEF].omega ? 0.000000 ? ?0.000001 ? 0.46913 0.638979

  26. #> [IEF].alpha1 ?0.031741 ? ?0.023152 ? 1.37097 0.170385

  27. #> [IEF].beta1 ? 0.937777 ? ?0.016498 ?56.84336 0.000000

  28. #> [Joint]dcca1 ?0.033573 ? ?0.014918 ? 2.25044 0.024421

  29. #> [Joint]dccb1 ?0.859787 ? ?0.079589 ?10.80278 0.000000

  30. #>

  31. #> Information Criteria

  32. #> ---------------------

  33. #> ? ? ? ? ? ? ? ? ? ?

  34. #> Akaike ? ? ? -24.140

  35. #> Bayes ? ? ? ?-23.925

  36. #> Shibata ? ? ?-24.143

  37. #> Hannan-Quinn -24.058

  38. #>

  39. #>

  40. #> Elapsed time : 0.8804049

我們可以繪制時變相關性:

  1. # 提取時變協(xié)方差和相關矩陣

  2. dim(dcc_cor)

  3. #> [1] ? ?3 ? ?3 1007

  4. #繪圖


  5. plot(corr_t

  6. ? ? main = "時變相關", legend.loc = "left")

我們看到兩個收益ETF之間的相關性非常高且相當穩(wěn)定。與SPY的相關性較小,在小于0的區(qū)間波動。

?

最受歡迎的見解

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

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

3.波動率的實現(xiàn):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股票指數(shù)進行ARIMA + GARCH交易策略


R語言用多元ARMA,GARCH ,EWMA, ETS,隨機波動率SV模型對金融時間序列數(shù)據(jù)建模的評論 (共 條)

分享到微博請遵守國家法律
松溪县| 寿宁县| 朝阳县| 济南市| 濉溪县| 黄骅市| 延津县| 塘沽区| 开封市| 天祝| 高青县| 喜德县| 车险| 克东县| 宿州市| 德州市| 灵川县| 贵州省| 班玛县| 陇西县| 龙胜| 启东市| 上栗县| 河南省| 崇州市| 理塘县| 洪江市| 邵阳县| 上蔡县| 桐城市| 鄂托克旗| 大洼县| 扶风县| 泉州市| 石林| 武清区| 宁波市| 潞城市| 若羌县| 大方县| 宾阳县|