Brinson-Fachler#

Decomposes a portfolio’s active return against a benchmark into allocation, selection and interaction effects, computed per asset and per date, then aggregated across time.

Formulas#

For each asset on each date, with asset return \(r\), portfolio weight \(w_p\) and benchmark weight \(w_b\):

\[\begin{split}r_p &= w_p \cdot r &&\text{portfolio contribution} \\ r_b &= w_b \cdot r &&\text{benchmark contribution} \\ \alpha &= r_p - r_b &&\text{active return} \\ \text{allocation} &= (w_p - w_b) \cdot r_b \\ \text{selection} &= \alpha \cdot w_p \\ \text{interaction} &= \alpha - \text{allocation} - \text{selection}\end{split}\]

Per-date totals are the sums across assets, and by construction

\[\alpha = \text{allocation} + \text{selection} + \text{interaction}\]

which is also equal to \(\text{portfolio\_return} - \text{benchmark\_return}\).

Implementation#

The PyArrow-based implementation lives in BrinstonFachlerArrowAttribution, implementing BrinstonFachlerArrowInterface. A pandas-based reference implementation is also available as BrinstonFachlerAttribution. See Brinson-Fachler for the full API reference.

Enable this methodology by setting brinson_fachler_method = yes in attribution_analysis_parameters.xlsx (see Configuration Reference).