I am a very big fan of index funds. However, I often hear the argument from my friends and relatives that index investors are content to be “average” and that smart investors who are well informed and willing to put in a little extra work should be able to “beat the market”.
If only it were that easy! There are numerous academic studies showing that, after fees, the average active mutual fund underperforms low cost index funds. These studies also show that there is very little “persistence” among the mutual funds that have managed to beat the indexes in the past. In other words, we can’t accurately predict which funds which will beat the market in the future by looking at past performance.
Despite all the evidence in favor of index funds, I find that it is very difficult to change the mind of a diehard believer in active management. Instead, I choose to stress the importance of carefully measuring investment performance. I strongly believe that any investor who does not carefully measure and evaluate investment performance is not a serious investor! I have found that most investors who carefully and honestly monitor the performance of their investments and compare this performance to a relevant benchmark will eventually convince themselves that indexing is the way to go.
Evaluating the Performance of Some Carefully Chosen Mutual Funds
In this post, I’m going to demonstrate two methods for evaluating investment performance. First, I’ll compare the returns of some carefully chosen mutual funds to a broad index benchmark. Next, I’ll do a risk-adjusted evaluation of these same funds using the Fama-French Three Factor model.
How the Sample Funds were Selected
One very well known and long established list of carefully selected mutual funds is the Forbes Honor Roll. This list of 10 mutual funds is published annually, and, according to Forbes, the funds are chosen based on “consistency and great long-term returns”.
To keep this analysis simple, I’m going to use only the Top 5 funds from the 2005 Honor Roll list. I’ve chosen a 5-year interval as a minimum amount of time to begin to evaluate the performance and risk of the chosen funds.
5-year Performance of Selected Funds vs. Total Stock Market
So, how have the Honor Roll funds from 5-years ago performed? A plot of the total returns (including dividends) of the Top 5 Honor Roll Funds from 2005 is shown here:
The bold red line is an index based on the total stock market (VTI). We can see that 3 of 5 funds outperformed the total stock market. Not bad for the Honor Roll! However, a closer look shows that two funds beat the index by a very small margin, and one fund underperformed by a large amount. In fact, an investor who invested an equal amount in each of these Top 5 Honor Roll funds would have underperformed the VTI index by more than 4% over the 5-year period.
What about risk?
One potential problem with comparing these funds to VTI is that VTI may not be an appropriate benchmark. Some of the funds may take on more risk than others, and the returns of the funds should be judged on a risk-adjusted basis.
For example, most investors believe that stocks are likely to outperform bonds over the long run, but investors still buy bonds in spite of their lower expected returns. Why? Of course, the reason is that stocks are more risky than bonds. Stocks are likely to outperform bonds, but they also have a risk of doing very poorly…even over relatively long horizons. Investors who are not willing to bear this risk will choose bonds over stocks in spite of the fact that returns are likely to be lower.
Similarly, not all stocks have the same risk/return characteristics. Some stocks have higher risk and higher expected return. A mutual fund which overweights these risky stocks will tend to have higher returns than the broader market when times are good, but it may also have a higher chance of disaster when the markets are under stress.
The best way to account for differences in risk is to evaluate funds using an asset pricing model such as the Capital Asset Pricing Model (CAPM) or Fama-French Three Factor (FF3F) model. I prefer the Fama-French model since it does a better job of explaining returns across a wide variety of investment strategies.
Fama-French Regression Results
The Fama-French Three Factor model regression results are shown here:
|Fund Name||Ticker||Monthly Alpha||FF-Beta||FF-s (size)||FF-h (value)||R-squared|
|Calamos Growth Fund A||CVGRX||-0.129%||1.24||0.17||-0.57||0.93|
|Mairs&Powers Growth Fund||MPGFX||-0.032%||0.78||0.18||0.33||0.91|
|Keeley Small Cap Value Fund||KSCVX||-0.148%||1.18||0.63||0.06||0.91|
Only the Bruce fund has a positive alpha over the 5-year evaluation period. In other words, only the Bruce Fund has outperformed after adjusting for risk. Further, the only statistically significant alpha is the negative alpha for the Muhlencamp fund.
In this post, I’ve demonstrated two basic methods for evaluating the performance of a mutual fund. We can compare the performance to a broad market benchmark, or we can use an asset pricing model to evaluate whether the funds deliver excess returns after accounting for risk. If your investment strategy is underperforming by a meaningful margin when evaluated by either of these two methods, then you might consider switching to a simpler index based portfolio.
Data: The data for this analysis was taken from Yahoo! Finance and the Fama-French website.
Code: The R-code used to run the regressions and generate the plots is shown below.
# Goal: Using data from Yahoo finance, estimate the Fama-French Factors for Forbes Honor Roll # using monthly returns library(tseries) # Load FF factor returns startyear <- 2006 startmonth <- 1 endyear <- 2010 endmonth <- 12 start <- (startyear-1926.5)*12+startmonth stop <- (endyear - 1926.5)*12+endmonth ff_returns <- read.table("F-F_Factors_monthly.txt") rmrf <- ff_returns[start:stop,2]/100 smb <- ff_returns[start:stop,3]/100 hml <- ff_returns[start:stop,4]/100 rf <- ff_returns[start:stop,5]/100 # Load Fund Data prices1 <- get.hist.quote("CVGRX", quote="Adj", start="2005-12-25", retclass="zoo") prices2 <- get.hist.quote("BRUFX", quote="Adj", start="2005-12-25", retclass="zoo") prices3 <- get.hist.quote("MUHLX", quote="Adj", start="2005-12-25", retclass="zoo") prices4 <- get.hist.quote("MPGFX", quote="Adj", start="2005-12-25", retclass="zoo") prices5 <- get.hist.quote("KSCVX", quote="Adj", start="2005-12-25", retclass="zoo") # Benchmark prices.vti <- get.hist.quote("VTI", quote="Adj", start="2005-12-25", retclass="zoo") prices1 <- na.locf(prices1) # Copy last traded price when NA prices2 <- na.locf(prices2) prices3 <- na.locf(prices3) prices4 <- na.locf(prices4) prices5 <- na.locf(prices5) # To make monthly returns, you must have this incantation: monthly.prices <- aggregate(prices1, as.yearmon, tail, 1) monthly.prices2 <- aggregate(prices2, as.yearmon, tail, 1) monthly.prices3 <- aggregate(prices3, as.yearmon, tail, 1) monthly.prices4 <- aggregate(prices4, as.yearmon, tail, 1) monthly.prices5 <- aggregate(prices5, as.yearmon, tail, 1) # Benchmark monthly.vti <- aggregate(prices.vti, as.yearmon, tail, 1) # Convert selected monthly prices into monthly returns to run regression r <- diff(log(monthly.prices)) # Need to chnage this line to estimate factors for desired fund r1 <- exp(r)-1 # Now shift out of zoo into ordinary matrix rj <- coredata(r1) rj <- rj[1:60] rjrf <- rj - rf d <- lm(rjrf ~ rmrf + smb + hml) # FF model estimation. print(summary(d)) series1 <- 100*(monthly.prices/coredata(monthly.prices)-1) series2 <- 100*(monthly.prices2/coredata(monthly.prices2)-1) series3 <- 100*(monthly.prices3/coredata(monthly.prices3)-1) series4 <- 100*(monthly.prices4/coredata(monthly.prices4)-1) series5 <- 100*(monthly.prices5/coredata(monthly.prices5)-1) series.vti <- 100*(monthly.vti/coredata(monthly.vti)-1) dates <- 2005+10/12 + (1:64)/12 series <- cbind(series1,series2,series3,series4,series5,series.vti) dates <- cbind(dates,dates,dates,dates,dates,dates) matplot(dates,series,type='l',lty = c(3,4,5,6,2,1),col=c(3,4,5,6,9,2),lwd=c(2,2,2,2,2,5),ylab="",xlab="") legend(2006,45,c("CVGRX","BRUFX","MUHLX","MPGFX","KSCVX","VTI"),lty = c(3,4,5,6,2,1),col=c(3,4,5,6,9,2),lwd=c(2,2,2,2,2,5)) title("Total Returns of Forbes Honor Roll Funds vs. VTI",xlab="Date",ylab="Percent Gain",cex.main="2.25",cex.lab="1.75")