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中。
导⼊数据,并绘制三个样本序列的价格序列图。
p=read.table('C:/Urs/dqxq767/Documents/',p ='\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="价格美元", pe ="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), pe ="single",xlab="Time",ylab="value",col=c("red","black","yellow"),lty=1:3,main="样本的对数收益率线形图");
plot(zoo(p1ld[,1],time), pe ="single",xlab="Time",ylab="value",col=c("red"),main="⽐特币的对数收益率线形图");
plot(zoo(p1ld[,2],time), pe ="single",xlab="Time",ylab="value",col=c("black"),main="以太坊的对数收益率线形图");
plot(zoo(p1ld[,3],time), pe ="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)st(p1ld[,i]))
为了防⽌可能造成的后续ARIMA模型伪回归的问题,对收益率序列进⾏ADF单位根检验,原假设序列存在单位根,当p值越⼩越拒绝原假设,可以得出该序列平稳。若不平稳,需在进⾏差分处理。再不⾏,额,我也不知道了
for(i in 1:3)st(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阶滞后。
进⼀步⽤LB检验残差项的平⽅是否存在⾃相关性,检验p值很⼩拒绝原假设,表明存在⾃相关性,满⾜建⽴GARCH模型的前提条件。
收益率序列拟合后的ARMA模型残差会表现出异⽅差性。此时需要⽤ARCH检验来判断扰动项的条件⽅差对它前期⽅差依赖的程度,确保该序列可以建⽴GARCH 模型。
install.packages('MTS')
library(MTS)
archTest(residuals(armamodel1),lag=5)
archTest(residuals(armamodel2),lag=5)
异地恋怎么维持感情
archTest(residuals(armamodel3),lag=5)
对收益率序列拟合GARCH模型,当检验结果显⽰均值不显著时,将‘an = TRUE’改为“an = FALSE”
gfit1=garchFit(~garch(1,1),data=p1ld[,1],an = FALSE,trace = F,cond.dist ="norm")
gfit1
gfit2=garchFit(~garch(1,1),data=p1ld[,2],an = FALSE,trace = F,cond.dist ="norm")
gfit2
gfit3=garchFit(~garch(1,1),data=p1ld[,3],an = FALSE,trace = F,cond.dist ="norm")
gfit3
对收益率序列进⾏DCC-GARCH模型的拟合,选择0-4绘制相关图⽰。0表⽰退出,其中4是最重要的,是两者之间的动态相关系数时序图。本次数据有3个样本序列,两两组合,共3种
install.packages('rmgarch')
library(rmgarch)
meanSpec=list(armaOrder=c(0,0),an=FALSE,archpow=1)
distSpec=c("mvnorm")
varSpec=list(model="sGARCH",garchOrder=c(1,1))
spec1=del=del=varSpec)
mySpec=multispec(replicate(2,spec1))
mspec=dccspec(mySpec,VAR=F,robust = F,lag=1,lag.max=iterion =c("AIC"),ssors =l =list(gamma=0.25,delt a=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",l =list(),l =list(eval.=TRUE,stationary=TRUE,scale=FALSE ),parallel=l=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",l =list(),l =list(eval.=TRUE,stationary=TRUE,scale=FALSE ),parallel=l=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",l =list(),l =list(eval.=TRUE,stationary=TRUE,scale=FALSE ),parallel=l=list(pkg=c("multicore"),cores=2),fit=NULL,VAR.fit=NULL)
show(fdcc23)
plot(fdcc23)