I have some trouble understanding how to create factor mimicking portfolio returns. As pointed out in this question, Tsay provides a small description, but I am unsure if my procedure is correct. In more detail, I want to generate factor mimicking returns for consumption growth as explained in the paper "Empirical Test of the Consumption Oriented CAPM" (Breeden, Gibbons, Litzenberger; 1989).

Procedure in R

First, I download real personal consumption expenditures per capita from FRED


cons <- getSymbols('A794RX0Q048SBEA', 
                   auto.assign = FALSE)
cons_growth <- data.frame(Date = index(cons),

        Date    cons_exp
1 1947-04-01  1.19832958
2 1947-07-01 -0.12981650
3 1947-10-01 -0.43789643
4 1948-01-01  0.07114062
5 1948-04-01  0.75570085
6 1948-07-01 -0.28271900

Consumption growth data from Fed

The data is available on a quarterly basis. As stated by Breeden et al., more precise evidence on the CCAPM can be provided if only returns were needed to test the theory.

CCAPM justifies the use of betas measured relative to a portfolio that has maximum correlation with growth in aggregate consumption, in place of betas measured relative to aggregate consumption.

In the original paper, monthly returns on individual securities are gathered from CRSP and twelve portfolios are used. For illustrative purposes I want to use factor portfolio returns obtained by Kenneth Frenchs homepage.

Download Fama French Factors

famaFrenchZip <- "http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/F-F_Benchmark_Factors_Monthly.zip"
famaFrenchFile <- "F-F_Benchmark_Factors_Monthly.txt"
temp <- tempfile()
ffData <- read.table(unz(temp, famaFrenchFile),  header = TRUE)

names(ffData) <- c('Date', 'Rm.Rf', 'SMB', 'HML')
ffData$Date <- as.Date(paste0(ffData$Date, '01'), format='%Y%m%d')

        Date Rm.Rf   SMB   HML
1 1926-07-01  2.69 -2.49 -2.91
2 1926-08-01  2.52 -1.25  4.25
3 1926-09-01  0.00 -1.38  0.22
4 1926-10-01 -3.06 -0.20  0.71
5 1926-11-01  2.42 -0.34 -0.40
6 1926-12-01  2.66 -0.07 -0.11

Compute the maximum correlation portfolio weights

The aim is to create portfolio weights whose portfolio returns exhibit the highest correlation with the consumption growth. In the original paper, Breeden et al. show that mathematically, the MCP solves $$\min_w w'Vw + 2\lambda(\beta_{c,nb}-w'\beta_c)$$

where $V$ is the $N\times N$ unconditional covariance matrix for the returns, $\beta_c$ is the $N\times 1$ vector of unconditional consumption betas and $\beta_{c, nb}$ is the unconditional consumption beta of the MCP.

I first create the vector $\beta_c$ of unconditional consumption betas by multivariate linear regression

jdata <- left_join(cons_growth, ffData, by='Date')
X <- cbind(1, jdata%>%.$cons_exp)
betac <- solve(t(X)%*%X)%*%t(X)%*%as.matrix(jdata%>%select(Rm.Rf:HML))

     Rm.Rf        SMB       HML
[1,] 0.7154750 -0.1411068 0.6945837
[2,] 0.1728738  0.3052810 0.3483269

The second row corresponds to the unconditional consumption betas of the individual factor returns (first row are intercept terms). Then the MCP weights are computed as

V <- cov(jdata%>%select(Rm.Rf:HML)) # unconditional covariance matrix of the assets
w <- solve(V)%*%betac[2,]
w <- w/sum(w)

The results look as follows:

Rm.Rf 0.07773869
SMB   0.43093279
HML   0.49132852

cov(as.matrix(jdata%>%select(Rm.Rf:HML))%*%w, jdata$cons_exp)

I would interpret the monthly factor mimicking portfolio returns as

r <- as.matrix(ffData%>%select(-Date))%*%w

Factor mimicking portfolio returns


  • is this procedure correct so far?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.