1. 模型简介
普通的模型对于两个序列的波动分析一般是静态的,但是dcc-garch模型可以实现他们之间动态相关的波动分析,即序列间波动并非为一个常数,而是一个随着时间的变化而变化的系数。其主要用于研究市场间波动率的关系。2. DCC-GARCH模型代码及应用2.1,导入数据
首先是读取文件:我的文件是csv格式,内容是各行业指数的收益率
- dat1 = read.csv("stock.csv",header=T)
- head(dat1)
- # 除去日期列
- x = dat1[,2:length(dat1)]
- # 将变量命名
- name = c("能源","材料","工业","可选","消费","医药","金融","信息","电信","公用")
- colnames(x) = name
- head(x)
得到:
2.2,变量平稳性检验以下以ADF检验为例。
- library(tseries)
- Dickey_Fuller = 0 #(保存Dickey_Fuller的向量)
- ADF_p = 0 #(保存p值的向量)
- for( i in 1:length(x)){
- adf = adf.test(x[,i])
- Dickey_Fuller[i] = adf$statistic[1] #(提取Dickey_Fuller)
- ADF_p[i] = adf$p.value[1] #(提取p值)
- }
- adf_result = cbind(name,Dickey_Fuller,ADF_p)
- write.csv(adf_result,"adf.csv") # 结果储存
总体保存到csv的结果如下:
结果表明序列平稳。
2.3 ARCH效应检验
LM检验思路:循环得到每列的N(max_lag)阶LM检验值, 看是否拒绝原假设,均拒绝原假设则存在ARCH效应。
- library(FinTS)
- Lmtest = function(series,nm,max_lag){
- chi = 0
- lm_p = 0
- chi[1] = nm
- lm_p[1] = nm
- chi[2] = "chi"
- lm_p[2] = "p"
- for( lags in 1:max_lag){
- lm = ArchTest(x=series,lag=lags)
- chi[lags+2] = lm$statistic[1]
- lm_p[lags+2] = lm$p.value[1]
- }
- once_mat = rbind(chi,lm_p)
- }
- max_lag = 5
- lm_mat = matrix(nrow=(2*length(x)),ncol=(max_lag+2))
- for (j in 1:length(x)){
- start = 1+2*(j-1)
- end = 2*j
- lm_mat[start:end,] = Lmtest(x[,j],name[j],max_lag)
- }
- colnames(lm_mat) = append(c("变量","参数"),seq(from = 1, to = max_lag, by = 1))
- write.csv(lm_mat,"lm_mat.csv")
结果如下
结果表明存在ARCH效应
2.4 Box-Ljung检验 (选择合适的ARCH模型)
最终结果如下:
可见,ARCH(5)仍然不是最优模型,因此直接选择GARCH(1,1)
TIPS:经验表明,GARCH(1,1)适用于大多数金融序列。
2.5 建立DCC模型
思路:两两建立GARCH-DCC模型,均值方程设定为常数项形式,原因:股票随机游走假设方差方程为GARCH(1,1)
R代码设定思路
建立GARCH -DCC 需要分别设定3个方程,2个单序列GARCH方程和1个DCC联立方程2个单序列GARCH为spec1和spec2,DCC联立方程为mspec = multispec( c( spec1, spec2 ) ) 代码:
- dcc_once=function(xx){
- spec1 = ugarchspec(variance.model = list(model="sGARCH",garchOrder=c(1,1)),
- mean.model = list(armaOrder=c(0,0)))
- spec2 = ugarchspec(variance.model = list(model="sGARCH",garchOrder=c(1,1)),
- mean.model = list(armaOrder=c(0,0)))
- mspec = multispec( c( spec1, spec2 ) )
- spec = dccspec(mspec, VAR = FALSE, robust = FALSE,external.regressors = NULL,
- dccOrder = c(1,1), model = "DCC", distribution = "mvnorm")
- m1=dccfit(spec, xx, out.sample = 0, solver = "solnp", solver.control = list(),
- fit.control = list(eval.se = TRUE, stationarity = TRUE, scale = FALSE),
- cluster = NULL, fit = NULL, VAR.fit = NULL, realizedVol = NULL)
- show(m1)
- matcoef=m1@mfit$matcoef
- rho=m1@mfit$R
- n=length(rho)
- rho.t=0
- for(i in 1:n){
- r=rho[[i]]
- rho.t[i]=r[1,2]
- }
- return(rho.t)
- }
功能:需要传入一个T×2的时间序列,打印模型的参数,返回一个残差相关性序列
结果如下(一次为例)
Dcca1 和dccb1 显著,表明存在DCC效应。(行业联动性、时变相关性)
由于设定为默认形式,因此VAR参数是0。
随后还需要循环两两计算行业间联动性,并且需要绘制时变相关性
2.6 以其他股票和能源股票为例:
结果如下:
注:本程序将免费提供,关注:计量模型研究院