14.4 Can You Beat the Market? (Part I)
The theory of efficient capital markets states that stock prices embody all currently available information. If this hypothesis holds, it should not be possible to estimate a useful model for forecasting future stock returns using publicly available information on past returns (this is also referred to as the weak-form efficiency hypothesis): if it was possible to forecast the market, traders would be able to arbitrage, e.g., by relying on an AR(\(2\)) model, they would use information that is not already priced-in which would push prices until the expected return is zero.
This idea is presented in the box Can You Beat the Market? (Part I) on p. 582 of the book. This section reproduces the estimation results.
We start by importing monthly data from 1931:1 to 2002:12 on excess returns of a broad-based index of stock prices, the CRSP value-weighted index. The data are provided by the authors of the book as an excel sheet which can be downloaded here.
# read in data on stock returns
SReturns <- read_xlsx("Data/Stock_Returns_1931_2002.xlsx",
sheet = 1,
col_types = "numeric")
#Alternatively, ASC cen be read directly from internet.
SReturns <- read.csv("https://www.princeton.edu/~mwatson/Stock-Watson_3u/Students/EE_Datasets/Stock_Returns_1931_2002.asc",
sep = "\t", header = FALSE )
colnames(SReturns) <- c( "Year", "Month", "ExReturn", "ln_DivYield" )
We continue by converting the data to an object of class ts.
# convert to ts object
StockReturns <- ts(SReturns[, 3:4],
start = c(1931, 1),
end = c(2002, 12),
frequency = 12)
Next, we estimate AR(\(1\)), AR(\(2\)) and AR(\(4\)) models of excess returns for the time period 1960:1 to 2002:12.
# estimate AR models:
# AR(1)
SR_AR1 <- dynlm(ExReturn ~ L(ExReturn),
data = StockReturns, start = c(1960, 1), end = c(2002, 12))
# AR(2)
SR_AR2 <- dynlm(ExReturn ~ L(ExReturn) + L(ExReturn, 2),
data = StockReturns, start = c(1960, 1), end = c(2002, 12))
# AR(4)
SR_AR4 <- dynlm(ExReturn ~ L(ExReturn) + L(ExReturn, 2:4),
data = StockReturns, start = c(1960, 1), end = c(2002, 12))
After computing robust standard errors, we gather the results in a table generated by stargazer().
# compute robust standard errors
rob_se <- list(sqrt(diag(sandwich(SR_AR1))),
sqrt(diag(sandwich(SR_AR2))),
sqrt(diag(sandwich(SR_AR4))))
# generate table using 'stargazer()'
stargazer(SR_AR1, SR_AR2, SR_AR4,
title = "Autoregressive Models of Monthly Excess Stock Returns",
header = FALSE,
model.numbers = F,
omit.table.layout = "n",
digits = 3,
column.labels = c("AR(1)", "AR(2)", "AR(4)"),
dep.var.caption = "Dependent Variable: Excess Returns on the CSRP Value-Weighted Index",
dep.var.labels.include = FALSE,
covariate.labels = c("$excess return_{t-1}$", "$excess return_{t-2}$",
"$excess return_{t-3}$", "$excess return_{t-4}$",
"Intercept"),
se = rob_se,
omit.stat = "rsq")
Dependent Variable: Excess returns on the CSRP Value-Weighted Index | |||
AR(1) | AR(2) | AR(4) | |
excess returnt-1 | 0.050 | 0.053 | 0.054 |
(0.051) | (0.051) | (0.051) | |
excess returnt-2 | -0.053 | ||
(0.048) | |||
excess returnt-3 | -0.054 | ||
(0.048) | |||
excess returnt-4 | 0.009 | ||
(0.050) | |||
Intercept | -0.016 | ||
(0.047) | |||
Constant | 0.312 | 0.328* | 0.331 |
(0.197) | (0.199) | (0.202) | |
Observations | 516 | 516 | 516 |
Adjusted R2 | 0.001 | 0.001 | -0.002 |
Residual Std. Error | 4.334 (df = 514) | 4.332 (df = 513) | 4.340 (df = 511) |
F Statistic | 1.306 (df = 1; 514) | 1.367 (df = 2; 513) | 0.721 (df = 4; 511) |
Table 14.1: Autoregressive Models of Monthly Excess Stock Returns
The results are consistent with the hypothesis of efficient financial markets: there are no statistically significant coefficients in any of the estimated models and the hypotheses that all coefficients are zero cannot be rejected. \(\bar{R}^2\) is almost zero in all models and even negative for the AR(\(4\)) model. This suggests that none of the models are useful for forecasting stock returns.