Introduction
How much more expected return is required to justify the turnover and the taxes that must be paid immediately? That’s the question we will continue to explore. In Part 1 we began with a simple example and built the tools to better address the question. Here in Part 2 we explore how the answer varies with a variety of inputs.
The post in Part 1 contained some functions we will use here. To streamline the post we have put that code into a separate file and source it below. All the code is available in this GitHub repository.
source("TaxAlphaUtilities.r") # load the code (functions)
marketAssumptions <- rbind(c(0.024,0.019,0.005),c(0.068,0.031,0.037),c(0.079,0.024,0.054))
rownames(marketAssumptions)<-c("US Large Stocks","EAFE","Emerging Markets")
colnames(marketAssumptions)<-c("ExpectedReturns","Dividend Yield","Appreciation")
Size of unrealized gain
How does the size of the unrealized gain impact the extra return required to justify a trade? The size of unrealized gain we use the cost basis as a percent of the market value. An investor with a basis of $75 would have a value of 0.75 if the market value were $100. In this case the investor would have a 33% (=25/75) unrealized capital gain on his or her investment. The unrealized gain may be converted to the cost/value percentage by dividing 1 by the quantity 1 plus the percentage gain (e.g., 0.75 = 1/(1+0.3333)).
Let’s consider some real world assumptions. Every month Research Affiliates publishes 10 year return forecasts for a variety of asset classes. As of February 28, 2018, they assumed the following nominal annualized expected returns:
kable(marketAssumptions*100,digits = 1, align="c", caption="Market Assumptions (%)")
ExpectedReturns | Dividend Yield | Appreciation | |
---|---|---|---|
US Large Stocks | 2.4 | 1.9 | 0.5 |
EAFE | 6.8 | 3.1 | 3.7 |
Emerging Markets | 7.9 | 2.4 | 5.4 |
An excellent article on the subject is Is Your Alpha Big Enough to Cover Its Taxes? Revisited by Arnott, Berkin and Bouchey, 2011 Investments & Wealth Monitor.
The code for this post is available in this GitHub repository.
So Research Affiliates expects stocks in international developed (EAFE) and emerging markets to outperform. The margin seems like enough, but is it? To add to the realism, consider the following chart of SPY, an ETF that tracks the S&P 500. Its price has more than tripled which is a gain of over 200% since the beginning of 2009. Should an investor bite the bullet and pay the capital gains taxes for the expected higher returns in other markets?
As an example, we’ compare two scenarios using the assumptions for Research Affiliates. In one scenario an investor continues to hold $100 in US Large Stocks at a basis of $33.33 (a 200% gain) for 10 years before liquidating. In another scenario the investor liquidates and purchase EAFE stocks.
taxRateDiv <- 0.25 # Dividends are taxed at 25%
taxRateLTCG <- 0.25 # Capital gains are taxed at 25%
horizon <- 10 # The time horizon is 10 years
currentValue <- 100
currentBasis <- 33.33
h <- createScenario(currentValue,currentBasis,
marketAssumptions["US Large Stocks","Dividend Yield"],
marketAssumptions["US Large Stocks","Appreciation"],
taxRateDiv, taxRateLTCG, horizon)
currentValueAT <- currentValue - (currentValue - currentBasis) * h$taxRateLTCG
l <- createScenario(currentValueAT, currentValueAT,
marketAssumptions["EAFE","Dividend Yield"],
marketAssumptions["EAFE","Appreciation"],
taxRateDiv, taxRateLTCG, horizon)
hAT <- ATValue_scenario(h)
lAT <- ATValue_scenario(l)
kable(hAT, digits = 2, caption = "Hold US")
Value | Basis | Dividend | Tax | Growth | AT | |
---|---|---|---|---|---|---|
0 | 100.00 | 33.33 | 0.00 | 0.00 | 0.00 | 0.00 |
1 | 101.93 | 34.75 | 1.90 | 0.48 | 0.50 | 85.13 |
2 | 103.89 | 36.21 | 1.94 | 0.48 | 0.51 | 86.97 |
3 | 105.89 | 37.69 | 1.97 | 0.49 | 0.52 | 88.84 |
4 | 107.93 | 39.20 | 2.01 | 0.50 | 0.53 | 90.74 |
5 | 110.00 | 40.73 | 2.05 | 0.51 | 0.54 | 92.69 |
6 | 112.12 | 42.30 | 2.09 | 0.52 | 0.55 | 94.67 |
7 | 114.28 | 43.90 | 2.13 | 0.53 | 0.56 | 96.68 |
8 | 116.48 | 45.53 | 2.17 | 0.54 | 0.57 | 98.74 |
9 | 118.72 | 47.19 | 2.21 | 0.55 | 0.58 | 100.84 |
10 | 121.01 | 48.88 | 2.26 | 0.56 | 0.59 | 102.97 |
kable(lAT, digits = 2, caption = "Liquidate, buy EAFE")
Value | Basis | Dividend | Tax | Growth | AT | |
---|---|---|---|---|---|---|
0 | 83.33 | 83.33 | 0.00 | 0.00 | 0.00 | 0.00 |
1 | 88.35 | 85.27 | 2.58 | 0.65 | 3.08 | 87.58 |
2 | 93.68 | 87.32 | 2.74 | 0.68 | 3.27 | 92.09 |
3 | 99.32 | 89.50 | 2.90 | 0.73 | 3.47 | 96.87 |
4 | 105.30 | 91.81 | 3.08 | 0.77 | 3.67 | 101.93 |
5 | 111.65 | 94.26 | 3.26 | 0.82 | 3.90 | 107.30 |
6 | 118.38 | 96.86 | 3.46 | 0.87 | 4.13 | 113.00 |
7 | 125.51 | 99.61 | 3.67 | 0.92 | 4.38 | 119.03 |
8 | 133.07 | 102.53 | 3.89 | 0.97 | 4.64 | 125.43 |
9 | 141.09 | 105.62 | 4.13 | 1.03 | 4.92 | 132.22 |
10 | 149.59 | 108.90 | 4.37 | 1.09 | 5.22 | 139.42 |
From the rightmost after-tax column (AT), we see that liquidating and investing in the EAFE portfolio results in a higher expected terminal value $139.42 versus $102.97. (Before taxes, it will take 5 years for the EAFE portfolio to catch up to the US portfolio).
The question we asked initially was how much more return would be need to justify the trade. We have two sources of return: dividends and appreciation. Because dividends are more predictable, we will only solve for the appreciation required.
breakeven <- appreciationRoot(h,l,6)
In the example we are using, EAFE has higher dividends than US Large stocks. It turns out that the appreciation of EAFE can be slightly negative at -0.24% for the trade to be as good as not trading (we’ll call this a breakeven rate). This would make the total return 2.86% compared to the US Large Stock return of 2.4%. Below is the table for the values assuming the appreciation is the breakeven rate and note the terminal AT value matches the terminal AT value of holding onto the US Large Cap portfolio.
In this scenario the AT values exceed the pretax values due to capital losses and the assumption that there’s value to the losses in that they may be used to offset other gains whether current or future.
l2 <- l
l2$appreciation <- breakeven$root
kable(ATValue_scenario(l2), digits = 2, caption = "Liquidate, buy EAFE assuming breakeven appreciation")
Value | Basis | Dividend | Tax | Growth | AT | |
---|---|---|---|---|---|---|
0 | 83.33 | 83.33 | 0.00 | 0.00 | 0.00 | 0.00 |
1 | 85.07 | 85.27 | 2.58 | 0.65 | -0.20 | 85.12 |
2 | 86.84 | 87.25 | 2.64 | 0.66 | -0.20 | 86.94 |
3 | 88.65 | 89.27 | 2.69 | 0.67 | -0.21 | 88.81 |
4 | 90.50 | 91.33 | 2.75 | 0.69 | -0.21 | 90.71 |
5 | 92.39 | 93.43 | 2.81 | 0.70 | -0.22 | 92.65 |
6 | 94.31 | 95.58 | 2.86 | 0.72 | -0.22 | 94.63 |
7 | 96.28 | 97.77 | 2.92 | 0.73 | -0.23 | 96.65 |
8 | 98.28 | 100.01 | 2.98 | 0.75 | -0.23 | 98.72 |
9 | 100.33 | 102.30 | 3.05 | 0.76 | -0.24 | 100.82 |
10 | 102.42 | 104.63 | 3.11 | 0.78 | -0.24 | 102.97 |
Now that we’ve illustrated the concept and process, let’s consider 9 investors with $100 in SPY who purchased their position for $10, $20, $30, … $90. How much more return must they expect to induce them to trade given an expected return of 2.4% for US Large Stocks?
out <- sapply(seq(10,90,10), function(x) {
h$initBasis <- x
l$initValue <- h$initValue - (h$initValue-h$initBasis)*h$taxRateLTCG
l$initBasis <- l$initValue
appreciationRoot(h,l,6)$root
})
result <- cbind(out,out+l$dividendYld,out+l$dividendYld-h$dividendYld-h$appreciation)
row.names(result) <- paste0("$",seq(10,90,10))
colnames(result) <- c("Appreciation","Total Return", "Excess")
kable(result*100,digits=2, caption = "Breakeven rates (%)")
Appreciation | Total Return | Excess | |
---|---|---|---|
$10 | -0.05 | 3.05 | 0.65 |
$20 | -0.14 | 2.96 | 0.56 |
$30 | -0.22 | 2.88 | 0.48 |
$40 | -0.29 | 2.81 | 0.41 |
$50 | -0.36 | 2.74 | 0.34 |
$60 | -0.43 | 2.67 | 0.27 |
$70 | -0.49 | 2.61 | 0.21 |
$80 | -0.56 | 2.54 | 0.14 |
$90 | -0.61 | 2.49 | 0.09 |
plot(seq(10,90,10),result[,"Appreciation"], col="red",
pch=19, type="b",
main="Breakeven based on cost basis",
ylim=c(min(result),max(result)),
xlab="Cost basis", ylab= "Return")
points(seq(10,90,10),result[,"Total Return"], col="blue", pch=18, type="b")
abline(h=h$dividendYld+h$appreciation,col="gray")
abline(h=0,col="gray")
legend(10, 0.015,legend=c("Appreciation","Total Return"),
col=c("red","blue"),
lty=1:2, pch=c(19,18), box.lty = 0)
The appreciation is the return so that the AT terminal value “breaks even” with that of the hold scenario. The total return combines the appreciation with the dividend yield. The excess is the difference over the total return (yield + appreciation) of the hold strategy.
Time horizon
Let’s consider different time horizons while maintaining our $33.33 basis. A short horizon does not make as much difference as one might think because in our analysis we liquidate both portfolios at the end.
out <- sapply(seq(1,10), function(x) {
h$horizon <- x
l$horizon <- x
l$initValue <- h$initValue - (h$initValue-h$initBasis)*h$taxRateLTCG
l$initBasis <- l$initValue
appreciationRoot(h,l,6)$root
})
result <- cbind(out,out+l$dividendYld,out+l$dividendYld-h$dividendYld-h$appreciation)
row.names(result) <- paste0(seq(1,10),"Y")
colnames(result) <- c("Appreciation","Total Return", "Excess")
kable(result*100,digits=2, caption = "Breakeven rates (%)")
Appreciation | Total Return | Excess | |
---|---|---|---|
1Y | -0.22 | 2.88 | 0.48 |
2Y | -0.22 | 2.88 | 0.48 |
3Y | -0.22 | 2.88 | 0.48 |
4Y | -0.23 | 2.87 | 0.47 |
5Y | -0.23 | 2.87 | 0.47 |
6Y | -0.23 | 2.87 | 0.47 |
7Y | -0.23 | 2.87 | 0.47 |
8Y | -0.24 | 2.86 | 0.46 |
9Y | -0.24 | 2.86 | 0.46 |
10Y | -0.24 | 2.86 | 0.46 |
plot(seq(1,10),result[,"Appreciation"], col="red",
pch=19, type="b",
main="Breakeven based on horizon",
ylim=c(min(result),max(result)),
xlab="Horizon (years)", ylab= "Return")
points(seq(1,10),result[,"Total Return"], col="blue", pch=18, type="b")
abline(h=h$dividendYld+h$appreciation,col="gray")
abline(h=0,col="gray")
legend(2, 0.015,legend=c("Appreciation","Total Return"),
col=c("red","blue"),
lty=1:2, pch=c(19,18), box.lty = 0)
We see that the horizon is not meaningful. This is based on the assumption that we will liquidate the after-tax value of the hold portfolio or at least compare after-tax values of the two.
An excellent article on the subject is Is Your Alpha Big Enough to Cover Its Taxes? Revisited by Arnott, Berkin and Bouchey, 2011 Investments & Wealth Monitor.
The code for this post is available in this GitHub repository.