The point of Fama and French’s time series regression is *not* to explain stock returns as much as assessing estimated intercept terms as well as linking parameter estimates to average excess portfolio returns in a positive and linear fashion. Since it is unintuitive (and perhaps unwieldy) to plot average excess returns against respective parameter estimates when there are 4 dimensions (expected return ~ mkt + smb + hml), it is useful to visualise model fit by plotting actual average excess returns against model predictions across the 25 sorted FF portfolios. The vertical axis is still the average return of the test assets,but instead of plotting these against estimated parameters as before,the horizontal axis reflect predicted values from the CAPM and FF models. The points should lie on the 45 degree line if the model is correct. The vertical distance between this line and plot points reflects the discrepancies between actual data and model projections.

The code for the cross sectional regressions follows.

############################################################### #Cross Section ############################################################### #[Size perspective] SZ.focus <- matrix(unlist(SZ.BM$size.port.mean),ncol=1) - mean(rf.ret) ######capm SZ.capm.b <- matrix(unlist(s.betas),ncol=1) SZ.capm.cross <- lm(SZ.focus~SZ.capm.b) SZ.capm.alpha <- as.matrix(coef(SZ.capm.cross)[1]) SZ.capm.beta <- as.matrix(coef(SZ.capm.cross)[2]) SZ.capm.fitted <- fitted(SZ.capm.cross) SZ.capm.rsq <- summary(SZ.capm.cross)$adj.r.squared ######fama french 3 factor SZ.ff.b <- t(matrix(unlist(s.ff.betas),nrow=3)) colnames(SZ.ff.b) <- c('MKT','SMB','HML') SZ.ff.cross <- lm(SZ.focus~SZ.ff.b) SZ.ff.alpha <- as.matrix(coef(SZ.ff.cross)[1]) SZ.ff.beta <- as.matrix(coef(SZ.ff.cross)[2:4]) SZ.ff.fitted <- fitted(SZ.ff.cross) SZ.ff.rsq <- summary(SZ.ff.cross)$adj.r.squared #[Value perspective] BZ.focus <- matrix(unlist(BM.SZ$value.port.mean),ncol=1) - mean(rf.ret) ######capm BZ.capm.b <- matrix(unlist(v.betas),ncol=1) BZ.capm.cross <- lm(BZ.focus~BZ.capm.b) BZ.capm.alpha <- as.matrix(coef(BZ.capm.cross)[1]) BZ.capm.beta <- as.matrix(coef(BZ.capm.cross)[2]) BZ.capm.fitted <- fitted(BZ.capm.cross) BZ.capm.rsq <- summary(BZ.capm.cross)$adj.r.squared ######fama french 3 factor BZ.ff.b <- t(matrix(unlist(v.ff.betas),nrow=3)) colnames(BZ.ff.b) <- c('MKT','SMB','HML') BZ.ff.cross <- lm(BZ.focus~BZ.ff.b) BZ.ff.alpha <- as.matrix(coef(BZ.ff.cross)[1]) BZ.ff.beta <- as.matrix(coef(BZ.ff.cross)[2:4]) BZ.ff.fitted <- fitted(BZ.ff.cross) BZ.ff.rsq <- summary(BZ.ff.cross)$adj.r.squared ###############################################################################

To visualise the cross sectional results for the CAPM and FF3F models across 25 sorted portfolios.

