Asset Pricing [5b : Fama French 3 Factor Model]

Any violation of the CAPM should be a joint puzzle of beta and average returns. The previous post set up some empirical facts to the tune of small value stock portfolios outpacing large growth stocks in terms of raw performance. The outperformance of certain stock categories is not an indictment of the CAPM as long as the average returns of such assets also shoulder the burden of a higher systematic risk. Having plotted the monthly excess returns to the 25 size/value sorted portfolios and traced the mean return of these asset groupings along growth-value & small cap-large cap dimensions,the next logical step would be to determine whether the high average returns of smaller-cheaper stock portfolios are consistent with the their exposure to systematic risk. One would expect the small-value stock portfolios, which command the highest average return, to also be most strongly exposed to undiversifiable market risk. To determine the average return/market risk relation,a time series regression of the 25 portfolios against excess market returns is performed,and average portfolio returns plotted against estimated betas.

l

#############################################################################
#Regression lines
#############################################################################

windows()
layout(matrix(c(1,2),ncol=1,byrow=T))

#Value portfolios perspective,capm beta
par(mai=c(0.5,0.75,0.3,0.4))
plot(xaxt='n',ylab='Excess Returns',main='Average excess returns versus market beta',xlim=c(0.5,1.5),ylim=c(0,1.2),col=cols.m[1],x=BM.SZ$value.excess[[1]]$ts.betas,y=colMeans(as.matrix(BM.SZ$value.port[[1]]-rf.ret))*100,lwd=1.5,'line',cex.main=0.85,cex.lab=0.65,cex.axis=0.65)
points(col=cols.m[1],x=BM.SZ$value.excess[[1]]$ts.betas,y=colMeans(as.matrix(BM.SZ$value.port[[1]]-rf.ret))*100,pch=21)
text(cex=0.65,pos=4,col=cols.m[1],x=BM.SZ$value.excess[[1]]$ts.betas[1],y=colMeans(as.matrix(BM.SZ$value.port[[1]]-rf.ret))[1]*100,'Small')
text(cex=0.65,pos=2,col=cols.m[1],x=BM.SZ$value.excess[[1]]$ts.betas[5],y=colMeans(as.matrix(BM.SZ$value.port[[1]]-rf.ret))[5]*100,'Large')

for(i in 2:5){
  lines(col=cols.m[i],x=BM.SZ$value.excess[[i]]$ts.betas,y=colMeans(as.matrix(BM.SZ$value.port[[i]]-rf.ret))*100,lwd=1.5)
 	points(col=cols.m[i],x=BM.SZ$value.excess[[i]]$ts.betas,y=colMeans(as.matrix(BM.SZ$value.port[[i]]-rf.ret))*100,pch=20+i)
	text(cex=0.65,pos=4,col=cols.m[i],x=BM.SZ$value.excess[[i]]$ts.betas[1],y=colMeans(as.matrix(BM.SZ$value.port[[i]]-rf.ret))[1]*100,'Small')
	text(cex=0.65,pos=2,col=cols.m[i],x=BM.SZ$value.excess[[i]]$ts.betas[5],y=colMeans(as.matrix(BM.SZ$value.port[[i]]-rf.ret))[5]*100,'Large')
}
legend(title='Lines connect same B/M','bottomleft',pch=21:25,col=cols.m,legend=c('Low B/M Portfolio',2:4,'High B/M Portfolio'),ncol=1,bg='white',bty='n',cex=0.6)

#Size portfolios perspective,capm beta
par(mai=c(0.8,0.75,0,0.4))
plot(main='',xlab='Beta on Market',ylab='Excess Returns',xlim=c(0.5,1.5),ylim=c(0,1.2),col=cols.m[1],x=SZ.BM$size.excess[[1]]$ts.betas,y=colMeans(SZ.BM$size.port[[1]]-rf.ret)*100,lwd=1.5,'line',cex.main=0.85,cex.lab=0.65,cex.axis=0.65)
points(col=cols.m[1],x=SZ.BM$size.excess[[1]]$ts.betas,y=colMeans(SZ.BM$size.port[[1]]-rf.ret)*100,pch=21)
text(cex=0.65,pos=4,col=cols.m[1],x=SZ.BM$size.excess[[1]]$ts.betas[1],y=colMeans(as.matrix(SZ.BM$size.port[[1]]-rf.ret))[1]*100,'Low')
text(cex=0.65,pos=2,col=cols.m[1],x=SZ.BM$size.excess[[1]]$ts.betas[5],y=colMeans(as.matrix(SZ.BM$size.port[[1]]-rf.ret))[5]*100,'High')

