# Chapter 10: Performance Attribution: Where Did My Returns Come From?

_Previous: [Chapter 9: Risk Attribution](09-risk-attribution.md)_

---

Risk attribution ([Chapter 9](09-risk-attribution.md)) is _ex ante_: model-implied, forward-looking, in volatility units. Performance attribution is its _ex post_ mirror: realized returns, decomposed through the same exposures and factor returns, in return units. The two reports should be read together: the ex ante report says which bets you are running. The ex post report says what each bet paid. When the ex post report surprises you ("I had no momentum bet, why did momentum cost me 72bp last quarter?"), the answer is usually already in the ex ante report: you were running the bet and didn't know it. When the two reports _genuinely_ disagree, a bet sized small ex ante but paying large ex post, one is mismeasured, and finding out which is one of attribution's main uses.

## 10.1 The single-period decomposition

Within one period everything is exact accounting. The active return is

$$r_a = w_a^\top r = w_a^\top (Xf + \epsilon) = \underbrace{x_a^\top f}_{\text{factor part}} + \underbrace{w_a^\top \epsilon}_{\text{specific part}} = \sum_k \underbrace{x_{a,k}\, f_k}_{\text{factor } k\text{'s contribution}} + \; \text{specific},$$

with $x_a$ the active exposures and $f, \epsilon$ the period's estimated factor returns and residuals ([Chapter 6](06-estimating-factor-returns.md)). Each factor contribution has a hard interpretation via [Chapter 7](07-factor-portfolios.md): $x_{a,k} f_k$ is the return on the $x_{a,k}$ units of the pure factor-$k$ portfolio the manager implicitly held. There is no cross-term problem here (unlike variance attribution): returns are linear, contributions just add.

**Mini example, month 1:** Active exposures from [Chapter 9](09-risk-attribution.md). Factor returns from [Chapter 6](06-estimating-factor-returns.md) (MKT +1.82%, TECH +0.77%, FIN −1.28%, CONS +0.31%, VALUE +0.55%, MOM +1.96%, SIZE +0.05%):

| Source              | exposure × factor return | contribution |
| ------------------- | ------------------------ | -----------: |
| MKT                 | 0.00 × 1.82%             |       0.000% |
| TECH                | −0.145 × 0.77%           |      −0.112% |
| FIN                 | +0.095 × (−1.28%)        |      −0.122% |
| CONS                | +0.051 × 0.31%           |      +0.015% |
| VALUE               | +0.385 × 0.55%           |  **+0.211%** |
| MOM                 | −0.332 × 1.96%           |  **−0.651%** |
| SIZE                | −0.275 × 0.05%           |      −0.013% |
| **Factor total**    |                          |  **−0.671%** |
| Specific (residual) |                          |      +0.030% |
| **Active return**   |                          |  **−0.641%** |

Check: portfolio returned +1.178%, benchmark +1.819%, difference −0.641%. That ties out, and is exact because month-1 returns, exposures, and factor returns satisfy $r = Xf + \epsilon$ identically.

The value bet worked (+21bp), but the unintended anti-momentum exposure cost more than three times as much (−65bp in this single month; −72bp over the full quarter, §10.2) in a strong momentum month. [Chapter 9](09-risk-attribution.md)'s ex ante warning, momentum is your biggest style risk, cashed out in month one. The intended bet was fine. The accident was expensive. Also note both industry tilts lost (−11bp, −12bp): underweight the industry that outperformed, overweight the one that lagged.

## 10.2 The multi-period problem

Run the same decomposition for three months. The mini example assumes constant exposures across the quarter, a simplification. See the §10.5 pitfall on exposure timing.

| Month          |  Factor | Specific |  **Active** |
| -------------- | ------: | -------: | ----------: |
| 1              | −0.671% |  +0.030% | **−0.641%** |
| 2              | +0.985% |  +0.300% | **+1.285%** |
| 3              | −0.690% |  −0.100% | **−0.790%** |
| arithmetic sum |         |          | **−0.146%** |

But the _true_ quarterly active return, portfolio compounded (+2.674%) minus benchmark compounded (+2.776%), is −0.102%, not −0.146%. Single-period contributions are arithmetic. Multi-period returns compound. The two do not reconcile. The 4.4bp gap is small here, but it grows with horizon and volatility, and an attribution report that doesn't sum to the actual active return is a report nobody trusts.

**Linking algorithms** distribute the compounding cross-terms over the per-period contributions so everything adds up. The main families:

- **Cariño linking:** Rescale each period's contributions by $\kappa_t / \kappa$, where $\kappa_t = \frac{\ln(1+r_{p,t}) - \ln(1+r_{b,t})}{r_{p,t} - r_{b,t}}$ and $\kappa$ is the same expression on cumulative returns. The intuition: convert to log-return space (where time-additivity is exact), apportion there, convert back. Contributions then sum _exactly_ to the true cumulative active return.
- **Menchero (optimized linking):** Chooses per-period scaling factors that are as uniform as possible subject to exact reconciliation, minimizing distortion of any single period.
- **Frongello / GRAP:** Order-dependent sequential compounding. In Frongello's rule, period $t$'s contribution is scaled by benchmark growth before it and portfolio growth after it; GRAP is a close variant. Intuitive ("a basis point earned early compounds longer").

All produce the same totals and qualitatively similar splits. Consistency matters more than which one you pick.

**Mini example, Cariño-linked quarter:**

| Source    | linked contribution |
| --------- | ------------------: |
| TECH      |              −0.00% |
| FIN       |              −0.07% |
| CONS      |              +0.06% |
| VALUE     |              +0.46% |
| MOM       |              −0.72% |
| SIZE      |              −0.07% |
| Specific  |              +0.24% |
| **Total** |         **−0.102%** |

The quarter's verdict: value added 46bp, momentum took away 72bp, stock selection (specific) added 24bp, and the industry and size lines netted another −8bp, for −10bp against the benchmark. A consumer of this report knows precisely what to fix, and it is not the stock-picking.

## 10.3 Interpreting attribution: skill vs. tilt

Factor attribution's main payoff is separating persistent factor tilts from idiosyncratic skill:

- A manager whose long-run active return is mostly _factor_ contribution from stable exposures is delivering factor returns, valuable, but obtainable cheaply via factor products. Their fee should be benchmarked accordingly.
- A manager whose active return is consistently dominated by _specific_ contribution is doing the thing factor exposure cannot replicate: stock selection. The specific line is the cleanest single signal of differentiated skill the industry has, with two caveats:
  - _Statistical._ A +24bp specific quarter is noise. Significance follows $t = \mathrm{IR}\sqrt{T}$: an IR of 0.5 needs ~16 years to clear two standard errors ($T = (2/0.5)^2$), an IR of 1.0 about four.
  - _Structural._ "Specific" means _what this model's factors don't span_. A sharper model can reclassify yesterday's alpha as today's beta; the crowding factor did exactly this to some stat-arb returns ([Chapter 15](15-modifying-the-model.md)).

The mini example's manager, on one quarter: modest positive selection, a working value process, and an unmanaged momentum leak. The actionable conclusion is to _hedge or neutralize the momentum exposure, not to change stock selection_. [Chapter 11](11-portfolio-construction.md) executes exactly this.

## 10.4 Factor-based vs. Brinson attribution

The other attribution tradition, Brinson (allocation/selection), needs no factor model: split active return into _allocation_ ($\sum_j (w_{p,j} - w_{b,j})(r_{b,j} - r_b)$ over groups $j$, did you overweight winning sectors?) and _selection_ ($\sum_j w_{p,j}(r_{p,j} - r_{b,j})$, did you pick winners inside sectors?). The portfolio weight $w_{p,j}$ in the selection term, as written here, folds the interaction effect into selection; the Brinson-Fachler variant uses $w_{b,j}$ and reports interaction as its own line.

|                  | Factor-based                           | Brinson                                             |
| ---------------- | -------------------------------------- | --------------------------------------------------- |
| Dimensions       | all factors simultaneously             | one grouping (sector or country)                    |
| Style effects    | explicit lines                         | invisible (folded into "selection")                 |
| Model dependence | full risk model                        | none                                                |
| Audience         | quantitative and style-aware processes | classic sector-rotation processes, client reporting |

The reconciliation pitfall: Brinson's "selection" within sectors _contains_ every style effect: a value manager's Brinson report shows brilliant/terrible "selection" in years when value works/fails, even with zero genuine stock-picking. Factor attribution exists to break that conflation. Best practice for a fundamental shop is to run both and explain their differences, which are themselves informative.

## 10.5 Pitfalls

- **Model misspecification leaks into "specific."** A missing factor lands its returns in the residuals, so attribution flatters or damns stock selection erroneously. A specific line that is large _and correlated across your own portfolios_ is a missing-factor alarm ([Chapter 15](15-modifying-the-model.md)), not a skill reading.
- **Horizon/model mismatch:** Attributing a daily-turnover book with a monthly model (or vice versa) misstates exposures during the period. Match frequencies. [Chapter 14](14-model-evaluation.md)'s fit-for-purpose tests include this.
- **Exposure timing and trading:** Real portfolios trade intra-period. Using start-of-period holdings creates a _trading residual_ (transaction costs plus intra-period exposure drift) that should be reported as its own line, not silently lumped into specific. The mini example's constant-exposure quarter assumes this away. Production attribution recomputes daily and links.
- **Different models, different answers:** VALUE's contribution depends on the model's value definition (descriptor recipe, universe, [Chapter 3](03-factors-and-exposures.md) and [Chapter 5](05-universes.md)). Attribution numbers are model-conditional statements. Quote the model with the number.

## 10.6 Summary

- Single-period attribution is exact: $r_a = \sum_k x_{a,k} f_k + w_a^\top \epsilon$. Contributions are returns on implicitly-held pure factor portfolios.
- Multi-period contributions need a linking algorithm (Cariño et al.) to reconcile arithmetic contributions with geometric compounding. Linked, they sum exactly.
- The factor/specific split is the industry's working definition of tilt vs. skill, with model-dependence as the standing caveat.
- The mini example's quarter: VALUE +46bp, MOM −72bp, specific +24bp = −10bp net. Diagnosis: fix the unintended exposure, keep the process. That fix is [Chapter 11](11-portfolio-construction.md)'s worked example.

---

_Next: [Chapter 11: Portfolio Construction](11-portfolio-construction.md)_
