Archive

Tag Archives: campbell shiller

The point of the Campbell-Shiller present value identity is to quantitatively illustrate how variance in dividend yields must be matched by the variable’s ability to forecast returns and/or dividend growth.

nn

The price-dividend ratio can move if and only if there is corresponding news about current dividends,future dividend growth or future returns. If returns and dividend growth are totally unpredictable (i.e. if at every time (t), a trader’s expectation of future dividend growth and returns are constant), then p(t)-d(t) must be constant. Since dividend yields are demonstrably varying over time, asset markets cannot feature both unpredictable dividends and unpredictable returns.

The previous post examined how the introduction of new variables (dividend yield) and long horizon regressions (k=1:15) overturned previously cherished beliefs about the unpredictability of returns. While the results can be (and were) framed in the context of the Campbell-Shiller identity, we have not really tested the identity’s implications empirically.We have neither run infinite order regressions on log variables :

fg

nor determined that the long-run return and dividend growth regression coefficients mechanically add up to one :

kk

I have merely shown how returns (which should be unpredictable) are increasingly forecastable at longer horizons on the basis of the dividend yield, and how dividend growth (which should be forecastable) eludes forecastability at any horizon by the same measure. In the following code snippet I have transformed the raw variables into logs, compounded the return and dividend growth variables across a finite horizon (1:15 as before) before using them as inputs to the set of long-run regressions. Since one cannot actually run infinitely long regressions,I used the VAR’s implications for infinite period forecasts to determine the long-run coefficient of the return regression :

 ccc

The code follows :

#####################################################################################
# Long-run forecasts using Campbell Shiller identity
#####################################################################################

idx.list dg.list idx.reg dg.reg
idx.list[[1]] dg.list[[1]] <-log.dg

for(i in 2:15){
 idx.list[[i]]=LogCompound(log.ret,i)
 dg.list[[i]]=LogCompound(log.dg,i)
}

for(i in 1:15){
  temp=cbind(idx.list[[i]],lag(log.dp,-1)[1:length(idx.list[[i]])])
  temp2=cbind(dg.list[[i]],lag(log.dp,-1)[1:length(dg.list[[i]])])
  idx.reg[[i]]=lm(temp[,1]~temp[,2])
  dg.reg[[i]]=lm(temp2[,1]~temp2[,2])
}

idx.coef=sapply(idx.reg,coef)[2,]
dg.coef=sapply(dg.reg,coef)[2,]
coef.diff=idx.coef-dg.coef

#Infinite order
temp3=cbind(log.dp,lag(log.dp,-1),log.ret)
dp.coef=coef(lm(temp3[,1]~temp3[,2]))[2]
temp4=cbind(log.ret,lag(log.dp,-1))
ret.coef=coef(lm(temp4[,1]~temp4[,2]))[2]
infinite.br=(1/rho)*(ret.coef/(1-(rho*dp.coef)))
infinite.dg=infinite.br-1

b.data=rbind(idx.coef,dg.coef)
lr.data=cbind(matrix(0,nrow=2,ncol=15),c(infinite.br,infinite.dg))
lr.df=cbind(matrix(0,nrow=1,ncol=15),(infinite.br-infinite.dg))

windows()
b=barplot(ylim=c(0,max(lr.data)+0.5),axes=F,xlab='Horizon',b.data,cex.main=0.85,cex.lab=0.75,cex.axis=0.75,main='Long-run coefficients and their differences\nacross horizons',col=c('darkblue','lightblue'))
barplot(coef.diff,col='cyan',add=T,axes=F)
barplot(lr.df,col='gold',add=T,names.arg=c(1:15,expression(infinity)))
text(b,coef.diff-0.05,round(coef.diff,2),cex=0.7,col='black')
text(b[15]+(b[15]-b[14]),lr.df[16]-0.05,round(lr.df[16],2),cex=0.7,col='black')
text(1.5,1.05,'1~b(r)-b(dg)',col='red',cex=0.7,font=2)
legend(bty='n',y.intersp=0.85,'left',fill=c('darkblue','lightblue','cyan','gold'),legend=c('long-run b(r)','long-run b(dg)','difference(horizons)','difference(infinite order VAR)'),ncol=1,bg='white',cex=0.7)
###################################################################################