for(i in 2:5){
	lines(col=cols.m[i],x=SZ.BM$size.excess[[i]]$ts.betas,y=colMeans(as.matrix(SZ.BM$size.port[[i]]-rf.ret))*100,lwd=1.5)
 	points(col=cols.m[i],x=SZ.BM$size.excess[[i]]$ts.betas,y=colMeans(as.matrix(SZ.BM$size.port[[i]]-rf.ret))*100,pch=20+i)
	text(cex=0.65,pos=4,col=cols.m[i],x=SZ.BM$size.excess[[i]]$ts.betas[1],y=colMeans(as.matrix(SZ.BM$size.port[[i]]-rf.ret))[1]*100,'Low')
	text(cex=0.65,pos=2,col=cols.m[i],x=SZ.BM$size.excess[[i]]$ts.betas[5],y=colMeans(as.matrix(SZ.BM$size.port[[i]]-rf.ret))[5]*100,'High')
}
legend(title='Lines connect same Size','bottomleft',pch=21:25,col=cols.m,legend=c('Small Size Portfolio',2:4,'Large Size Portfolio'),ncol=1,bg='white',bty='n',cex=0.6)

l

gr

gg

j

While both plots chart average excess returns of the 25 size/value sorted portfolios against estimated time series beta, the first plot connects different size portfolios within the same B/M category and the second plot connects different B/M portfolios within the same size category. In the context of the previous returns plot (reprinted for convenience), lines in the first regression plot can be thought of as connecting portfolios vertically, while lines in the second regress plot can be thought of as connecting portfolios horizontally, both of course against estimated betas.

From the first regression plot, it appears that variation in size produces a variation in average returns that is positively related to variation in market betas, the central message of the CAPM. Small cap portfolios tend to command higher average excess returns than large cap portfolios across all value categories. This outperformance of small cap portfolios is accompanied by higher betas and hence connecting the portfolios of different sizes in each value category produce positively sloped lines.

From the second regression plot, variation in book/market ratio produces a variation in average return that is negatively related to variation in market betas,violating the central implication of the CAPM. Value stocks (those with high B/M ratios) tend to have higher average excess returns than growth stocks (those with low B/M ratios) but, contrary to the demands of theory, shoulder less systematic risk. Connecting the portfolios of different B/M ratios in each size category produce negatively sloped lines. As a consequence of this value effect, the CAPM is a disaster when confronted with these portfolios.

In an attempt to explain these patterns, Fama and French specified a multifactor model with the market return (MKT), the return of small less big stocks (SMB) and the return of high minus low B/M stocks (HML) as three factors. They managed to associate variation in average returns of the 25 portfolios with factor betas in the model. The Fama-French solution involves firstly running a time series regression of excess portfolio returns against the three factors (which can be downloaded from Kenneth French’s website),secondly running a cross section regression of average excess returns against estimated betas, and thirdly evaluating model predictions against actual values for excess portfolio returns.

The time series regression is given by:

gs

The Cross section regression is given by:

d

To give an idea about how regression coefficients of the FF3F model stack up against those of the CAPM for the 25 size/value sorted portfolios, I plotted the estimated parameters along with their significance in a similar plot as the returns plot above :

;

# TS Coefficients,Collective Plot
windows()
layout(matrix(c(1:25),nrow=5,ncol=5))
col1 <- adjustcolor(col='gold',alpha.f=0.3)
col2 <- adjustcolor(col='blue',alpha.f=0.3)
res.tot <- NULL

