.. _brinson_fachler: 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 :math:`r`, portfolio weight :math:`w_p` and benchmark weight :math:`w_b`: .. math:: 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} Per-date totals are the sums across assets, and by construction .. math:: \alpha = \text{allocation} + \text{selection} + \text{interaction} which is also equal to :math:`\text{portfolio\_return} - \text{benchmark\_return}`. Implementation --------------- The PyArrow-based implementation lives in :class:`~kaxanuk.attribution_analysis.interfaces.BrinstonFachlerArrowAttribution`, implementing :class:`~kaxanuk.attribution_analysis.interfaces.BrinstonFachlerArrowInterface`. A pandas-based reference implementation is also available as :class:`~kaxanuk.attribution_analysis.interfaces.BrinstonFachlerAttribution`. See :ref:`attribution_methodologies_brinson_fachler_ref` for the full API reference. Enable this methodology by setting ``brinson_fachler_method = yes`` in ``attribution_analysis_parameters.xlsx`` (see :ref:`configuration`).