R炒面

91-预测分析-R语言实现-时间序列2

2020-10-26  本文已影响0人  wonphen
> library(pacman)
> p_load(dplyr, forecast)

1、预测猞猁的诱捕

猞猁数据集:包含了1821-1934年期间在麦肯齐河里诱捕的加拿大猞猁数量。
任务:预测猞猁的诱捕。

1.1 数据准备

> data(lynx)
> plot.ts(lynx, col = "red", 
+         xlab = "时间", ylab = "诱捕的猞猁数量", 
+         main = "1821-1934年期间每年在麦肯齐河里诱捕的加拿大猞猁数量")
猞猁的诱捕

可以看到数据中存在明显的周期性。

1.2 建模

使用auto.arima()函数通过最小化AICc和MLE来获得一个ARIMA模型。

> tune.pdq <- auto.arima(lynx)
> tune.pdq
## Series: lynx 
## ARIMA(2,0,2) with non-zero mean 
## 
## Coefficients:
##          ar1      ar2      ma1      ma2       mean
##       1.3421  -0.6738  -0.2027  -0.2564  1544.4039
## s.e.  0.0984   0.0801   0.1261   0.1097   131.9242
## 
## sigma^2 estimated as 761965:  log likelihood=-932.08
## AIC=1876.17   AICc=1876.95   BIC=1892.58

使用该参数重新建模, method为指定模型参数估计使用的方法,ML表示极大似然估计,CSS为条件最小二乘估计。

> fit.arima <- arima(lynx, order = c(2, 0, 2), method = "ML")
> fit.arima
## 
## Call:
## arima(x = lynx, order = c(2, 0, 2), method = "ML")
## 
## Coefficients:
##          ar1      ar2      ma1      ma2  intercept
##       1.3417  -0.6739  -0.2025  -0.2556  1544.3986
## s.e.  0.0985   0.0801   0.1263   0.1096   131.9856
## 
## sigma^2 estimated as 728547:  log likelihood = -932.08,  aic = 1876.17

1.3 模型评价

均方根误差(RMSE —— root-mean-square error):又叫标准误差、均方根差。
定义:观测值与真值偏差的平方和,与观测次数n比值的平方根。
理论意义:衡量观测值同真值之间的偏差。
实际用途:衡量测量精度。
实际应用:对异常值敏感,所以,标准误差能够很好地反映出测量的精密度。

平均绝对误差(MAE):又叫平均绝对离差。
定义:所有单个观测值与算术平均值的偏差的绝对值的平均。
理论意义:平均绝对误差可以避免偏差相互抵消的问题。
实际用途:描述数据离散程度。

> mean(lynx)
## [1] 1538.018
> accuracy(fit.arima)
##                    ME     RMSE     MAE       MPE     MAPE      MASE        ACF1
## Training set -1.60476 853.5499 610.132 -63.91502 140.8225 0.7343393 -0.01261722

RMSE和MAE都远小于均值。

> qqnorm(fit.arima$residuals)
> qqline(fit.arima$residuals)
残差QQ图

Ljung-Box test是对时间序列是否存在滞后相关的一种统计检验。
1、纯随机性检验,p值小于5%,序列为非白噪声;
2、用于检验某个时间段内的一系列观测值是不是随机的独立观测值。
LBQ检验的原假设和备择假设分别为 :
H0: 原本的数据都是独立的,即总体的相关系数为0,能观察到的某些相关仅仅产生于随机抽样的误差。
H1: 原本的数据不是独立的。

