Cointegration is a statistical trend that occurs when two variables which are not stationary tend to follow a similar path. This would mean that the long-run properties of consumption and GNP are the same at frequency zero. Since consumption is nearly a random walk, its long-run properties are almost the same as its short-run properties, and thus easy to estimate and it is stable over long time periods.
Dividend/ price ratios forecast returns better than lagged returns, while dividends are nearly a random walk. Therefore, price shocks with constant dividends are almost entirely transitory. This would mean that changes in dividends implies greater earning capabilities, so stock prices are tied in that way to reflect the price.
He explains that transitory variation requires long-term forecasting to find strong GDP data. To do this, he uses GDP and consumption growth as his two-variable auto-regressions.
Returns revert to their mean, and prices revert too. Thus, a discount rate or expected return shock gives rise to a transitory price shock with no change in dividends, just like the “price” shock in the VAR. No change in dividends means there would be no change in long-term earnings.
Given that consumption is a ‘random walk’, if consumption does not change then we can assume that any change in GDP would be considered transitory.
Consumption, which is usually a transitory shock accounts for 70-80% of the variance in GDP growth. As such, it is the main factor and ‘driving force’ for GDP. The consumption/ GNP ratio is a much more potent forecaster of long-horizon GNP growth. Thus, it can imply much larger transitory variation.
1. Download packages and prepare the data.
library(dplyr); library(ggplot2); library(vars); library(tsDyn)
CG <- read.csv("HW11.csv")
summary(CG)
## CONS GDP
## Min. : 39906 Min. : 59297
## 1st Qu.: 74742 1st Qu.:111966
## Median :115634 Median :162845
## Mean :131401 Mean :188128
## 3rd Qu.:181135 3rd Qu.:263120
## Max. :278333 Max. :394245
2. Create a new dataset that is the natural log of the old data set.
ln_CG <- log(CG)
summary(ln_CG)
## CONS GDP
## Min. :10.59 Min. :10.99
## 1st Qu.:11.22 1st Qu.:11.63
## Median :11.66 Median :12.00
## Mean :11.64 Mean :12.01
## 3rd Qu.:12.11 3rd Qu.:12.48
## Max. :12.54 Max. :12.88
3. Create another new dataset that is differenced.
lag_CG <- ln_CG %>%
mutate(d.GDP = c(NA, diff(GDP)), d.CONS = c(NA, diff(CONS))) %>%
filter(!is.na(d.GDP)) %>%
dplyr::select(-GDP, -CONS)
4. Fit a vector autoregression to the two series. After fitting the model, run a Akaike Information Criterion test. How many lags should you include?
Var <- VAR(lag_CG, p = 4, type = "const")
summary(Var)
##
## VAR Estimation Results:
## =========================
## Endogenous variables: d.GDP, d.CONS
## Deterministic variables: const
## Sample size: 214
## Log Likelihood: 2062.538
## Roots of the characteristic polynomial:
## 0.8301 0.8301 0.7506 0.7506 0.7448 0.7448 0.3577 0.3577
## Call:
## VAR(y = lag_CG, p = 4, type = "const")
##
##
## Estimation results for equation d.GDP:
## ======================================
## d.GDP = d.GDP.l1 + d.CONS.l1 + d.GDP.l2 + d.CONS.l2 + d.GDP.l3 + d.CONS.l3 + d.GDP.l4 + d.CONS.l4 + const
##
## Estimate Std. Error t value Pr(>|t|)
## d.GDP.l1 1.7335879 0.0727865 23.817 < 2e-16 ***
## d.CONS.l1 0.0991276 0.0951557 1.042 0.2988
## d.GDP.l2 -1.5608698 0.1346210 -11.595 < 2e-16 ***
## d.CONS.l2 -0.1334362 0.1617298 -0.825 0.4103
## d.GDP.l3 0.7312048 0.1346461 5.431 1.58e-07 ***
## d.CONS.l3 0.1835334 0.1616950 1.135 0.2577
## d.GDP.l4 -0.1375845 0.0731228 -1.882 0.0613 .
## d.CONS.l4 -0.1366979 0.0936436 -1.460 0.1459
## const 0.0019146 0.0004813 3.978 9.64e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.00235 on 205 degrees of freedom
## Multiple R-Squared: 0.8615, Adjusted R-squared: 0.8561
## F-statistic: 159.3 on 8 and 205 DF, p-value: < 2.2e-16
##
##
## Estimation results for equation d.CONS:
## =======================================
## d.CONS = d.GDP.l1 + d.CONS.l1 + d.GDP.l2 + d.CONS.l2 + d.GDP.l3 + d.CONS.l3 + d.GDP.l4 + d.CONS.l4 + const
##
## Estimate Std. Error t value Pr(>|t|)
## d.GDP.l1 0.1091701 0.0561798 1.943 0.053358 .
## d.CONS.l1 1.5481375 0.0734453 21.079 < 2e-16 ***
## d.GDP.l2 -0.0698928 0.1039063 -0.673 0.501926
## d.CONS.l2 -1.3767311 0.1248301 -11.029 < 2e-16 ***
## d.GDP.l3 -0.0160339 0.1039257 -0.154 0.877539
## d.CONS.l3 0.7186024 0.1248032 5.758 3.08e-08 ***
## d.GDP.l4 0.0709825 0.0564394 1.258 0.209939
## d.CONS.l4 -0.1297361 0.0722782 -1.795 0.074134 .
## const 0.0013219 0.0003715 3.558 0.000464 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.001814 on 205 degrees of freedom
## Multiple R-Squared: 0.8328, Adjusted R-squared: 0.8263
## F-statistic: 127.7 on 8 and 205 DF, p-value: < 2.2e-16
##
##
##
## Covariance matrix of residuals:
## d.GDP d.CONS
## d.GDP 5.522e-06 1.512e-06
## d.CONS 1.512e-06 3.290e-06
##
## Correlation matrix of residuals:
## d.GDP d.CONS
## d.GDP 1.0000 0.3547
## d.CONS 0.3547 1.0000
Lag order selection procedures improve the accuracy of impulse response estimates. The most common strategy in empirical studies is to select the lag-order by some pre-specified criterion and to condition on this estimate in constructing the impulse response estimates (Ventzislav & Lutz 2005). If the variable in question has a long lasting impact on today’s values, more lags will be necessary. We chose 4 lags because a year seems to be a reasonable estimate of lasting impact.
5. Generate some impulse responses. Interpret the plots.
irfs <- irf(Var)
plot(irfs)
The plot shows us that GDP reaches a peak after 1 standard deviation shock then rapidly decreases reaching a low after 5 quarters. Consumption on the other hand fluctuates up and down as time goes on.
6. Fit a vector error correction model and generate irfs again. Is there any substantial difference?
vecm1 <- VECM(data= lag_CG, lag = 4, r = 1, include = "const", estim = "ML", beta = 0)
irfs2 <- irf(vecm1)
plot(irfs2)
The graphs show little difference between them, if anything there is less of an impact from consumption after fitting the vector error correction model.
7. Generate forecasts for GDP and consumption growth over the next year. Plot these predictions.
CG_pred <- predict(Var, n.ahead = 4)
plot(CG_pred)
References: