Archive

Tag Archives: impulse response

Present value logic suggests that current prices are linked to a trader’s expectations about future returns and dividends. Regression results prove that if expected returns rise,this drives down prices and on average we see the returns that the trader expected in the first place. Impulse response calculations can provide answers to questions like :‘how long do changes in expected returns last?’ Essentially, impulse response functions help illustrate the expected future path of a variable across time for a given unexpected shock to the system at a particular time(t). To illustrate how shocks today reflect changes in expected dividend growth,returns (and other variables) going forward,one would simulate the system of forecasts considered in previous posts

klk

While it may be tempting to shock each of the dependent variables separately,the shocks are related in such a way that there are really only two shocks with the third one following along :

kji

We shall apply [1] a shock to dividend growth with no change in dividend yield, and [2] a shock to dividend yields with no change in dividend growth or:

kmo

The impulse-response function is obtained by simply simulating the system forward through time in response to each of these shocks. The following code illustrates the base case sketched above along with the the extended case that includes the consumption-to-wealth ratio. While the base case is simulated manually using a for loop,the extended case makes use of the VAR function to automatically fit a vector autoregressive model to the data and the irf function to extract impulse responses from the fitted object. Cumulative paths are also drawn.

k

###################################################################################
# Impulse Response
###################################################################################

#Regression on single period lagged variables
idx.temp <- cbind(log.ret,lag(log.dp,-1))
idx.reg<-lm(idx.temp[,1]~idx.temp[,2])
ret.coeff <- coef(idx.reg)[2]

dp.temp <- cbind(log.dp,lag(log.dp,-1))
dp.reg <- lm(dp.temp[,1]~dp.temp[,2])
dp.coeff <- coef(dp.reg)[2]

dg.temp <- cbind(log.dg,lag(log.dp,-1))
dg.reg <- lm(dg.temp[,1]~dg.temp[,2])
dg.coeff <- coef(dg.reg)[2]

#Simulate dividend yield shock
dpt<-ddt<-rt<-chg.pt<-matrix(0,nrow=25,ncol=1)
dpt[2] = 1
ddt[2] =0
chg.pt[2] =-dpt[2]+0+ddt[2]
rt[2] = -rho

for(i in 3:25){
 dpt[i] = dp.coeff*dpt[i-1]
 ddt[i] = dg.coeff*dpt[i-1]
 rt[i] = ret.coeff*dpt[i-1]
 chg.pt[i] = -dpt[i]+dpt[i-1]+ddt[i]
}

#Cumulate
cumddt=cumsum(ddt)
cumrt=cumsum(rt)
cumpt=cumsum(chg.pt)

#simulate dividend growth shock
rt.d<-dpt.d<-ddt.d<-chg.ptd<-matrix(0,nrow=25,ncol=1)
rt.d[2]=1
dpt.d[2]=0
ddt.d[2]=1
chg.ptd[2] =-dpt.d[2]+0+ddt.d[2]

for(i in 3:25){
 dpt.d[i]=dp.coeff*dpt.d[i-1]
 ddt.d[i]=dg.coeff*dpt.d[i-1]
 rt.d[i]=ret.coeff*dpt.d[i-1]
 chg.ptd[i] = -dpt.d[i]+dpt.d[i-1]+ddt.d[i]
}

#Cumulate
cumddt.d=cumsum(ddt.d)
cumdpt.d=cumsum(dpt.d)
cumrt.d=cumsum(rt.d)
cumpt.d=cumsum(chg.ptd)

#Simulate cay shock
var.data=cbind(log.ret,log.dp,log.dg,cay)
vv=VAR(var.data)
imp=irf(vv,response=c('log.ret'),n.ahead=24)
cay.resp=imp$irf$cay
dg.resp=imp$irf$log.dg

#Cumulate
cumrt.c=cumsum(cay.resp)
cumddt.c=cumsum(dg.resp)

