Diagnosing a Fama-French Momentum Portfolio Replication Gap
Summary
The document describes an attempted replication of the large-cap high- and low-prior-return portfolios used in the Fama-French momentum factor. The researcher maps stocks to Russell 1000 constituents and follows a 12-to-2-month return sort with upper and lower groups. The high-prior-return portfolio matches closely, while adding the risk-free rate to the low-prior-return portfolio appears to remove its discrepancy, prompting a question about how that rate could have entered the calculation.
A reply reports a quick, preliminary comparison using CRSP data and suggests several possible sources of the mismatch: using Russell 1000 instead of the full stock universe, different prior-return windows or percentile breakpoints, and portfolio weighting. It notes that value-weighted returns should use market capitalization lagged by one month. These are debugging hypotheses, not a definitive explanation; the responder emphasizes that the replication was not exact and advises checking the published breakpoints and universe coverage.
Key ideas
- The replication matches the high-prior-return portfolio but not the low-prior-return portfolio.
- Adding the risk-free rate to the low-prior-return series appears to align the result, but the cause is unresolved.
- Using Russell 1000 constituents may omit firms with very poor prior returns that left the index.
- Prior-return windows and percentile breakpoints should be checked against the published methodology.
- Value-weighted portfolio returns should use market capitalization lagged by one month.
Tags
Full text
# Fama/French momentum replication: risk-free rate missing on one of the legs? # Fama/French momentum replication: risk-free rate missing on one of the legs? I am using a python script to replicate the monthly UMD factor, disregarding small caps (ie, focusing only on the "BIG HiPRIOR" and "BIG LoPRIOR" sub-portfolios in prof. French's website). For that purpose, I am mapping the universe of stocks to the Russell 1000, which has a good fit in terms of market cap cut-off, and downloading data from Bloomberg for the relevant constituents over the 1997-2015 period. I then follow the methodology described in prof. French's website (sort 12-2 returns, take upper and bottom 30%, etc.). My problem is as follows: I manage to get a very close replication of the BIG HiPRIOR returns over the whole period. However, using exactly the same methodology and data, I fail to replicate the BIG LoPRIOR one: After several days of unsuccessfully trying multiple avenues to explain the discrepancy, it occurred to me that the difference in performance looked like some sort of compounding over time. So I decided to download the risk free rate from prof. French's website to see if it explained the difference. Shockingly, it did almost perfectly - if I add the risk free rate to prof. Frech's LoPrior returns only, then the match becomes just as good as for the HiPrior portfolio: Here is the issue: the risk free rate was never part of the original dataset I downloaded from Bloomberg (all I downloaded was individual stock returns for the index constituents over the relevant period). Therefore it is not possible that an error in my code would have introduced that consistent bias over time on one portfolio but not the other. The risk free data simply didn't exist as far as my model is concerned. So at this point I am completely at a loss to explain this issue. On the one hand, I find it impossible to believe that there'd be an issue with prof. French's rigorous calculations; on the other hand I can't explain how such a precise bias (monthly risk free rate at each point in time over a period of 18 years, affecting only the LoPrior portfolio) could have crept into my model if that data simply did not exist when I ran the model. Could I ask, to put me out of my misery, if anyone has gone through a similar exercise and successfully replicated each of the sub-portfolios used in the construction of the UMD factor? Many thanks in advance for any help/clarity anyone could shed on this topic! ## Answer by Matthew Gunn (score 5) https://quant.stackexchange.com/a/34630 Out of curiosity, I took a quick stab at replicating the Fama-French portfolios using CRSP data. - I seem to be getting numbers reasonably close to Fama-French, so I think the issue is on your end. It's also possible though the difference is due to using the Russell 1000 rather than the full CRSP universe. That doesn't strike me as crazy. - I'm for sure not matching Fama-French methodology exactly. Don't take my numbers etc... as gospel. I did this quickly. Here's my preliminary replication of the equal weight, big size, low prior return portfolio (and comparison to Fama French). #### Some ideas: - I'd check your 30th percentile breakpoint vs. Ken French's computed breakpoint. (Note: I used 11 months of prior returns; I think French's computed breakpoints elsewhere on the website use 12 months?) - There might be an issue that you don't have companies with horrible, prior returns in the Russel 1000 because if they had horrible prior returns they would leave the index! Corollary: you could be doing everything right, but you'll need the full universe to replicate Fama-French. #### Some excerpts from my stuff: These are the breakpoints for the 30th prior return percentile and the 70th prior return percentile for the 11 months of prior returns (i.e. t-12 through t-2... do they use 12?). http://www.mattgunn.com/share/quantse1/PRELIMINARY_prior_ret_breakpoints.csv These are the returns I get for the portfolio in question: http://www.mattgunn.com/share/quantse1/PRELIMINARY_big_lowpriorret.csv I use French's size breakpoints available here: http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html#Breakpoints I'm using my own computed breakpoints for prior returns (in the link above), but if you're trying to match Fama-French, I'd just use their breakpoints which appear to be available at the above link. Another obvious point that I thought I'd mention is that to compute value weight returns, you want to use the 1 month lagged market cap (eg. February return gets the weight of the end of January market cap).
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.