This series of posts was inspired by and/or modified in part from the methods for performance metrics for private equity investments by Karl Polen
In negotiating private equity or real estate deals, we are faced with the dilemma of how to negotiate fees. The primary fee cost drivers are the asset management and incentive fees. The asset management fee is usually stated as a percentage per annum of assets under management. This can be either as a percentage of committed capital or invested capital. In the former case, the fee is earned based on the amount the investors commit from the inception of the partnership, regardless of when the capital is called. If the asset management fee is based on invested capital, the fee is calculated only on capital that has been called. The incentive fee (carry) is typically stated as a percentage of profits. Profits are normally defined as the gross profits of the investments after returning partnership expenses, including the asset management fee. Usually, a hurdle rate of return must be achieved before sharing begins.
The dilemma in assessing fees is that fee drag expressed in terms of percent of capital invested does not consider performance. Other things equal, a manager who generates \(8\%\) excess return and charges \(2\%\) fees is better than a manager who generates \(2\%\) excess performance and charges \(1\%\) in fees. In the former case, you make \(6\%\) net excess return and the manager has captured \(25\%\) of the gross excess return as its fee. In the latter case, you make \(1\%\) excess return and the manager has captured \(50\%\) of the gross excess return in fees.
Fee effectiveness is the percent of the gross excess return captured by the manager in fees. It can be expressed as the percent going to each party (“slice to gp”) or the ratio of excess return going to the investor divided by the excess return going to the manager. If we measure fee effectiveness by comparing \(IRRs\), we get a confusing picture. In fact, the fee effectiveness on a simple \(IRR\) comparison turns out to be true only for a one period investment. For longer durations, the effectiveness deteriorates1. The following calculations will illustrate this.
Let’s say we have an investment that earns \(12\%\) per year against a benchmark of \(8\%\) and the manager charges \(2\%\) in fees. Measured in percents, it looks you have \(1/2\) of the excess going to the manager and a fee effectiveness of \(1:1\).
out1=tibble(
period=1:10,
gross=1.12^period, #12% gross return compounded
net=1.10^period, #10% net return compounded
bench=1.08^period, #8% bench compounded
fee=gross-net,
excessreturn=net-bench,
effectiveness=excessreturn/fee,
grossprofit=gross-bench,
slice_gp=fee/grossprofit
)
perc_vars=c("gross", "net", "bench", "fee", "excessreturn",
"effectiveness", "grossprofit", "slice_gp")
# out1 %>% format.dt.f(page_length = 10, perc_vars, NA) # knitr::kable()
out1 %>% mutate_at(2:9, round, 2) %>% knitr::kable()
period | gross | net | bench | fee | excessreturn | effectiveness | grossprofit | slice_gp |
---|---|---|---|---|---|---|---|---|
1 | 1.12 | 1.10 | 1.08 | 0.02 | 0.02 | 1.00 | 0.04 | 0.50 |
2 | 1.25 | 1.21 | 1.17 | 0.04 | 0.04 | 0.98 | 0.09 | 0.50 |
3 | 1.40 | 1.33 | 1.26 | 0.07 | 0.07 | 0.96 | 0.15 | 0.51 |
4 | 1.57 | 1.46 | 1.36 | 0.11 | 0.10 | 0.95 | 0.21 | 0.51 |
5 | 1.76 | 1.61 | 1.47 | 0.15 | 0.14 | 0.93 | 0.29 | 0.52 |
6 | 1.97 | 1.77 | 1.59 | 0.20 | 0.18 | 0.91 | 0.39 | 0.52 |
7 | 2.21 | 1.95 | 1.71 | 0.26 | 0.23 | 0.90 | 0.50 | 0.53 |
8 | 2.48 | 2.14 | 1.85 | 0.33 | 0.29 | 0.88 | 0.63 | 0.53 |
9 | 2.77 | 2.36 | 2.00 | 0.42 | 0.36 | 0.86 | 0.77 | 0.54 |
10 | 3.11 | 2.59 | 2.16 | 0.51 | 0.43 | 0.85 | 0.95 | 0.54 |
Below we illustrate the curvature of the fee effectiveness and its sensitivity to “slice to gp” percent calculation. In relevant ranges, the fee effectiveness ratio is quite sensitive to small changes in the percent amount of profit sharing. For this reason, the slice to the \(GP\) percent is a more intuitive approach to understanding fairness of fees.
# communicating fee effectiveness
f1=function(x) (1-x)/x
f2=Deriv(f1) # delta of the 'fee effectiveness' (first derivative)
f3=Deriv(f2) # gamma of the 'fee effectiveness' (second derivative)
out2=tibble(
slice_gp=seq(.2,.8,.01),
ratio_fee_eff=(1-slice_gp)/slice_gp,
delta_fee_eff=f2(slice_gp),
gamma_fee_eff=f3(slice_gp)
)
plot1=out2 %>% ggplot(aes(x=slice_gp, y=ratio_fee_eff)) + geom_line()
plot2=out2 %>% ggplot(aes(x=slice_gp, y=delta_fee_eff)) + geom_line() +
ggtitle("Delta of Fee Effectiveness Ratio")
plot3=out2 %>% ggplot(aes(x=slice_gp, y=gamma_fee_eff)) + geom_line() +
ggtitle("Gamma of Fee Effectiveness Ratio")
gridExtra::grid.arrange(plot1, plot2, plot3, nrow=3)
Private equity fees are complicated and difficult to analyze. A typical deal might be stated as \(20\%\) carry over an \(8\%\) pref with a \(50\%\) catchup. This means that the investor has to earn at least an \(8\%\) return after fund-level costs before the sponsor earns any carry. Above an \(8\%\) return, the sponsor gets half the profit (i.e., the catchup is \(50\%\)) until the ratio of profit split is \(20\%\) to the sponsor. Thereafter, the profits are split \(80\%\) to the investors and \(20\%\) to the sponsor. Incentive fees of \(20\%\) over an \(8\%\) hurdle are nearly universal in private equity. Assuming the incentive fee is \(20\) over \(8\) and a reasonably successful private markets investment program, the catchup will add \(1.6\%\) per year to the investment cost; i.e. the \(20\%\) incentive rate times the \(8\%\) hurdle. While this would be considered market standard in many contexts, it may at times be negotiable, with somewhere in the \(50\%\) to \(100\%\) range being typical. We present here some suggestions to negotiate and reduce cost in private equity and real estate2 partnerships.
gpcomp
function is used to evaluate general partner compensation for one or more returns:
gpcomp = function(dmat, ret, capital = 100, invcost = 100) {
#' @param dmat a data frame describing the deal structure with columns for
# asset management fee, pref, catchup and carry
#' @param ret one or more returns as a vector
#' @param capital amount contributed
#' @param invcost cost of investments (may be different from cost because of
# asset management fee)
am = dmat$am
pref = dmat$pref
catchup = dmat$catchup
carry = dmat$carry
if (any(1 < c(catchup, carry)))
stop("catchup and carry must be stated as decimals<1")
pref = c(pref, 1e+16)
am = c(am, 0)
stack = vector()
lpcut = vector()
typ = vector()
nlayer = nrow(dmat)
if (am[1] > 0) {
stack = c(stack, am[1])
lpcut = c(lpcut, 0)
typ = c(typ, paste("Asset mgmt", 0))
}
if (capital > 0) {
stack = c(stack, capital)
lpcut = c(lpcut, 1)
typ = c(typ, paste("Return of Capital"))
}
if (pref[1] > 0) {
stack = c(stack, pref[1])
lpcut = c(lpcut, 1)
typ = c(typ, paste("Preferred Return", 1))
}
for (j in 1:nlayer) {
if (am[j + 1] > 0) {
stack = c(stack, am[j + 1])
lpcut = c(lpcut, 0)
typ = c(typ, paste("Asset Mgmt", j))
}
nextpref = pref[j + 1]
lpsofar = sum(stack * lpcut) - capital
lpshort = nextpref - lpsofar
cu = catchup[j]
cy = carry[j]
catchuplayer = 0
if (cu > cy) {
catchuplayer = (lpsofar * cy)/(cu - cy)
if (cu < 1)
catchuplayer = min(catchuplayer, lpshort/(1 - cu))
stack = c(stack, catchuplayer)
lpcut = c(lpcut, (1 - cu))
typ = c(typ, paste("Catchup", j))
}
lpsofar = sum(stack * lpcut) - capital
lpshort = nextpref - lpsofar
carrylayer = lpshort/(1 - cy)
if (carrylayer > 0) {
stack = c(stack, carrylayer)
lpcut = c(lpcut, (1 - cy))
typ = c(typ, paste("Carry", j))
}
}
ansmat = matrix(0, nrow = length(stack), ncol = length(ret))
#given waterfall w in dollars and available cash c,
# distribute the cash to the waterfall
wf=function(w,c){
x=c-cumsum(w)
x[x>0]=0
x=x+w
x[x<0]=0
c(x,c-sum(x))
}
for (i in 1:length(ret)) {
ansmat[, i] = wf(stack[-length(stack)], ret[i])
}
ans = list()
ans$lpshare = matrix(lpcut, nrow = length(stack), ncol = length(ret)) *
ansmat
rownames(ans$lpshare) = typ
ans$gpshare = ansmat - ans$lpshare
rownames(ans$gpshare) = typ
ans$grossreturn = 100 * (ret - invcost)/invcost
ans$netreturn = 100 * (colSums(ans$lpshare) - capital)/capital
ans$stack = stack
ans$lpcut = lpcut
return(ans)
}
out3=tibble(
am=1.5,
pref=8,
catchup=.8,
carry=.2
) %>%
gpcomp(ret=seq(100, 130, .1)) %>%
extract(c("grossreturn", "netreturn")) %>%
bind_cols %>%
mutate(
fee=grossreturn-netreturn,
excessreturn=ifelse((grossreturn-8)<=0,NA,grossreturn-8), # 8 benchmark
# assumed near term public market returns
slicegp=pmin(1,fee/excessreturn)
)
Here the catchup has the biggest impact in the return band of \(9\%\) to \(12\%\) gross returns, where the catchup is paid. If this is an interemediate return strategy (as many real estate and credit strategies will be) where the expected returns are within that band, we may need to consider whether this is acceptable.
plot1=out3 %>% ggplot(aes(x=grossreturn,y=fee))+geom_line()
plot2=out3 %>% ggplot(aes(x=grossreturn,y=slicegp))+geom_line()
gridExtra::grid.arrange(plot1, plot2, ncol=2)
# 0% catchup
out4=tibble(
am=1.5,
pref=8,
catchup=0,
carry=.2
) %>%
gpcomp(ret=seq(100, 130, .1)) %>%
extract(c("grossreturn", "netreturn")) %>%
bind_cols %>%
mutate(
fee=grossreturn-netreturn,
excessreturn=ifelse((grossreturn-8)<=0,NA,grossreturn-8), # 8 benchmark
# assumed near term public market returns
slicegp=pmin(1,fee/excessreturn)
)
Negotiated solutions might be elimination of the catchup, possibly in consideration for a lower hurdle or the addition of higher incentive structures for exceptional performance.
plot1=out4 %>% ggplot(aes(x=grossreturn,y=fee))+geom_line()
plot2=out4 %>% ggplot(aes(x=grossreturn,y=slicegp))+geom_line()
gridExtra::grid.arrange(plot1, plot2, ncol=2)
Asset management fees are charged on either committed or invested capital. In the former case, you pay a fee on the full amount of capital committed regardless of whether it has been called. Assuming investments are made ratably over the first \(3\) years of the partnership, this adds \(1.5\) times the annual fee rate over the life of the fund. Assuming an annual fee rate of \(1.5\%\) and weighted average duration of investments of \(8\) years, the annual additional cost is a little less than \(30\) bps per year. This is a fraction of the cost of the catchup but still important.
Managing cost of fees is important, bot not sufficient to ensure success. Alignment of interest across a range of outcomes, not just the upside, should be given paramount importance in private equity partnerships. If your partner is a smaller PE investment manager, they may need the early revenue to support a proper team for your strategy and you might better serve yourself by focusing on other areas for cost savings. Compromises may be available in the form of reduced fees on committed capital or performance based fees that link fees to achieved operational results.
Finally, pay careful attention to what services are funded by the asset management fees and what services are charged as additional fund expenses to the partnership or charged to the deals. Read the manager’s ADV forms filed with the SEC. There is a lot of useful disclosure here.
With underperforming investments there is no incentive for the manager to wrap up the partnership. In fact, the manager is better off avoiding asset sales to continue the asset management fees and for the option value on the incentive fee in case the asset recovers.↩︎
Real estate deals have greater variation. Many real estate deals have multiple layers but no catchup. Thus, a real estate deal might be stated as “\(20\) over \(8\), \(30\) over \(12\), and \(50\) over \(20\) with a \(2\%\) asset management fee, half of which is deferred until after \(8\%\). Stated this way, the sponsor starts sharing \(20\%\) of profits once the investor has earned an \(8\%\) return and switches to \(30\%\) of profits once the investor has earned a \(12\%\) return and \(50\%\) of profits once the investor has earned a \(20\%\) return. Only \(1\%\) of the asset management fee is paid unconditionally. The remainder is paid once the investor has earned \(8\%\).↩︎