R语言实战 (9) | 时间序列分析 (5) -- ARCH 和 GARCH

论坛 期权论坛 期权     
期权匿名问答   2021-12-14 19:03   9500   0
本文首发于个人公众号 “DAMM”, 获取数据及代码、查看往期文章请移步。
本文通过案例介绍 ARCH 模型和 GARCH 模型的建模步骤。
ARCH 模型

简介

ARCH模型(自回归条件异方差模型)由 R. F. Engle 1982 年提出,是在计量经济学和金融问题的背景下创建的。其基本思想为:

  • 收益率的扰动序列 前后不相关,但是不独立。
  • 的不独立性可以由 作为 的滞后值的线性组合表示。
具体来说,对于 ARCH(m), 有


其中
此外, 需要满足条件使得 有限。
的分布常取为正态分布,标准化的t分布, 广义误差分布(Generalized Error Distribution), 有些情况下还取为有偏的分布。
模拟

使用 fGarch 包进行模拟。其中

  • garchSpec() 设定模型参数; omega 为上述模型中的 ;alpha 为向量,个数代表了 ARCH的阶数; beta 为 GARCH的参数
  • garchSim() 用于模拟,n代表模拟次数
    因此模拟的模型为
spec <- garchSpec(model = list(omega = 0.01, alpha = c(0.2), beta = 0))
sim <- garchSim(spec, n = 200)
sim %>%
  plot()

建模步骤


  • 定阶。根据 序列的 PACF 的截尾性确定 m。
  • 模型估计。模型的似然函数与假定 的分布有关,存在多种似然函数形式(如正态假设、t 分布假设、有偏 t 分布假设和广义误差分布假设)。
  • 模型验证。对标准化残差 进行系列验证。
  • 预测。
案例分析


  • 首先加载包和数据, 并对数据进行简单处理。
library(tidyverse)
library(fGarch)
library(fpp3)
library(lubridate)

intel_df <- read_table("ftsdata/m-intcsp7309.txt") %>%
  mutate(date = ymd(date)) %>%
  mutate(log_return = log(1 + intc),
         at = log_return - mean(log_return)) %>%
  mutate(num = row_number())
  
intel_ts <- intel_df %>%
  as_tsibble(index = num)


  • 查看残差平方的 ACF


  • 可以看到在滞后 12 以及前 3 阶滞后较突出。
intel_ts %>%
  ACF(at^2) %>%
  autoplot()



  • 查看残差平方的 PACF


  • 可以看到残差平方的 PACF 在滞后 12 处较高, 另外在滞后 1 到 3 较高。
  • 因此,可考虑建立 ARCH(3) 作为波动率方程。
intel_ts %>%
  PACF(at^2, lag_max = 36) %>%
  autoplot()



  • 构建 ARCH(3) 模型
    为收益率,构建如下模型



  • 从输出结果可以看到, 几乎为0,



  • 并且可以看到 不显著, 因此可以考虑 ARCH(1) 模型。
mod_arch3 <- garchFit(~ 1 + garch(3, 0), data = c(intel_ts$at), trace = FALSE)

mod_arch3 %>% summary()

#> Title:
#> GARCH Modelling

#>Call:
#> garchFit(formula = ~1 + garch(3, 0), data = c(intel_ts$at), trace = FALSE)

#>Mean and Variance Equation:
#> data ~ 1 + garch(3, 0)
#> <environment: 0x164bc9808>
#>  [data = c(intel_ts$at)]

#> Conditional Distribution:
#>  norm

#> Coefficient(s):
#>         mu        omega       alpha1       alpha2       alpha3  
#> -1.0790e-17   1.0455e-02   2.3174e-01   7.4890e-02   5.0929e-02  

#> Std. Errors:
#> based on Hessian

#> Error Analysis:
#>          Estimate  Std. Error  t value Pr(>|t|)   
#> mu     -1.079e-17   5.523e-03    0.000   1.0000   
#> omega   1.046e-02   1.243e-03    8.411   <2e-16 ***
#> alpha1  2.317e-01   1.124e-01    2.062   0.0392 *  
#> alpha2  7.489e-02   4.717e-02    1.588   0.1123   
#> alpha3  5.093e-02   4.481e-02    1.137   0.2557   
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

#> Log Likelihood:
#>  303.9098    normalized:  0.6844816

#> Description:
#>  Thu Nov 25 09:18:03 2021 by user:  


#> Standardised Residuals Tests:
#>                               Statistic p-Value     
#> Jarque-Bera Test   R    Chi^2  204.6315  0           
#> Shapiro-Wilk Test  R    W      0.9635663 4.840499e-09
#> Ljung-Box Test     R    Q(10)  9.286162  0.5051782   
#> Ljung-Box Test     R    Q(15)  19.3473   0.1984253   
#> Ljung-Box Test     R    Q(20)  20.45647  0.4297205   
#> Ljung-Box Test     R^2  Q(10)  7.242142  0.7024046   
#> Ljung-Box Test     R^2  Q(15)  27.20339  0.02712225  
#> Ljung-Box Test     R^2  Q(20)  27.97832  0.1099135   
#> LM Arch Test       R    TR^2   25.02139  0.01472184  

#> Information Criterion Statistics:
#>      AIC       BIC       SIC      HQIC
#> -1.346441 -1.300317 -1.346691 -1.328251

  • 构建 ARCH(1) 模型
    由于结果较长,这里不再呈现。


  • 构建出来的模型为 模型的 AIC 为 比 ARCH(3) 的 要大。
  • 此外 Ljung-Box 检验滞后 10 阶 的 p-value 为 0.277, 可认为为白噪声。滞后 10 阶的 的 p-value 为0.086
  • JB, SW 均拒绝原假设为正态分布
