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!

