R语言DCC-GARCH模型

感谢nie chun xiao
首先简述一下对一个时间序列建立DCC-GARCH模型的步骤:
1.通常时间序列不平稳,且经常对时间序列取对数化。所以第一步先取对数化、差分(是为了解决序列不平稳的问题)。
2.adf单位根检验显示平稳后,建立ARMA模型,用来提取方差。
3.用LB检验残差项是否存在自相关性,防止对下一步残差平方的自相关检验产生影响。
4.当残差项不存在自相关性,进一步用LB检验残差项的平方是否存在自相关性。当检验p值很小拒绝原假设,表明存在自相关性,满足建立GARCH模型的前提条件。
5. 检验ARMA模型残差是否存在ARCH效应,若存在,可以建立GARCH模型
6. 对收益率序列拟合GARCH模型
7. 对收益率序列进行DCC-GARCH模型的拟合,选择0-4绘制相关图示。

本人的数据形式如下。从Excel中复制粘贴到了txt中。

R语言DCC-GARCH模型_第1张图片

导入数据,并绘制三个样本序列的价格序列图。

p=read.table('C:/Users/dqxq767/Documents/R/p.txt',sep = '\t',header = T)
time=as.Date(p$'date',"%Y/%m/%d")
p1=ts(p[,2:4])
install.packages('zoo')
library(zoo)
par(mfrow=c(1,1),oma=c(0.2,0.2,0.2,0.2)) 
plot(zoo(p1,time),xlab="time",ylab="价格美元", plot.type = "single",col=c("red","black","yellow","green"),lty=1:3,main="样本的价格序列");
par(mfrow=c(1,3),oma=c(0.2,0.2,0.2,0.2))  
plot(zoo(p1[,1],time),xlab="time",ylab="价格美元",main="比特币价格序列")
plot(zoo(xt[,2],time),xlab="time",ylab="价格美元",main="以太坊价格序列")
plot(zoo(xt[,3],time),xlab="time",ylab="价格美元",main="瑞波币价格序列")

计算相关系数矩阵

p1cor=cor(p1)             ##相关系数矩阵
p1cor

计算基本统计量最大值、最小值、中位数、偏度、峰度、极值

install.packages('DistributionUtils')
library(DistributionUtils)      #基本统计量计算
data_outline = function(x){
     
  m = mean(x)
  d=max(x)
  xd=min(x)
  me = median(x)
  s = sd(x)
  kur=kurtosis(x)
  ske=skewness(x)
  R = max(x)-min(x)
  data.frame( Mean=m,  Median=me, max=d,min=xd,std_dev=s,
             Skewness=ske, Kurtosis=kur, R=R)
}
for (i in  1:3){
     print(data_outline(p1[,i]))}

绘制价格序列分布直方图

par(mfrow=c(1,3))  
hist(p1[,1],main="比特币价格分布直方图",col="yellow",xlab="价格")
hist(p1[,2],main="以太坊价格分布直方图",col="yellow",xlab="价格")
hist(p1[,3],main="瑞波币价格分布直方图",col="yellow",xlab="价格")

通常对时间序列对数化、差分。后面将处理后的序列称之为“收益率序列”

p1ld=diff(log(p1))
par(mfrow=c(1,1))  
plot(zoo(p1ld,time), plot.type = "single",xlab="Time",ylab="value",col=c("red","black","yellow"),lty=1:3,main="样本的对数收益率线形图");
plot(zoo(p1ld[,1],time), plot.type = "single",xlab="Time",ylab="value",col=c("red"),main="比特币的对数收益率线形图");
plot(zoo(p1ld[,2],time), plot.type = "single",xlab="Time",ylab="value",col=c("black"),main="以太坊的对数收益率线形图");
plot(zoo(p1ld[,3],time), plot.type = "single",xlab="Time",ylab="value",col=c("yellow"),main="瑞波币的对数收益率线形图");

对收益率序列做频数分布直方图、正态QQ图,充实一下内容


par(mfrow=c(1,2))     #正态检验作图
hist(p1ld[,1],main="比特币对数差分收益率密度图",col="yellow",xlab="",ylim=c(0,10),probability=T)
lines(density(p1ld[,1]),lwd=2);
data_outline(p1ld[,1])   
qqnorm(p1ld[,1],);
qqline(p1ld[,1])       

hist(p1ld[,2],main="以太坊对数差分收益率密度图",col="yellow",xlab="",ylim=c(0,10),probability=T)
lines(density(p1ld[,2]),lwd=2);
data_outline(p1ld[,2])   
qqnorm(p1ld[,2],);
qqline(p1ld[,2])       

hist(p1ld[,3],main="瑞波币对数差分收益率密度图",col="yellow",xlab="",ylim=c(0,10),probability=T)
lines(density(p1ld[,3]),lwd=2);
data_outline(p1ld[,3])   
qqnorm(p1ld[,3],);
qqline(p1ld[,3]) 

对收益率序列进行shapiro正态检验,p值越小,越拒绝原假设,表明序列不服从正态分布。原假设H0:数据服从正态分布

for (i in  1:3)print(shapiro.test(p1ld[,i]))     

为了防止可能造成的后续ARIMA模型伪回归的问题,对收益率序列进行ADF单位根检验,原假设序列存在单位根,当p值越小越拒绝原假设,可以得出该序列平稳。若不平稳,需在进行差分处理。再不行,额,我也不知道了