#Plot Impulse responses for both shocks
windows()
par(mfrow=c(2,3),mai=c(0.3,0.35,0.5,0.15))
plot(xaxt='n',rt.d,type='l',col='blue',lwd=2,ylab='',xlab='',cex.main=0.8,cex.lab=0.75,cex.axis=0.75,main='Response to \ndividend growth shock')
axis(1, at=0:25, labels=-1:24, padj=1,cex.axis=0.75)
points(rt.d,pch=17,cex=0.95,col='darkblue')
lines(ddt.d,col='red',lwd=2,lty=2)
lines(chg.ptd,col='green',lwd=2,lty=2)
abline(h=0)
abline(v=2,lty='dashed')
legend(bty='n',y.intersp=1,'right',fill=c('blue','red','green'),legend=c('Return','Dividend','Price'),ncol=1,bg='white',cex=0.75)

par(mai=c(0.3,0.35,0.5,0.15))
plot(xaxt='n',ylim=c(min(cay.resp),max(rt)),rt,type='l',col='blue',lwd=2,ylab='',xlab='',cex.main=0.8,cex.lab=0.75,cex.axis=0.75,main='Response to \ndividend yield shock')
axis(1, at=0:25, labels=-1:24, padj=1,cex.axis=0.75)
points(rt,pch=17,cex=0.95,col='darkblue')
lines(ddt,col='red',lwd=2,lty=2)
#lines(chg.pt,col='green',lwd=2,lty=2)
abline(h=0)
abline(v=2,lty='dashed')
legend(bty='n',y.intersp=1,'right',fill=c('blue','red'),legend=c('Return','Dividend'),ncol=1,bg='white',cex=0.75)

par(mai=c(0.3,0.35,0.5,0.15))
plot(xaxt='n',cay.resp,type='l',col='blue',lwd=2,ylab='',xlab='',cex.main=0.8,cex.lab=0.75,cex.axis=0.75,main='Response to \ncay shock (VAR)')
axis(1, at=0:25, labels=-1:24, padj=1,cex.axis=0.75)
points(cay.resp,pch=17,cex=0.95,col='darkblue')
lines(dg.resp,col='red',lwd=2,lty=2)
abline(h=0)
abline(v=2,lty='dashed')
legend(bty='n',y.intersp=1,'right',fill=c('blue','red'),legend=c('Return','Dividend'),ncol=1,bg='white',cex=0.75)

par(mai=c(0.35,0.35,0.5,0.15))
plot(xaxt='n',cumrt.d,type='l',col='blue',lwd=2,ylab='',xlab='',cex.main=0.8,cex.lab=0.75,cex.axis=0.75,main='Cumulative Response to \ndividend growth shock')
axis(1, at=0:25, labels=-1:24, padj=1,cex.axis=0.75)
points(cumrt.d,pch=17,cex=0.95,col='darkblue')
lines(cumddt.d,col='red',lwd=2,lty=2)
lines(cumpt.d,col='green',lwd=2,lty=3)
abline(v=2,lty='dashed')
abline(h=0)
legend(bty='n',y.intersp=1,'right',fill=c('blue','red','green'),legend=c('Return','Dividend','Price'),ncol=1,bg='white',cex=0.75)

par(mai=c(0.35,0.35,0.5,0.15))
plot(xaxt='n',cumrt,type='l',col='blue',lwd=2,ylab='',xlab='',cex.main=0.8,cex.lab=0.75,cex.axis=0.75,main='Cumulative Response to \ndividend yield shock')
axis(1, at=0:25, labels=-1:24, padj=1,cex.axis=0.75)
points(cumrt,pch=17,cex=0.95,col='darkblue')
lines(cumddt,col='red',lwd=2,lty=2)
lines(cumpt,col='green',lwd=2,lty=3)
abline(h=0)
abline(v=2,lty='dashed')
legend(bty='n',y.intersp=1,'right',fill=c('blue','red','green'),legend=c('Return','Dividend','Price'),ncol=1,bg='white',cex=0.75)

par(mai=c(0.35,0.35,0.5,0.15))
plot(xaxt='n',cumrt.c,type='l',col='blue',lwd=2,ylab='',xlab='',cex.main=0.8,cex.lab=0.75,cex.axis=0.75,main='Cumulative Response to \ncay shock (VAR)')
axis(1, at=0:25, labels=-1:24, padj=1,cex.axis=0.75)
points(cumrt.c,pch=17,cex=0.95,col='darkblue')
lines(cumddt.c,col='red',lwd=2,lty=2)
abline(h=0)
abline(v=2,lty='dashed')
legend(bty='n',y.intersp=1,'right',fill=c('blue','red'),legend=c('Price','Dividend'),ncol=1,bg='white',cex=0.75)
###################################################################################

