Diagnosing Fama-MacBeth Tests of Valuation, Size, and Momentum
Summary
The document describes an attempt to test valuation, size, and momentum premia with Fama-MacBeth regressions. The proposed design estimates factor loadings in rolling 60-month time-series regressions for 50 portfolios, then runs monthly cross-sectional regressions and averages the estimated premia. The author reports insignificant unconditional and regime-specific premia for the proprietary factors, and also says a check using Fama-French HML and SMB failed to find significant premia with the same procedure.
A reply questions how closely the author’s 3,000-stock sample matches the Fama-French sample and reports a separate quick check using 25 book-to-market portfolios and the three-factor model. In that check, six first-stage alphas were significant, while the market factor was significant in the second stage but had the wrong sign. The reply characterizes the sample as short at 25 years. These exchanges raise data, sample, and implementation questions, but do not establish a definitive diagnosis; the reply provides limited comparison evidence and no full code review.
Key ideas
- The described procedure estimates portfolio factor loadings with rolling time-series regressions before monthly cross-sectional regressions.
- The author reports insignificant premia for proprietary factors across unconditional and market-regime tests.
- A check with Fama-French factors also failed to find significant HML or SMB premia in the author’s setup.
- A reply raises sample comparability and reports different results from a brief test using 25 book-to-market portfolios.
- The exchange leaves the cause of the differing results unresolved.
Tags
Full text
# 8757
# Testing Valuation, Size and Momentum (proprietary factors) from 1988-2013: No evidence of driving cross-sectional returns
I am currently testing whether three proprietary factors - Valuation, Size and Momentum - explain cross-sectional returns. A sample of 3000 securities was tested using Fama-MacBeth two-pass regressions over the period 1988-2013. In order to mitigate any thorny estimation problems due to time-varying regression slopes, I have used 50 portfolios sorted on size and book/market (25), and size and momentum (25), as test assets (LHS variables).
The unconditional regressions resulted in insignificant premia for the three factors. Since these factors might behave differently in disparate market conditions, I have also performed conditional regressions based on regimes. The hypothesis was that Valuation should be highly significant in a Bear market, while Momentum should have a statistically significant premia in Bull markets. However, the results showed insignificant premia for all factors across all market regimes.
I am a bit surprised by the results, and made me question the actual testing methodology.
For a sanity check for the methodology, I have decided to test the Fama-French factors HML and SMB using the same sample period used in the Fama-French(1993) paper. The data was downloaded from Kenneth French website. However, even in this case, the Fama-MacBeth procedure was unable to discover any significant premia for either HML or SMB factors.
Would anyone have any thoughts on this issue?
Here is the code for the Fama-MacBeth procedure using 50 portfolios as test assets. The 50 sorted portfolios, as well as the factor-mimicking portfolios - VAL, SIZE and MOM - are constructed using a sample of 3000 securities.
- In the first pass of Fama-MacBeth (time-series regression), betas are estimated using rolling windows of 60 months each. Betas are updated monthly.
- Securities are sorted at the end of June each year, and test portfolios' returns are computed from July to June of the next year.
- The returns on the factor mimicking portfolios (VAL, SIZE and MOM) are computed as the top-bottom spread of 5 book-to-market quantiles, 5 market-cap quantiles, and 5 momentum quantiles respectively.
- In the second-pass of Fama-MacBeth, the previously estimated betas of portfolios are used as independent variables in monthly-cross-sectional regressions, on a subsequent sample period. The premiums for VAL, SIZE and MOM are estimated monthly. When all the monthly cross-sectional regressions have been done, the mean of the time-series of premiums is estimated for each factor. This is all performed by the function pmg(). The average premiums are then tested for statistically significant difference from zero using the t-statistic. The conditional regressions based on market regimes is not included in the code. The reason being is that the regime definition is also proprietary. All you need to know is that when the cross-sectional regressions are evaluated, the time-series of premiums for each factors are averaged on a per-regime basis: in other words, you average the premiums for the periods of bull-markets, and periods of bear-markets, ... separately. The bull and bear, and .. premiums for each factor are tested using the t-statistic.
Please be mindful that this is only a representative (modified) snapshot of the code.
```
##########################################################################
### Time-Series Regressions ###
##########################################################################
portfolios = 50 ## Test assets
num.factors = 3 ## VAL, SIZE and MOM
rows = nrow(ret.ff.zoo) - 60 + 1 ### Number of time windows
beta.mat <- matrix(nc = num.factors + 1, nr = portfolios*rows)
portfolio.id = matrix(nc = 1, nr = portfolios*rows)
d = 1
for(i in seq(1:portfolios)) {
######### Dataset (merging test assets' returns and returns of factor-mimicking portfolios
data = merge(return = ret.zoo[,i], VAL = df$VAL, SIZE = df$SIZE, MOM = df$MOM, all = c(TRUE, rep("FALSE", num.factors))) ## "df" is the dataframe (zoo object) containing the returns of VAL, SIZE and MOM only
############ Coefficients of regression
reg = function (z) coef(lm(return ~., data = as.data.frame(z)))
beta = rollapply(data, width = 60, FUN = reg, by.column = FALSE, align = "right")
beta.mat[d:(d+rows-1),] = beta
portfolio.id[d:(d+rows-1),] = i
d = d + rows
}
beta.df = data.frame(port = portfolio.id, date = index(beta), beta.mat)
colnames(beta.df) <- c("portfolio", "date", "intercept", colnames(beta)[-1])
##########################################################################
### Cross-Sectional Regressions ###
##########################################################################
## requires library(plm)
return <- matrix(ret.zoo[which(index(ret.zoo) >= beta.df$date[1]),], ncol = 1)
dataset <- cbind(beta.df, return)
fpmg <- pmg(return ~ VAL + SIZE + MOM, data = dataset, index = c("date", "portfolio"), na.action = na.omit)
summary(fpmg)
```
Thank you,
## Answer by phdstudent (score 4)
https://quant.stackexchange.com/a/55114
I think your best shot is to share with us your 3,000 stocks. How far can that be from FF sample?
As a quick check I took the 25 book-to-market portfolios and the Fama-French 3 factor model and run the standard fama macbeth regressions.
- First stage results:
Only 6 alphas are statistically significant from zero (which is good news for the model).
- Second stage results:
As you can see the market factor (though with the wrong sign is significant).
This is however a super short sample that you used (25 years of data).Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.