ts()函数只能生成连续的时间序列,在现实中很多经济活动并不是连续的时间序列,这时候可以用xts()和as.xts()函数来生成时间序列。
1 数据
我们以Shibor.xlsx的数据为例来演示ARMA模型的操作。首先打开shibor.xlsx数据文件。其中第1例是时间,由于上海隔夜利率周末休市,所以时间序列不是连续的。第2列是隔夜利率,第三列是1周的利率,...。
2 读取时间序列数据并转换为R中的时间序列类型
2.1 方式一
由于R导入中文标题时容易出错,所以手动修改日期、O/N、1W的变量名为“空”、ir和wir,然后选中前3列进行复制(第一列变量名为空,在导入R时可以自动作为行名,方便后面将其转换为时间序列)。
> 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 方式二
> 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)
> plot(sb)
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)
> pacf(sb$ir)
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