# 1102計量經濟學(二)期末報告《匯率預測》#######

# Packages ######## 
library(forecast)
## Warning: package 'forecast' was built under R version 4.0.5
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(tseries)
library(readr)
library(readxl)
library(ggplot2)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.0.5
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(pander)
## Warning: package 'pander' was built under R version 4.0.5
# Import Data #######
df <- read_xlsx("~/Desktop/Econometrics/data_第12組.xlsx")

# Plot #######
plot(x = df$month, y = df$E, type = "l",
     main = "Nominal Exchange Rate Trend (2011.1-2022.3)",
     xlab = "Year", ylab = " Nominal Exchange Rate")

plot(x = df$month, y = df$E_real, type = "l", 
     main = "Real Exchange Rate Trend (2011.1-2022.3)",
     xlab = "Year", ylab = "Real Exchange Rate")

# Real Exchange Rate ######
# Augmented Dickey-Fuller Test (Unit Root Test) #######
df$E_real %>% 
        na.omit %>% 
        adf.test %>% 
        pander
Augmented Dickey-Fuller Test: .
Test statistic Lag order P value Alternative hypothesis
-2.264 5 0.4668 stationary
# First-Order Difference
df <- df %>% 
        mutate(dE_real = c(NA, diff(E_real)))

df$dE_real %>% 
        na.omit %>% 
        adf.test %>% 
        pander
## Warning in adf.test(.): p-value smaller than printed p-value
Augmented Dickey-Fuller Test: .
Test statistic Lag order P value Alternative hypothesis
-4.374 5 0.01 * * stationary
# Box-Pierce and Ljung-Box Tests (White Noise Test) #######
df$dE_real %>% 
        na.omit %>% 
        Box.test(type = "Ljung-Box") %>% 
        pander
Box-Ljung test: .
Test statistic df P value
5.767 1 0.01633 *
# Find Best ARIMA #######
md_r <- auto.arima(df$E_real)
auto.arima(df$E_real, trace = TRUE)
## 
##  ARIMA(2,1,2) with drift         : 87.08205
##  ARIMA(0,1,0) with drift         : 86.2018
##  ARIMA(1,1,0) with drift         : 82.1572
##  ARIMA(0,1,1) with drift         : 82.62584
##  ARIMA(0,1,0)                    : 84.85514
##  ARIMA(2,1,0) with drift         : 84.27802
##  ARIMA(1,1,1) with drift         : 84.28061
##  ARIMA(2,1,1) with drift         : Inf
##  ARIMA(1,1,0)                    : 80.57237
##  ARIMA(2,1,0)                    : 82.66264
##  ARIMA(1,1,1)                    : 82.66414
##  ARIMA(0,1,1)                    : 81.0765
##  ARIMA(2,1,1)                    : Inf
## 
##  Best model: ARIMA(1,1,0)
## Series: df$E_real 
## ARIMA(1,1,0) 
## 
## Coefficients:
##          ar1
##       0.2219
## s.e.  0.0870
## 
## sigma^2 = 0.1044:  log likelihood = -38.24
## AIC=80.48   AICc=80.57   BIC=86.28
accuracy(md_r)
##                      ME      RMSE       MAE        MPE      MAPE      MASE
## Training set 0.02040839 0.3206395 0.2488294 0.06229534 0.7948412 0.9520995
##                      ACF1
## Training set -0.002464701
# Forecasting ######

forecast(md_r, 10)
##     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## 136       32.65785 32.24386 33.07185 32.02470 33.29100
## 137       32.70500 32.05132 33.35868 31.70528 33.70471
## 138       32.71546 31.87627 33.55465 31.43203 33.99889
## 139       32.71778 31.72482 33.71074 31.19918 34.23639
## 140       32.71830 31.59190 33.84469 30.99562 34.44097
## 141       32.71841 31.47270 33.96413 30.81325 34.62357
## 142       32.71844 31.36385 34.07302 30.64678 34.79009
## 143       32.71844 31.26311 34.17377 30.49270 34.94418
## 144       32.71844 31.16890 34.26799 30.34862 35.08827
## 145       32.71844 31.08009 34.35680 30.21280 35.22409
plot(forecast(md_r, 10),
     xlab = 'month', ylab = 'real exchange rate',
     main='Real Exchange Rate Forecast from ARIMA(1,1,0)',
     sub = "t = 10")

# Nominal Exchange Rate #########

# Augmented Dickey-Fuller Test######
df$E %>% 
        na.omit %>% 
        adf.test %>% 
        pander
Augmented Dickey-Fuller Test: .
Test statistic Lag order P value Alternative hypothesis
-1.691 5 0.7052 stationary
df <- df %>% 
        mutate(dE = c(NA, diff(E)))

df$dE %>% 
        na.omit %>% 
        adf.test %>% 
        pander
## Warning in adf.test(.): p-value smaller than printed p-value
Augmented Dickey-Fuller Test: .
Test statistic Lag order P value Alternative hypothesis
-4.93 5 0.01 * * stationary
# Box-Pierce and Ljung-Box Tests#######
df$dE %>% 
        na.omit %>% 
        Box.test(type = "Ljung-Box") %>% 
        pander
