# Asset Pricing [8d : Time Series Predictability]

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 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 : We shall apply  a shock to dividend growth with no change in dividend yield, and  a shock to dividend yields with no change in dividend growth or: 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)

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

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

#Simulate dividend yield shock
dpt<-ddt<-rt<-chg.pt<-matrix(0,nrow=25,ncol=1)
dpt = 1
ddt =0
chg.pt =-dpt+0+ddt
rt = -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=1
dpt.d=0
ddt.d=1
chg.ptd =-dpt.d+0+ddt.d

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)
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')
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')
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)')
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')
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')
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)')
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 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.

1. Hey Alpha! I love the posts and thanks for the code. If you have time I’d love to chat about getting some of these into QuantConnect.com – please reach out to discuss in more detail

2. Hey Jared ! Thank you for stopping by. I am simply (attempting to at least) replicating some academic stuff here and there rather than devising trading strategies which your cool website seems to focus on.

3. Dear Alpha, I am new to R. I am not able to understand the codes in lines 38 to 49. I can see that they are connected to the equations for the two shocks. Would be grateful if you could kindly provide their meaning.

And also, this code is for a linear AR process, and not for a threshold-type nonlinear model, isn’t it?

4. Hello there Vijayan! Omitting the change in prices variable (chg.ptd) :

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

Here we are simply setting up the variables to correspond to 'shock 1' in the text above where at t=1 we have return shock & dividend shock being equal to 1 and div-yield shock is equal to 0. For example,focussing on the return shock we have :

rt.d=0 and rt.d=1 ; this corresponds the return shock being 0 at t=0 and the return shock being 1 at t=1.

————————————————————————————————————————————————————

In the second part :

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]
}

We are just filling in the rest of the 25 row matrices set up earlier by feeding through the first set of equations in the text. We only have one shock at t=1 (i=2 in the code) hence for all t>1 (i>2 in the code) the error terms are 0 so we get :

rt.d[i]=ret.coeff*dpt.d[i-1]+error term
=ret.coeff*dpt.d[i-1] + 0
=ret.coeff*dpt.d[i-1]

The same process for other variables.

It is perhaps best to read the source material !