k

ppp

l

[Dividend growth shock]

The dividend growth shock represents a movement in dividends with no change in dividend yields such that prices would rise 1% with a 1% increase in dividends. Hence a dividend growth shock can be interpreted as a cashflow shock with no change in expected returns. A dividend growth shock at time t=1 of 1% with no change in dividend yields implies that prices just rise proportionately to dividends. This price spike we see in the top left plot corresponds to cashflow news only. A high return with no change in dividend yield isolates the event as cashflow news with no implication at all about future returns (which remain flat after the initial shock).

k

[Dividend yield shock]

The dividend yield shock represents a movement in the dividend yield with no change in dividend growth, so it must have been the prices that went down for a positive shock. If dividend growth is unpredictable (i.e b[d]=0 in the set of regressions) and prices change with no change in current dividends,then prices must be changing in the absence of news about future dividends too. If prices are changing with no news about future dividends then they must be changing on the basis of discount rate news. Hence a dividend yield shock can be thought of as a pure discount rate shock when dividends are unpredictable. In typical regressions (in ours aswell) dividends are not completely unpredictable (i.e.b[d] is small but not 0) such that dividend yield shocks combine a small amount of dividend growth news with a large amount of discount rate news.

The initial dip in prices is accompanied by a huge negative return shock (goes off the bottom of the graph). Given that it is the independent variable in all regressions of the base case,a shock to the dividend yield at time t=1 is expected to have ripple effects over time on other variables in the system. After disastrous first period returns,subsequent positive returns bring cumulative prices/return on to a positive path again.

Impulse response functions help separate a price hike that corresponds to cashflow news from one motivated by discount rate news. In the first scenario, a dividend growth shock occurs without a change in dividend yields and the initial price/return hikes revert to their original values in the second period. In the second case, a dividend yield shock occurs without a change in dividend growth and the initial price/return hikes melt away slowly over time.

l

[Consumption/Wealth ratio shock]

A shock to cay is followed firstly by a hike in expected returns in the short-term (this corresponds to the short term predictability alluded to in the previous post), secondly by a rapid decline in returns (much faster than the expected returns that follow a dividend yield shock), and finally by a reversal in returns.

kk

As usual,the Chicago lecture is the main reference used in this and other posts. Although there are some discrepancies between the plot in the lecture and mine (data differences?coding error?) the main point seems valid. 

According to classic market efficiency,stock prices (which are not predictable) follow a random walk and hence financial returns, which are basically percentage price changes, are similarly unpredictable. If this view of the world is true,then one would expect to see b=0 and R-squared=0 for any variable x(t) in the simple regression : R(t+1) = a+bx(t)+e(t+1). Intuitively,competition in stock markets should drive out any predictable movement in stock prices. If b were greater than 0, individual investors should buy when x(t) is high and sell when x(t) is low. However if every market participant adhered to this logic, prices would be driven up (down) on the basis of a high (low) x(t) until today’s price is the same as the price expected in the next period. The more competitive an asset market, the greater the degree of informational efficiency,the greater the speed at which pertinent material information is impounded in today’s stock price, the lower the likelihood of predicting stock price movements.

Implicit in these statements is a distinction between individual versus equilibrium perspectives. Assuming b>0, an individual would look towards a positive signal (x) as an indication to buy the stock and reap subsequent returns. If everybody followed this same logic, stock prices would be bid up until current and expected prices are equal and the incentive for further action eliminated. An asset for which b>0 cannot describe a market in equilibrium. It is tempting but erroneous to conclude that predictability implies inefficient markets. Nothing in the definition of market efficiency requires that expected returns remain constant over time.In fact, predictability is equivalent to variation in expected returns. Consider a regression model of excess stock returns on the Div/Price ratio over time :

gki

Taking expectations,this means that at time t, the expected returns is:

aw

This implies that expected returns vary over time and are not constant as long as returns are predictable (b not equal to 0). As far as I understand this, if the regression produces a zero slope coefficient, then expected returns would be reduced to a constant (a). Hence,as long as the estimated slope coefficient is non zero, one can link variation in expected returns to predictability of returns. As usual, all these posts may be riddled with mistakes and misunderstandings on my part;far better to look at the sources for yourself : Discount Rates,Chicago Lectures.