kk
This produces a barchart which shows how the long run return and dividend growth coefficients as (well as their differences) vary across forecast horizons (both finite and infinite).

lk

Clearly,longer forecast horizons increasingly satisfy the mechanical requirement of long run coefficients summing to one.We have started with the observation that variance in dividend yields must be matched by the variable’s ability to forecast returns and/or dividend growth. Now we have empirically determined which of these two possible channels is responsible for the observed variation in the price ratio : time-varying discount rates explain virtually all the variance of market dividend yields whereas dividend growth forecasts explain essentially none if it. In other words,variation in dividend yield corresponds completely to expected return news rather than to cashflow news. Expected return is the dominant cause of market price movements.

While I have focussed on D/P regressions so far, there are evidently a host of other variables that help forecast returns. Among these,Lettau & Ludwigson’s consumption-to-wealth ratio (cay) makes for an interesting candidate since it affects the term structure of expected returns in a way that is useful in the short run and that can be beautifully captured using impulse response functions. Consider the usual set of forecasting regressions with dp(t) and an additional cay(t) as state variables for both the single period and multi-period (long horizon) case. I have arbitrarily set the long horizon to k=15 for this example.An infinite order VAR would have been more appropriate but I do not know how to compute the implications for long-run coefficients in the case of multiple variables. Before using the cay variable in the regression,I rescaled it to have a standard deviation of 1 (as was done in the lecture).

k

###################################################################################
# Forecasting regressions with CAY variable
###################################################################################

cay.rescale=(cay/sd(cay))
reg.list <- list()
temp <- cbind(log.ret,log.dg,log.dp,cay.rescale,lag(log.dp,-1),lag(cay.rescale,-1))
temp2<-cbind(log.ret,lag(log.dp,-1))
dp.reg=lm(temp2[,1]~temp2[,2])

#One period regression
for(i in 1:4){
  reg.list[[i]]=lm(temp[,i]~temp[,5]+temp[,6])
}

#Long-run regressions
data1=cbind(idx.list[[15]],lag(log.dp,-1)[1:length(idx.list[[15]])],lag(cay.rescale,-1)[1:length(idx.list[[15]])])
lrun.ret.reg=lm(data1[,1]~data1[,2]+data1[,3])

data2=cbind(dg.list[[15]],lag(log.dp,-1)[1:length(dg.list[[15]])],lag(cay.rescale,-1)[1:length(dg.list[[15]])])
lrun.dg.reg=lm(data2[,1]~data2[,2]+data2[,3])

#Extracting estimates
estim=rbind(RegExtractor(reg.list,'est')[,-1],coef(lrun.ret.reg)[-1],coef(lrun.dg.reg)[-1])
tvals=rbind(RegExtractor(reg.list,'tval')[,-1],coef(summary(lrun.ret.reg))[c(2:3),3],coef(summary(lrun.dg.reg))[c(2:3),3])
rsq=matrix(RegExtractor(reg.list,'rsq'),ncol=1)

#Plot & Table
row.names<- c('r(t+1)','div.g(t+1)','dp(t+1)','cay.rescale(t+1)','LR-return','LR-div.g')
col.names<-c('dp(t)','cay.rescale(t) ','t-stats(dp)','t-stat(cay.rescale)','R2')
reg.table=cbind(round(estim,5),round(tvals,5),rbind(round(rsq,5),' ',' '))

windows()
layout(matrix(c(1,1,2),nrow=3))
plot(x=1:57,y=lag(log.ret,+1),ylab='Returns',xlab='Time',cex.main=0.85,cex.lab=0.75,cex.axis=0.75,main='Forecast and actual one-year returns',col='red',type='l',lwd=2)
lines(fitted(dp.reg),col='darkgreen',lwd=1)
lines(fitted(reg.list[[1]]),col='blue',lwd=1)
legend(bty='n',y.intersp=1,'bottom',fill=c('red','darkgreen','blue'),legend=c('Actual Returns','Forecast(DP)','Forecast(DP & cay.rescale)'),ncol=3,bg='white',cex=0.75)

