多变量GARCH模型R代码实现

      大家好,我是带我去滑雪!

     多变量GARCH(Generalized Autoregressive Conditional Heteroskedasticity)模型是一种用于建模多个时间序列变量之间的条件异方差性(conditional heteroskedasticity)的统计模型。它在金融、经济学和其他领域中具有广泛的用途,并具有以下用途和优点:

    用途如下

  1. 风险度量: 多变量GARCH模型用于度量多个资产或变量之间的风险,有助于投资者和决策者了解不同资产之间的相关性和波动性。这对于风险管理和投资组合优化至关重要。

  2. 资产组合优化: 在资产配置和投资组合管理中,多变量GARCH模型有助于建立更准确的风险模型,以帮助投资者构建风险调整后的收益最大化的投资组合。

  3. 金融衍生品定价: 多变量GARCH模型用于衍生品定价和风险管理,例如期权、期货和其他金融衍生品的定价模型。

  4. 宏观经济研究: 在经济学中,多变量GARCH模型可用于分析多个宏观经济变量之间的条件异方差性,以深入了解宏观经济波动和政策决策。

  5. 时间序列分析: 多变量GARCH模型用于对多个时间序列数据进行建模,以分析它们之间的相互作用和动态关系。

    优点如下:

  1. 考虑了波动性的动态性: 多变量GARCH模型考虑了条件异方差性的动态性,即波动性会根据历史信息的变化而变化。这更贴近实际市场情况,尤其是金融市场中的波动性通常是时间变化的。

  2. 处理多个变量之间的相关性: 该模型允许分析多个相关变量的条件异方差性,因此可以揭示它们之间的相互作用和影响,这对于风险管理和资产组合管理至关重要。

  3. 有丰富的变种: 多变量GARCH模型有多种变种,如BEKK-GARCH、DCC-GARCH等,可根据不同问题的需求进行调整和扩展,以适应复杂的建模情境。

  4. 有效的风险管理工具: 通过测量不同资产或变量之间的风险和相关性,多变量GARCH模型为风险管理提供了有效的工具,使投资者能够更好地管理投资组合风险。

      下面开始多变量GARCH模型的R代码实战。

(1)数据准备

       数据使用Brent原油数据和Wti原油数据,研究二者之间的条件异方差性。

dat1.tmp <-read.csv("E:/brent.csv")
head(dat1.tmp)

输出结果:


dat2.tmp <- read.csv("E:/wti.csv")
head(dat2.tmp)

输出结果:

      Dates  Open  High   Low Last Change Settle Volume Open.Interest
1 1983/3/30 29.01 29.56 29.01   NA     NA  29.40    949           470
2 1983/3/31 29.40 29.60 29.25   NA     NA  29.29    521           523
3  1983/4/4 29.30 29.70 29.29   NA     NA  29.44    156           583
4  1983/4/5 29.50 29.80 29.50   NA     NA  29.71    175           623
5  1983/4/6 29.90 29.92 29.65   NA     NA  29.90    392           640
6  1983/4/7 29.90 30.20 29.86   NA     NA  30.17    817           795
dat1=xts::as.xts(dat1.tmp[,5], as.Date(dat1.tmp[,1]))#将Brent原油数据中的第五列Settle与第一列时间合并
dat2=xts::as.xts(dat2.tmp[,7], as.Date(dat2.tmp[,1]))#与上面同理
head(dat1); head(dat2) 

输出结果:

            [,1]
1990-08-17 27.12
1990-08-20 27.38
1990-08-21 27.63
1990-08-22 30.19
1990-08-23 30.85
1990-08-24 30.10
            [,1]
1983-03-30 29.40
1983-03-31 29.29
1983-04-04 29.44
1983-04-05 29.71
1983-04-06 29.90
1983-04-07 30.17
Y1x=diff(log(dat1))*100; Y2x=diff(log(dat2))*100 #计算报酬率
Data=na.omit(merge(Y1x,Y2x)) 
colnames(Data)=c("Brent","Wti") 
head(Data) 

输出结果:

                 Brent        Wti
1990-08-20   0.9541357 -0.2447982
1990-08-21   0.9089319 -0.5265942
1990-08-22   8.8608605  9.4317719
1990-08-23   2.1626007  2.2487092
1990-08-24  -2.4611579 -3.2466251
1990-08-28 -12.0610951  3.5411621

       可以绘制 Brent和Wti的时间序列图,如下:

多变量GARCH模型R代码实现_第1张图片

(2)估计基准DCC模型