> Box.test(fit.arima$residuals, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  fit.arima$residuals
## X-squared = 0.01863, df = 1, p-value = 0.8914

p值大于0.05,接受原始假设,残差是独立不相关的。

1.4 预测

> yhat <- forecast(fit.arima, h = 10)
> plot(yhat)
预测猞猁的诱捕

2、预测外汇汇率

数据集:欧洲央行网站提供的欧元参考汇率历史数据库

> euro <- readr::read_csv("data_set/eurofxref-hist.csv")
> attr(euro, "spec") = NULL
> str(euro)
## tibble [5,584 × 43] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Date: Date[1:5584], format: "2020-10-23" "2020-10-22" "2020-10-21" "2020-10-20" ...
##  $ USD : num [1:5584] 1.19 1.18 1.19 1.18 1.18 ...
##  $ JPY : num [1:5584] 124 124 124 125 124 ...
##  $ BGN : num [1:5584] 1.96 1.96 1.96 1.96 1.96 ...
##  $ CYP : chr [1:5584] "N/A" "N/A" "N/A" "N/A" ...
##  $ CZK : num [1:5584] 27.2 27.2 27.2 27.2 27.3 ...
##  $ DKK : num [1:5584] 7.44 7.44 7.44 7.44 7.44 ...
##  $ EEK : chr [1:5584] "N/A" "N/A" "N/A" "N/A" ...
##  $ GBP : num [1:5584] 0.907 0.903 0.908 0.913 0.906 ...
##  $ HUF : num [1:5584] 364 365 364 366 365 ...
##  $ LTL : chr [1:5584] "N/A" "N/A" "N/A" "N/A" ...
##  $ LVL : chr [1:5584] "N/A" "N/A" "N/A" "N/A" ...
##  $ MTL : chr [1:5584] "N/A" "N/A" "N/A" "N/A" ...
##  $ PLN : num [1:5584] 4.58 4.58 4.57 4.58 4.57 ...
##  $ ROL : chr [1:5584] "N/A" "N/A" "N/A" "N/A" ...
##  $ RON : num [1:5584] 4.87 4.87 4.88 4.88 4.88 ...
##  $ SEK : num [1:5584] 10.4 10.4 10.4 10.4 10.4 ...
##  $ SIT : chr [1:5584] "N/A" "N/A" "N/A" "N/A" ...
##  $ SKK : chr [1:5584] "N/A" "N/A" "N/A" "N/A" ...
##  $ CHF : num [1:5584] 1.07 1.07 1.07 1.07 1.07 ...
##  $ ISK : chr [1:5584] "164.9" "164.6" "164.6" "164" ...
##  $ NOK : num [1:5584] 10.9 10.9 10.9 11 10.9 ...
##  $ HRK : num [1:5584] 7.58 7.58 7.58 7.58 7.58 ...
##  $ RUB : num [1:5584] 90.6 90.8 91.4 92 91.4 ...
##  $ TRL : chr [1:5584] "N/A" "N/A" "N/A" "N/A" ...
##  $ TRY : num [1:5584] 9.44 9.38 9.31 9.33 9.31 ...
##  $ AUD : num [1:5584] 1.66 1.66 1.67 1.68 1.66 ...
##  $ BRL : num [1:5584] 6.61 6.64 6.61 6.62 6.61 ...
##  $ CAD : num [1:5584] 1.56 1.56 1.56 1.56 1.55 ...
##  $ CNY : num [1:5584] 7.92 7.9 7.89 7.89 7.88 ...
##  $ HKD : num [1:5584] 9.19 9.16 9.19 9.15 9.13 ...
##  $ IDR : num [1:5584] 17410 17426 17342 17373 17348 ...
##  $ ILS : num [1:5584] 4 4 4.01 3.99 3.98 ...
##  $ INR : num [1:5584] 87.3 87.1 87.4 86.8 86.4 ...
##  $ KRW : num [1:5584] 1339 1342 1343 1346 1341 ...
##  $ MXN : num [1:5584] 24.8 25 24.9 25 24.8 ...
##  $ MYR : num [1:5584] 4.93 4.9 4.91 4.9 4.88 ...
##  $ NZD : num [1:5584] 1.77 1.77 1.79 1.8 1.78 ...
##  $ PHP : num [1:5584] 57.4 57.5 57.5 57.3 57.2 ...
##  $ SGD : num [1:5584] 1.61 1.6 1.61 1.6 1.6 ...
##  $ THB : num [1:5584] 37.1 37 37 37 36.7 ...
##  $ ZAR : num [1:5584] 19.2 19.3 19.4 19.5 19.4 ...
##  $ X43 : logi [1:5584] NA NA NA NA NA NA ...
##  - attr(*, "problems")= tibble [25,034 × 5] (S3: tbl_df/tbl/data.frame)
##   ..$ row     : int [1:25034] 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 ...
##   ..$ col     : chr [1:25034] "ILS" "ILS" "ILS" "ILS" ...
##   ..$ expected: chr [1:25034] "a double" "a double" "a double" "a double" ...
##   ..$ actual  : chr [1:25034] "N/A" "N/A" "N/A" "N/A" ...
##   ..$ file    : chr [1:25034] "'data_set/eurofxref-hist.csv'" "'data_set/eurofxref-hist.csv'" "'data_set/eurofxref-hist.csv'" "'data_set/eurofxref-hist.csv'" ...
> summary(euro$Date)
##      Min.      1st Qu.       Median         Mean      3rd Qu.         Max. 
##  "1999-01-04" "2004-06-17" "2009-11-26" "2009-11-26" "2015-05-13" "2020-10-23"  

数据框包含了多个不同货币的兑换汇率,这里选择只关注欧元对美元汇率的时间序列,然后将日期范围选小一点,因为只是为了学习。

> euro <- euro %>% 
+   dplyr::filter(Date <= as.Date("2013-12-31") & Date >= as.Date("2005-01-01")) %>% 
+   dplyr::arrange(Date) %>% 
+   dplyr::select(USD) %>% 
+   ts()
## Error in filter(., Date <= as.Date("2013-12-31") & Date >= as.Date("2005-01-01")): 找不到对象'Date'
> plot.ts(euro)
欧元对美元汇率

2.1 建模

> tune.euro <- auto.arima(euro)
> tune.euro
## Series: euro 
## ARIMA(0,1,0) 
## 
## sigma^2 estimated as 7.432e-05:  log likelihood=7682.92
## AIC=-15363.85   AICc=-15363.85   BIC=-15358.11
> p_load(fGarch)
> fit.garch <- garchFit(~ arma(0, 1, 0) + garch(1, 1),
+                       data = euro, trace = F)
> fit.garch
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~arma(0, 1, 0) + garch(1, 1), data = euro, 
##     trace = F) 
## 
## Mean and Variance Equation:
##  data ~ arma(0, 1, 0) + garch(1, 1)
## <environment: 0x556a5e183750>
##  [data = euro]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##         mu       omega      alpha1       beta1  
## 1.3147e+00  3.9825e-05  7.8011e-01  2.1459e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## mu     1.315e+00   1.152e-03 1141.628  < 2e-16 ***
## omega  3.982e-05   6.853e-06    5.812 6.19e-09 ***
## alpha1 7.801e-01   5.122e-02   15.230  < 2e-16 ***
## beta1  2.146e-01   4.507e-02    4.761 1.93e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  3677.615    normalized:  1.595495 
## 
## Description:
##  Mon Oct 26 22:06:07 2020 by user:

2.2 预测

> predict(fit.garch, n.ahead = 20, plot = T)
预测汇率
##    meanForecast  meanError standardDeviation lowerInterval upperInterval
## 1      1.314653 0.06447943        0.06447943      1.188276      1.441031
## 2      1.314653 0.06461752        0.06461752      1.188005      1.441301
## 3      1.314653 0.06475460        0.06475460      1.187737      1.441570
## 4      1.314653 0.06489066        0.06489066      1.187470      1.441837
## 5      1.314653 0.06502571        0.06502571      1.187205      1.442101
## 6      1.314653 0.06515978        0.06515978      1.186942      1.442364
## 7      1.314653 0.06529286        0.06529286      1.186682      1.442625
## 8      1.314653 0.06542497        0.06542497      1.186423      1.442884
## 9      1.314653 0.06555612        0.06555612      1.186166      1.443141
## 10     1.314653 0.06568631        0.06568631      1.185910      1.443396
## 11     1.314653 0.06581556        0.06581556      1.185657      1.443649
## 12     1.314653 0.06594387        0.06594387      1.185406      1.443901
## 13     1.314653 0.06607126        0.06607126      1.185156      1.444151
## 14     1.314653 0.06619773        0.06619773      1.184908      1.444398
## 15     1.314653 0.06632329        0.06632329      1.184662      1.444645
## 16     1.314653 0.06644796        0.06644796      1.184418      1.444889
## 17     1.314653 0.06657173        0.06657173      1.184175      1.445131
## 18     1.314653 0.06669462        0.06669462      1.183934      1.445372
## 19     1.314653 0.06681663        0.06681663      1.183695      1.445611
## 20     1.314653 0.06693778        0.06693778      1.183458      1.445849

预测结果显示,这个序列会在未来一段时间内略微衰减。

上一篇下一篇

猜你喜欢

热点阅读