Skip to content
All library documents

Compounding Long and Short Return Attribution

Article Quant Q&A · Author: ccox11

Summary

The discussion addresses how to allocate a long/short fund's compounded return to its long and short segments. Separately compounding each segment and combining the results fails because the portfolio compounds on the combined gains and losses. The exchange presents a contribution method that carries each period's segment contribution forward at the overall portfolio return rate for subsequent periods, then sums those terminal contributions.

An alternative formula applies each segment's period return to the portfolio growth accumulated before that period. In the constant-return illustration, the resulting segment contributions add to the stated total fund return. The answers also point to a portfolio-contribution framework and show its period and total outputs. These methods make attribution possible under a defined reinvestment convention, but the allocation is not uniquely inherent in the compounded portfolio result: part of later growth assigned to one segment reflects prior gains from the other. Attribution therefore depends on the chosen convention and requires the whole fund's periodic returns.

Key ideas

  • Compounding long and short returns separately does not generally reproduce the compounded portfolio return.
  • A contribution method compounds each period's segment return forward using subsequent total portfolio returns.
  • Segment contributions can be summed to reconcile with the portfolio total under the selected convention.
  • The allocation depends on how cross-period compounding is assigned between segments.
  • Periodic portfolio returns are needed to calculate compounded attribution across time.

Tags

Full text
# Return Attribution for Long/Short Fund


# Return Attribution for Long/Short Fund












Let's say a fund's net returns are described by the following table:

| Long | Short | Total |
| 1.0% | 0.25% | 1.25% |
| 1.0% | 0.25% | 1.25% |
| ... | ... | ... |
| 1.0% | 0.25% | 1.25% |

After 12 months the net performance of the fund would be calculated to be (1+1.25%)^12-1 = 16.08%. My question is how would one go about attributing the returns of the net performance figure to Long or Short? This is only an example, but in a real-world example where Long/Short oscillates between positive and negative performance is attribution attainable.

Some rough numbers I've played around with to attempt to do this: (1+1%)^12-1 = 12.68%

(1+0.25%)^12-1= 3.04%

(1+12.68%)*(1+3.04%) = 16.11% (This is obviously an approximation which is very close but over a longer period of time and with absolute larger Long/Short numbers this becomes much less accurate).

Looking for advice from someone who's worked in the L/S equity space in the past.

## Answer by nbbo2 (score 2)

https://quant.stackexchange.com/a/71741

You may want to use a technique I learned on this forum from Enrico Schumann, who referenced the book by Bruce Feibel (specifically the Chapter 2 on Portfolio Contribution). See this answer https://quant.stackexchange.com/a/36530/16148

The technique is based on the assumption "that a segment's return contribution in one period is reinvested in the overall portfolio in succeeding periods". Here the two segments are the Long Segment and the Short Segment. We also need the monthly returns for the whole fund.

So for example the Short Segment earned 0.25% in January. We assume that this grew at the overall rate of the whole fund in Feb, Mar, ..., December. So we can find how much this was worth on December 31. Next we look how much the Short Segment made in Feb, this amount is similarly "compounded forward" using the overall fund rate for Mar, ..., December. In this way we find out how much all 12 months Short contributions were worth at year end. Then do the same for the longs.

## Answer by Lsvob (score 1)

https://quant.stackexchange.com/a/71740

It is no surprise that the value resulting strays from the true performance since in most cases, $$(1+a+b)^n ≠ (1+a)^n * (1+b)^n $$

The financial intuition behind this is that the portfolio compounds on the gains of both the long and the short allocation whereas this is not the case when you multiply the returns of the two exposures separately.

One (perhaps dirty) method would be to compute: $$r^{Long}_{TOT}=\sum_{i=1}^{T} (r_{i}^{Long} * \prod_{j=0}^{i-1}(1+r_{j}^{Long}+r_{j}^{Short}))$$ with $$r_{0}^{Long}=r_{0}^{Short}=0$$

In this example, it would make: $$r^{Long}_{TOT}=12.86\%$$ and in the same manner: $$r^{Short}_{TOT}=3.22\%$$ with $$r^{Short}_{TOT}+r^{Long}_{TOT}=r^{Portfolio}_{TOT} = 16.08\%$$ The issue I see with this method is that part of what is attributed to the long exposure is derived from the short exposure of the previous periods.

In response to @nbbo2:

Using the thread's method, with parameters:

```
weights <- rbind(c( 1, 1),
                 c( 1, 1),
                 c( 1, 1),
                 c( 1, 1),
                 c( 1, 1),
                 c( 1, 1),
                 c( 1, 1),
                 c( 1, 1),
                 c( 1, 1),
                 c( 1, 1),
                 c( 1, 1),
                 c( 1, 1))

R <- rbind(c( 1,   0.25),
           c( 1,   0.25),
           c( 1,   0.25),
           c( 1,   0.25),
           c( 1,   0.25),
           c( 1,   0.25),
           c( 1,   0.25),
           c( 1,   0.25),
           c( 1,   0.25),
           c( 1,   0.25),
           c( 1,   0.25),
           c( 1,   0.25))/100
```

calling:

```
rc(R, weights, segment = c("F1", "F2"))
```

We get:

```
$period_contributions
   timestamp   F1     F2  total
1          1 0.01 0.0025 0.0125
2          2 0.01 0.0025 0.0125
3          1 0.01 0.0025 0.0125
4          2 0.01 0.0025 0.0125
5          1 0.01 0.0025 0.0125
6          2 0.01 0.0025 0.0125
7          1 0.01 0.0025 0.0125
8          2 0.01 0.0025 0.0125
9          1 0.01 0.0025 0.0125
10         2 0.01 0.0025 0.0125
11         1 0.01 0.0025 0.0125
12         2 0.01 0.0025 0.0125

$total_contributions
      F1        F2     total 
0.1286036 0.0321509 0.1607545 

attr(,"method")
[1] "contribution"
```

This is indeed what was computed.

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.