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

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

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

文章目录

  • [1 对数收益率时序可视化](#1 对数收益率时序可视化)
  • [2 平稳性及白噪声检验](#2 平稳性及白噪声检验)
    • [2.1 平稳性检验](#2.1 平稳性检验)
    • [2.2 白噪声检验](#2.2 白噪声检验)
  • [3 模型定阶](#3 模型定阶)
    • [3.1 ACF、PACF图定阶](#3.1 ACF、PACF图定阶)
    • [3.2 EACF表定阶](#3.2 EACF表定阶)
      • [3.2.1 EACF简表](#3.2.1 EACF简表)
      • [3.2.2 EACF表](#3.2.2 EACF表)
  • [4 模型拟合](#4 模型拟合)
  • [5 残差检验](#5 残差检验)
  • [6 模型优化](#6 模型优化)
  • [7 模型预测](#7 模型预测)

该篇文章实现了对深证综指收益率数据进行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 深证综指日对数收益率时序图")

运行结果:

首先由收益率公式:

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=lnPt−1Pt=lnPt−lnPt−1

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

2 平稳性及白噪声检验

2.1 平稳性检验

运行程序:

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

运行结果:

## 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

2.2 白噪声检验

运行程序:

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

运行结果:

## 
##  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可以大致看出深证综指的日对数收益率收益率为平稳的时间序列,通过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 偏自相关图")             #偏自相关图

运行结果:

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

3.2 EACF表定阶

3.2.1 EACF简表

运行程序:

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

运行结果:

## 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

运行程序:

m1

运行结果:

## $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"

3.2.2 EACF表

运行程序:

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

运行结果:

##        [,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

一般地,由"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                            #模型拟合

运行结果:

## 
## 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

运行程序:

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

运行程序:

##          ma1    intercept 
## 5.998510e-06 5.070172e-02

5 残差检验

运行程序:

tsdiag(fit3)                   #残差检验

运行结果:

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

6 模型优化

运行程序:

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

运行结果:

## 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

运行程序:

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

运行结果:

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

运行程序:

tsdiag(fit4)                   #残差检验

运行结果:

由结果可知,拟合的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)

运行结果:

拟合效果与预测效果见上图。由于模型未通过残差显著性检验,因此拟合效果也不是很理性。但经过多种尝试,建立较优的模型为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} xt−0.0004=1−0.8435B1−0.8053B

相关推荐
Lizhihao_18 分钟前
JAVA-队列
java·开发语言
算法歌者20 分钟前
[算法]入门1.矩阵转置
算法
林开落L35 分钟前
前缀和算法习题篇(上)
c++·算法·leetcode
远望清一色36 分钟前
基于MATLAB边缘检测博文
开发语言·算法·matlab
tyler_download38 分钟前
手撸 chatgpt 大模型:简述 LLM 的架构,算法和训练流程
算法·chatgpt
何曾参静谧44 分钟前
「Py」Python基础篇 之 Python都可以做哪些自动化?
开发语言·python·自动化
Prejudices1 小时前
C++如何调用Python脚本
开发语言·c++·python
SoraLuna1 小时前
「Mac玩转仓颉内测版7」入门篇7 - Cangjie控制结构(下)
算法·macos·动态规划·cangjie
我狠狠地刷刷刷刷刷1 小时前
中文分词模拟器
开发语言·python·算法
鸽鸽程序猿1 小时前
【算法】【优选算法】前缀和(上)
java·算法·前缀和