美文网首页R炒面
91-预测分析-R语言实现-时间序列2

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

作者: wonphen | 来源:发表于2020-10-26 22:56 被阅读0次
    > 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
    

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

    相关文章

      网友评论

        本文标题:91-预测分析-R语言实现-时间序列2

        本文链接:https://www.haomeiwen.com/subject/ceozmktx.html