install.packages('tseries')
library(tseries)
for (i in 1:3)print(adf.test(p1ld[,i],alt="stationary"))  

对前面d=1阶差分平稳后的收益率序列进行ARMA(p,q)模型的定阶。看偏自相关图pacf用来确定p(我总是会忘记acf和pacf到底对应的是谁,干脆就这样记忆,pacf有一个p,所以确定p),和自相关图acf用来确定q,几阶结尾,就确定为几阶。

install.packages('stats')
library(stats)
for (i in  1:3){
     
  par(mfrow=c(1,2))
  acf(p1ld[,i])
  pacf(p1ld[,i])
  }

其实看图不如直接调用forecast程序包中的auto.arima函数根据AIC准则自动拟合ARIMA模型来的直接。当然为了扩充内容还是可以的


install.packages('forecast')
library(forecast)
armamodel1=auto.arima(p1ld[,1],ic = 'aic')      
armamodel2=auto.arima(p1ld[,2],ic = 'aic')
armamodel2
armamodel3=auto.arima(p1ld[,3],ic = 'aic')
armamodel3

提取拟合ARIMA模型的残差项,对其进行LB检验来判断残差项是否独立不相关。原假设H0:独立不相关。p值越小越拒绝,当p值较大时,则认为序列不相关。
LB统计量表达式。
在这里插入图片描述
n为样本的数量,d是样本的自由度,k代表k阶滞后。

Box.test(residuals(armamodel1),lag=5 ,type = "Ljung-Box")        
Box.test(residuals(armamodel2),lag=5 , type = "Ljung-Box") 
Box.test(residuals(armamodel3), lag=5 ,type = "Ljung-Box") 

进一步用LB检验残差项的平方是否存在自相关性,检验p值很小拒绝原假设,表明存在自相关性,满足建立GARCH模型的前提条件。

Box.test(residuals(armamodel1)^2,lag=5)
Box.test(residuals(armamodel2)^2,lag=5)
Box.test(residuals(armamodel3)^2,lag=5)

收益率序列拟合后的ARMA模型残差会表现出异方差性。此时需要用ARCH检验来判断扰动项的条件方差对它前期方差依赖的程度,确保该序列可以建立GARCH 模型。

install.packages('MTS')
library(MTS)
archTest(residuals(armamodel1),lag=5)   
archTest(residuals(armamodel2),lag=5)
archTest(residuals(armamodel3),lag=5)

对收益率序列拟合GARCH模型,当检验结果显示均值不显著时,将‘include.mean = TRUE’改为“include.mean = FALSE”
在这里插入图片描述

install.packages('fGarch')
library(fGarch);  
gfit1=garchFit(~garch(1,1),data=p1ld[,1],include.mean = FALSE,trace = F,cond.dist = "norm")
gfit1
gfit2=garchFit(~garch(1,1),data=p1ld[,2],include.mean = FALSE,trace = F,cond.dist = "norm")
gfit2
gfit3=garchFit(~garch(1,1),data=p1ld[,3],include.mean = FALSE,trace = F,cond.dist = "norm")
gfit3

对收益率序列进行DCC-GARCH模型的拟合,选择0-4绘制相关图示。0表示退出,其中4是最重要的,是两者之间的动态相关系数时序图。本次数据有3个样本序列,两两组合,共3种
R语言DCC-GARCH模型_第2张图片

install.packages('rmgarch')
library(rmgarch)

meanSpec=list(armaOrder=c(0,0),include.mean=FALSE,archpow=1)
distSpec=c("mvnorm")
varSpec=list(model="sGARCH",garchOrder=c(1,1))
spec1=ugarchspec(mean.model=meanSpec,variance.model=varSpec)

mySpec=multispec(replicate(2,spec1))

mspec=dccspec(mySpec,VAR=F,robust = F,lag=1,lag.max=NULL,lag.criterion = c("AIC"),external.regressors = NULL,robust.control = list(gamma=0.25,delta=0.01,nc=10,ns=500),dccOrder = c(1,1),distribution = distSpec,start.pars = list(),fixed.pars = list())
##上述是方程参数估计准备过程
fdcc12=dccfit(data=p1ld[,c(1,2)],mspec,out.sample = 10,solver = "solnp",solver.control = list(),fit.control = list(eval.se=TRUE,stationary=TRUE,scale=FALSE),parallel=TRUE,parallel.control=list(pkg=c("multicore"),cores=2),fit=NULL,VAR.fit=NULL)
show(fdcc12)
plot(fdcc12)
fdcc13=dccfit(data=p1ld[,c(1,3)],mspec,out.sample = 10,solver = "solnp",solver.control = list(),fit.control = list(eval.se=TRUE,stationary=TRUE,scale=FALSE),parallel=TRUE,parallel.control=list(pkg=c("multicore"),cores=2),fit=NULL,VAR.fit=NULL)
show(fdcc13)
plot(fdcc13)
fdcc23=dccfit(data=p1ld[,c(2,3)],mspec,out.sample = 10,solver = "solnp",solver.control = list(),fit.control = list(eval.se=TRUE,stationary=TRUE,scale=FALSE),parallel=TRUE,parallel.control=list(pkg=c("multicore"),cores=2),fit=NULL,VAR.fit=NULL)
show(fdcc23)
plot(fdcc23)

你可能感兴趣的:(r语言)