top of page

Attribution Analysis

Decompose. Explain. Improve.

Description

Portfolio performance attribution framework that explains where your returns came from. It decomposes a portfolio's active return against a benchmark using two complementary methodologies, Brinson-Fachler and Factor Model, which you can run together or independently. Built on PyArrow for high-performance columnar processing, it is configured entirely from an Excel workbook with no code required, and can also be run programmatically in Python.


Features
 

  • Configurable from an Excel parameters workbook, with no code required to run an analysis, or directly from a Python script. CLI for project initialization (init excel) and template updates.

  • Brinson-Fachler attribution: breaks active return into allocation, selection and interaction effects, computed per asset and per date and aggregated over time. The effects add up exactly to portfolio return minus benchmark return.

  • Factor Model attribution: decomposes portfolio return into per-factor contributions plus an idiosyncratic residual, using your own factor return series (style factors such as size, momentum, beta, residual volatility and value, plus industry factors).

  • Cumulative and percentage views: factor contributions are accumulated over time and expressed as a share of total return, so you can see how much of performance each factor explains and how much is stock-specific.

  • Independent methodology switches: turn Brinson-Fachler and Factor Model on or off from the workbook to run either analysis alone or both side by side.

  • Interactive dashboards for exploring factor model results, served locally on a configurable port. Static plots are produced for Brinson-Fachler-only runs.

  • PyArrow-based engine with pandas reference implementations, behind clean interfaces that make each methodology easy to extend.

  • Robust data handling: automatic detection of horizontal or vertical weight files, configurable date and price column names, automatic alignment of all inputs to their common date range, and start/end dates that can be set manually or derived from the data.
     

Supported Input Formats
 

  • Market Data: CSV, Parquet (one file per ticker with date and price; returns computed internally)

  • Portfolio and Benchmark Weights: CSV, Excel (weights by rebalancing date)

  • Benchmark Returns: CSV (daily)

  • Factor Returns: CSV (one file per factor, per-asset returns)

  • Configuration: Excel workbook or programmatic Python configuration


Everything you need to get started!

​

Backtest Engine.png
bottom of page