library(rmgarch) 
meanSpec=list(armaOrder=c(1,0), include.mean=TRUE, archpow=2)
varSpec=list(model="eGARCH", garchOrder = c(2,1))
distSpec = c("mvt") 
spec = ugarchspec(mean.model=meanSpec, variance.model=varSpec)
mySpec0=multispec(list(spec, spec))
mySpec = dccspec(mySpec0, VAR = TRUE, robust = TRUE, lag.max =20, lag.criterion = "AIC", model="aDCC", distribution=distSpec)
fitDcc=dccfit(data=Data, mySpec, solver="solnp") 
show(fitDcc)  

输出结果:

*---------------------------------*
*          DCC GARCH Fit          *
*---------------------------------*

Distribution         :  mvt
Model                :  aDCC(1,1)
No. Parameters       :  99
[VAR GARCH DCC UncQ] : [82+12+4+1]
No. Series           :  2
No. Obs.             :  6176
Log-Likelihood       :  -26580.6
Av.Log-Likelihood    :  -4.3 

Optimal Parameters
-----------------------------------
                Estimate  Std. Error     t value Pr(>|t|)
[Brent].omega   0.014021    0.002192     6.39720 0.000000
[Brent].alpha1 -0.042463    0.029515    -1.43870 0.150235
[Brent].alpha2  0.034299    0.028255     1.21393 0.224775
[Brent].beta1   0.993653    0.000022 45405.17851 0.000000
[Brent].gamma1  0.145203    0.038973     3.72572 0.000195
[Brent].gamma2 -0.017929    0.037409    -0.47927 0.631746
[Wti].omega     5.035586    0.253793    19.84131 0.000000
[Wti].alpha1    0.627256    0.093282     6.72427 0.000000
[Wti].alpha2    0.242307    0.193114     1.25473 0.209576
[Wti].beta1     0.030845    0.034868     0.88462 0.376359
[Wti].gamma1    0.934502    0.134395     6.95337 0.000000
[Wti].gamma2    3.460364    0.222249    15.56975 0.000000
[Joint]dcca1    0.006693    0.003728     1.79531 0.072604
[Joint]dccb1    0.973724    0.009904    98.32013 0.000000
[Joint]dccg1    0.002541    0.003605     0.70495 0.480842
[Joint]mshape   4.000000    0.141729    28.22291 0.000000

Information Criteria
---------------------
                   
Akaike       8.6398
Bayes        8.7476
Shibata      8.6393
Hannan-Quinn 8.6772


Elapsed time : 1.39972 

(3)取出对象和绘图

GARCH=sigma(fitDcc)  
head(GARCH) 

输出结果:

              Brent         Wti
1990-08-20 2.221890    2.462386
1990-08-21 2.221890    2.462386
1990-08-22 2.165188    2.758191
1990-08-23 2.549332   45.850703
1990-08-24 2.616450 1370.848840
1990-08-28 2.742976    2.935267
dev.new(); plot(fitDcc,which=4) 
dev.new(); nisurface(fitDcc) 
COV=rcov(fitDcc) 
COV 
Rho=rcor(fitDcc)
Rho  
COV12=as.data.frame(Cov[1,2,])
head(COV12)
Rho12=as.data.frame(Rho[1,2,])
head(Rho12)
DCCtest(Data, garchOrder = c(1,1), n.lags = 1, solver = "solnp", solver.control = list(), cluster = NULL, Z = NULL)

输出结果:

多变量GARCH模型R代码实现_第2张图片

(4)设置条件多样化

        估计基准DCC模型中的代码使用了设定条件均一样的两笔数据。实际上 ,除了概率分布必须相同外,均值和方差的形式可以选择不一样的。

library(rmgarch) 
meanSpec1<-list(armaOrder=c(1,0), include.mean=TRUE, archpow=2)
varSpec1<-list(model="eGARCH", garchOrder = c(2,1))
meanSpec2<-list(armaOrder=c(1,1), include.mean=TRUE, archpow=2)
varSpec2<-list(model="sGARCH", garchOrder = c(1,2))
distSpec<-c("mvt") 
spec1<-ugarchspec(mean.model=meanSpec1, variance.model=varSpec1)
spec2<-ugarchspec(mean.model=meanSpec2, variance.model=varSpec2)
mySpec2<-multispec(list(spec1,spec2))
mySpecX<-dccspec(mySpec2, VAR = TRUE, robust = TRUE, lag.max =20 ,lag.criterion = "AIC", model="aDCC", distribution=distSpec)
fitDcc2<-dccfit(data=Data, mySpecX, solver="solnp") 
show(fitDcc2) 
slot(fitDcc2,"mfit")$matcoef 

需要数据集的家人们可以去百度网盘(永久有效)获取:

链接:https://pan.baidu.com/s/1E59qYZuGhwlrx6gn4JJZTg?pwd=2138
提取码:2138 


更多优质内容持续发布中,请移步主页查看。

   点赞+关注,下次不迷路!

你可能感兴趣的:(机器学习之python,1024程序员节,r语言,GARCH模型)