est.tab <- reg.table
est.tab <- apply(est.tab, 2, rev)
est.tab <- cbind(rev(row.names),est.tab)
par(mai=c(0.15,0.25,0.25,0.15))
		TableMaker(row.h=1,est.tab,c('Multivariate',col.names),strip=F,strip.col=c('green','blue'),col.cut=0.05,alpha=0.7,border.col='lightgrey',text.col='black',header.bcol='gold',header.tcol='black',title=c('Multivariate Regression on lagged DP & CAY\nAnnual data for 1952-2008'))
###################################################################################

kklThe figure above graphs the one year forecast using [1] the dividend yield alone and [2] both dividend yield and consumption-to-wealth ratio against actual ex-post returns. Clearly, adding the cay variable allows us to capture the undulations of actual returns that would have otherwise gone unnoticed.The first four rows of the accompanying table show regression results for one year estimates while the last two rows show the results for long horizon regressions. In the short run, the cay variable helps to forecast one-period returns.The t-statistic is relatively large and the R-squared of 23% implies that the variation of expected returns is substantially raised.The new variable only marginally helps to forecast dividend growth. The cay signal decays more quickly than dp,with a 0.66 coefficient as opposed to 0.94. From these one-period results it is tempting to conclude that we have found a potent new forecaster in the cay variable. These rosy results however are overturned in the long run where the cay coefficient becomes statistically indistinguishable from 0. Even though the consumption-to-wealth ratio has a dramatic effect on one-period return forecasts ,it has almost no effect on long-run return forecasts. It is in this sense that the new variable affects the term structure of expected returns.

Campbell & Shiller’s(1988) present value identity provides a convenient framework for understanding time series predictability and addressing the new issues alluded to towards the end of the previous post. As usual, i will not profess to understand every step of the derivation or the requisite mathematics behind it, but I shall provide (copy) a brief sketch that is relevant to the post. Starting with a simple return decomposition and taking logs:

xa

xb

The Taylor expansion of the final equation yields:

xc

Iterating forward and ruling out explosive behaviour of stock prices:

xd

From this relation,it is clear that prices are high relative to fundamentals if investors today :

[a] expect dividends to rise in the future.This is sensible since high dividend growth expectations give high prices (and p-d). 

[b] expect returns (discount rates) to be low in the future. This is sensible since low discount rates imply future cashflows are discounted at a lower rate to the present and hence provide higher current prices (and p-d).

Price-dividend ratios can move if and only if there is news about current dividends,future dividend growth or future returns. Hence if dividend growth and returns are totally unpredictable (i.e. same for every time t), then it must follow from the identity that p(t)-d(t) be constant over time.

If prices are supposed to capture how the world looks going forward,then constant expectations of fundamentals going forward must generate constant prices today. Since empirically p(t)-d(t) is not constant, it must be true that one of the two components on the right-hand-side of the identity be predictable. To determine which of these two channels is ultimately responsible for the observed variation of the p-d ratio, it is convenient to link predictability to variability via a set of regressions. Reformulating the identity to :

bb

and regressing each component of the identity on the dividend yield would result in the following set of regressions:

fg

The coefficients must be such that:

kk

The set of regressions might give one the illusion that the right hand side (dividend yield) is causally related to the dependent variable on the left (whatever it may be).Contrary to typical statistical interpretation,these forecasting regressions are estimated in an attempt to understand how the right hand variable is formed. Traders that observe some news about expected cash flows or discount rates going forward (LHS) would incorporate this information in current prices (RHS). Therefore, these regressions are not explanatory in nature, rather they seek to answer the question ‘how much of the return can one know ahead of time’? The R-squared measure provides an answer to this question.

The long run return & dividend growth forecasting regression coefficients must add to one.If dividend yields vary,they must forecast long-run returns or dividend growth. Since covariances are the numerators of regression betas,multiplying both sides by the variance of the dividend yield ratio (denominator of the coefficient) implies :