for(i in 1:5){
  for(j in 1:5){
		coeff.matrix <- cbind(BM.SZ$value.excess[[i]]$ts.alphas[j],BM.SZ$value.excess[[i]]$ts.betas[j],BM.SZ$value.excess[[i]]$ff.alphas[j],t(BM.SZ$value.excess[[i]]$ff.betas[,j]))
		res.tot <- rbind(res.tot,coeff.matrix)
		pvalues.matrix <- cbind(BM.SZ$value.excess[[i]]$capm.p.a[j],BM.SZ$value.excess[[i]]$capm.p.b[j],BM.SZ$value.excess[[i]]$ff.p.a[j],BM.SZ$value.excess[[i]]$ff.p.mkt[j],BM.SZ$value.excess[[i]]$ff.p.smb[j],BM.SZ$value.excess[[i]]$ff.p.hml[j])
		col.matrix<-ifelse(pvalues.matrix<0.05,'red','black')

		if(j==1 && i>1 && i<5)
		{
			par(mai=c(0.015,0.025,0.25,0.025))
		  plot(yaxt='n',xaxt='n',cex.main=0.85,cex.lab=0.65,cex.axis=0.65,x=1:length(coeff.matrix),coeff.matrix,type='h',col=col.matrix,lwd=1.5)
			points(x=1:length(coeff.matrix),y=coeff.matrix,col=col.matrix,cex=1,pch=19)
			abline(h=0)
			abline(v=2.5,col='darkred',lwd=1.5,lty=3)
			mtext(text=paste('BM Portfolios',i),side=3,cex=0.65)
			rect(0,-6,2.5,2,col=col1)
      rect(2.5,-6,7,2,col=col2)

		}
		else if(j>1 && j<5 && i>1 && i<5)
		{
			par(mai=c(0.015,0.025,0.015,0.025))
		  plot(yaxt='n',xaxt='n',cex.main=0.85,cex.lab=0.65,cex.axis=0.65,x=1:length(coeff.matrix),coeff.matrix,type='h',col=col.matrix,lwd=1.5)
		  points(x=1:length(coeff.matrix),y=coeff.matrix,col=col.matrix,cex=1,pch=19)
			abline(h=0)
			abline(v=2.5,col='darkred',lwd=1.5,lty=3)
			rect(0,-6,2.5,2,col=col1)
      rect(2.5,-6,7,2,col=col2)

		}
		else if(j==1 && i==1)
		{
			par(mai=c(0.015,0.25,0.25,0.025))
		  plot(xaxt='n',cex.main=0.85,cex.lab=0.65,cex.axis=0.65,x=1:length(coeff.matrix),coeff.matrix,type='h',col=col.matrix,lwd=1.5)
	    points(x=1:length(coeff.matrix),y=coeff.matrix,col=col.matrix,cex=1,pch=19)
			mtext(text=paste('BM Portfolios',i),side=3,cex=0.65)
			abline(h=0)
			abline(v=2.5,col='darkred',lwd=1.5,lty=3)
			rect(0,-6,2.5,2,col=col1)
      rect(2.5,-6,7,2,col=col2)

		}
		else if(j==1 && i==5)
		{
			par(mai=c(0.015,0.025,0.25,0.15))
		  plot(yaxt='n',xaxt='n',cex.main=0.85,cex.lab=0.65,cex.axis=0.65,x=1:length(coeff.matrix),coeff.matrix,type='h',col=col.matrix,lwd=1.5)
			points(x=1:length(coeff.matrix),y=coeff.matrix,col=col.matrix,cex=1,pch=19)
			mtext(text=paste('Size Portfolios',j),side=4,cex=0.65)
			mtext(text=paste('BM Portfolios',i),side=3,cex=0.65)
			abline(h=0)
			abline(v=2.5,col='darkred',lwd=1.5,lty=3)
			rect(0,-6,2.5,2,col=col1)
      rect(2.5,-6,7,2,col=col2)

	}
		else if(j>1 && j<5 && i==1)
		{
		  par(mai=c(0.015,0.25,0.015,0.025))
		  plot(xaxt='n',cex.main=0.85,cex.lab=0.65,cex.axis=0.65,x=1:length(coeff.matrix),coeff.matrix,type='h',col=col.matrix,lwd=1.5)
      points(x=1:length(coeff.matrix),y=coeff.matrix,col=col.matrix,cex=1,pch=19)
			abline(h=0)
			abline(v=2.5,col='darkred',lwd=1.5,lty=3)
			rect(0,-6,2.5,2,col=col1)
      rect(2.5,-6,7,2,col=col2)

		}
		else if(j==5 && i==1)
		{
			par(mai=c(0.25,0.25,0.015,0.025))
		  plot(xaxt='n',xlab='',cex.main=0.85,cex.lab=0.65,cex.axis=0.65,x=1:length(coeff.matrix),coeff.matrix,type='h',col=col.matrix,lwd=1.5)
    	axis(at=1:6,side=1,labels=c('a','mkt','a','mkt','smb','hml'))

			points(x=1:length(coeff.matrix),y=coeff.matrix,col=col.matrix,cex=1,pch=19)
			abline(h=0)
			abline(v=2.5,col='darkred',lwd=1.5,lty=3)
			rect(0,-6,2.5,2,col=col1)
      rect(2.5,-6,7,2,col=col2)

		}
		else if(j==5 && i>1 && i<5)
		{
			par(mai=c(0.25,0.025,0.015,0.025))
		  plot(xaxt='n',xlab='',yaxt='n',cex.main=0.85,cex.lab=0.65,cex.axis=0.65,x=1:length(coeff.matrix),coeff.matrix,type='h',col=col.matrix,lwd=1.5)
   		axis(at=1:6,side=1,labels=c('a','mkt','a','mkt','smb','hml'))

			points(x=1:length(coeff.matrix),y=coeff.matrix,col=col.matrix,cex=1,pch=19)
			abline(h=0)
			abline(v=2.5,col='darkred',lwd=1.5,lty=3)
			rect(0,-6,2.5,2,col=col1)
      rect(2.5,-6,7,2,col=col2)

		}
		else if(j==5 && i==5)
		{
		 par(mai=c(0.25,0.025,0.015,0.15))
	   plot(xaxt='n',yaxt='n',cex.main=0.85,cex.lab=0.65,cex.axis=0.65,x=1:length(coeff.matrix),coeff.matrix,type='h',col=col.matrix,lwd=1.5)
     axis(at=1:6,side=1,labels=c('a','mkt','a','mkt','smb','hml'))

     points(x=1:length(coeff.matrix),y=coeff.matrix,col=col.matrix,cex=1,pch=19)
		 mtext(text=paste('Size Portfolio',j),cex=0.65,side=4)
		 abline(h=0)
		 abline(v=2.5,col='darkred',lwd=1.5,lty=3)
			rect(0,-6,2.5,2,col=col1)
      rect(2.5,-6,7,2,col=col2)

		}
		else if(j>1 && j<5  && i==5)
		{
		 par(mai=c(0.025,0.025,0.015,0.15))
	   plot(xaxt='n',yaxt='n',cex.main=0.85,cex.lab=0.65,cex.axis=0.65,x=1:length(coeff.matrix),coeff.matrix,type='h',col=col.matrix,lwd=1.5)

		 points(x=1:length(coeff.matrix),y=coeff.matrix,col=col.matrix,cex=1,pch=19)
     mtext(text=paste('Size Portfolio',j),cex=0.65,side=4)
		 abline(h=0)
		 abline(v=2.5,col='darkred',lwd=1.5,lty=3)
		 rect(0,-6,2.5,2,col=col1)
     rect(2.5,-6,7,2,col=col2)

		}
	}
}

aq

The yellow boxes cover CAPM estimates while the blue boxes cover FF parameters.Red lines indicate statistical significance at the 10% level, while black lines indicate non significance. For most portfolios the 3 risk factors tend to be significant and have the expected sign. As such, the smaller sized portfolios are more exposed to the SMB factor than larger sized portfolios. Exposure to the HML factor tends to increase as we move from growth to value stocks (left to right or B/M1 to B/M5). Clearly, the statistical significance of most of the factors points to the multifactor model being able to capture risk exposures beyond the conventional CAPM. It should be noted that the main point of the time series regression is NOT to explain stock returns but to see if the intercept term is low and if high average returns are associated with high slope parameters. Essentially, time series regressions provide the data for explaining stock returns, a task delegated to cross section regressions.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: