ARMA模型

Reads: 2015 Edit

ts()函数只能生成连续的时间序列,在现实中很多经济活动并不是连续的时间序列,这时候可以用xts()和as.xts()函数来生成时间序列。

1 数据

我们以Shibor.xlsx的数据为例来演示ARMA模型的操作。首先打开shibor.xlsx数据文件。其中第1例是时间,由于上海隔夜利率周末休市,所以时间序列不是连续的。第2列是隔夜利率,第三列是1周的利率,...。

r-74

2 读取时间序列数据并转换为R中的时间序列类型

2.1 方式一

由于R导入中文标题时容易出错,所以手动修改日期、O/N、1W的变量名为“空”、ir和wir,然后选中前3列进行复制(第一列变量名为空,在导入R时可以自动作为行名,方便后面将其转换为时间序列)。

r-75

> shibor=read.table("clipboard",header = TRUE)
> shibor
               ir   wir
2020/1/2   1.4436 2.433
2020/1/3   1.1620 2.349
2020/1/6   1.0030 2.219
2020/1/7   1.2150 2.259
2020/1/8   1.5530 2.320
2020/1/9   1.6900 2.470
2020/1/10  1.7722 2.487
2020/1/13  2.0590 2.522
2020/1/14  2.5180 2.654
2020/1/15  2.6540 2.717
2020/1/16  2.6090 2.663
2020/1/17  2.5220 2.640
2020/1/19  2.4130 2.608
2020/1/20  2.2480 2.607

说明:时间列作为行号

> install.packages("xts")
> library(xts)
> sb=as.xts(shibor)
> sb
               ir   wir
2020-01-02 1.4436 2.433
2020-01-03 1.1620 2.349
2020-01-06 1.0030 2.219
2020-01-07 1.2150 2.259
2020-01-08 1.5530 2.320
2020-01-09 1.6900 2.470
2020-01-10 1.7722 2.487
2020-01-13 2.0590 2.522

说明:此时sb变为时间序列

2.2 方式二

r-75-1

> shibor2=read.table("clipboard",header = TRUE)
> shibor2
            dt     ir   wir
1     2020/1/2 1.4436 2.433
2     2020/1/3 1.1620 2.349
3     2020/1/6 1.0030 2.219
4     2020/1/7 1.2150 2.259
5     2020/1/8 1.5530 2.320
6     2020/1/9 1.6900 2.470
7    2020/1/10 1.7722 2.487
8    2020/1/13 2.0590 2.522
9    2020/1/14 2.5180 2.654
10   2020/1/15 2.6540 2.717

说明:此时行号为默认的1,2,3,4,...

> row.names(shibor2)=shibor2$dt
> shibor2=shibor2[,-1]
> shibor2
               ir   wir
2020/1/2   1.4436 2.433
2020/1/3   1.1620 2.349
2020/1/6   1.0030 2.219
2020/1/7   1.2150 2.259
2020/1/8   1.5530 2.320
2020/1/9   1.6900 2.470
2020/1/10  1.7722 2.487
2020/1/13  2.0590 2.522
2020/1/14  2.5180 2.654
2020/1/15  2.6540 2.717

> sb2=as.xts(shibor2)
> sb2
               ir   wir
2020-01-02 1.4436 2.433
2020-01-03 1.1620 2.349
2020-01-06 1.0030 2.219
2020-01-07 1.2150 2.259
2020-01-08 1.5530 2.320
2020-01-09 1.6900 2.470
2020-01-10 1.7722 2.487
2020-01-13 2.0590 2.522
2020-01-14 2.5180 2.654
2020-01-15 2.6540 2.717

说明:数据成功转换成R中的时间类型

3 绘制隔夜利率和1周利率的走势图

> plot(sb$ir)

r-76

> plot(sb)

r-77

4 构建隔夜利率的ARMA模型

4.1 单位根检验

> library(fUnitRoots)

> unitrootTest(sb$ir,lags=1,type = c("nc"))

Title:
 Augmented Dickey-Fuller Test

Test Results:
  PARAMETER:
    Lag Order: 1
  STATISTIC:
    DF: -1.5143
  P VALUE:
    t: 0.1217 
    n: 0.3908     
> unitrootTest(sb$ir,lags=1,type = c("c"))

Title:
 Augmented Dickey-Fuller Test

Test Results:
  PARAMETER:
    Lag Order: 1
  STATISTIC:
    DF: -5.4844
  P VALUE:
    t: 3.636e-06 
    n: 0.3866    
> unitrootTest(sb$ir,lags=1,type = c("ct"))

说明:依次进行无截距(nc)、截距(c)、趋势(ct)三种形式的单位根检验,发现截距形式下拒绝了存在单位根的原假设,不需要再进行趋势形式的单位根检验。可以认为原始序列平稳。
说明:我们在上述单位根检验时,滞后项选择了1,UnitrootTest()函数无法自动计算最优的滞后项,也没有给出AIC判断准则,所以实际中可以根据经验自己尝试几种滞后项,综合判断变量是否存在单位根!

4.2 自相关和偏自相关图

> acf(sb$ir)

r-78

> pacf(sb$ir)

r-79

4.3 估计ar(1)模型

> arima(sb$ir,order=c(1,0,0))

Call:
arima(x = sb$ir, order = c(1, 0, 0))

Coefficients:
         ar1  intercept
      0.8528     1.5768
s.e.  0.0326     0.1113

sigma^2 estimated as 0.06997:  log likelihood = -22.84,  aic = 51.68

4.4 估计arma(1,1)

> arima(sb$ir,order=c(1,0,1))

Call:
arima(x = sb$ir, order = c(1, 0, 1))

Coefficients:
         ar1     ma1  intercept
      0.7728  0.3194     1.5850
s.e.  0.0446  0.0632     0.0923

sigma^2 estimated as 0.06467:  log likelihood = -13.11,  aic = 34.21

说明:arima()函数没有给出参数估计的P值,但是可以通过系数估计值和标准差来计算t统计量,进而判断显著性。另外,时间序列分析中,变量的显著性没有回归分析中那么重要,更重要的模型选择指标是aic,由于arma(1,1)模型的aic更小,所以最终选择arma(1,1)模型。

4.5 利用auto.arima()函数自动识别arma模型形式

> install.packages("forecast")
> library(forecast)
> auto.arima(sb2$ir,stationary = TRUE)
Series: sb2$ir 
ARIMA(1,0,1) with non-zero mean 

Coefficients:
         ar1     ma1    mean
      0.7728  0.3194  1.5850
s.e.  0.0446  0.0632  0.0923

sigma^2 = 0.06546:  log likelihood = -13.11
AIC=34.21   AICc=34.37   BIC=48.28

说明:因为单位根检验隔夜利率平稳,所以在auto.arima()函数中需要加入参数“stationary = TRUE”,最终自动识别的为arma(1,1)模型,和我们判断的一致。

4.6 进行时间序列预测

> library(forecast)
> arma=arima(sb$ir,order=c(1,0,1))
> forecast(arma,h=5,level=c(99.5))
          Point Forecast   Lo 99.5  Hi 99.5
21513601       1.294916 0.5810831 2.008749
21600001       1.360829 0.3037607 2.417898
21686401       1.411765 0.1950588 2.628471
21772801       1.451126 0.1483857 2.753866
21859201       1.481543 0.1300352 2.833050


获取案例数据,请关注微信公众号并回复:R_dt11


Comments

Make a comment