While we have a foundation and momentum from the last post “SelectionShare & TimingShare | Masterfully Written by Delightfully Responsive Author” , we can run the Ekholm calculations on some popular funds to see how they have evolved since the early 1980s. Remember these are my opinions and not investment advice. I chose these four funds for
- popularity in terms of Assets Under Management (AUM)
- style (active)
- tenure (old)
- evolution ( 2 evolved in a bad way and 2 have stayed consistent in a good way ).
This will continue what I envision to be a whole series of posts experimenting with the Ekholm (2014) decomposition into SelectionShare and TimingShare and determining how to use it in a mutual fund selection process. Just as a reminder, below is the link to the very well-done paper by Anders Ekholm.
Ekholm, Anders G.
Components of Portfolio Variance: Systematic, Selection and Timing
August 8, 2014
See if you can make any conclusions after reading the paper and looking at the chart below on the 2 year rolling Ekholm decomposition of FPA Crescent ® Fund (FPACX), Sequoia ® Fund (SEQUX), Fidelity ® Contrafund ® (FCNTX), and The Growth Fund of America ® (AGTHX).
As always, I really would like for you to reproduce and extend. Please let me know if you do. Below is the code.
# perform Ekholm (2012,2014) analysis on some popular mutual funds
# Ekholm, A.G., 2012
# Portfolio returns and manager activity:
# How to decompose tracking error into security selection and market timing
# Journal of Empirical Finance, Volume 19, pp 349-358
# Ekholm, Anders G., July 21, 2014
# Components of Portfolio Variance:
# R2, SelectionShare and TimingShare
# Available at SSRN: http://ssrn.com/abstract=2463649
library(Quandl) # use to get Fama/French factors
library(pipeR) # pipes are the future or R
library(rlist) # rlist - like underscore/lodash for R lists
library(dplyr) # super fast and really powerful
library(tidyr) # next gen wide/long formatter package
library(latticeExtra) # old but still awesome
library(directlabels) # fantastic and works with ggplot & lattice
library(quantmod) # also will load xts
# use Quandl Kenneth French Fama/French factors
f <- Quandl("KFRENCH/FACTORS_D",type = "xts") / 100
# grab our function from post
tickers <- c( "FCNTX", "AGTHX", "SEQUX", "FPACX" )
ekFunds <- lapply(
getSymbols( from = "1896-01-01", auto.assign = F ) %>>%
fund[,6] / stats::lag( fund[,6], 1 ) - 1
,dimnames = list(NULL,gsub(x = colnames(fund), pattern = "[\\.]Adjusted", replacement = ""))
merge( f ) %>>% # Quandl("KFRENCH/FACTORS_D",type = "xts") / 100
( data.frame( summary(.[["linmod"]])$"r.squared" , .$ekholm ) ) %>>%
xts(order.by=tail(index(x),1)) -> return_df
colnames(return_df) <- "R_sq"
, width = 500
#, by = 100
, fill = NULL
names(ekFunds) <- tickers
date = index(.)
, fund = names(ekFunds)[.i]
do.call( rbind , . )
) -> ekT
# just plot at R^2, SelectionShare, and TimingShare
filter( measure %in% c("R_sq","SelectionShare","TimingShare") ) %>>%
value ~ date | measure
, groups = fund
, data = .
, type = "l"
# using direct.label so not necessary
, auto.key = list( space = "right" )
# title our plot
, main = paste(
"Comparison of Ekholm Decomposition for Various Mutual Funds"
,paste0("2 Year Rolling since ",format(.$date,format="%b %d, %Y"))
# layout one on top of the other
, layout = c(1,length(unique(.$measure)))
# I like labels on plot rather than legend
directlabels::direct.label( method = "last.qp" ) %>>%
# pretty it up with the latticeExtra Economist theme