nb

Clearly,the price ratio only varies if it forecasts long-run dividend growth or long run returns.If both coefficients were equal to zero this would imply that the price ratio can neither forecast dividend growth nor returns and dp(t) would not vary over time.Since dp(t) clearly varies over time it must forecast at least one of returns or dividend growth. Returning to the original identity, variation in dividend yields must correspond to changing investor expectations of dividend growth or returns.

Towards the end of the previous post, I alluded to the fact that the initial tests & results concerning stock return predictability had been overturned in the 80s.The simple forecasting regression of return on lagged returns used in the first generation of tests engendered the view that beta=0,returns followed a random walk and that one cannot beat the market.

The second generation of time series tests overturned these remarks by focussing on new variables (price ratios in particular) across longer horizons, concluding that expected returns vary over time in ways not captured by the classic random walk.

To illustrate how the introduction of longer horizons and new variables overturned previously cherished views of stock-return behaviour over time, consider the following regression :

km

The dependent variable is the CSRP value weighted excess return compounded over k horizons such that for k=5,the compounded stock return is given by the following with each R(t) being defined as (1+Return) :

xds

and the corresponding excess return is given by :

xaa

The following code illustrates the results of regressing compounded returns across 15 years on the dividend price ratio and the drastic variation in the R-squared measure aswell as the slope coefficient across horizons.

k

#####################################################################################
# New views & facts
#####################################################################################
#Return regressions~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

dep.list<-list()
new.reg <- list()
dep.list[[1]]<-matrix(c(idx.ret,tbill,exc),nrow=length(idx.ret))
for(i in 2:15){
  dep.list[[i]]=CustomCompound(idx.ret,tbill,i)
}

png(file="actf%02d.png",width=550,height=500)
for(i in 1:15){
  temp=cbind(dep.list[[i]][,3],lag(dp,-1)[1:nrow(dep.list[[i]])])
  new.reg[[i]]=lm(temp[,1]~temp[,2])
 plot(temp[,1],ylab='Returns',xlab='',cex.main=0.85,cex.lab=0.75,cex.axis=0.75,main=paste('Actual versus forecast\nHorizon',i,' years'),col='darkgreen',type='l',lwd=2)
	lines(fitted(new.reg[[i]]),col='blue')
	legend(bty='n',y.intersp=1,'bottomleft',fill=c('darkgreen','blue'),legend=c('Actual','Fitted'),ncol=1,bg='white',cex=0.75)
}
dev.off()
shell("convert -delay 15 *.png actf.gif")

#Extract regression values
estim <-RegExtractor(new.reg,'est')
pvals <-matrix(RegExtractor(new.reg,'pval'),ncol=2)
tvals <-matrix(RegExtractor(new.reg,'tval'),ncol=2)
rsq <-matrix(RegExtractor(new.reg,'rsq'),ncol=1)

#Variation relative to mean level
std.vals=sapply(new.reg,function(v) sd(fitted(v)))
mean.vals=sapply(new.reg,function(v) mean(fitted(v)))

#Plot & Table
row.names<- paste('Compound ',1:15,' Years')
col.names<-c('Intercept','Beta','t-stats','p-vals','R2','E(R)','Std(Fitted)')
reg.table=cbind(estim,(tvals[,2]),(pvals[,2]),rsq,mean.vals,std.vals)

windows()
layout(matrix(c(1,1,2),nrow=3))
barplot(t(rsq*100),ylab='R-squared(%)',xlab='horizon',cex.main=0.85,cex.lab=0.75,cex.axis=0.75,main='Comparing R-squared across horizons\nReturn regressions',col='gold',names.arg=1:15)
est.tab <- round(reg.table,5)
est.tab <- apply(est.tab, 2, rev)
est.tab <- cbind(rev(row.names),est.tab)
par(mai=c(0.15,0.25,0.25,0.15))
TableMaker(row.h=1,est.tab,c('Multiple Periods',col.names),strip=F,strip.col=c('green','blue'),col.cut=0.05,alpha=0.7,border.col='lightgrey',text.col='black',header.bcol='gold',header.tcol='black',title=c('Regression of returns on lagged DP\nAnnual data for 1952-2008'))

