當前位置:股票大全官網 - 股票投資 - 如何用R語言預測arma-garch

如何用R語言預測arma-garch

原文鏈接:/?p=20015?

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

平均值模型

本節討論條件均值模型。

Iid模型

讓我們從壹個簡單的iid模型開始。Iid模型假設對數收益率xt是壹個n維高斯時間序列:

均值和協方差矩陣的樣本估計量分別是樣本均值。

和樣本協方差矩陣。

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

讓我們生成合成iid數據,並估計均值和協方差矩陣:

#生成綜合收益數據X

現在,讓我們對不同數量的觀測值t再做壹次:

#首先生成所有數據x

Plot (t _ sweep,error _ sigma _ vs _ tmain =“sigma估算中的誤差”,ylab =“誤差”。

單變量ARMA模型

ARMA(p,q)模型對對數收益率xt為

其中wt是均值為零、方差為σ2的白噪聲序列。模型的參數是系數嗎?I、θi和噪聲方差σ2。

請註意,ARIMA(p,d,q)模型是具有d階時差的ARMA(p,q)模型。所以,如果我們用xt代替對數價格,那麽之前的對數收益模型其實就是ARIMA(p,1,Q)模型,因為壹旦對數價格不同,我們就會得到對數收益。

Rugarch生成數據?

我們將使用rugarch包?生成單變量ARMA數據,估計參數並進行預測。

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

#用給定的系數和參數指定AR(1)模型# >;# & gt*-* # & gt;* ?ARFIMA型號規格?* # & gt*-* # & gt;條件平均動力學# & gt-# >;刻薄的模特?:ARFIMA(1,0,0)# & gt;Include Mean : TRUE # ># & gt條件分布# & gt-# >;發行:?norm # & gt包括傾斜:?FALSE # & gt包括形狀?: ?FALSE # & gt包括Lambda?: ?FALSE # & gt?固定水平包括估計LB UB# >mu 0.01 1?10na NA # >;ar1?-0.90 1 ?10na NA # >;馬0.00 0?0 0 NA NA # >;阿爾菲馬0.00 0?0 0 NA NA # >;archm 0.00 0?0 0 NA NA # >;mxreg 0.00 0?0 0 NA NA # >;西格瑪0.20 1?10na NA # >;阿爾法0.00 0?0 0 NA NA # >;貝塔?0.00 0 ?0 0 NA NA # >;伽馬0.00 0?0 0 NA NA # >;eta1?0.00 0 ?0 0 NA NA # >;eta2?0.00 0 ?0 0 NA NA # >;delta 0.00 0?0 0 NA NA # >;λ0.00 0?0 0 NA NA # >;vxreg 0.00 0?0 0 NA NA # >;歪斜?0.00 0 ?0 0 NA NA # >;形狀0.00 0?0 0 NA NA # >;ghlambda?0.00 0 ?0 0 NA NA # >;xi 0.00 0?0 0 NA NAfixed.pars# >$ mu # & gt[1] 0.01# ># & gt$ ar 1 # >;[1] -0.9# ># & gt$ sigma # >;[1]0.2 true _ params # & gt;穆?ar1西格瑪# >?0.01 -0.90 ?0.20

然後,我們可以生成壹個時間序列:

#模擬壹條路徑apath(spec,n.sim = T)#) #將其轉換為xts並繪制Plot (synth _ log _ returns,main = " ARMA模型的對數收益率" Plot (synth _ log _ prices,main = " ARMA模型的對數價格")。

ARMA模型

現在,我們可以估計參數(我們已經知道):

#指定AR(1)模型ARIMASPEC(平均值。model = list (ARMA order = c (1,0),包含。mean = true)) #估算模型# >;?穆?ar1西格瑪# >?0.0083 ?-0.8887 ?0.1987 # >;穆?ar1西格瑪# >?0.01 -0.90 ?0.20

我們還可以研究樣本大小t對參數估計誤差的影響:

# loop for (T_ in T_sweep) {?estim _ coeffs _ vs _ T & lt- rbind(estim_coeffs_vs_T,coef(arma_fit))?error _ coeffs _ vs _ T & lt-rbind (error _ coeffs _ vs _ t,ABS(coef(ARMA _ fit)-true _ params)/true _ params)# Drawing mat plot(T _ sweep,estim _ coeffs _ vs _ t,main = "estimated ARMA coefficient ",xlab = "T ",ylab =

Matplot (t _ sweep,100 * error _ coeffs _ vs _ t,main = "估計ARMA系數的相對誤差",xlab = "T ",ylab = "誤差(%)",

首先,真μ幾乎為零,所以相對誤差可能會顯得不穩定。在T = 800個樣本之後,其他系數被很好地估計。

ARMA預測

為了進行健全性檢查,我們現在將比較兩個包。預測?然後呢。魯加奇的結果:

#指定AR(1)模型規格(平均值。model = list (ARMA order = c (1,0),包含。均值=真),固定。Pars = list (mu = 0.005,Ar1 =-0.9,sigma = 0.1)) #生成序列arfima(arma_fixed_spec,n . sim = 1000)@ path $ seriessim #指定並擬合模型spec (mean。模型=列表(armaorder = c (1,0),包含。mean = true)) #使用包“預測”來擬合模型# >;非零均值ARIMA(1,0,0 # >;# & gt系數:# & gt?ar1 mean# >?-0.8982 ?0.0036# >s.e?0.0139 ?0.0017 # >;# & gtsigma^2估計為0.01004:?對數似然=881.6# >AIC=-1757.2?AICc=-1757.17?BIC=-1742.47#比較模型系數# & gt?ar1截距σ# >-0.898181148 ?0.003574781 ?0.100222964 # >;?穆?ar1西格瑪# >?0.003605805 -0.898750138 ?0.100199956

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

ARMA模型選擇?

在之前的實驗中,我們假設已知ARMA模型的階數,即p = 1,q = 0。事實上,順序是未知的,因此必須嘗試不同的順序組合。階數越高,擬合越好,但這必然會導致過擬合。已經開發了許多方法來懲罰復雜度的增加以避免過擬合,例如AIC、BIC、SIC、HQIC等。

#嘗試不同的組合#查看排名# & gtAR MA平均ARFIMA BIC收斂# >1 ?1 ?0 1 ?0 -0.38249098 1# >2 ?1 ?1 1 ?0-0.378831571 # >;3 ?2 ?0 1 ?0 -0.37736340 1# >4 ?1 ?2 1 ?0 -0.37503980 1# >5 ?2 ?1 1 ?0-0.37459177 1 # >;6 ?3 ?0 1 ?0-0.37164609 1 # >;7 ?1 ?3 1 ?0-0.37143480 1 # >;8 ?2 ?2 1 ?0-0.37107841 1 # >;9 ?3 ?1 1 ?0 -0.36795491 1# >10 ?2 ?3 1 ?0 -0.36732669 1# >11 ?3 ?2 1 ?0 -0.36379209 1# >12 ?3 ?3 1 ?0 -0.36058264 1# >13 ?0 ?3 1 ?0-0.11875575 1 # >;14 ?0 ?2 1 ?0 ?0.02957261 # >15 ?0 ?1 1 ?0 ?0.39326050 1# >16 ?0 ?0 1 ?0 ?1.17294875 1#選擇最好的armaOrder # & gtAR MA # & gt?1 ?0

在這種情況下,由於觀測值T = 1000的數量足夠大,因此可以正確地檢測出階數。相反,如果妳嘗試使用T = 200,檢測到的順序是p = 1,q = 3。

ARMA預測?

壹旦估計出ARMA模型參數?我?I和θ j,模型可用於預測未來值。例如,基於過去信息的xt預測為

並且預測誤差會是x t-x t = wt(假設參數已經估計出來),它的方差是σ2。軟件包?魯加奇?使樣本外數據的預測變得簡單;

#估計模型(不包括樣本)coef(ARMA _ fit)# & gt;?穆?ar1西格瑪# >?0.007212069 -0.898745183 ?0.200400119#預測對數收益外全樣本Forecast _ log _ returns <-xts(ARMA _ Fore @ Forecast $ series for[1,],dates _ out _ of _ sample) #恢復對數價格Prev _ log _ price

多元VARMA模型

VARMA(p,q)模型對xt的對數收益率為

其中wt是均值為零的白噪聲序列,協方差矩陣σ w,這個模型的參數是向量/矩陣系數?0,φ i,θ j和噪聲協方差矩陣σ w。

比較

讓我們先裝載S & P500:

#加載標準普爾500數據頭(SP500指數價格)# & gt?SP500 # & gt;2012-01-03 1277.06 # >;2012-01-04 1277.30 # >;2012-01-05 1281.06 # >;2012-01-06 1277.81 # >;2012-01-09 1280.70 # >;2012-01-101292.08 #準備訓練和測試數據logreturns _ trn

現在,我們用訓練數據(即對於t = 1,…,Ttrnt = 1,…,Ttrn)來擬合不同的模型(請註意,樣本外數據被指示排除?out.sample = T_tst).特別的,我們會考慮iid模型,ar模型,ARMA模型以及壹些ARCH和GARCH模型(後面會更詳細的研究方差建模)。

#擬合內徑模型系數(iid _ fit)# & gt;?sigma # & gt0.0005712982 0.0073516993 mean(log returns _ trn)# & gt;[1]0.0005681388 SD(log returns _ trn)# & gt;[1]0.007360208 # Coef(AR _ FIT)擬合AR(1)模型# > mu?ar1西格瑪# >?0.0005678014 -0.0220185181 ?0.0073532716#擬合ARMA(2,2)模型系數(ARMA _ fit)# & gt;穆?ar1?ar2?ma1?ma2 sigma # >?0.0007223304 ?0.0268612636 ?0.9095552008 -0.0832923604 -0.9328475211 ?0.0072573570#擬合ARMA (1,1)+ARCH (1)模型COEF(ARCH _ FIT)# >;穆?ar1?ma 1ωα1 # >?6.321441e-04?8.720929 e-02-9.391019e-02?4.898885e-05?9.986975e-02#擬合ARMA(0,0)+ARCH(10)模型系數(long _ ARCH _ fit)# & gt;?mu歐米伽?alpha1?alpha2?alpha3?alpha4?alpha 5 # >;7.490786 e-04 2.452099 e-05 6.88561e-02 7.207551e-02 1.465438 e-09938 e-01.909541e-02 3.082806 e-02 # >?alpha6?alpha7?alpha8?alpha9?alpha 10 # >;4.026539 e-02 3.050040 e-07 9.260183 e-02 1.150128 e-01.1.068426 e-06 #擬合ARMA(。穆?ar1?ma 1ωα1β1 # >?6.660346e-04?9.664597 e-01-1.000000 e+00?7.066506e-06?1.257786e-01?7.470725e-01

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

#準備預測樣本外期間的對數收益# i.i.d模型預測預測(IID _ FIT,n.ahead = 1,n.roll = t _ TST-1)?Dates _ out _ of _ sample)# AR(1)要預測的模型(AR _ FIT,N. ahead = 1,N. Roll = t _ tst-1)Dates _ out _ of _ sample)# ARMA(2)2)按模型預測(ARMA _ fit,n. ahead = 1,n . Roll = t _ tst-1)?Dates_out_of_sample)#使用ARMA (1,1)+ARCH (1)模型進行預測forecast (arch _ fit,n. ahead = 1,n. Roll = t _ tst-65438。Dates _ out _ of _ sample) # ARMA (0,0)+ARCH (10)模型預測(long _ ARCH _ FIT,n.ahead = 1,n . roll = T _ tst-1)dates _ out _ of _ sample)# ARMA(1,1)+GARCH (1)模型預測(garch_fit,n.ahead

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

print(error _ var)# & gt;?樣本內樣本外# >iid 5.417266e-05?8.975710e-05# >AR(1)?5.414645e-05?9.006139e-05# >ARMA(2,2)?5.265204e-05?1.353213e-04 # >;ARMA(1,1)+ARCH(1)5.415836 e-05?8.983266e-05# >ARCH(10)?5.417266e-05?8.975710e-05# >ARMA(1,1) + GARCH(1,1) 5.339071e-05?9.244012e-05

我們可以觀察到,隨著模型復雜度的增加,樣本內誤差趨於減小(由於擬合數據的自由度更高),雖然差異可以忽略。重要的實際上是樣本外誤差:我們可以看到,增加模型的復雜性可能會導致糟糕的結果。就預測收益的誤差而言,似乎最簡單的iid模型就足夠了。

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

Plot(error,main = "不同模型的樣本外誤差",

請註意,由於我們沒有重新擬合模型,隨著時間的發展,誤差越大(尤其是對ARCH建模)。

滾動窗口比較

我們先通過壹個簡單的例子比較壹下靜態預測和滾動預測的概念:

#ARMA(2,2)模型規格

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

現在,我們可以基於滾動窗口重做所有模型的所有預測:

#滾動預測Roll (IID _ spec,data = logreturns,n. ahead = 1,預測。length = t _ t # ar (1)基於i.i.d模型滾動預測roll(ar_spec,data = logreturns,N. ahead = 1,Forecast。length = t _ tst,# ARMA (2,2)模型滾動預測roll (ARMA _ spec,data = log returns,n. ahead = 1,forecast。length = t _ tst,# ARMA (1,1)+ARCH (1)滾動預測Roll (ARCH _ SPEC,data = LOG RETURNS,N. ahead = 1,forecast。長度= T _ TST,?Roll (long _ arch _ spec,data = log returns,n. ahead = 1,forecast。length = t _ tst)refine . every的模型= 50,refine.win # ARMA (0,0)+arch (10),Refine。Every = 50,# ARMA (1,1)+GARCH (1,1)滾動預測滾動模型(GARCH _ SPEC,data = log returns,n.ahead = 1,forecast.length = T_tst,refit.every = 50,refit.window

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

print(rolling _ error _ var)# & gt;?樣本內樣本外# >iid 5.417266e-05?8.974166e-05# >AR(1)?5.414645e-05?9.038057e-05# >ARMA(2,2)?5.265204e-05?8.924223e-05# >ARMA(1,1)+ARCH(1)5.415836 e-05?8.991902e-05# >ARCH(10)?5.417266e-05?8.976736e-05# >ARMA(1,1) + GARCH(1,1) 5.339071e-05?8.895682e-05

和壹些圖表:

Plot(error_logreturns,main = "不同模型的滾動預測誤差",legend.loc = "topleft "。

我們可以看到現在所有的模型都符合時間序列。此外,我們沒有發現模型之間有任何顯著差異。

我們最後可以比較靜態誤差和滾動誤差:

Barplot (rbind (error _ var [,"樣本外"],rolling _ error _ var [,"樣本外"]) Col = c("深藍","暗金棒"),Legend = c("靜態預測","滾動"。

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

方差模型

ARCH和GARCH模型

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

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

其中m為模型階數,ω>;0,αi≥0為參數。

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

其中參數ω& gt;0,αi≥0,βj≥0需要滿足∑mi = 1αI+∑SJ = 1βJ≤1的穩定性。

Rugarch生成數據?

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

#用給定的系數和參數指定GARCH模型# >;# & gt*-* # & gt;* ?GARCH模型規格?* # & gt*-* # & gt;# & gt條件方差動力學# & gt-# >;GARCH模型?:sGARCH(1,1)# >差異目標?:FALSE # & gt# & gt條件平均動力學# & gt-# >;刻薄的模特?:ARFIMA(1,0,0)# & gt;Include Mean : TRUE # >GARCH-in-Mean:FALSE # & gt;# & gt條件分布# & gt-# >;發行:?norm # & gt包括傾斜:?FALSE # & gt包括形狀?: ?FALSE # & gt包括Lambda?: ?FALSE # & gt?固定水平包括估計LB UB# >mu 0.005 1?10na NA # >;ar1?-0.900 1 ?10na NA # >;馬0.000?0 0 NA NA # >;阿爾菲馬0.000 0?0 0 NA NA # >;archm 0.000 0?0 0 NA NA # >;mxreg 0.000 0?0 0 NA NA # >;歐米茄0.001 1?10na NA # >;alpha1 0.300 1?10na NA # >;beta1 0.650 1?10na NA # >;伽馬0.000 0?0 0 NA NA # >;eta1?0.000 0 ?0 0 NA NA # >;eta2?0.000 0 ?0 0 NA NA # >;delta 0.000 0?0 0 NA NA # >;λ0.000 0?0 0 NA NA # >;vxreg 0.000 0?0 0 NA NA # >;歪斜?0.000 0 ?0 0 NA NA # >;形狀0.000?0 0 NA NA # >;ghlambda?0.000 0 ?0 0 NA NA # >;xi 0.000?0 0 NA NA # >;$ mu # & gt[1] 0.005# ># & gt$ ar 1 # >;[1] -0.9# ># & gt$ omega # >;[1] 0.001# ># & gt$ alpha 1 # >;[1] 0.3# ># & gt$ beta 1 # >;[1]0.65 true _ params # & gt;mu ar1?歐米茄alpha1?beta1 # >?0.005 -0.900 ?0.001 ?0.300 ?0.650

然後,我們可以生成產量時間序列:

# Simulate a path hpath(garch_spec,n . sim = T)# & gt;?Num [1: 2000,1]0.167-0.217 # Plot對數收益{plot (synthesis _ log _ returns,main =模型的對數收益",lwd = 1.5。線條(synth_volatility

廣義自回歸條件異方差(GeneralizedAutoregressiveConditionalHeteroskedasticity)

現在,我們可以估計參數:

#指定GARCH模型ugarspec(平均值。model = list (ARMA order = c (1,0) #估計模型系數(GARCH _ fit)# & gt;穆?ar 1ωα1β1 # >?0.0036510100 -0.8902333595 ?0.0008811434 ?0.2810460728 ?0.6717486402 # >;mu ar1?歐米茄alpha1?beta1 # >?0.005 -0.900 ?0.001 ?0.300 ?0.650#系數誤差# & gt?穆?ar 1ω?alpha1 beta1 # >0.0013489900 0.0097666405 0.0001188566 0.0189539272 0.0217486402

我們還可以研究樣本大小t對參數估計誤差的影響:

# loop for (T_ in T_sweep) {?garch_fit?error _ coeffs _ vs _ T & lt- rbind(error_coeffs_vs_T,ABS((coef(GARCH _ fit)-true _ params)/true _ params))?estim _ coeffs _ vs _ T & lt-rbind (estim _ coeffs _ vs _ t,coef(GARCH _ FIT))# Drawing mat plot(T _ sweep,100 * error _ coeffs _ vs _ t,main = "估計GARCH系數的相對誤差",xlab = "T ",ylab =

真ω幾乎為零,所以誤差很不穩定。至於其他系數,和ARMA的情況壹樣,μ的估計真的很差(相對誤差超過50%),而其他系數在T = 800個樣本後,估計似乎很好。

GARCH結果對比?

作為健全性檢查,我們現在將比較兩個軟件包?fGarch?然後呢。魯加奇的結果:

#指定帶有特定參數值的ARMA (0,0)-GARCH (1,1)作為數據生成過程garch_spec #生成長度為1000的數據路徑(GARCH _ fixed _ SPEC,n . SIM = 1000)@-ugar fit(SPEC = GARCH _ SPEC,data = x) #使用包“fGarch”擬合模型GARCH fit(formula = ~ GARCH(654333穆?歐米茄alpha1?beta1 # >0.09749904 0.01395109 0.13510445 0.73938595 # >;穆?歐米茄alpha1?beta1 # >0.09750394 0.01392648 0.13527024 0.7391658 #標準差打印(head(fgarch _ fi # >;[1]0.3513549 0.3254788 0.3037747 0.2869034 0.2735266 0.2708994 print(head(rugar # & gt;[1] 0.3538569 0.3275037 0.3053974 0.2881853 0.2745264 0.2716555

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

用rugarch包進行GARCH預測?

壹旦估計了GARCH模型的參數,就可以用該模型來預測未來值。例如,基於過去信息的條件方差的壹步預測為

給定ω/(1-∑Mi = 1αI-∑SJ = 1βJ)。軟件包?魯加奇?使樣本外數據的預測變得簡單;

#估計模型,排除樣本外GARCH _ fit coef(GARCH _ fit)# & gt;穆?ar 1ωα1β1 # >?0.0034964331 -0.8996287630 ?0.0006531088 ?0.3058756796 ?0.6815452241#預測整個樣本的對數收益GARCH _ Fore @ Forecast $ sigma for[1,] #對數收益圖plot(cbind("fitted "?= fitted(garch_fit),main = "合成對數收益預測",legend.loc = "topleft ")。

波動率對數收益圖的# plot(cbind("擬合波動率")?= sigma(garch_fit),main = "預測合成對數回報的波動性",legend.loc = "topleft ")。

不同的方法

讓我們先裝載S & P500:

#加載標準普爾500指數數據頭(SP500指數價格)# & gt?SP500 # & gt;2008-01-021447.16 # >2008-01-03 1447.16 # >2008-01-04 1411.63 # >;2008-01-07 1416.18 # >;2008-01-081390.19 # >;2008-01-09 1409 438+03 #準備訓練和測試數據x _ trn <-x[1:T _ trn]x _ tst & lt;-x[-c(1:T _ trn)]# Plot { Plot(x,main = "revenue "?AddEventLines(xts ("training ",在

常數

讓我們從常數開始:

Plot (cbind (sqrt (var _ constant),x _ trn) main = "constant ")

移動平均數

現在,讓我們使用收益率平方的移動平均值:

Plot (cbind (sqrt (var _ t),x _ trn),main = "基於簡單滾動均方的包絡(時間段=20)。

EWMA

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

註意,這也可以建模為ETS(A,n,n)狀態空間模型:

Plot(cbind(std_t,x_trn),main = "基於平方EWMA的包絡")

乘法ETS

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