R语言DCC-GARCH模型

R语言DCC-GARCH模型QXQ

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

在这里插入图片描述

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

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="瑞波币的对数收益率线形图"); 

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

 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]) norm(p1ld[,1],); line(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]) norm(p1ld[,2],); line(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]) norm(p1ld[,3],); line(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 
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) 
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 
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) 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229067.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午5:32
下一篇 2026年3月16日 下午5:33


相关推荐

  • 光合组织OpenClaw龙虾局杭州场火热 周国辉:驾驭并掌控Al,达到人机和谐共治

    光合组织OpenClaw龙虾局杭州场火热 周国辉:驾驭并掌控Al,达到人机和谐共治

    2026年3月14日
    3
  • 设置vim 永久显示行号

    设置vim 永久显示行号介绍了 ubuntu 环境下 vim 临时显示行号和永久显示行号的设置方法

    2026年3月20日
    3
  • 关联数据及其应用

    关联数据及其应用转载自:http://blog.sciencenet.cn/blog-357889-578799.html关联数据(LinkedData)是万维网的发明人——蒂姆•伯纳斯-李(TimBerners-Lee)——提出的一种万维网上发布数据的方式,可以看成语义Web的一种实现方式。它一般要求采用RDF数据模型,利用URI(统一资源标识符)命名数据实体,发布和部署实例数据和类数据

    2022年7月17日
    24
  • 【JVM】JVM内存结构之——G1收集器

    【JVM】JVM内存结构之——G1收集器目录 1 什么是 G12 G1 收集器发展历程 3 G1 收集器分区划分 3 1 为什么 G1 收集器需要设计巨型对象 3 2G1 收集器参数设置 3 3G1 收集器回收的细节 3 4G1 收集器 Rset 问题 记忆集 3 5G1 两种回收策略 4 G1 收集器优缺点 5 G1 收集器核心配置参数 1 什么是 G1G1 收集器 Garbage FirstGarbage 整堆收集 G1 收集器是一款在 server 端运行的垃圾收集器 专门针对于拥有多核处理器和大内存的机器 在 JDK7u4 版本发行时被正式

    2026年3月16日
    3
  • oracle:sql保留两位小数方法

    oracle:sql保留两位小数方法1 selectcast 1 0 10000asnumer 18 2 2 selectconver decimal 18 2 1 0 10000 3 ROUND count aa count t bb 4 100 解释 SELECTROUND column name decimals FROMtable na

    2026年3月18日
    2
  • OpenCV-Python实战(1)——OpenCV简介与图像处理基础

    OpenCV-Python实战(1)——OpenCV简介与图像处理基础OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时也提供了Python接口,实现了图像处理和计算机视觉方面的很多通用算法。在本文中,将介绍OpenCV库,包括它的主要模块和典型应用场景,同时使用OpenCV-Python实战讲解图像处理基础要点。

    2022年5月13日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号