GARCH模型:
GARCH模型要求時間序列的殘差爲零均值、異方差的純隨機序列,但是有時不能充分提取序列的相關信息,即不是純隨機性序列;另外,原序列可能是非平穩序列。對於這種情況,需要將原始序列變爲平穩序列,對擬合自迴歸模型,即構造ARIMA模型,再考察殘差序列的方差齊性,如果是異方差殘差序列,最後構造GARCH模型,這便是ARIMA-GARCH模型。
時序圖:
樣本數據有明顯的趨勢特徵,對數據分別進行白噪聲檢驗和單位根平穩性(ADF)檢驗,樣本數據爲非平穩非白噪聲數據,需要對數據進行差分處理,消除數據的趨勢特徵,然後對樣本數據再作進一步分析。
差分後的時序圖:
從時序圖中可以看出差分後的樣本數據趨勢消除,且存在集羣效應和不可逆性。
ACF圖和PACF圖:
對樣本數據分別建立ARIMA(0,1,1)模型、ARIMA(1,1,1)模型和ARIMA(1,1,0)模型,從擬合後的AIC來看,ARIMA(1,1,0)模型對差分後的時間序列數據擬合較好。
對擬合後的殘差作白噪聲檢驗,殘差爲白噪聲,說明ARIMA(1,1,0)模型已充分提取了時間序列的水平信息。
平穩性檢驗:
爲避免出現僞迴歸的情況,對ARIMA(1,1,0)模型的殘差進行平穩性檢驗,殘差是平穩的。
正態性檢驗:
分佈直方圖:
殘差呈現尖峯後尾分佈且具有不對稱性,初步判斷殘差爲非正態分佈,但是這只是直觀上的判斷,需要進一步的檢驗。
對殘差分別進行Shapiro-Wilk檢驗、Anderson-Darling檢驗和Kolmogorov-Smirnov檢驗,可以判斷殘差不服從正態分佈。
ARCH效應檢驗:
分別進行Portmanteau Q檢驗和LM檢驗(拉格朗日乘子檢驗),LM檢驗和Q檢驗都顯示殘差序列方差非齊性,且殘差平方序列具有顯著的長期自相關關係。
構造GARCH(1,1)模型:
綜合水平模型和波動模型,完整的ARIMA-GARCH模型爲:
對模型的參數進行正態性檢驗,畫出QQ圖,殘差服從正態分佈。
模型預測:
根據ARIMA(1,1,0)模型對未來時間序列的預測:
根據GARCH(1,1)模型對時間序列的擬合,置信區間爲95%:
R語言代碼:
library(TSA)
library(tseries)
library(fUnitRoots)
library(locfit)
library(forecast)
library(nortest)
library(stats19)
library(FinTS)
library(zoo)
##讀取文件
Time<-read.table("E:/時間序列論文/外匯.csv",sep=",",header=T)
##時序圖
rate<-ts(Time$rate,start=c(2005,11),end=c(2019,11),frequency=12)
plot(rate)
##ADF檢驗
for(i in 1:3) print(adfTest(rate,lag=i,type="c"))
##白噪聲檢驗
for(i in 1:2) print(Box.test(rate,lag=6*i))
##差分
rate_diff<-diff(rate)
plot(rate_diff)
##ACF圖和PACF圖
acf(rate_diff)
pacf(rate_diff)
##ARIMA(0,1,1)
rate.fit1<-arima(rate,order=c(0,1,1))
rate.fit1
##ARIMA(1,1,1)
rate.fit2<-arima(rate,order=c(1,1,1))
rate.fit2
## ARIMA(1,1,0)
rate.fit3<-arima(rate,order=c(1,1,0))
rate.fit3
##白噪聲檢驗
for(i in 1:6) print(Box.test(rate.fit3$residual,type="Ljung-Box",lag=i))
##預測
rate.fore3<-forecast(rate,model=rate.fit3)
plot(rate.fore3)
##平穩性檢驗
for(i in 1:3) print(adfTest(rate.fit3$residual,lag=i,type="c"))
hist(rate.fit3$residual)
##正態性檢驗
shapiro.test(rate.fit3$residual)
ad.test(rate.fit3$residual)
ks.test(rate.fit3$residual,pnorm)
##ARCH效應檢驗
for(i in 1:6)print(Box.test(rate.fit3$residual^2,type="Ljung-Box",lag=i))
for(i in 1:5)print(ArchTest(rate.fit3$residual,lag=i))
##GARCH模型
rate.fit<-garch(rate.fit3$residual,order=c(1,1))
summary(rate.fit)
##置信區間
rate.pred<-predict(rate.fit)
plot(rate.pred)
##QQ圖
qqnorm(rate.fit$residual)
qqline(rate.fit$residual)