精华内容
下载资源
问答
  • GARCH 模型

    2018-04-18 10:22:30
    实现GARCH模型的demo 实现GARCH模型的demo 实现GARCH模型的demo
  • 以中国石油(601857)股票2010年1月15日至2011年1月17日交易日收盘价格的实际数据为样本,建立了股票对数收益率波动率的GARCH模型,利用Eviews软件进行参数估计得到波动率的方程,并对波动率进行预测,从而得到基于GARCH...
  • GARCH模型对上证综合指数的检验,习鹏程,沈超,GARCH模型是近20年发展起来的时间序列模型,它反映了经济变量之间特殊的不确定形式:方差随时间变化而变化,所以其在金融市场的预测与�
  • 本文档介绍了如何对收益率进行时间序列分析,并用garch模型对波动率进行预测
  • 里面包含数据集,R语言代码,代码后面也写了注释,清晰易懂
  • 运用数据与第一次作业数据相同,所以时间序列的水平信息的提取在本次中不再进行分析,而是提取arima模型拟合后的残差,对其建立garch模型,对这部分进行分析。运用garch模型测度序列的波动性和进行分析的,含r语言...
  • R中GARCH模型

    2017-12-28 23:31:45
    在R中建立GARCH(1,1)模型的代码,帮助大家解决时间序列问题
  • 基于GARCH模型族上证指数收益率波动的实证分析,赵丹华,,本文基于GARCH模型族,对2005年5月9日-2010年6月30日的上证指数日收益率的波动情况进行了实证分析,结果显示:上证指数收益率具有“尖�
  • GARCH模型族在最优套期保值比率研究中的应用,黄银芳,吴晓,GARCH模型族已经成为金融风险管理中确定最优套期保值比率(OHR)的重要工具之一。本文评述在OHR研究中应用的一些典型的GARCH模型族子模型
  • R语言实现基于修正的ECM-DCC-GARCH模型的动态保值比计算
  • 论文研究-基于BEMD-Copula-GARCH模型的股票投资组合VaR风险度量研究.pdf, 鉴于股票波动具有显著的多尺度特征,本文引入二元经验模态分解(EMD)与二元Copula-GARCH算法...
  • 这项研究调查了11种竞争时间序列GARCH模型的拟合收益率数据的性能,并使用了1996年1月至2015年12月期间每月的市场指数收益序列观察。 从对数似然(Log L),Schwarzs Bayesian Criterion(SBC)和Akaike Information...
  • 利用R语言,根据GARCH模型进行波动率的预测。
  • 用于将通用 GARCH 模型(AR、MA、ARMA、GARCH)拟合和评估到加载数据的用户界面。 数据可以从, - 一个包含时间序列的 Excel 文件,日期在第一列,数据在第二列。 假定电子表格的第一行是列标题。 - MATLAB 工作区...
  • MATLAB源码集锦-多元GARCH模型预测的Matlab程序
  • GARCH模型

    万次阅读 多人点赞 2017-06-29 15:25:35
    GARCH模型的定义ARCH模型的实质是使用残差平方序列的q阶移动平移拟合当期异方差函数值,由于移动平均模型具有自相关系数q阶截尾性,所以ARCH模型实际上只适用于异方差函数短期自相关系数。 但是在实践中,有些残差...

    GARCH模型的定义

    ARCH模型的实质是使用残差平方序列的q阶移动平移拟合当期异方差函数值,由于移动平均模型具有自相关系数q阶截尾性,所以ARCH模型实际上只适用于异方差函数短期自相关系数。
    但是在实践中,有些残差序列的异方差函数是具有长期自关性,这时使用ARCH模型拟合异方差函数,将会产生很高的移动平均阶数,增加参数估计的难度并最终影响ARCH模型的拟合精度。
    为了修正个问题,提出了广义自回归条件异方差模型, 这个模型简记为GARCH(p,q).
    GARCH模型实际上就是在ARCH的基础上,增加考虑异方差函数的p阶自回归性而形成,它可以有效的拟合具有长期记忆性的异方差函数。ARCH模型是GARCH模型的一个特例,p=0的GARCH(p,q)模型。

    AR-GARCH模型

    对序列拟合GARCH模型有一个基本要求:零均值,纯随机,异方差序列。
    有时回归函数不能充分提取原序列中的相关信息,可能具有自相关性,而不是纯随机的,这时需要对序列拟合自回归模型,再考察自回归模型的方差奇性,如果异方差,对它拟合GARCH模型。这样构造的模型为AR(m)-GARCH(p,q).
    分析拟合1979年12月31日至1991年12月31日外币对美元日兑换率序列:

    w<-read.table("D:/R-TT/book4/4R/data/file23.csv",sep=",",header = T)
    x<-ts(w$exchange_rates,start=c(1979,12,31),frequency = 365)
    plot(x)

    外币对美元日兑换率序列时序图
    外币对美元日兑换率序列时序图
    对差分序列性质的考察

    plot(diff(x))

    这里写图片描述
    外币对美元日兑换率序列1阶差分时序图
    外币对美元日兑换率序列1阶差分自相关图

    acf(diff(x))

    外币对美元日兑换率序列1阶差分自相关图
    外币对美元日兑换率序列1阶差分自相关图

    pacf(diff(x))

    外币对美元日兑换率序列1阶差分偏自相关图
    外币对美元日兑换率序列1阶差分偏自相关图
    序列时序图显示序列非平稳,有明显的趋势特征,差分后序列时序图显示趋势消除,但是有明显的集群效应,所以分析该序列需要同时提取水平相关信息与波动相关信息。
    水平信息的提取是考察差分后的自相关性与偏相关性,拟合ARIMA(0,1,1)。

    • 水平相关信息提取
    #水平相关信息提取,拟合ARIMA(0,1,1)模型
    x.fit<-arima(x,order = c(0,1,1))
    x.fit
    
    
    
    Call:
    arima(x = x, order = c(0, 1, 1))
    
    Coefficients:
             ma1
          0.0357
    s.e.  0.0143
    
    sigma^2 estimated as 0.0002007:  log likelihood = 13545.61,  aic = -27087.22
    > #残差白噪声检验
    > for (i in 1:6) print(Box.test(x.fit$residual,type = "Ljung-Box",lag=i))
    
        Box-Ljung test
    
    data:  x.fit$residual
    X-squared = 0.0005354, df = 1, p-value = 0.9815
    
    
        Box-Ljung test
    
    data:  x.fit$residual
    X-squared = 0.55102, df = 2, p-value = 0.7592
    
    
        Box-Ljung test
    
    data:  x.fit$residual
    X-squared = 2.6528, df = 3, p-value = 0.4483
    
    
        Box-Ljung test
    
    data:  x.fit$residual
    X-squared = 3.3062, df = 4, p-value = 0.5079
    
    
        Box-Ljung test
    
    data:  x.fit$residual
    X-squared = 6.8276, df = 5, p-value = 0.2338
    
    
        Box-Ljung test
    
    data:  x.fit$residual
    X-squared = 6.8306, df = 6, p-value = 0.3368
    

    该拟合模型的残差白噪声检验显示该模型显著成立,利用该拟合模型可以预测列未来的水平。

    #水平预测,并绘制预测图
    library(forecast)
    x.fore<-forecast(x.fit,h=365)
    plot(x.fore)

    外币对美元日兑换率序列日预测图
    外币对美元日兑换率序列日预测图

    • 波动相关信息提取
      波动信息的提取首先是考察ARIMA(0,1,1)模型的残差平方序列的异方差特征。
    #条件异方差检验(Portmanteau Q检验)
    for (i in 1:6) print(Box.test(x.fit$residual^2,type = "Ljung-Box",lag=i))
    Box-Ljung test
    
    data:  x.fit$residual^2
    X-squared = 82.803, df = 1, p-value < 2.2e-16
    
    
        Box-Ljung test
    
    data:  x.fit$residual^2
    X-squared = 237.9, df = 2, p-value < 2.2e-16
    
    
        Box-Ljung test
    
    data:  x.fit$residual^2
    X-squared = 343.33, df = 3, p-value < 2.2e-16
    
    
        Box-Ljung test
    
    data:  x.fit$residual^2
    X-squared = 490.84, df = 4, p-value < 2.2e-16
    
    
        Box-Ljung test
    
    data:  x.fit$residual^2
    X-squared = 602.1, df = 5, p-value < 2.2e-16
    
    
        Box-Ljung test
    
    data:  x.fit$residual^2
    X-squared = 841.96, df = 6, p-value < 2.2e-16

    波动信息的提取首先是考察ARIMA(0,1,1)模型的残差平方序列的异方差特征,Portmanteau Q检验显示残差序列显著方差非齐性,且具有长期相关性,所以构造GARCH(1,1)模型,并根据该模型的拟合结果绘制波动的95%置信区间。

    #拟合GARCH(1,1)模型
    r.fit<-garch(x.fit$residual,order=c(1,1))
    summary(r.fit)
    Call:
    garch(x = x.fit$residual, order = c(1, 1))
    
    Model:
    GARCH(1,1)
    
    Residuals:
         Min       1Q   Median       3Q      Max 
    -4.83074 -0.58407  0.02616  0.58758  4.54060 
    
    Coefficient(s):
        Estimate  Std. Error  t value Pr(>|t|)    
    a0 2.133e-06   3.014e-07    7.077 1.48e-12 ***
    a1 7.623e-02   5.456e-03   13.972  < 2e-16 ***
    b1 9.144e-01   6.015e-03  152.009  < 2e-16 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Diagnostic Tests:
        Jarque Bera Test
    
    data:  Residuals
    X-squared = 319.23, df = 2, p-value < 2.2e-16
    
    
        Box-Ljung test
    
    data:  Squared.Residuals
    X-squared = 0.28019, df = 1, p-value = 0.5966`
    #绘制波动置信区间
    r.pred<-predict(r.fit)
    plot(r.pred)

    外币对美元日兑换率序列残差波动置信区间
    外币对美元日兑换率序列残差波动置信区间

    GARCH衍生模型

    GARCH模型给出了对波动性进行描述的方法,为大量的金融序列提供了有效的分析方法,它是迄今为至最常用的、最便捷的异方差序列拟合模型。但是,大量的使用经验表明,它也存在一些不足。
    一是它对参数的约束非常严格,无条件方差必须非负的要求,导致以参数非负的约束条件,同时有条件方差必须平稳的要求,要求参数有界。参数的约束条件一定程序上限制了GARCH模型的适用范围。
    二是它对正负扰动的反应是对称,扰动项是真实值与预测值之差。如果扰动项为正,说明真实值比预测值大,对于投资者而言就是获得超预期收益。如果扰动项为负,说明真实值比预测值小,对于投资者而言就是出现超预期亏损。
    为了拓展GARCH模型使用范围、提高GARCH模型的拟合精度,统计学家从不同的角度出发,构造了多个GARCH模型的衍生模型。
    1.指数GARCH模型(EGARCH)
    这里写图片描述
    2.方差无穷GARCH模型(IGARCH)
    这里写图片描述
    这里写图片描述
    3.依均值GARCH模型(GARCH-M)
    这里写图片描述

    展开全文
  • 波动率预测_GARCH模型与隐含波动率
  • 本文的目的是使用通用自回归条件异方差(GARCH)类型模型来估计肯尼亚股票市场(即内罗毕证券交易所(NSE))... 结果揭示的另一个事实是,非对称GARCH模型比对称模型更适合NSE。 这证明了NSE回报系列中存在杠杆效应。
  • 多元ARMA-GARCH模型的波动率估计
  • GARCH模型在我国商业银行利率风险研究中的应用,王永勤,,中国银行间同业拆借利率(CHIBOR)是我国货币市场上最早市场化的利率。选择七日拆借利率为研究对象对其进行建模,发现银行间同业拆借�
  • 股市风险一直是投资者关注的热点。... GARCH模型与极值理论的POT模型相结合以测量风险。 比较三个显着性水平0.05、0.025和0.01的失效率,失效率接近显着性水平,这表明GARCH-POT模型可以很好地衡量中国股市的风险。
  • arch与garch模型详细计算与推导,其中包含理论介绍,公式推导,统计检验与应用
  • 中、印、美股市信息溢出效应研究-基于三元非对称VAR-BEKK-GARCH模型,陈晓蒙,雷钦礼,运用三元非对称VAR-BEKK-GARCH模型检验中、印、美股市之间的信息溢出效应,结果表明:金融危机前,中美之间有明显的单向的波动...
  • mfGARCH-混频GARCH模型 用于估计GARCH-MIDAS(混合DAta采样)模型的R包(Engle,Ghysels和Sohn,2013年, )和相关的统计推断,随附论文“两个比一个更好:使用乘法的波动率预测组件GARCH模型”(康拉德和克莱恩...
  • GARCH模型是Bollerslev在1986年提出来的,全称为广义自回归条件异方差模型,Generalized Autoregressive Conditionally Heteroskedastic Models - GARCH(p,q),是ARCH模型的扩展。GARCH模型认为时间序列每个时间点...

    一、GARCH简介

    GARCH模型是Bollerslev在1986年提出来的,全称为广义自回归条件异方差模型,Generalized Autoregressive Conditionally Heteroskedastic Models - GARCH(p,q),是ARCH模型的扩展。GARCH模型认为时间序列每个时间点变量的波动率是最近p个时间点残差平方的线性组合,与最近q个时间点变量波动率的线性组合加起来得到。即GARCH模型的条件方差不仅是滞后残差平方的线性函数,还是滞后条件方差的线性函数,因而GARCH模型适合在计算量不大时,方便地描述高阶的ARCH过程,具有更大的适用性。模型的最终结果表示形式为:
    在这里插入图片描述

    其中ωt, 为白噪音,否则模型将是非平稳的。GARCH模型的估计与ARCH模型类似,具体推导过程参见计量经济学相关书籍。在实际应用中,GARCH(1,1)和GARCH(2,1)一般可以满足对自回归条件异方差的描述。下面使用Python对GARCH(1,1)模型进行模拟和估计。

    二、读取数据

    选取云南白药(000538)
    Date
    2020-06-22 -0.005435
    2020-06-23 0.022186
    2020-06-24 0.006308
    2020-06-29 0.002869
    2020-06-30 -0.006251
    Name: Close, dtype: float64

    三、绘制000538.SZ 收益率平方序列图

    在这里插入图片描述

    如图所示,大致可观察出收益率序列存在着很明显的波动聚集的现象。因此可初步判断出000538.SZ 收益率序列存在着 ARCH 效应。

    四、000538.SZ 序列自相关性

    LB检验输出结果:
    Out[10]: 1.4317159591174947e-136
    检验的p 值明显小于 0.05 ,拒绝000538.SZ收益率序列是白噪声,即无自相关的原假设,即原序列(000538.SZ收益率序列)存在ARCH 效应。
    五、000538.SZ 收益率 GARCH 模型构建
    接下来是以20181月1日-2020年6月30云南白药(000538)的收益率为研究对象,建立GARCH模型。模型构建步骤为:
    1、导入 arch 包中的 arch_model 模块,设定模型;
    2、arch_model!默认建立 GARCH(1,1) 模型;
    3、估计参数;
    4、update 盼 freq=O 表示不输出中间结果;
    5、只输出最终结果。
    结果输出为:
    Optimization terminated successfully. (Exit mode 0)
    Current function value: -1578.3210128752269
    Iterations: 10
    Function evaluations: 76
    Gradient evaluations: 6

    六、查看结果

    Constant Mean - GARCH Model Results
    Dep. Variable: Close R-squared: -0.001
    Mean Model: Constant Mean Adj. R-squared: -0.001
    Vol Model: GARCH Log-Likelihood: 1578.32
    Distribution: Standardized Student’s t AIC: -3146.64
    Method: Maximum Likelihood BIC: -3124.65
    No. Observations: 601
    Date: Mon, Dec 07 2020 Df Residuals: 596
    Time: 19:49:50 Df Model: 5
    Mean Model
    coef std err t P>|t| 95.0% Conf. Int.
    mu -4.9107e-04 8.928e-04 -0.550 0.582 [-2.241e-03,1.259e-03]

                               Volatility Model                              
    

    =============================================================================

                 coef    std err          t      P>|t|       95.0% Conf. Int.
    

    omega 1.7721e-04 8.150e-04 0.217 0.828 [-1.420e-03,1.775e-03]
    alpha[1] 0.0553 0.137 0.403 0.687 [ -0.213, 0.324]
    beta[1] 0.4475 2.259 0.198 0.843 [ -3.980, 4.875]

                              Distribution                              
    

    ========================================================================

                 coef    std err          t      P>|t|  95.0% Conf. Int.
    

    nu 5.3168 13.388 0.397 0.691 [-20.924, 31.557]

    ========================================================================

    Covariance estimator: robust
    根据函数的返回值,模型结果为:
    000538.SZRett=-0.00049107+εt
    其中:
    εt=σtut
    σt2=0.00017721+0.0553ε2t-1+0.4475σ2t-1

    七、运行代码

    #云南白药(000538)
    import time
    import datetime
    import pandas_datareader as web
    import pandas as pd
    stock=input("輸入股票代號=====> ")
    stockfile=stock+".SZ"
    #from pandas_datareader import data as web
    write=pd.ExcelWriter('D:/stock.xlsx')
    starttime=time.perf_counter()
    start = datetime.datetime(2018,1,1)
    end =datetime.datetime(2020,6,30)
    df=web.DataReader(stockfile,'yahoo',start,end)
    df.to_excel(write,'stock')
    write.save()
    SZ=pd.read_excel('D:/stock.xlsx')
    df=web.DataReader(stockfile,'yahoo',start,end)
    # ********************************************************************
    SZindex = df
    SZindex.index=pd. to_datetime(SZindex.index)
    Close = SZindex.Close
    SZiRet = (Close - Close.shift(1)) / Close.shift(1)
    SZiRet.tail()
    # ********************************************************************
    import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
    %matplotlib inline
    plt.rcParams['font.sans-serif'] = [u'SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    # ********************************************************************
    SQSZiRet = SZiRet**2
    ABSSZiRet = np.abs(SZiRet)
    fig = plt.figure(figsize=(24, 8))
    ax = fig.add_subplot(2, 1, 1)
    ax.plot(SQSZiRet, label='Squared Dai1y Return')
    plt.title(stockfile + ' Squared Dai1y Return ')
    ax.legend();
    ax2 = fig.add_subplot(2, 1, 2)
    ax2.set_xticks(range(0, len(Close.index), 22))
    ax2.set_xticklabels(Close.index[::22],rotation=60)
    plt.plot(ABSSZiRet,label = 'Abso1ute Dai1y Return ')
    plt.ylabel(' Percents(%) ')
    plt.title(stockfile + ' Abso1ute Dai1y Return ')
    plt.grid(True,axis = 'both')
    plt.legend()
    plt.show()
    # ********************************************************************
    from statsmodels.tsa import stattools
    from statsmodels.stats.diagnostic import acorr_ljungbox
    LjungBox = stattools.q_stat(stattools.acf \
                                (SQSZiRet[1:13]),len(SZiRet))
    LjungBox
    LjungBox[1][-1]
    # ********************************************************************
    #导入 arch 包中的 arch_model 模块
    from arch import arch_model
    #设定模型
    #arch_model!默认建立 GARCH(1,1) 模型
    am = arch_model(SZiRet) #估计参数
    #update 盼 freq=0 表示不输出中间结果, #只输出最终结果
    model = am.fit(update_freq = 0)
    # ********************************************************************
    #拟合399001.SZ数据
    SZiRet = SZiRet.sort_index()
    SZiRet =SZiRet.dropna()
    am = arch_model(SZiRet,p=1,o=0,q=1,dist='StudentsT')
    model = am.fit(update_freq=0)
    print(model.summary())
    # ********************************************************************
    
    展开全文
  • 【R语言】GARCH模型的应用

    千次阅读 2021-07-16 21:18:57
    (二)模型比较   从拟合的模型结果来看,非对称类型的指数GARCH模型在最大似然估计值达到最大,同时AIC和BIC都能达到最小,说明指数GARCH模型比较好。从拟合的模型残差分布来看,非正态分布的AIC和BIC都明显低于...

      本文是时间序列分析课程的作业,基于R、Rnw和Latex进行编写。
      GARCH代码实现主要参考自《经济与金融计量方法:原理、应用案例及R语言实现》和对应包的官方文档,代码进一步整合,但每次执行时可能需要较长的时间,建议执行完后将结果导出成excel。如果本文存在问题,随时欢迎交流~

    一、数据来源

      沪深300指数,是由沪深证券交易所于 2005 年 4 月 8 日联合发布的反映沪深 300 指数编制目标和运行状况的金融指标,并能够作为投资业绩的评价标准,为指数化投资和指数衍生产品创新提供基础条件。因此,本次数据来源于网易财经,研究的数据集对象是沪深 300 指数(股票代码为000300),此次分析选取了沪深 300 指数2000 年1月2019年12月的工作日收盘价格数据。

    二、数据分析

    (一)时序图

      为了分析数据的波动情况,对其进行对数化和差分得到对数收益率,下图为沪深 300 指数的收盘价时序图对数收益率时序图
    在这里插入图片描述
    在这里插入图片描述

    (二)平稳性检验

      Augmented Dickey-Fuller Test (ADF) 是 DF 检验的拓展形式,可以对存在高阶滞后的序列进行单位根检验,原假设存在单位根,即序列不平稳。本文使用adf.test()进行单位根检验,检验结果如下所示,p 值远小于 0.01 说明拒绝原假设,即序列是平稳的。
    在这里插入图片描述

    三、模型建立

    (一)均值模型

    1. 均值模型的识别

      序列平稳后,使用auto.arima()对序列自动识别均值模型。

    • 识别出来的模型为ARMA(4, 4)。经过模型识别后,对模型 A R M A ( 4 , 4 ) ARMA(4,4) ARMA(4,4)进行参数显著性检验。检验结果发现部分参数不显著,采用建立疏系数的均值模型,将不显著的参数强制为0。
      在这里插入图片描述
    • 采用疏系数的 A R M A ARMA ARMA模型后的参数显著性检验结果来看,非零参数结果都显著。(注:这一步存有疑问,后续依旧是采用 A R M A ( 4 , 4 ) ARMA(4,4) ARMA(4,4)的非疏系数模型进行拟合)
      在这里插入图片描述

    (二)方差模型建立

    1. ARCH效应检验

      上述建立模型后,对残差进行ARCH效应检验。Ljung-Box统计量 Q ( m ) Q(m) Q(m)对残差序列进行自相关检验。原假设是序列不存在自相关,在残差的平方序列中可以检验条件异方差。

    • 使用MTS包中的archTest()进行检验
      检验结果显示,滞后10阶和滞后20阶的残差序列存在自相关,因此拒绝原假设,残差序列存在ARCH效应
      ## [1] "m = 10"
      ## Q(m) of squared series(LM test):
      ## Test statistic: 1043.197 p-value: 0
      ## Rank-based Test:
      ## Test statistic: 849.5804 p-value: 0
      ## [2] "m = 20"
      ## Q(m) of squared series(LM test):
      ## Test statistic: 1705.592 p-value: 0
      ## Rank-based Test:
      ## Test statistic: 1565.588 p-value: 0
      

    2. 标准GARCH模型建立

      上述ARCH效应表明,条件方差是依赖于过去值。因此可以考虑GARCH模型对方差方程进行参数估计。

    • 使用tseries包中的garch()函数进行拟合标准GARCH模型。
      从结果上看,拟合出来的参数都显著,Box-Ljung test结果中的P值大于显著性,因此可以认为模型的残差无序列相关,说明该模型拟合效果较好。但实际上,其中Jarque Bera Test用于对回归残差的正态性进行检验,Shapiro - Wilk Normality Test也可以用于正态性检验,原假设都是是残差序列服从正态分布,检验结果表明,残差序列是不服从正态分布,因此可以对模型进行优化,考虑其他GARCH模型。
      ## Call:
      ## garch(x = r.data, order = c(1, 1))
      ##
      ## Model:
      ## GARCH(1,1)
      ##
      ## Residuals:
      ## Min 1Q Median 3Q Max
      ## -4.91948 -0.53035 0.04107 0.57992 5.60582
      ##
      ## Coefficient(s):
      ## Estimate Std. Error t value Pr(>|t|)
      ## a0 0.011014 0.002491 4.422 9.78e-06 ***
      ## a1 0.063407 0.004076 15.556 < 2e-16 ***
      ## b1 0.934953 0.003839 243.530 < 2e-16 ***
      ## ---
      ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
      ##
      ## Diagnostic Tests:
      ## Jarque Bera Test
      ##
      ## data: Residuals
      ## X-squared = 659.37, df = 2, p-value < 2.2e-16
      ##
      ##
      ## Box-Ljung test
      ##
      ## data: Squared.Residuals
      ## X-squared = 1.5224, df = 1, p-value = 0.2173
      

    四、模型优化

    (一)模型拟合

      上述的模型考虑的是 A R I M A ( 0 , 0 , 0 ) ARIMA(0,0,0) ARIMA(0,0,0)的标准 G A R C H ( 1 , 1 ) GARCH(1,1) GARCH(1,1)模型,即均值模型的参数均设置为0。而从均值模型的分析来看,可以拟合 A R I M A ( 4 , 0 , 4 ) ARIMA(4,0,4) ARIMA(4,0,4)的均值模型与 G A R C H ( 1 , 1 ) GARCH(1,1) GARCH(1,1)的方差模型。而上述的正态性检验结果表明,残差的分布不适用标准正态分布,应该考虑其他类型的分布。

    • 使用 r u g a r c h rugarch rugarch包对多个模型进行拟合。
    • 对于均值模型,考虑不带截距项的 A R I M A ( 4 , 0 , 4 ) ARIMA(4,0,4) ARIMA(4,0,4)
    • 对于方差模型,阶数设定1阶ARCH和1阶GARCH,考虑标准GARCH( s G A R C H sGARCH sGARCH)、指数GARCH( e G A R C H eGARCH eGARCH)、 G J R − G A R C H GJR-GARCH GJRGARCH、渐近幂ARCH( A P A R C H APARCH APARCH)、门限GARCH( T G A R C H TGARCH TGARCH)、非线性非对称GARCH( N A G A R C H NAGARCH NAGARCH)六类模型。
    • 对于残差分布类型,考虑标准正态分布( n o r m norm norm)、标准t分布( s t d std std)、偏t分布( s s t d sstd sstd)、广义误差分布( g e d ged ged)和Johnson’SU分布( j s u jsu jsu)五类分布。
      在这里插入图片描述

    (二)模型比较

      从拟合的模型结果来看,非对称类型的指数GARCH模型在最大似然估计值达到最大,同时AIC和BIC都能达到最小,说明指数GARCH模型比较好。从拟合的模型残差分布来看,非正态分布的AIC和BIC都明显低于正态分布,说明残差是服从重尾类型的分布

    • 选取指数GARCH模型,对比不同分布的参数显著性、检验结果以及模型效果,这里分布考虑正态分布、t分布、广义误差分布与三种分布对应的偏态分布以及Johnson’SU分布,结果如下所示。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

      从模型拟合的系数显著性表可以看出,拟合的系数基本都显著,仅有少数参数不显著。从系数稳定性的个别检验和联合检验可以看出,在5%显著性水平下正态分布、偏正态分布、广义误差分布和偏广义误差分布都接收参数是稳定的原假设。从符号偏误检验的结果来看,指数GARCH模型正负残差的受到冲击的差异不明显,说明该非对称模型有效消除了杠杆效应。从调整皮尔逊拟合优度检验的结果来看,原假设是残差分布与理论分布没有差异,结果表明广义误差分布和偏广义误差分布是没有拒绝原假设,说明这两种分布与模型适配较好。

    (三)模型选择

      从模型拟合的信息准则表来看,偏广义误差分布的LLH达到最大,而BIC和HQ都达到最小,说明 A R M A ( 4 , 4 ) − e G A R C H ( 1 , 1 ) − S G E D ARMA(4,4)-eGARCH(1,1)-SGED ARMA(4,4)eGARCH(1,1)SGED模型最优。拟合 A R M A ( 4 , 4 ) − E G A R C H ( 1 , 1 ) − S G E D ARMA(4,4)-EGARCH(1,1)-SGED ARMA(4,4)EGARCH(1,1)SGED模型,理论模型和模型参数估计及显著性如下所示。
    X t = ∑ i = 1 p φ i X t − i − ∑ j = 1 q ϑ j ε t − j + ε t z t = ε t σ t = X t σ t l n σ t 2 = ω + α z t − 1 + β l n σ t − 1 2 + γ ( ∣ ε t − 1 ∣ σ t − 1 − E ∣ z t − 1 ∣ ) 其 中 , ε t ∼ S G E D ( 0 , 1 , s h a p e , s k e w ) \begin{aligned} X_t &= \sum \limits _{i=1}^{p}\varphi_i X_{t-i} - \sum \limits _{j=1}^{q} \vartheta_j \varepsilon_{t-j} + \varepsilon_t \\ z_t &= \frac{\varepsilon_t}{\sigma_t} = \frac{X_t}{\sigma_t} \\ ln\sigma_t^2 &= \omega +\alpha z_{t-1} + \beta ln\sigma ^2_{t-1} + \gamma (\frac{|\varepsilon_{t-1}|}{\sigma _{t-1}} - E|z_{t-1}|) \\ 其中,& \varepsilon_t \sim SGED(0,1,shape, skew) \end{aligned} Xtztlnσt2=i=1pφiXtij=1qϑjεtj+εt=σtεt=σtXt=ω+αzt1+βlnσt12+γ(σt1εt1Ezt1)εtSGED(0,1,shape,skew)
    在这里插入图片描述

    五、结论

      本文通过对沪深300指数的波动性分析发现,我国股票市场有两段时间出现较大的波动。第一次波动出现在2008年前后,这段期间为全球金融危机,明显可以看出收盘价时序图出现明显的陡峭的波峰,持续时间较长;第二次波动出现在2015年前后,该阶段是由于杠杆资金的加入和政策收紧,形成短暂的牛市和熊市,波动程度不亚于2008年金融危机,但持续时间比较短。
      本文使用多个GARCH模型进行比对,发现非对称模型 A R I M A − E G A R C H ARIMA-EGARCH ARIMAEGARCH模型与沪深300指数的对数收益率有较高的匹配度,同时偏广义误差分布与理论分布较为接近,说明沪深300指数的波动性呈现的是尖峰厚尾非对称性特征,说明我国股票市场存在杠杆效应

    六、实现代码

    # Created by: Enguanei
    # Created on: 2021/5/7
    
    # 导入包
    library(knitr)
    library(pedquant)
    library(zoo)
    library(imputeTS)
    library(tseries)
    library(forecast)
    library(MTS)
    library(rugarch)
    library(dplyr)
    
    # 爬取网易财经的数据
    datt <- md_stock(symbol = '000300.ss',
                     from = "2002-01-01",
                     to = "2019-12-31", source = "163")
    
    # 查看数据
    head(datt$`000300.ss`$close)
    head(datt$`000300.ss`$date)
    
    # 保存数据
    write.csv(datt, "D:\\Rproject\\hs300.csv")
    
    # 导入数据
    raw_data <- read.csv("D:\\Rproject\\hs300.csv", header = TRUE)
    
    # 转成时间序列
    my_date <- as.Date(raw_data$X000300.ss.date)
    my_data <- raw_data$X000300.ss.close
    data.ts <- zoo(my_data, my_date)
    
    # 查看是否存在缺失值
    sum(is.na(my_data))
    
    # 转成时间序列(不包括日期)和对数差分化处理
    r.data <- diff(log(ts(my_data))) * 100
    
    # 画出时序图
    par(mfrow = c(2, 1))
    plot(data.ts, xlab = 'Year', ylab = 'Close.Price',
         main = 'Close of CSI300')
    plot(r.data, ylab = 'Log.Return',
         main = 'Log.Return of CSI300')
    
    # 平稳性检验
    show(adf.test(r.data))
    
    # 拟合arma均值模型
    md1 <- auto.arima(r.data)
    md1
    
    # 系数显著性检验
    t <- md1$coef / sqrt(diag(md1$var.coef))
    p_1 <- 2 * (1 - pnorm(abs(t)))
    kable(rbind(p = p_1), caption = "Result of Coef. Test")
    
    # 拟合疏系数arma
    mean_md_1 <- Arima(r.data,
                       order = c(4, 0, 4),
                       fixed = c(NA, 0, 0, NA, NA, 0, 0, NA, 0))
    
    # 疏系数模型的系数显著性检验
    t <- mean_md_1$coef / sqrt(diag(mean_md_1$var.coef))
    p_2 <- 2 * (1 - pnorm(abs(t)))
    kable(rbind(p = p_2[p_2 != 1]), caption = "Result of Coef. Test")
    
    # ARCH效应检验(原假设是没有ARCH效应)
    print(paste0('m = 10'))
    archTest(mean_md_1$res, lag = 10)
    print(paste0('m = 20'))
    archTest(mean_md_1$res, lag = 20)
    
    # 使用tseries拟合sGARCH(只能拟合方差模型,没有考虑均值模型)
    out <- garch(r.data, order = c(1, 1))
    summary(out)
    
    # 模型优化
    # 模型选择
    md_name <- c("sGARCH", "eGARCH", "gjrGARCH",
                 "apARCH", "TGARCH", "NAGARCH")
    md_dist <- c("norm", "std", "sstd", "ged", "jsu")
    
    # 设定函数
    model_train <- function(data_, m_name, m_dist) {
      res <- NULL
      for (i in m_name) {
        sub_model <- NULL
        main_model <- i
        if (i == "TGARCH" | i == "NAGARCH") {
          sub_model <- i
          main_model <- "fGARCH"
        }
    
        for (j in m_dist) {
          model_name <- paste0('ARMA(4,4)', '-',
                               i, '-', j,
                               sep = "")
          if (main_model == "fGARCH") {
            model_name <- paste0('ARMA(4,4)', '-',
                                 sub_model, '-', j,
                                 sep = "")
          }
          print(model_name)
          # 模型设定
          mean.spec <- list(armaOrder = c(4, 4), include.mean = F,
                            archm = F, archpow = 1, arfima = F,
                            external.regressors = NULL)
          var.spec <- list(model = main_model, garchOrder = c(1, 1),
                           submodel = sub_model,
                           external.regressors = NULL,
                           variance.targeting = F)
          dist.spec <- j
          my_spec <- ugarchspec(mean.model = mean.spec,
                                variance.model = var.spec,
                                distribution.model = dist.spec)
          # 模型拟合
          my_fit <- ugarchfit(data = data_, spec = my_spec)
          res <- rbind(res, c(list(ModelName = model_name),
                              list(LogL = likelihood(my_fit)),
                              list(AIC = infocriteria(my_fit)[1]),
                              list(BIC = infocriteria(my_fit)[2]),
                              list(RMSE = sqrt(mean(residuals(my_fit)^2))),
                              list(md = my_fit)))
        }
      }
      return(res)
    }
    
    # 模型拟合
    my_model <- model_train(r.data, md_name, md_dist)
    
    # 保存模型结果
    write.table(my_model[, 1:5],
                "D:\\Rproject\\result.txt",
                sep = " ")
    
    # 读取模型结果
    res_table <- read.table("D:\\Rproject\\result.txt",
                            header = TRUE,
                            sep = " ")
    kable(res_table, caption = "Result of GARCH Model", align = 'l')
    
    # 选择模型再拟合
    md_name <- c("eGARCH")
    md_dist <- c("norm", "snorm", "std", "sstd", "ged", "sged", "jsu")
    new_model <- model_train(r.data, md_name, md_dist)
    
    # 信息准则表
    my_info_cri <- NULL
    for (i in 1:dim(new_model)[1]) {
      new_aic <- round(infocriteria(new_model[i, 6]$md)[1], digits = 4)
      new_bic <- round(infocriteria(new_model[i, 6]$md)[2], digits = 4)
      new_sib <- round(infocriteria(new_model[i, 6]$md)[3], digits = 4)
      new_hq <- round(infocriteria(new_model[i, 6]$md)[4], digits = 4)
      new_llk <- round(likelihood(new_model[i, 6]$md), digits = 4)
      my_info_cri <- rbind(my_info_cri, c(new_model[i, 1],
                                          Akaike = new_aic,
                                          Bayes = new_bic,
                                          Shibata = new_sib,
                                          HQ = new_hq,
                                          LLH = new_llk))
    }
    
    
    # 模型系数显著性表
    my_cof_table <- NULL
    my_cof_names <- NULL
    for (i in 1:dim(new_model)[1]) {
      my_cof_names <- rbind(my_cof_names, new_model[i, 1]$ModelName)
      my_df <- data.frame(t(round(new_model[i, 6]$md@fit$robust.matcoef[, 4],
                                  digits = 4)))
      if (i == 1) {
        my_cof_table <- data.frame(my_df)
      }
      else {
        my_cof_table <- full_join(my_cof_table, my_df)
      }
    }
    row.names(my_cof_table) <- my_cof_names[, 1]
    my_cof_table <- t(my_cof_table)
    
    
    # 参数稳定性个别检验表
    my_nyblom_table <- NULL
    my_nyblom_name <- NULL
    for (i in 1:dim(new_model)[1]) {
      my_nyblom_name <- rbind(my_nyblom_name,
                              new_model[i, 1]$ModelName)
      my_df <- data.frame(t(round(nyblom(new_model[i, 6]$md)$IndividualStat,
                                  digits = 4)))
      if (i == 1) {
        my_nyblom_table <- data.frame(my_df)
      }
      else {
        my_nyblom_table <- full_join(my_nyblom_table, my_df)
      }
    }
    row.names(my_nyblom_table) <- my_nyblom_name[, 1]
    my_IC <- NULL
    for (i in 1:dim(new_model)[1]) {
      my_IC <- cbind(my_IC, nyblom(new_model[1, 6]$md)$IndividualCritical)
    }
    my_nyblom_table <- rbind(t(my_nyblom_table), my_IC)
    
    # 参数稳定性联合检验表
    my_nyblom_table2 <- NULL
    my_nyblom_name2 <- NULL
    for (i in 1:dim(new_model)[1]) {
      my_nyblom_name2 <- rbind(my_nyblom_name2,
                               new_model[i, 1]$ModelName)
      df1 <- data.frame(JoinStat = round(nyblom(new_model[i,6]$md)$JointStat,
                                         digits = 4))
      df2 <- data.frame(mm = round(nyblom(new_model[i, 6]$md)$JointCritical,
                                   digits = 4))
      temp_table <- cbind(df1, t(df2))
      if (i == 1) {
        my_nyblom_table2 <- temp_table
      }
      else {
        my_nyblom_table2 <- full_join(my_nyblom_table2, temp_table)
      }
    }
    row.names(my_nyblom_table2) <- my_nyblom_name2
    
    # 模型分布拟合度p值检验表
    my_gof_table <- NULL
    my_gof_name <- NULL
    group_name <- c(20, 30, 40, 50)
    for (i in 1:dim(new_model)[1]) {
      my_gof_name <- rbind(my_gof_name,
                           new_model[i, 1]$ModelName)
      df1 <- round(gof(new_model[i, 6]$md,
                       groups = group_name)[1:4, 3],
                   digits = 4)
      if (i == 1) {
        my_gof_table <- df1
      }
      else {
        my_gof_table <- rbind(my_gof_table, df1)
      }
    }
    row.names(my_gof_table) <- my_gof_name
    colnames(my_gof_table) <- c(20, 30, 40, 50)
    
    # 符号偏误显著性检验表
    my_sign_table <- NULL
    my_sign_name <- NULL
    row_sign_name <- row.names(signbias(new_model[1, 6]$md))
    for (i in 1:dim(new_model)[1]) {
      my_sign_name <- rbind(my_sign_name,
                            new_model[i, 1]$ModelName)
      df1 <- round(signbias(new_model[i, 6]$md)$prob, digits = 4)
      if (i == 1) {
        my_sign_table <- df1
      }
      else {
        my_sign_table <- rbind(my_sign_table, df1)
      }
    }
    row.names(my_sign_table) <- my_sign_name
    colnames(my_sign_table) <- row_sign_name
    
    # 展示表格
    kable(my_cof_table,
          caption = "P-value Table of Coefficients")
    kable(my_nyblom_table,
          caption = "P-value Table of Nyblom Individual Stability Test")
    kable(my_nyblom_table2,
          caption = "P-value Table of Nyblom Joint Stability Test")
    kable(my_sign_table,
          caption = "P-value Table of Sign Bias Test")
    kable(my_gof_table,
          caption = "P-value Table of Goodness-of-fit")
    kable(my_info_cri,
          caption = "Table of Information Criteria")
    
    # 最终模型系数表
    kable(new_model[6, 6]$md@fit$robust.matcoef,
          caption = "Table of Final Model Coef.")
    

    七、参考资料

    [1] Ruey S. Tsay, 李洪成, 尚秀芬,等. 金融数据分析导论[M]. 机械工业出版社, 2013.
    [2] 何宗武, 马卫锋. 经济与金融计量方法:原理、应用案例及R语言实现[M]. 机械工业出版社, 2019
    [3] 张东旭. 基于ARMA-GARCH模型族的上证指数收益率波动的实证分析[D]. 清华大学.

    展开全文
  • GARCH 模型下 VaR 方法介绍及应用 摘 要利用 VaR 来测算金融市场的风险已成为一种 流行方法本文将介绍基于 GARCH 模型下 VaR 的测算方 法并且利用 VaR 工具来测算我国交易型开放式指数基金 ETF的市场风险本文基于 ...
  • R语言做滚动garch模型 roll-garch model 前几天帮人做了一个滚动garch模型,刚开始那个人没搞清楚,走了很多弯路,最后终于搞好了,主要就是没有有效的沟通好。 接下来就是分析我写roll-garch的思路。 其实roll-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,760
精华内容 704
关键字:

garch模型