Skip to content
Finance
Skill

/performance-attribution

Decompose portfolio returns into explainable components to identify where value was added or lost. Use when the user asks about Brinson attribution, allocation vs selection effects, factor-based attribution, fixed-income attribution, or currency attribution. Also trigger when

From plugin
finance-skills
16491 skills
Install
$ npx -y skills add JoelLewis/finance_skills --skill performance-attribution --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/performance-attribution

Context preview

The summary Claude sees to decide when to auto-load this skill.

Decompose portfolio returns into explainable components to identify where value was added or lost. Use when the user asks about Brinson attribution, allocation vs selection effects, factor-based attribution, fixed-income attribution, or currency attribution. Also trigger when

SKILL.md

performance-attribution.SKILL.md
name: performance-attribution
description: "Decompose portfolio returns into explainable components to identify where value was added or lost. Use when the user asks about Brinson attribution, allocation vs selection effects, factor-based attribution, fixed-income attribution, or currency attribution. Also trigger when users mention 'what drove my returns', 'was it stock picking or sector bets', 'alpha decomposition', 'multi-period linking', 'interaction effect', 'active return breakdown', or ask why their portfolio outperformed or underperformed the benchmark."

Performance Attribution

Core Concepts

Brinson-Fachler Attribution (Single Period)

The classic equity attribution model decomposes active return (portfolio return minus benchmark return) into three effects:

  • **Allocation effect:** Value added by over/underweighting sectors relative to the benchmark
  • A_i = (w_p,i - w_b,i) × (R_b,i - R_b)
  • Rewards overweighting sectors that outperform the total benchmark
  • **Selection effect:** Value added by picking better securities within each sector
  • S_i = w_b,i × (R_p,i - R_b,i)
  • Rewards outperforming the sector benchmark regardless of weight
  • **Interaction effect:** Combined effect of both overweighting and outperforming (or vice versa)
  • I_i = (w_p,i - w_b,i) × (R_p,i - R_b,i)
  • Captures the joint benefit of overweighting a sector AND selecting better securities in it
  • **Total active return:** R_p - R_b = Σ A_i + Σ S_i + Σ I_i

Where: w_p,i = portfolio weight in sector i, w_b,i = benchmark weight in sector i, R_p,i = portfolio return in sector i, R_b,i = benchmark return in sector i, R_b = total benchmark return.

Multi-Period Attribution

Single-period attribution does not compound across periods. Geometric linking methods are required:

  • **Carino method:** Applies a smoothing factor to make arithmetic effects compound to the correct geometric total
  • **Menchero method:** Uses a logarithmic approach for smoother decomposition
  • **GRAP (Geometric Return Attribution Program):** Converts arithmetic effects to geometric equivalents
  • Key principle: the sum of linked attribution effects must equal the total geometric active return over the full period

Factor-Based Attribution

Decomposes returns into exposures to systematic risk factors:

  • **Model:** R_p = Σ β_k × F_k + α
  • β_k = portfolio's exposure (loading) to factor k
  • F_k = return of factor k during the period
  • α = residual return unexplained by factors (true alpha)
  • **Common factors:** Market (MKT), Size (SMB), Value (HML), Momentum (UMD), Quality (QMJ), Low Volatility (BAB)
  • **Factor contribution:** β_k × F_k for each factor
  • **Active factor contribution:** (β_p,k - β_b,k) × F_k
  • The model chosen (Fama-French 3, Carhart 4, Fama-French 5, Barra, Axioma) affects results

Fixed-Income Attribution

Decomposes bond portfolio returns into component sources:

  • **Yield return (income):** Coupon income accrued during the period (yield × time)
  • **Roll return:** Price appreciation as bonds "roll down" the yield curve toward maturity
  • **Curve change return:** Impact of parallel and non-parallel yield curve shifts
  • Duration effect: -D × Δy (parallel shift)
  • Curve reshaping: key rate duration contributions
  • **Spread change return:** Impact of credit spread changes: -spread_duration × Δspread
  • **Credit/default return:** Losses from defaults or credit events
  • **Residual:** Unexplained return (convexity effects, model error)

Currency Attribution

For international portfolios, returns decompose into:

  • **Local return:** Return of the asset in its local currency
  • **Currency return:** Gain/loss from exchange rate movements
  • **Cross-product:** Interaction between local return and currency return
  • **Total return (base currency):** R_base ≈ R_local + R_currency + R_local × R_currency
  • **Hedged return:** Local return + hedge cost (forward premium/discount)
  • Attribution of active currency decisions: actual currency exposure vs benchmark currency exposure

Holdings-Based vs Returns-Based Attribution

  • **Holdings-based:** Uses actual portfolio positions; more accurate but requires detailed holdings data at each evaluation point
  • **Returns-based (style analysis):** Regresses portfolio returns against a set of style indices (e.g., Sharpe style analysis); less precise but requires only return series
  • **Transaction-based:** Most accurate; accounts for intra-period trading by using actual transaction records

Key Formulas

| Formula | Expression | Use Case | |---------|-----------|----------| | Allocation effect (sector i) | A_i = (w_p,i - w_b,i) × (R_b,i - R_b) | Sector weighting decisions | | Selection effect (sector i) | S_i = w_b,i × (R_p,i - R_b,i) | Security selection within sector | | Interaction effect (sector i) | I_i = (w_p,i - w_b,i) × (R_p,i - R_b,i) | Joint allocation-selection effect | | Total active return | R_p - R_b = Σ(A_i + S_i + I_i) | Sum of all effects equals active return | | Factor return contribution | C_k = β_k × F_k | Return from factor k exposure | | Duration effect | ΔP/P ≈ -D × Δy | Bond price change from yield shift | | Currency return | R_fx = (S_end - S_start) / S_start | Exchange rate impact |

Worked Examples

Example 1: Brinson-Fachler equity attribution

**Given:** Two-sector portfolio (Tech and Healthcare). Portfolio: 35% Tech (returned 15%), 65% Healthcare (returned 8%). Benchmark: 25% Tech (returned 12%), 75% Healthcare (returned 6%). Total benchmark return: 0.25×12% + 0.75×6% = 7.5%. **Calculate:** Allocation, selection, and interaction effects for each sector, and total active return. **Solution:** 1. **Total portfolio return:** 0.35×15% + 0.65×8% = 5.25% + 5.20% = 10.45%. 2. **Total active return:** 10.45% - 7.50% = **2.95%**. 3. **Tech allocation effect:** (0.35 - 0.25) × (12% - 7.5%) = 0.10 × 4.5% = **+0.45%** (overweight a sector that beat the benchmark). 4. **Tech selection effect:** 0.25 × (15% - 12%) = 0.25 × 3% = **+0.75%*

Read more
Ships withfinance-skills

A collection of Claude Code skill plugins for financial services. 91 skills across 7 domain plugins teach Claude investment management, regulatory compliance, advisory workflows, trading operations, and more — so it can assist with finance questions, build

Get the whole plugin
Stats
170
Stars
34
Forks
Maintained
Maintenance
Python
Language
MIT
License
1mo ago
Last commit
6mo ago
Created

Repo: JoelLewis/finance_skills

Other skills on finance-skills.