时间序列第二次作业
一.数据介绍
本次数据与第一次作业数据相同,所以时间序列的水平信息的提取在本次作
业中不再进行分析,而是提取 arima 模型拟合后的残差,对其建立 garch 模型,
对这部分进行分析。
二.代码及备注
#设置工作目录#
setwd("E:/Rstuff")
library(zoo) #加载 zoo 包#
library(forecast) #加载 forecast 包#
#加载 tseries 包#
library(tseries)
library(mclust)
#加载 mclust 包#
#加载 lmtest 包#
library(lmtest)
library(FinTS)
#加载 FinTS 包#
work=read.table(file="work.txt",header=T,sep=" ") #读入数据#
work=ts(work,frequency=12,start=c(1985,1)) #将读入数据生成为时间序列#
plot(work) #绘制时间序列图#
acf(work)
pacf(work) #绘制时间序列偏自相关图#
work1=diff(work,lag=12) #对原始序列进行 12 步差分#
plot(work1) #绘制差分后序列的时序图#
Box.test(work1) #检验差分后的时间序列是否为平稳序列#
acf(work1,36)
pacf(work1,36) #绘制差分后的时间序列偏自相关图#
fit=arima(work,order=c(1,1,1),seasonal=list(order=c(0,1,1), period =12),
include.mean=T,method="CSS",transform.pars=T) #建立模型#
for(i in 1:6){
print(Box.test(fit$residual,type="Ljung-Box",lag=i))
#绘制差分后的时间序列自相关图#
#绘制时间序列自相关图#
}
#对残差序列进行延迟 1-6 阶白噪声检验#
#检验是否存在异方差#
RE=fit$residuals #提取残差#
plot(RE) #绘残差图#
for(i in 1:6)print(ArchTest(RE,lag=i))
dwtest(RE~1)
P=NULL
Q=NULL
AIC=NULL
for(p in 0:2){
#定义空变量用于存储 p 值#
#定义空变量用于存储 q 值#
#定义空变量用于存储 aic 值#
#检验是否存在短期自相关#
for(q in 1:2){
fit=garch(RE,order=c(p,q));
aic=AIC(fit);
P=c(P,p);
Q=c(Q,q);
for(p in 1:2){
fit=garch(RE,order=c(p,0));
aic=AIC(fit);
P=c(P,p);
Q=c(Q,0);
AIC=c(AIC,aic);
}
}
AIC=c(AIC,aic);
}
#显示 aic 最小的行#
#显示全部 p,q,aic#
#将最小 aic 的 p 值提取#
#将最小 aic 的 q 值提取#
L=cbind(P,Q,AIC)
ORDER=order(AIC)
k=ORDER[1]
L[k,]
L
p=L[k,1]
q=L[k,2]
fit.garch=garch(RE,order=c(p,q))
fit.pred<-predict(fit.garch)
plot(fit.pred)
plot(RE)
#绘制残差预测值各点的置信区间上限#
lines(fit.pred[,1],col=2)
#绘制残差预测值各点的置信区间下限#
lines(fit.pred[,2],col=2)
abline(h=1.96*sd(RE),col=4) #绘制 RE 序列均值 95%置信区间上限#
abline(h=-1.96*sd(RE),col=4) #绘制 RE 序列均值 95%置信区间下限#
#绘制残差拟合期预测图#
#绘制原始序列残差图#
#建立 aic 最小模型#
#对拟合期进行预测#
三.分析过程
本次数据与第一次作业数据相同,所以时间序列的水平信息在本次作业中不
再进行分析,而是提取其残差,对其建立 garch 模型。
for(i in 1:6){
print(Box.test(fit$residual,type="Ljung-Box",lag=i))
}
对残差序列进行延迟 1-6 阶白噪声检验
分析:p 值均很大,拒绝原假设,即认为残差序列为白噪声序列。
RE=fit$residuals
提取残差
plot(RE)
绘残差图
0
2
0
1
0
0
1
-
E
R
1986
1988
1990
1992
1994
1996
Time
分析:残差图显示为平稳序列,但波动很大,此序列可能有异方差。
for(i in 1:6)print(ArchTest(RE,lag=i))
检验是否存在异方差
分析:p 值均比较小,前五个都小于 0.05,第六个稍比 0.05 大,所以在 95%
的置信水平下,拒绝原假设,即认为残差序列存在异方差。
dwtest(RE~1)
用 D-W 检验检验是否存在短期自相关
分析:p 值较大,大于 0.05,所以在所以在 95%的置信水平下,拒绝原假设,
即认为不存在自相关。
P=NULL
定义空变量用于存储 p 值
Q=NULL
定义空变量用于存储 q 值
AIC=NULL
定义空变量用于存储 aic 值
for(p in 0:2){
for(q in 1:2){
fit=garch(RE,order=c(p,q));
aic=AIC(fit);
P=c(P,p);
Q=c(Q,q);
AIC=c(AIC,aic);
}
}
for(p in 1:2){
fit=garch(RE,order=c(p,0));
aic=AIC(fit);
P=c(P,p);
Q=c(Q,0);
AIC=c(AIC,aic);
}
利用循环建立参数分别为(0,1)、(0,2)、(1,0)、(1,1)、(1,2)、(2,0)、(2,1)、(2,2)的
garch 模型
L=cbind(P,Q,AIC)
将所有的 p,q,aic 一一对应合成数据框
ORDER=order(AIC)
将 AIC 中的数由小到大输出所在位置赋给 ORDER
k=ORDER[1]
最小 aic 所在位置赋给 k
L[k,]
显示 aic 最小的行
分析:输出结果显示 aic 最小对应的参数为(p,q)=(0,2)。
L
显示全部 p,q,aic
分析:从结果可以看出参数为(p,q)=(0,2)是的 aic 确实最小。
p=L[k,1]
将最小 aic 的 p 值提取
q=L[k,2]
将最小 aic 的 q 值提取
fit.garch=garch(RE,order=c(p,q))
建立使得 aic 最小的模型
fit.garch
输出模型
对拟合期进行预测
plot(fit.pred)
绘制拟合期预测图
fit.pred
1
s
e
i
r
e
S
2
s
e
i
r
e
S
0
1
9
8
7
6
6
-
7
-
8
-
9
-
0
1
-
1986
1988
1990
1992
1994
1996
Time
plot(RE)
绘制原始序列残差图
lines(fit.pred[,1],col=2)
绘制残差预测值各点的置信区间上限
lines(fit.pred[,2],col=2)
绘制残差预测值各点的置信区间下限
abline(h=1.96*sd(RE),col=4)
绘制残差预测均值 95%置信区间上限
abline(h=-1.96*sd(RE),col=4)
绘制残差预测均值 95%置信区间下限
0
2
0
1
0
0
1
-
E
R
1986
1988
1990
1992
1994
1996
Time
分析:从图中可以看出,拟合的效果并不好。这种情况可能是由于残差序列
向上幅度和向下幅度不同导致的,从残差图中可以看出 1987 年-1990 年向上振
幅明显大于向下振幅,而 1990 年-1993 年间向下振幅明显大于向上振幅,1996
年前后的向上振幅也明显大于向下的振幅,偏离均值幅度较大的地方都是原始序
列峰值处,说明 arima 模型对原始序列峰值处拟合的并不好,事实上 arima 模型
对原始序列峰值处拟合的确实不好。
我猜想可以拟合诸多效果不是太好的 arima 模型,使得残差呈现符合可以用
garch 拟合的序列,由于时间问题并没进行探索。也用 garch 衍生模型对残差序
列进行了拟合,但很多输出结果都看不懂。结果在下页。