l
An animated gif that shows how the predicted and actual values vary for each horizon of the regression :

mmThe correlation is evident,high dividend yields(low prices) mean high subsequent returns and low dividend yields(high prices) mean low subsequent returns. A more useful plot that illustrates how r-squared and regression results vary with the horizon : 

df

R-squared and slope coefficients increase with the regression horizon implying that forecastability get more economically interesting at longer horizons. From the Chicago lectures I would have expected that the slope remains statistically insignificant throughout, but I clearly obtained the opposite result with smaller p-values for longer horizons. Another good example of the ‘tinkering’ aspect of this blog where i may have made a mistake somewhere or glossed over some procedure that has been taken for granted but is unknown to me.

Looking at the parallel forecasts of dividend growth :

gtg

When prices are high, this should be a signal that investors expect dividends to be higher in the future, so on average one should observe higher dividend growth in the years following high prices (low dividend yields) and expect a negative slope coefficient. To determine whether this is the case, I ran dividend growth forecasting regressions for 15 horizons as before :

k

#Dividend growth ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dep.list<-list()
new.reg <- list()
dep.list[[1]]<-dg
temp<-NULL
for(i in 2:15){
  dep.list[[i]]=DivCompound(dg,i)
}

for(i in 1:15){
  temp=cbind(dep.list[[i]],lag(dp,-1)[1:length(dep.list[[i]])])
  new.reg[[i]]=lm(temp[,1]~temp[,2])
}

#Extract regression values
estim <-RegExtractor(new.reg,'est')
pvals <-matrix(RegExtractor(new.reg,'pval'),ncol=2)
tvals <-matrix(RegExtractor(new.reg,'tval'),ncol=2)
rsq <-matrix(RegExtractor(new.reg,'rsq'),ncol=1)

#Table
row.names<- paste('Compound ',1:15,' Years')
col.names<-c('Intercept','Beta','t-stats','p-vals','R2')
reg.table=cbind(estim,(tvals[,2]),(pvals[,2]),rsq)

windows()
layout(matrix(c(1,1,2),nrow=3))
barplot(ylim=c(0,35),t(rsq*100),ylab='R-squared(%)',xlab='horizon',cex.main=0.85,cex.lab=0.75,cex.axis=0.75,main='Comparing R-squared across horizons\nDividend growth regressions',col='lightblue',names.arg=1:15)
est.tab <- round(reg.table,5)
est.tab <- apply(est.tab, 2, rev)
est.tab <- cbind(rev(row.names),est.tab)
par(mai=c(0.15,0.25,0.40,0.15))
TableMaker(row.h=1,est.tab,c('Multiple Periods',col.names),strip=F,strip.col=c('green','blue'),col.cut=0.05,alpha=0.7,border.col='lightgrey',text.col='black',header.bcol='lightblue',header.tcol='black',title=c('Regression of dividend growth on lagged DP\nAnnual data for 1952-2008'))
#####################################################################################

k
hn
Keeping the scale of the plot as before illustrates just how appalling the R-squared is.The coefficient which should be negative (theoretically) is positive in our regression (empirically). We do not,contrary to expectations,observe higher dividend growth in the years following high prices.

The present value identity sketched above establishes that : [a] if price variation comes from news about dividend growth,then the price-dividend ratio should forecast dividend growth ; [b] if price variation comes from news about changing discount rates,then the price-dividend ratio should forecast returns.

Using the results obtained from the return and dividend growth regressions above, we would conclude that returns which should not be forecastable are and dividend growth which should be forecastable isn’t. On average, price dividend ratios are moving in response to expected return news rather than cash flow news. Time varying discount rates explain virtually all the variance of dividend yields while dividend growth forecasts explain essentially none of it. This is a clear contradiction of the view engendered by first generation tests.