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
library(quantmod)
library(dplyr)
cons <- getSymbols('A794RX0Q048SBEA',
src='FRED',
auto.assign = FALSE)
cons_growth <- data.frame(Date = index(cons),
cons_exp=100*as.vector(diff(log(cons$A794RX0Q048SBEA))))[-1,]
rownames(cons_growth)<-NULL
head(cons_growth)
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
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()
download.file(famaFrenchZip,temp)
ffData <- read.table(unz(temp, famaFrenchFile), header = TRUE)
unlink(temp)
names(ffData) <- c('Date', 'Rm.Rf', 'SMB', 'HML')
ffData$Date <- as.Date(paste0(ffData$Date, '01'), format='%Y%m%d')
head(ffData)
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))
betac
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:
w
[,1]
Rm.Rf 0.07773869
SMB 0.43093279
HML 0.49132852
cov(as.matrix(jdata%>%select(Rm.Rf:HML))%*%w, jdata$cons_exp)
0.2066
I would interpret the monthly factor mimicking portfolio returns as
r <- as.matrix(ffData%>%select(-Date))%*%w
Questions
- is this procedure correct so far?