The first generation of tests suggest that basically nothing can forecast stock returns. The following section gives a sense of this from regressions of returns on lagged returns for : [a] CSRP stock data ; [b] T-bill rate ; [c] Excess returns. Observations are annual for the period from 1952 to 2008. Data sources come from the Chicago lecture problem sets linked to above. Additional variables such as the D/P,Div Growth and Cay are also imported for later use.

l

#####################################################################################
#Data import & handling
#####################################################################################

#Import CSV file(s)
ret.csv<- read.csv('ps1_data.csv',header=T)
cay.csv <- read.csv('cay.csv',header=T)
ret.ts <- ts(data=ret.csv,start=c(1926),end=c(2011),frequency=1)
cay.ts <- ts(data=cay.csv,start=c(1952,1),end=c(2009,1),frequency=4)

#Subset data
row.idx <- 1:nrow(cay.ts)
ret.sub <- window(ret.ts,start=c(1952),end=c(2008),frequency=1)
cay.sub <- ts(cay.ts[row.idx%%4==0,],start=c(1952),end=c(2008),frequency=1)

#Save individual series
idx.ret <- ret.sub[,1]
dp <- ret.sub[,2]
dg <- ret.sub[,3]
tbill <- ret.sub[,4]
cay <-cay.sub[,4]
exc <- idx.ret-tbill

#Save log series
log.ret <- log(1+idx.ret)
log.dp <- log(dp)
log.dg <- log(1+dg)
rho=0.96
###################################################################################

l

Running regressions of stock,tbill,excess returns on their one period lagged values :

###################################################################################
# Initial Regression & Test
###################################################################################

#Initial regressions on lagged values
idx.temp <- cbind(idx.ret,lag(idx.ret,-1))
idx.reg<-lm(idx.temp[,1]~idx.temp[,2])

tbill.temp <- cbind(tbill,lag(tbill,-1))
tbill.reg<-lm(tbill.temp[,1]~tbill.temp[,2])

exc.temp <- cbind(exc,lag(exc,-1))
exc.reg<-lm(exc.temp[,1]~exc.temp[,2])

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

#Variation of expected returns with the level of expected returns
std.vals=sapply(reg.list,function(v) sd(fitted(v)))*100
mean.vals=sapply(reg.list,function(v) mean(fitted(v)))*100

#Plots&Table
asset.names<-c('Returns','Tbill','Excess')
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))
plot(idx.ret,ylab='Returns',xlab='',cex.main=0.85,cex.lab=0.75,cex.axis=0.75,main='Timeseries plots',col='darkgreen',type='l',lwd=2)
lines(tbill,col='blue')
lines(exc,col='red')
legend(bty='n',y.intersp=1,'bottomleft',fill=c('darkgreen','blue','red'),legend=asset.names,ncol=1,bg='white',cex=0.75)

est.tab <- round(reg.table,5)
est.tab <- apply(est.tab, 2, rev)
est.tab <- cbind(rev(asset.names),est.tab)
par(mai=c(0.35,0.15,0.5,0.15))
TableMaker(row.h=1,est.tab,c('Single Period',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 returns\nAnnual data for 1952-2008'))
###################################################################################

cc

The table beneath the time series plot summarises the typical regression estimates. Stock returns are basically unpredictable,if returns go up 100% this year,one would expect a rise of just about 4% next year,a trivial amount of momentum. While the slope coefficient is statistically insignificant this has no significance in terms of economic interpretation. The R-squared which measures the proportion of return variance that can be forecast one year ahead is tiny. Results for the t-bill regression provide an interesting contrast with a large slope parameter estimate that is statistically significant with a R-squared of 72%. This is visually corroborated by the relatively smooth time series plot for interest rate returns. The last row in the table presents results for the excess return regression. The results clearly mimic that of the pure stock return. Excess return separates willingness to consume less and save from the willingness to bear risk. The last 2 columns of the table compare how much expected returns vary over time with the level of expected returns. This can be thought of as another economic measure of how much expected returns vary over time. While these findings may have been revolutionary in the 1970s,they were upended by two new facts a decade later: [a] long horizon regressions and [b] new variables.