mod_arch1 <- garchFit(~ 1 + garch(1, 0), data = c(intel_ts$at), trace = FALSE)
mod_arch1 %>% summary()


  • 计算标准化残差


  • 序列图
sd_res <- residuals(mod_arch1, standardize = TRUE)

intel_ts_res2 <- intel_ts %>%
  bind_cols(
    mod_arch1_resi = sd_res
  )
  
intel_ts_res2 %>%
  autoplot(mod_arch1_resi) +
  labs(title = "标准化残差序列图")



  • ACF 图
    可以看到 的 ACF 除了在滞后 12 和 21 较为突出以外已经没有了低阶的波动率相关。
intel_ts_res2 %>%
  ACF(sd_res) %>% autoplot()
  
intel_ts_res2 %>%
  ACF(sd_res^2, lag_max = 36) %>%
  autoplot()





  • PACF 图
    可以看到仅在高阶的滞后11、滞后21还较高。 作为低阶模型, ARCH(1)作为波动率方程已经比较适合
intel_ts_res2 %>%
  PACF(sd_res^2, lag_max = 36) %>%
  autoplot()



  • 获取拟合的波动率
mod_arch1_vol <- volatility(mod_arch1)
mod_arch1_vol %>% head()

#> [1] 0.1306700 0.1051708 0.1455081 0.1099812 0.1132171 0.1299140


  • 预测
mod_arch1_pre <- predict(mod_arch1, n.head = 12)
mod_arch1_pre

#>  meanForecast meanError standardDeviation
#> 1  -1.078952e-17 0.1088896         0.1088896
#> 2  -1.078952e-17 0.1244838         0.1244838
#> 3  -1.078952e-17 0.1298450         0.1298450
#> 4  -1.078952e-17 0.1317974         0.1317974
#> 5  -1.078952e-17 0.1325215         0.1325215
#> 6  -1.078952e-17 0.1327918         0.1327918
#> 7  -1.078952e-17 0.1328929         0.1328929
#> 8  -1.078952e-17 0.1329308         0.1329308
#> 9  -1.078952e-17 0.1329450         0.1329450
#> 10 -1.078952e-17 0.1329503         0.1329503
GARCH 模型

简介

ARCH 模型用来描述波动率能得到很好的效果,但实际建模时可能需要较高的阶数,GARCH 将建模简化。
GARCH 模型由 Tim Bollerslev 1986 年提出。对于一个对数收益率序列 , 令


为其新息序列,如果 满足


则称 服从 GARCH(m,s) 模型。
其中,


最后一个条件用来保证满足模型的 无条件方差有限且不变, 而条件方差 可以随时间 而变。
案例分析

我们对上面的案例进行 GARCH 建模

  • 对标准化残差及其平方的白噪声检验结果都通过。
  • AIC 为-1.388 ARCH 模型更好
  • 条件分布的正态性检验不通过
  • 模型可以写为


mod_garch1 <- garchFit(~ 1 + garch(1, 1), data = intel_ts$at, trace = FALSE)

mod_garch1

#> Title:
#>  GARCH Modelling

#> Call:
#>  garchFit(formula = ~1 + garch(1, 1), data = intel_ts$at, trace = FALSE)

#> Mean and Variance Equation:
#>  data ~ 1 + garch(1, 1)
#> <environment: 0x162ef1368>
#>  [data = intel_ts$at]

#> Conditional Distribution:
#>  norm

#> Coefficient(s):
#>          mu        omega       alpha1        beta1  
#> -1.0790e-17   9.3121e-04   8.4836e-02   8.5326e-01  

#> Std. Errors:
#>  based on Hessian

#> Error Analysis:
#>          Estimate  Std. Error  t value Pr(>|t|)   
#> mu     -1.079e-17   5.421e-03    0.000  1.00000   
#> omega   9.312e-04   3.948e-04    2.359  0.01833 *  
#> alpha1  8.484e-02   2.618e-02    3.241  0.00119 **
#> beta1   8.533e-01   3.973e-02   21.477  < 2e-16 ***
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

#> Log Likelihood:
#>  312.1701    normalized:  0.7030857

#> Description:
#>  Thu Nov 25 10:04:52 2021 by user:  


#> Standardised Residuals Tests:
                                Statistic p-Value     
#>  Jarque-Bera Test   R    Chi^2  180.1466  0           
#>  Shapiro-Wilk Test  R    W      0.9705797 8.706573e-08
#>  Ljung-Box Test     R    Q(10)  8.087345  0.6203054   
#>  Ljung-Box Test     R    Q(15)  15.57436  0.4108897   
#>  Ljung-Box Test     R    Q(20)  16.48704  0.6859865   
#>  Ljung-Box Test     R^2  Q(10)  0.8364551 0.9999246   
#>  Ljung-Box Test     R^2  Q(15)  11.14164  0.7424905   
#>  Ljung-Box Test     R^2  Q(20)  12.37327  0.9026296   
#>  LM Arch Test       R    TR^2   10.37458  0.5831354   

#> Information Criterion Statistics:
#>      AIC       BIC       SIC      HQIC
#> -1.388153 -1.351254 -1.388314 -1.373602


  • 拟合的波动率图形为
mod_garch1_vol <- volatility(mod_garch1)
mod_garch1_vol %>%
  as_tibble() %>%
  mutate(num = row_number()) %>%
  as_tsibble(index = num) %>%
  autoplot()


小结

本文介绍了 ARCH 和 GARCH 模型运用。
我们下期见!
参考文献


  • Tsay, Ruey S. 2010. Analysis of Financial Time Series. 3rd Ed. John Wiley & Sons, Inc.
  • 金融时间序列分析
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:400157
帖子:80032
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP