• 【R语言实战】——金融时序ARIMA建模


    🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972

       个人介绍: 研一|统计学|干货分享
             擅长Python、Matlab、R等主流编程软件
             累计十余项国家级比赛奖项,参与研究经费10w、40w级横向

    该篇文章实现了对深证综指收益率数据进行ARIMA建模及预测,包括对原始收益数据的处理;平稳性及白噪声检验;ACF/PACF定阶;EACF表定阶;模型拟合;残差检验;模型优化;模型预测,同时附带完整代码及相关分析。

    1 对数收益率时序可视化

      运行程序:

    #加载包
    data<-read.xlsx("F:\\2021-03-15 上证指数,深证综指日交易数据.xls",'Sheet1',
                    encoding ="UTF-8")#读取数据
    rt=log(data$收盘价.元.点._ClPr)-log(data$昨收盘.元.点._PrevClPr)#对数收益率
    rt=na.omit(rt)                                                  #清除缺失数据
    rt1=ts(rt,start =c(1991,4,4),frequency = 244)                   #转化为时序数据
    plot(rt1,sub="图1 深证综指日对数收益率时序图")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

      运行结果:

      首先由收益率公式:

    r t = l n P t P t − 1 = l n P t − l n P t − 1 r_t=ln \frac{P_t}{P_{t-1}}=lnP_t-lnP_{t-1} rt=lnPt1Pt=lnPtlnPt1

      计算深证综指日对数收益率,并对缺失值进行处理,得到从1991-2021年深证综指的对数收益率共7379个观测值。由于该证券数据一年多为244天,故以244天作为1年绘制证券收益率时序图(图1),接下来利用清洗过后的数据进行其分布拟合。

    2 平稳性及白噪声检验

    2.1 平稳性检验

      运行程序:

    library(aTSA)  #加载包
    adf.test(rt)   #平稳性检验
    
    • 1
    • 2

      运行结果:

    ## Augmented Dickey-Fuller Test 
    ## alternative: stationary 
    ##  
    ## Type 1: no drift no trend 
    ##       lag   ADF p.value
    ##  [1,]   0 -81.3    0.01
    ##  [2,]   1 -58.0    0.01
    ##  [3,]   2 -46.5    0.01
    ##  [4,]   3 -38.8    0.01
    ##  [5,]   4 -35.0    0.01
    ##  [6,]   5 -33.5    0.01
    ##  [7,]   6 -30.2    0.01
    ##  [8,]   7 -28.3    0.01
    ##  [9,]   8 -26.4    0.01
    ## [10,]   9 -25.6    0.01
    ## [11,]  10 -24.4    0.01
    ## Type 2: with drift no trend 
    ##       lag   ADF p.value
    ##  [1,]   0 -81.3    0.01
    ##  [2,]   1 -58.0    0.01
    ##  [3,]   2 -46.6    0.01
    ##  [4,]   3 -38.9    0.01
    ##  [5,]   4 -35.0    0.01
    ##  [6,]   5 -33.6    0.01
    ##  [7,]   6 -30.2    0.01
    ##  [8,]   7 -28.3    0.01
    ##  [9,]   8 -26.4    0.01
    ## [10,]   9 -25.6    0.01
    ## [11,]  10 -24.5    0.01
    ## Type 3: with drift and trend 
    ##       lag   ADF p.value
    ##  [1,]   0 -81.3    0.01
    ##  [2,]   1 -58.0    0.01
    ##  [3,]   2 -46.6    0.01
    ##  [4,]   3 -38.9    0.01
    ##  [5,]   4 -35.0    0.01
    ##  [6,]   5 -33.6    0.01
    ##  [7,]   6 -30.2    0.01
    ##  [8,]   7 -28.3    0.01
    ##  [9,]   8 -26.4    0.01
    ## [10,]   9 -25.6    0.01
    ## [11,]  10 -24.5    0.01
    ## ---- 
    ## Note: in fact, p.value = 0.01 means p.value <= 0.01
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    2.2 白噪声检验

      运行程序:

    for(i in 1:2){
      print(Box.test(rt,lag=6*i,type="Ljung-Box"))
    }
    
    • 1
    • 2
    • 3

      运行结果:

    ## 
    ##  Box-Ljung test
    ## 
    ## data:  rt
    ## X-squared = 60.804, df = 6, p-value = 3.089e-11
    ## 
    ## 
    ##  Box-Ljung test
    ## 
    ## data:  rt
    ## X-squared = 84.94, df = 12, p-value = 4.674e-13
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

      通过图1可以大致看出深证综指的日对数收益率收益率为平稳的时间序列,通过ADF检验P值均小于0.05,拒绝“为非平稳时序数据”的原假设,认为该序列为平稳序列,经过6阶、12阶的白噪声检验,发现其p值均小于0.05,说明该时序数据为平稳非白噪声序列,适合建模。

    3 模型定阶

    3.1 ACF、PACF图定阶

      运行程序:

    par(mfrow=c(1,2))     #创建1×2画布
    acf(rt1,sub="图5 自相关图")              #自相关图
    pacf(rt1,sub="图6 偏自相关图")             #偏自相关图
    
    • 1
    • 2
    • 3

      运行结果:

      由该序列自相关图与偏自相关图可以知道,该序列自相关图与偏自相关图均拖尾,故该序列应该拟合ARIMA模型。

    3.2 EACF表定阶

    3.2.1 EACF简表

      运行程序:

    par(mfrow=c(1,2))         #创建1×1画布
    library(TSA)              #加载包
    m1<-eacf(rt1)             #EACF简化表
    
    • 1
    • 2
    • 3

      运行结果:

    ## AR/MA
    ##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
    ## 0 x o x x o x x o o o o  x  o  o 
    ## 1 x o o x x o x o o o o  x  o  o 
    ## 2 x x o o x o x o o o o  x  o  o 
    ## 3 x x x o x x x x o o o  o  x  o 
    ## 4 x x x x o x x o o o o  o  x  o 
    ## 5 x x x x x x o x o o o  o  x  o 
    ## 6 x x x x x x o x o o o  x  o  o 
    ## 7 x x x x x x x o o o o  x  o  o
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

      运行程序:

    m1
    
    • 1

      运行结果:

    ## $eacf
    ##             [,1]        [,2]          [,3]         [,4]        [,5]
    ## [1,]  0.05186075  0.01823984  0.0325773192  0.054479116  0.01637515
    ## [2,] -0.27566564 -0.01859668  0.0006709612  0.042149140  0.02510675
    ## [3,] -0.40185155 -0.03309427  0.0010163577  0.020239247  0.03371968
    ## [4,] -0.44286371  0.04988986 -0.2128448359 -0.003718364  0.02897970
    ## [5,] -0.19118004  0.38128140 -0.2144903835 -0.088680936  0.01158896
    ## [6,]  0.26705846  0.19626575 -0.1450178522 -0.222002007 -0.17385311
    ## [7,]  0.49969401  0.29144002 -0.1646513342 -0.337466248 -0.24228788
    ## [8,] -0.15020845 -0.27865513  0.4074569846 -0.136264204 -0.20457862
    ##              [,6]        [,7]        [,8]        [,9]        [,10]       [,11]
    ## [1,] -0.031052623  0.03357787  0.01095985  0.01882619 -0.014338401 0.005463929
    ## [2,] -0.005811746  0.04075826 -0.01247056  0.01625908 -0.006116629 0.002232497
    ## [3,]  0.008914872  0.03225957  0.02313849  0.02103490  0.001852557 0.008683467
    ## [4,] -0.036415647  0.05209669  0.02677686  0.01459742 -0.018470501 0.004610147
    ## [5,] -0.042585501  0.03814105 -0.02166573  0.01710606 -0.017224865 0.010382543
    ## [6,] -0.028772804 -0.01335083 -0.03251102 -0.01477290 -0.015664739 0.007008101
    ## [7,]  0.204890840  0.01125851 -0.02889638  0.01763848 -0.009981756 0.010181724
    ## [8,]  0.171302086  0.11324458 -0.01197408 -0.00758839 -0.014792266 0.016635518
    ##              [,12]        [,13]         [,14]
    ## [1,]  0.0380495740  0.015792999 -0.0005846271
    ## [2,]  0.0316646229  0.017095597  0.0002921578
    ## [3,]  0.0275045416  0.010343692 -0.0175732761
    ## [4,]  0.0054253399  0.027250487  0.0064546092
    ## [5,] -0.0009724119  0.027170687 -0.0147765589
    ## [6,]  0.0043693392  0.027724684  0.0040001865
    ## [7,]  0.0392960113  0.005843992  0.0089263044
    ## [8,]  0.0427462184 -0.014826829 -0.0003964176
    ## 
    ## $ar.max
    ## [1] 8
    ## 
    ## $ma.ma
    ## [1] 14
    ## 
    ## $symbol
    ##   0   1   2   3   4   5   6   7   8   9   10  11  12  13 
    ## 0 "x" "o" "x" "x" "o" "x" "x" "o" "o" "o" "o" "x" "o" "o"
    ## 1 "x" "o" "o" "x" "x" "o" "x" "o" "o" "o" "o" "x" "o" "o"
    ## 2 "x" "x" "o" "o" "x" "o" "x" "o" "o" "o" "o" "x" "o" "o"
    ## 3 "x" "x" "x" "o" "x" "x" "x" "x" "o" "o" "o" "o" "x" "o"
    ## 4 "x" "x" "x" "x" "o" "x" "x" "o" "o" "o" "o" "o" "x" "o"
    ## 5 "x" "x" "x" "x" "x" "x" "o" "x" "o" "o" "o" "o" "x" "o"
    ## 6 "x" "x" "x" "x" "x" "x" "o" "x" "o" "o" "o" "x" "o" "o"
    ## 7 "x" "x" "x" "x" "x" "x" "x" "o" "o" "o" "o" "x" "o" "o"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    3.2.2 EACF表

      运行程序:

    print(m1$eacf,digits=2)   #EACF表
    
    • 1

      运行结果:

    ##        [,1]   [,2]     [,3]    [,4]   [,5]    [,6]   [,7]   [,8]    [,9]
    ## [1,]  0.052  0.018  0.03258  0.0545  0.016 -0.0311  0.034  0.011  0.0188
    ## [2,] -0.276 -0.019  0.00067  0.0421  0.025 -0.0058  0.041 -0.012  0.0163
    ## [3,] -0.402 -0.033  0.00102  0.0202  0.034  0.0089  0.032  0.023  0.0210
    ## [4,] -0.443  0.050 -0.21284 -0.0037  0.029 -0.0364  0.052  0.027  0.0146
    ## [5,] -0.191  0.381 -0.21449 -0.0887  0.012 -0.0426  0.038 -0.022  0.0171
    ## [6,]  0.267  0.196 -0.14502 -0.2220 -0.174 -0.0288 -0.013 -0.033 -0.0148
    ## [7,]  0.500  0.291 -0.16465 -0.3375 -0.242  0.2049  0.011 -0.029  0.0176
    ## [8,] -0.150 -0.279  0.40746 -0.1363 -0.205  0.1713  0.113 -0.012 -0.0076
    ##        [,10]  [,11]    [,12]   [,13]    [,14]
    ## [1,] -0.0143 0.0055  0.03805  0.0158 -0.00058
    ## [2,] -0.0061 0.0022  0.03166  0.0171  0.00029
    ## [3,]  0.0019 0.0087  0.02750  0.0103 -0.01757
    ## [4,] -0.0185 0.0046  0.00543  0.0273  0.00645
    ## [5,] -0.0172 0.0104 -0.00097  0.0272 -0.01478
    ## [6,] -0.0157 0.0070  0.00437  0.0277  0.00400
    ## [7,] -0.0100 0.0102  0.03930  0.0058  0.00893
    ## [8,] -0.0148 0.0166  0.04275 -0.0148 -0.00040
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

      一般地,由“O”组成的三角形的左上顶点位于ARIMA模型的(p,q)处,由EACF简化表可以看出由“O”组成的三角形的左上顶点位于阶(p,q)=(0,1)处。,结合EACF表可以看到由(0,1)作为三角形顶点的三角形范围EACF值只有少数“X”是例外,但其对应EACF值仅比 2 7335 = 0.0335231 \frac{2}{\sqrt{7335}}=0.0335231 7335 2=0.0335231 稍微大一点,事实上,如果用1%的临界值,简化表中的“X”将变为“O”,因此EACF表明深证综指的日对数收益率服从定ARIMA(0,0,1)模型。

    4 模型拟合

      运行程序:

    library(forecast)
    fit3=arima(rt1,order = c(0,0,1))
    fit3                            #模型拟合
    
    • 1
    • 2
    • 3

      运行结果:

    ## 
    ## Call:
    ## arima(x = rt1, order = c(0, 0, 1))
    ## 
    ## Coefficients:
    ##          ma1  intercept
    ##       0.0504      4e-04
    ## s.e.  0.0115      3e-04
    ## 
    ## sigma^2 estimated as 0.0004579:  log likelihood = 17791.28,  aic = -35578.57
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

      运行程序:

    t=abs(fit3$coef)/sqrt(diag(fit3$var.coef))
    pt(t,length(rt)-length(fit3$coef),lower.tail = F)
    
    • 1
    • 2

      运行程序:

    ##          ma1    intercept 
    ## 5.998510e-06 5.070172e-02
    
    • 1
    • 2

    5 残差检验

      运行程序:

    tsdiag(fit3)                   #残差检验
    
    • 1

      运行结果:

      由结果可知,建立的ARIMA(0,0,1)模型系数通过了显著性检验,但是残差为非白噪声,因此该模型不理想。再尝试建立ARIMA(1,0,1)模型。

    6 模型优化

      运行程序:

    fit4=Arima(rt1,order = c(1,0,1))
    fit4                           #模型拟合
    
    • 1
    • 2

      运行结果:

    ## Series: rt1 
    ## ARIMA(1,0,1) with non-zero mean 
    ## 
    ## Coefficients:
    ##          ar1      ma1   mean
    ##       0.8435  -0.8053  4e-04
    ## s.e.  0.0647   0.0717  3e-04
    ## 
    ## sigma^2 estimated as 0.0004569:  log likelihood=17800.25
    ## AIC=-35592.49   AICc=-35592.49   BIC=-35564.89
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

      运行程序:

    t=abs(fit4$coef)/sqrt(diag(fit4$var.coef))
    pt(t,length(rt)-length(fit3$coef),lower.tail = F)
    
    • 1
    • 2

      运行结果:

    ##          ar1          ma1    intercept 
    ## 1.015093e-38 2.628404e-29 8.081087e-02
    
    • 1
    • 2

    运行程序:

    tsdiag(fit4)                   #残差检验
    
    • 1

      运行结果:

      由结果可知,拟合的ARIMA(1,0,1)模型的残差依旧不是白噪声,两模型的AIC差距较小,ARIMA(1,0,1)模型的AIC要较小一些,故模型比ARIMA(0,0,1)拟合效果相对较好。

    7 模型预测

      运行程序:

    fore1=forecast(fit4,h=5)
    plot(fore1,lty=2,sub="图9 模型拟合效果图")
    lines(fore1$fitted,col=4)
    
    • 1
    • 2
    • 3

      运行结果:

      拟合效果与预测效果见上图。由于模型未通过残差显著性检验,因此拟合效果也不是很理性。但经过多种尝试,建立较优的模型为ARIMA(1,0,1):

    x t − 0.0004 = 1 − 0.8053 B 1 − 0.8435 B x_t-0.0004=\frac{1-0.8053B}{1-0.8435B} xt0.0004=10.8435B10.8053B

  • 相关阅读:
    Layui + Flask | 表单组件(组件篇)(07)
    隐藏微信网页右上角的按钮、在微信网页中获取用户的网络状态,支付等
    最新 Solidity 语法学习笔记
    Qml-跨窗口拖动图片、物体
    linux下的文件的压缩和解压缩
    学习pytorch7 神经网络的基本骨架--nn,module的使用
    cargo 使用国内的镜像
    公众号查题接口 不限次数
    Docker学习笔记
    【机器学习】数值分析03——任意曲线拟合
  • 原文地址:https://blog.csdn.net/jd1813346972/article/details/136639174