################################################################################################### #Fitted vs Actual ################################################################################################### windows() layout(matrix(c(1,2,3,4),ncol=2,byrow=T)) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[SizeFocus]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# #CAPM par(mai=c(0.1,0.65,0.65,0)) plot(x=SZ.capm.fitted*100,y=SZ.focus*100,xlab='',xaxt='n',ylab='Average Excess Returns',cex.main=0.85,cex.lab=0.7,cex.axis=0.65,xlim=c(0.2,1.2),ylim=c(0.2,1.2),col='white') for(i in 1:5){ lines(x=SZ.capm.fitted[beg[i]:end[i]]*100,y=SZ.focus[beg[i]:end[i]]*100,col=cols.m[i]) points(x=SZ.capm.fitted[beg[i]:end[i]]*100,y=SZ.focus[beg[i]:end[i]]*100,col=cols.m[i],pch=20+i) } abline(0,1) legend(title='CAPM\n\nLines connect same\n Size Quintile','bottomright',pch=21:25,col=cols.m,legend=c('Smallest Size Portfolio',paste('Size Portfolio',2:4),'Largest Size Portfolio'),ncol=1,bg='white',bty='n',cex=0.6) #Fitted 3 factor models par(mai=c(0.1,0.2,0.65,0.45)) plot(x=SZ.ff.fitted*100,y=SZ.focus*100,xlab='',xaxt='n',ylab='',yaxt='n',cex.main=0.85,cex.lab=0.7,cex.axis=0.65,xlim=c(0.2,1.2),ylim=c(0.2,1.2),col='white') for(i in 1:5){ lines(x=SZ.ff.fitted[beg[i]:end[i]]*100,y=SZ.focus[beg[i]:end[i]]*100,col=cols.m[i]) points(x=SZ.ff.fitted[beg[i]:end[i]]*100,y=SZ.focus[beg[i]:end[i]]*100,col=cols.m[i],pch=20+i) } mtext(font=2,line=2,adj=1,cex=0.75,text='25 Size/BM sorted Portfolios : Actual average excess returns against model predictions',side=3) abline(0,1) legend(title='3 Factor Model\n\nLines connect same\n Size Quintile','bottomright',pch=21:25,col=cols.m,legend=c('Smallest Size Portfolio',paste('Size Portfolio',2:4),'Largest Size Portfolio'),ncol=1,bg='white',bty='n',cex=0.6) #*************************************************************************************************# #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ValueFocus]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# #CAPM par(mai=c(0.65,0.65,0.1,0)) plot(x=BZ.capm.fitted*100,y=BZ.focus*100,xlab='Predicted Mean Excess Returns',ylab='Average Excess Returns',cex.main=0.85,cex.lab=0.7,cex.axis=0.65,xlim=c(0.2,1.2),ylim=c(0.2,1.2),col='white') for(i in 1:5){ lines(x=BZ.capm.fitted[beg[i]:end[i]]*100,y=BZ.focus[beg[i]:end[i]]*100,col=cols.m[i]) points(x=BZ.capm.fitted[beg[i]:end[i]]*100,y=BZ.focus[beg[i]:end[i]]*100,col=cols.m[i],pch=20+i) } abline(0,1) legend(title='CAPM\n\nLines connect same\n Book-Market Quintile','bottomright',pch=21:25,col=cols.m,legend=c('Lowest B/M Portfolio',paste('Value Portfolio',2:4),'Highest B/M Portfolio'),ncol=1,bg='white',bty='n',cex=0.6) #Fitted 3 factor models par(mai=c(0.65,0.2,0.1,0.45)) plot(x=BZ.ff.fitted*100,y=BZ.focus*100,xlab='Predicted Mean Excess Returns',ylab='',yaxt='n',cex.main=0.85,cex.lab=0.7,cex.axis=0.65,xlim=c(0.2,1.2),ylim=c(0.2,1.2),col='white') for(i in 1:5){ lines(x=BZ.ff.fitted[beg[i]:end[i]]*100,y=BZ.focus[beg[i]:end[i]]*100,col=cols.m[i]) points(x=BZ.ff.fitted[beg[i]:end[i]]*100,y=BZ.focus[beg[i]:end[i]]*100,col=cols.m[i],pch=20+i) } abline(0,1) legend(title='3 Factor Model\n\nLines connect same\n Book-Market Quintile','bottomright',pch=21:25,col=cols.m,legend=c('Lowest B/M Portfolio',paste('Value Portfolio',2:4),'Highest B/M Portfolio'),ncol=1,bg='white',bty='n',cex=0.6) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#

The first row of plots charts mean excess returns against cross sectional predictions across both CAPM and FF3F models with lines connecting different BM portfolios within each size category The second row of plots examines the risk return relation by connecting different size portfolios within each BM category. In both cases, the scatter of points is closer to the 45 degree line for the FF3F model than for the CAPM, implying that variation in average returns of the 25 portfolios can be explained by varying loadings on the 3 factors. The adjusted r-squared increases from 0.23% to 72.78% as we move away from the CAPM to the 3 factor model.

At this point it is instructive, at least in terms of keeping a diary of experiments for myself,to embed the idea of factor models discussed above in the microeconomic framework outlined in part 1 of the asset pricing series. The economic intuition for valuing uncertain cash flows starts with

[1] the basic consumer problem of maximising current and future expected utility of consumption :

leading to [2] the central asset pricing relation according to which the price of any asset is simply its discounted payoffs : **p = E(mx)** where

providing [3] a set of important relations such as

- Asset prices (p) are equal to the expected cash flow payoff (x) discounted at the risk free rate (rf) plus a risk premium.
- This risk premium depends on the covariance of the payoff with the discount factor.
- Assets whose payoff covaries positively with the stochastic discount factor (m) or negatively with consumption growth commands a higher price and a lower expected return.
- Assets whose payoff covaries negatively with the discount factor or positively with consumption growth commands a lower price and a higher expected return.
- Investors dislike uncertainty in their consumption streams.
- Assets whose payoff vary positively with consumption disrupt an investor’s consumption stream and hence must be cheap in terms of price and high in terms of expected returns.
- Assets whose payoff vary negatively with consumption help stabilise an investors consumption stream and hence can be expensive in terms of price and low in terms of expected returns.
- A positive covariance between asset payoff and consumption characterises an asset that pays off well when investors are already wealthy (bad when investors already feel poor).
- A negative covariance between asset payoff and consumption characterises an asset that pays off poorly when investors feel wealthy (well when investors feel poor).
- Price/Expected return depend on covariance not individual risks.

Practical applications tend to use linear approximations of the form :

leading to the well worn specification of :

Although this consumption based approach should in principle provide a complete answer to most absolute pricing issues,empirically it is not perfect. Essentially, the slew of factor models is a response to the question posed by Cochrane : ‘what variables other than consumption might indicate bad times (high marginal utility)’.

Value stocks, which combine high book values with low market prices, tend to be particularly affected in times of recession and crises, inducing investors to only hold such assets at low prices/high premiums. Assets that covary negatively with m and hence positively with consumption must pay a higher average return. Since value stocks do poorly in recessions when consumption levels are low, they are covarying positively with consumption,negatively with the stochastic discount factor, and hence must provide a greater premium/lower price to entice investors. The original authors suggest that the economic meaning of HML is as a proxy for this distress risk. Along similar lines of reasoning,the SMB can be thought of as a mimicking portfolio for illiquidity risk. It should be noted that while the 3 factor model is an empirical improvement in most applications, the economic meaning of the factors on the right hand side seem to be less certain.