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)