In this project, we evaluate different models for forecasting one-month-ahead inflation in order to build a time series of real interest rates on a monthly basis. In particular, we compare the predictive accuracy between two models: AR(1) and Simple Exponential Smoothing (SES). We evaluate the predictive accuracy of one-year-ahead forecasts using roll-forward partioning, where the training window is expanded by one observation for each one-year-ahead forecast. Throughout this process, we attempt to find the optimal learning rate, alpha, for SES.
Our results reveal that AR(1) performs significantly better than SES for one-step ahead forecasts, while SES is more accurate for long-term forecasts.
Finally, we plot a time series of real interest rates, in which the values from the roll-forward AR(1) and SES forecasts are used as proxies for expected inflation. In other words, the real rate at time \(t\) is computed by subtracting forecasted inflation at time \(t+1\) from the nominal rate at time \(t\)
Monthly 10-Year Treasury yield (Constant Maturity) from April 1953 to October 2018
Monthly 5-Year Treasury yield (Constant Maturity) from April 1953 to October 2018
Monthly 3-Year Treasury yield (Constant Maturity) from April 1953 to October 2018
Monthly 1-Year Treasury yield (Constant Maturity) from April 1953 to October 2018
Monthly Seasonally adjusted CPI from January 1947 to November 2018
Monthly annualized inflation from Jan 1948 to Nov 2018, which is derived by computing the change in CPI of a given month, \(m\), from year \(y-1\) to year \(y\), like so: \(inflation_{m,y} = \log(CPI_{m,y}) - \log(CPI_{m,y-1})\)
Initially, the data frame \(rates\) is used to store 18 variables:
\(date\), which stores monthly dates from April 1953 to October 2018
\(tcmnom\)_\(y10\), the 10-Year Treasury Yield (CM) used as a proxy for the nominal rate
\(tcmnom\)_\(y5\), the 5-Year Treasury Yield (CM)
\(tcmnom\)_\(y3\), the 3-Year Treasury Yield (CM)
\(tcmnom\)_\(y1\), the 1-Year Treasury Yield (CM)
\(pi.realized\) stores the one-month-ahead inflation rate relative to the nominal rate (i.e. inflation at \(t+1\)), from April 1953 to October 2018
\(r\)_\(y10\), the 10-Year realized real interest rate from April 1953 to October 2018, which is computed the following way: tcmnom_y10 - pi.realized
\(r\)_\(y5\), the 5-Year realized real interest rate
\(r\)_\(y3\), the 3-Year realized real interest rate
\(r\)_\(y1\), the 1-Year realized real interest rate
\(r\)_\(y10.ar1.roll\) stores the 10-Y real rate forecasted using one-month-ahead AR(1) forecasts of inflation with roll-forward partioning
\(r\)_\(y10.ses.roll\) stores the 10-Year real rate forecasted using one-month-ahead Simple Exponential Smoothing forecasts of inflation with roll-forward partioning
\(r\)_\(y5.ar1.roll\) stores the forecasted 5-Y real rate using AR(1)
\(r\)_\(y5.ses.roll\) stores the forecasted 5-Y real rate using SES
\(r\)_\(y3.ar1.roll\) stores the forecasted 3-Y real rate using AR(1)
\(r\)_\(y3.ses.roll\) stores the forecasted 3-Y real rate using SES
\(r\)_\(y1.ar1.roll\) stores the forecasted 1-Y real rate using AR(1)
\(r\)_\(y1.ses.roll\) stores the forecasted 1-Y real rate using SES
In order to build a time series of real interest rates, we attempt to find the best model for predicting inflation based on litterature and statistical testing. Autocorrelation plots as well as the Dickey-Fuller test suggest that inflation follows an AR(1) process with time trend. We wanted to test this against a Simple Exponential Smoothing (SES) model knowing that stationary models of inflation tend to perform worse than models which account for a time varying mean (“Forecasting Inflation”" by Faust and Wright). In our case, the learning rate of SES, alpha, is set to a default value of 0.2.
We first estimate an AR(1) and a SES model on inflation. The Diebold-Mariano test reveals that AR(1) performs significantly better than SES.
Then, we measure long-term forecasting accuracy of AR(1) and SES using fixed partioning (i.e. the training set is fixed throughout the forecast horizon). The forecast horizon spans from December 1993 up to November 2018 (300-month-ahead forecast). SES was found to perform significantly better than AR(1).
Roll-forward partioning was used next to forecast one-month-ahead inflation from May 1953 to November 2018. With roll-forward partioning, the size of the training set increases by one for each one-year-ahead forecast as we add the next observed (realized) datapoint to the set. Roll-forward partitioning enables us to generate multiple one-year-ahead forecasts and thus gain a more accurate understanding of how the forecast peforms on average In this case, AR(1) was significantly more accurate then SES.
Finally, we plot four graphs for every type of interest rates (10Y, 5Y, 3Y, & 1Y), each of which contains the following curves from April 1953 to October 2018:
the realized real rate (nominal rate minus one-month-ahead realized inflation)
the forecasted real rate using AR(1) roll-forward forecasts of inflation
the forecasted real rate using SES roll-forward forecasts of inflation
In the graph above, the real rate at month \(m\) is computed by subtracting the realized inflation at \(m+1\) from the nominal rate at month \(m\).
1. Plotting Realized Inflation
Geometric decay of the Acf suggests an AR process
Large Significant autocorrelation at lag 1 suggests an AR(1) as well
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression trend
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + tt + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.0998 -0.1936 0.0100 0.2020 2.3811
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.630e-02 3.309e-02 1.701 0.089269 .
## z.lag.1 -1.794e-02 4.913e-03 -3.652 0.000276 ***
## tt 4.069e-12 5.541e-05 0.000 1.000000
## z.diff.lag 3.939e-01 3.150e-02 12.506 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3938 on 845 degrees of freedom
## Multiple R-squared: 0.1636, Adjusted R-squared: 0.1606
## F-statistic: 55.08 on 3 and 845 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -3.6522 4.529 6.7291
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau3 -3.96 -3.41 -3.12
## phi2 6.09 4.68 4.03
## phi3 8.27 6.25 5.34
Dickey-Fuller Test Number 3 (null = Random walk + drift, alternative = stationary AR(1) + time trend ) reveals no unit root which is significant at a 1% level, therefore, the inflation series follows a stationary AR(1) with time trend.
## Series: pi.ts
## ARIMA(4,0,0) with non-zero mean
##
## Coefficients:
## ar1 ar2 ar3 ar4 mean
## 1.3677 -0.3621 0.0056 -0.0276 3.5744
## s.e. 0.0343 0.0590 0.0610 0.0358 0.7922
##
## sigma^2 estimated as 0.156: log likelihood=-416.43
## AIC=844.86 AICc=844.95 BIC=873.33
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set -0.006893601 0.3937475 0.2722055 -Inf Inf 0.1684159 -0.008301311
Model selection using BIC suggests an AR(4)
2. Comparing Ar(1) with Simple Exponential Smoothing (SES)
## [1] "RMSE for AR(1):"
## [1] 0.4290825
## [1] "RMSE for SES:"
## [1] 1.027951
## [1] "RMSE for AR(4):"
## [1] 0.3937475
##
## Diebold-Mariano Test
##
## data: ar1.mod$residualsses.mod$residuals
## DM = -10.163, Forecast horizon = 1, Loss function power = 2, p-value <
## 2.2e-16
## alternative hypothesis: two.sided
RMSE of AR(1) is 0.492 which is much lower than that of SES (RMSE= 1.028). The Diebold-Mariano test shows a significant difference in accuracy between both models at a 5% lvl (p-value for two-sided test < 2.2e-16). No rate of alpha could change this significance.
#perform Diebold-Mariano test on ar(1) vs ar(4)
dm.test(ar1.mod$residuals, ar4.mod$residuals)
##
## Diebold-Mariano Test
##
## data: ar1.mod$residualsar4.mod$residuals
## DM = 3.2659, Forecast horizon = 1, Loss function power = 2, p-value =
## 0.001135
## alternative hypothesis: two.sided
RMSE of AR(4) (0.394) is lower than that of AR(1) (0.492). This difference is significant at a 5% level
1. 300-month-ahead Forecast with fixed partitioning (forecast horizon: Dec 1993 to Nov 2018)
## [1] "RMSE of AR(1) forecast:"
## [1] 2.181206
## [1] "RMSE of SES forecast:"
## [1] 1.284839
##
## Diebold-Mariano Test
##
## data: ar1.fixed$residualsses.fixed$residuals
## DM = -8.9884, Forecast horizon = 1, Loss function power = 2, p-value <
## 2.2e-16
## alternative hypothesis: two.sided
RMSE for SES is lower than for AR(1). D-M test reveals a significant difference in accuracy at a 5% lvl.
2. One-month-ahead Forecasting with Roll-Forward partitioning (horizon: May 1953 to Nov 2018)
## [1] "RMSE for recursive AR(1)"
## [1] 0.3564117
## [1] "RMSE for recursive SES"
## [1] 0.7984016
##
## Diebold-Mariano Test
##
## data: valid.roll - ar1.rollvalid.roll - ses.roll
## DM = -13.252, Forecast horizon = 1, Loss function power = 2, p-value <
## 2.2e-16
## alternative hypothesis: two.sided
In this case, RMSE for AR(1) is lower than for SES, and this difference significant at a 5% lvl.
Conclusion: one-month-ahead forecasts using AR(1) significantly outperform the SES model,while SES performs significantly better for long-term forecasts (300-month-ahead).
In the graph above we can see the nominal rate plotted against the realized real rate as well as the forecasted real rates. For each forecasted real rate (AR(1) & SES), the value of \(r\) at month \(m\) is computed by subtracting forecasted inflation at month \(m+1\) from the nominal rate at month \(m\).