Box-Ljung test: .
Test statistic df P value
22.69 1 1.908e-06 * * *
md_n <- auto.arima(df$E)
auto.arima(df$E, trace = T) 
## 
##  ARIMA(2,1,2) with drift         : Inf
##  ARIMA(0,1,0) with drift         : 49.37992
##  ARIMA(1,1,0) with drift         : 26.48812
##  ARIMA(0,1,1) with drift         : 25.3912
##  ARIMA(0,1,0)                    : 47.44342
##  ARIMA(1,1,1) with drift         : 26.80114
##  ARIMA(0,1,2) with drift         : 26.95079
##  ARIMA(1,1,2) with drift         : Inf
##  ARIMA(0,1,1)                    : 23.36598
##  ARIMA(1,1,1)                    : 24.72466
##  ARIMA(0,1,2)                    : 24.87963
##  ARIMA(1,1,0)                    : 24.4267
##  ARIMA(1,1,2)                    : Inf
## 
##  Best model: ARIMA(0,1,1)
## Series: df$E 
## ARIMA(0,1,1) 
## 
## Coefficients:
##          ma1
##       0.4444
## s.e.  0.0771
## 
## sigma^2 = 0.06801:  log likelihood = -9.64
## AIC=23.27   AICc=23.37   BIC=29.07
# Forecasting ######
forecast(md_n, 10)
##     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## 136       28.64073 28.30652 28.97494 28.12960 29.15187
## 137       28.64073 28.05359 29.22788 27.74277 29.53869
## 138       28.64073 27.88061 29.40085 27.47823 29.80323
## 139       28.64073 27.74028 29.54119 27.26361 30.01786
## 140       28.64073 27.61904 29.66242 27.07819 30.20328
## 141       28.64073 27.51073 29.77073 26.91255 30.36892
## 142       28.64073 27.41194 29.86953 26.76145 30.52001
## 143       28.64073 27.32051 29.96095 26.62163 30.65983
## 144       28.64073 27.23502 30.04644 26.49089 30.79058
## 145       28.64073 27.15444 30.12702 26.36765 30.91381
plot(forecast(md_n, 10),
     xlab = 'month', ylab = 'real exchange rate',
     main='Nominal Exchange Rate Forecast from ARIMA(0, 1, 1)',
     sub = "t = 10")

# ARIMA(1, 1, 1)#######

# real exchange rate
md_r_111 <- arima(df$E_real, order=c(1, 1, 1))
plot(forecast(md_r_111, 10), xlab = 'month', ylab = 'real exchange rate',
     main = ' Alternative Real Exchange Rate Forecast from ARIMA(1,1,1)',
     sub = "t = 10")

# nominal exchange rate
md_n_111 <- arima(df$E, order = c(1, 1, 1))
plot(forecast(md_n_111, 10), xlab = 'month', ylab = 'nominal exchange rate',  
     main=' Alternative Nominal Exchange Rate Forecast from ARIMA(1,1,1)',
     sub = "t = 10")

# Output #######
md_r_110 <- arima(df$E_real, order = c(1, 1, 0))
md_n_011 <- arima(df$E, order = c(0, 1, 1))

stargazer::stargazer(md_r_110, md_r_111 , md_n_011, md_n_111,
                     dep.var.labels = rep(c("exchange rate", "real exchange rate"), each = 2),
                     type = "html", title = "ARIMA model", out = "result.doc")
## 
## <table style="text-align:center"><caption><strong>ARIMA model</strong></caption>
## <tr><td colspan="5" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"></td><td colspan="4"><em>Dependent variable:</em></td></tr>
## <tr><td></td><td colspan="4" style="border-bottom: 1px solid black"></td></tr>
## <tr><td style="text-align:left"></td><td>exchange rate</td><td>exchange rate</td><td>real exchange rate</td><td>real exchange rate</td></tr>
## <tr><td style="text-align:left"></td><td>(1)</td><td>(2)</td><td>(3)</td><td>(4)</td></tr>
## <tr><td colspan="5" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">ar1</td><td>0.222<sup>**</sup></td><td>0.212</td><td></td><td>0.193</td></tr>
## <tr><td style="text-align:left"></td><td>(0.087)</td><td>(0.278)</td><td></td><td>(0.213)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td style="text-align:left">ma1</td><td></td><td>0.010</td><td>0.444<sup>***</sup></td><td>0.277</td></tr>
## <tr><td style="text-align:left"></td><td></td><td>(0.276)</td><td>(0.077)</td><td>(0.213)</td></tr>
## <tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td></tr>
## <tr><td colspan="5" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Observations</td><td>134</td><td>134</td><td>134</td><td>134</td></tr>
## <tr><td style="text-align:left">Log Likelihood</td><td>-38.240</td><td>-38.240</td><td>-9.637</td><td>-9.270</td></tr>
## <tr><td style="text-align:left">sigma<sup>2</sup></td><td>0.104</td><td>0.104</td><td>0.067</td><td>0.067</td></tr>
## <tr><td style="text-align:left">Akaike Inf. Crit.</td><td>80.481</td><td>82.480</td><td>23.274</td><td>24.540</td></tr>
## <tr><td colspan="5" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"><em>Note:</em></td><td colspan="4" style="text-align:right"><sup>*</sup>p<0.1; <sup>**</sup>p<0.05; <sup>***</sup>p<0.01</td></tr>
## </table>
# 4 Plots in one ######

par(mfrow = c(2, 2))

plot(forecast(md_r, 10),
     xlab = 'month', ylab = 'real exchange rate',
     main='Real Exchange Rate Forecast from ARIMA(1,1,0)',
     sub = "t = 10")

plot(forecast(md_r_111, 10), xlab = 'month', ylab = 'real exchange rate',
     main = ' Alternative Real Exchange Rate Forecast from ARIMA(1,1,1)',
     sub = "t = 10")

plot(forecast(md_n, 10),
     xlab = 'month', ylab = 'real exchange rate',
     main='Nominal Exchange Rate Forecast from ARIMA(0, 1, 1)',
     sub = "t = 10")

plot(forecast(md_n_111, 10), xlab = 'month', ylab = 'nominal exchange rate',  
     main=' Alternative Nominal Exchange Rate Forecast from ARIMA(1,1,1)',
     sub = "t = 10")

par(mfrow = c(1, 1))