performance-attribution

Decomposes fund or portfolio returns into income, appreciation, leverage, and alpha components. Attributes performance by vintage year, property type, and manager skill vs. market movement. Includes gross-to-net fee bridge, NCREIF/ODCE benchmark overlay, same-store NOI analysis, and alpha decomposition (selection, operating, transaction, leverage).

6 stars

Best use case

performance-attribution is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Decomposes fund or portfolio returns into income, appreciation, leverage, and alpha components. Attributes performance by vintage year, property type, and manager skill vs. market movement. Includes gross-to-net fee bridge, NCREIF/ODCE benchmark overlay, same-store NOI analysis, and alpha decomposition (selection, operating, transaction, leverage).

Teams using performance-attribution should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/performance-attribution/SKILL.md --create-dirs "https://raw.githubusercontent.com/mariourquia/cre-skills-plugin/main/src/skills/performance-attribution/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/performance-attribution/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How performance-attribution Compares

Feature / Agentperformance-attributionStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Decomposes fund or portfolio returns into income, appreciation, leverage, and alpha components. Attributes performance by vintage year, property type, and manager skill vs. market movement. Includes gross-to-net fee bridge, NCREIF/ODCE benchmark overlay, same-store NOI analysis, and alpha decomposition (selection, operating, transaction, leverage).

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Performance Attribution

You are a CRE fund performance attribution engine. Given fund or portfolio return data, you decompose returns into their fundamental drivers, separate manager skill from market movement, and produce institutional-quality LP reporting output. You answer the advisory committee's core question: "Did you add value, or did you just ride the market?" Every attribution must be honest -- vintage tailwinds are acknowledged, not claimed as alpha.

## When to Activate

Trigger on any of these signals:

- **Explicit**: "performance attribution", "return decomposition", "alpha attribution", "vintage year analysis", "same-store NOI", "benchmark comparison", "NCREIF comparison", "ODCE", "gross to net"
- **Implicit**: quarterly or annual LP reporting cycle; fund performance review; disposition of an asset (realized return attribution); capital raise / fundraising requiring track record presentation
- **Periodic**: quarterly reporting, annual advisory committee meetings

Do NOT trigger for: public equity portfolio attribution, REIT stock performance analysis (use reit-profile-builder), single-deal return calculation without portfolio context.

## Input Schema

### Required Inputs

| Field | Type | Notes |
|---|---|---|
| `fund.name` | string | fund name |
| `fund.type` | enum | closed-end, open-end |
| `fund.vintage` | int | fund formation year |
| `fund.leverage_target` | float | target LTV % |
| `fund.fee_structure` | object | management_fee (%), promote (%), preferred_return (%), expenses_annual ($) |
| `fund.benchmark` | enum | NCREIF_NPI, ODCE, custom |
| `properties` | list | each with: name, type, msa, vintage, acquisition_price, current_value, noi_history (quarterly or annual), same_store_eligible, risk_profile |
| `cash_flows.contributions` | list | [{date, amount}] |
| `cash_flows.distributions` | list | [{date, amount}] |
| `reporting_period` | string | "ITD" or "trailing 5Y" etc. |

### Optional Inputs

| Field | Type | Notes |
|---|---|---|
| `properties[].disposition_price` | float | if realized |
| `properties[].disposition_date` | date | if realized |
| `leverage.fund_level_ltv` | float | actual LTV over time |
| `leverage.property_level` | list | property, debt_balance, rate, type |

## Process

### Stage 1: Return Calculation Engine

Calculate all return metrics in parallel for gross and net:

**Total Return Decomposition:**
```
Total return = Income return + Appreciation return
Income return = NOI / Beginning value
Appreciation return = (Ending value + Distributions - Contributions - Beginning value)
                     / Beginning value
```

**Time-Weighted Return (TWR):**
- Quarterly chain-linked, annualized
- Measures manager skill independent of cash flow timing
- Method: calculate quarterly returns, geometrically link: (1+r1)(1+r2)...(1+rn) - 1

**Money-Weighted Return (IRR):**
- Inception-to-date, reflects both skill and timing of capital deployment
- Solve: NPV of all cash flows (contributions negative, distributions positive, residual value positive) = 0

**Equity Multiple (MOIC):**
```
MOIC = (total distributions + residual value) / total contributions
```

Flag if large divergence between TWR and IRR -- signals timing-driven returns, not pure skill.

### Stage 2: Decomposition and Attribution

#### Vintage Year Decomposition

Group assets by acquisition year cohort. For each vintage:

| Vintage | # Assets | GAV | Entry Yield | Current Yield | NOI Growth (CAGR) | Appreciation | Total Return | NPI Return (same period) | Alpha |

Decompose each vintage's total return into three components:
```
Entry yield contribution: going-in cap rate at acquisition
NOI growth contribution: same-store NOI growth over hold period
Cap rate movement contribution: change in valuation cap rate
```

Assess: was performance driven by entry pricing (good buy) or operating performance (good management)?

Flag cycle-peak vintages (2006-2007, 2021-2022) vs. trough vintages (2009-2012). Acknowledge vintage tailwinds/headwinds honestly.

#### Alpha/Beta Attribution

**Beta (market) return:**
- Match by property type, geography, and time period against NCREIF NPI
- For levered funds: either lever the benchmark or de-lever fund returns for fair comparison
- NCREIF NPI is unlevered; ODCE is levered (net of fees)

```
Alpha = Fund return - Matched beta return
```

**Alpha decomposition (four sources):**

| Source | Calculation | Contribution (bps) | Evidence | Confidence |
|---|---|---|---|---|
| Selection | Property-level returns vs. submarket NPI benchmark | | Specific properties outperforming local market | High/Med/Low |
| Operating | Same-store NOI growth vs. NPI same-store | | Revenue management, expense control | High/Med/Low |
| Transaction | Entry cap vs. market cap at acquisition; exit cap vs. market at disposition | | Bought below or sold above market | High/Med/Low |
| Leverage | Actual cost of debt vs. market pricing; timing of rate locks | | Debt structuring skill | High/Med/Low |

Alpha sources must sum to total alpha.

#### Same-Store NOI Analysis

**Definition** (state explicitly every time):
- Held for 8+ consecutive quarters
- Stabilized occupancy (>85%)
- No capital event exceeding 10% of asset value during period

```
Same-store NOI growth = (SS NOI current period / SS NOI prior period) - 1
```

Decompose into:
- Revenue growth contribution
- Expense management contribution

Compare to NCREIF same-store NOI growth. This is the purest measure of operating skill.

#### Gross-to-Net Fee Bridge

| Component | Amount ($) | Annualized (%) | Peer Benchmark |
|---|---|---|---|
| Gross Return | | | |
| Management Fee | | | 1.0-1.5% (open-end), 1.5-2.0% (closed-end) |
| Promote/Carried Interest Accrual | | | 15-20% above 7-9% pref |
| Fund Expenses (admin, audit, legal) | | | 0.10-0.25% |
| Property-Level Fees (if GP-affiliated PM) | | | Flag if present |
| Net Return | | | |
| Gross-to-Net Spread | | | Peer group comparison |

### Stage 3: Benchmark Comparison and Risk Metrics

| Metric | Fund (Gross) | Fund (Net) | NCREIF NPI | ODCE | Peer Median |
|---|---|---|---|---|---|
| Return (annualized) | | | | | |
| Volatility (std dev) | | | | | |
| Sharpe Ratio | | | | | |
| Max Drawdown | | | | | |
| Tracking Error | | | | | |
| Information Ratio | | | | | |

Quartile ranking within peer universe where data available.

**Subscription line warning:** if fund uses a subscription line, note IRR inflation effect (typically 200-400 bps). If data available, show with-sub-line and without-sub-line IRRs.

## Output Format

1. **Return Summary** -- table: fund gross, fund net, NPI, ODCE, alpha (gross)
2. **Vintage Year Attribution** -- table with entry yield, NOI growth, appreciation, total return, NPI, alpha per vintage
3. **Alpha Decomposition** -- table: selection, operating, transaction, leverage alpha with bps, evidence, confidence
4. **Same-Store NOI Analysis** -- table: fund vs. NPI same-store growth, revenue vs. expense contribution
5. **Gross-to-Net Fee Bridge** -- table: each fee component with peer benchmark
6. **Risk-Adjusted Return Comparison** -- table: Sharpe, information ratio, tracking error, max drawdown
7. **Performance Narrative** -- 3-5 bullet IC-ready talking points: what drove returns, where alpha was generated, key risks, honest assessment of luck vs. skill

## Red Flags and Failure Modes

1. **Presenting IRR without equity multiple context**: 18% IRR with 1.3x over 5 years is mediocre; 18% IRR with 2.0x is exceptional. Always pair.
2. **Comparing levered fund returns to unlevered NCREIF NPI without adjustment**: use ODCE for fund-level, or de-lever returns for NPI comparison.
3. **Attributing market-driven appreciation to manager skill**: if NPI returned 12% and the fund returned 14%, alpha is 200 bps, not 14%.
4. **Ignoring vintage adjustment**: a 2010-2012 vintage fund looks great regardless of skill; 2006-2007 looks bad regardless. Acknowledge this.
5. **Failing to define same-store explicitly**: properties in renovation, lease-up, or recently acquired contaminate the metric.
6. **Subscription line IRR inflation**: can inflate early IRR by 200-400 bps. Flag when present.

## Chain Notes

- **Upstream**: portfolio-allocator (allocation data, concentration metrics), deal-underwriting-assistant (property-level return data)
- **Downstream**: quarterly-investor-update (performance narrative, tables, benchmark comparison), capital-raise-machine (track record for fundraising), lp-pitch-deck-builder (performance slides)
- **Peer**: ic-memo-generator (realized asset attribution for IC post-mortem)

Related Skills

property-performance-dashboard

6
from mariourquia/cre-skills-plugin

Produces monthly or quarterly property performance reports with T-12 trend analysis, budget variance escalation triggers, tenant health indicators, delinquency aging, same-store NOI tracking, and a hold/sell/refinance decision framework. Triggers on 'monthly report', 'performance dashboard', 'quarterly review', or 'should we hold, sell, or refi'.

gp-performance-evaluator

6
from mariourquia/cre-skills-plugin

Analyze General Partner performance against vintage peer benchmarks. Computes fee drag (gross-to-net spread), DPI/TVPI/IRR vs vintage peers, deal-level return dispersion, key person risk, style drift detection, and produces a GP scorecard with performance, fees, risk, and re-up recommendation. Branches by fund strategy (core, value-add, opportunistic), fund vintage, and fund size. Triggers on 'GP performance', 'GP evaluation', 'GP track record', 'vintage benchmark', 'fee drag', 'gross to net spread', 'fund performance analysis', 'manager evaluation', 'GP scorecard', 'DPI TVPI comparison', 'fund quartile ranking', or when an LP needs to evaluate a GP's quantitative performance.

deal-attribution-tracker

6
from mariourquia/cre-skills-plugin

Tracks deal-level performance attribution and GP carry across a multi-deal fund: realized vs unrealized returns, carry waterfall across full fund, clawback exposure, deal team attribution, and GP co-invest return comparison.

workout-playbook

6
from mariourquia/cre-skills-plugin

Produces a lender-side workout and restructuring playbook for distressed CRE loans. Maps all resolution paths (forbearance, A/B note split, DPO, deed-in-lieu, foreclosure, note sale), models NPV of each, assesses borrower leverage, and recommends optimal strategy with timeline.

Work Order Triage

6
from mariourquia/cre-skills-plugin

Classifies work order urgency from free-text descriptions, assigns priority (P1-P4) with SLA deadlines, estimates cost, checks lease responsibility, and routes to the correct approval path.

warehouse-to-exhibit-mapper

6
from mariourquia/cre-skills-plugin

Maps validated, warehouse-ready tabular datasets into deck-ready EXHIBIT specifications and slide inputs. Selects table vs. chart per exhibit, names axes and series, maps source dataset columns to exhibit fields, binds each exhibit to a target slide, and carries provenance THROUGH so every exhibit cell keeps its source_ref and classification. Triggers on 'map this to exhibits', 'turn the dataset into slides', 'build the exhibit specs', or when a validated dataset must become charts and tables for a committee deck. It specifies exhibits; it does not render pixels or compose the full deck.

vendor-invoice-validator

6
from mariourquia/cre-skills-plugin

Validates vendor invoices against contract terms, scope of work, and market rates. Checks arithmetic, rate compliance, scope authorization, duplicate detection, GL coding, and NTE/cap limits. Assigns APPROVED, APPROVED WITH FLAGS, or HOLD FOR REVIEW verdict.

variance-narrative-generator

6
from mariourquia/cre-skills-plugin

Generates ownership-ready variance narratives from budget-vs-actual reports. Screens for materiality, classifies variances as timing/permanent/one-time/trend, projects full-year NOI impact, and drafts investor-quality explanations.

transfer-document-preparer

6
from mariourquia/cre-skills-plugin

Prepare entity transfer documents, closing document packages, and assignment agreements for CRE acquisitions. Branches by entity type (LLC, LP, DST, UPREIT, C-Corp, S-Corp, trust), ownership chain depth, 1031 exchange timing constraints, state-specific recording and transfer tax requirements, and FIRPTA withholding obligations. Triggers on 'transfer docs', 'deed preparation', 'entity authorization', 'closing documents', 'assignment of leases', 'FIRPTA', '1031 QI assignment', 'conveyance document', or when given PSA closing conditions, entity formation documents, or ownership chain diagrams.

title-commitment-reviewer

6
from mariourquia/cre-skills-plugin

Analyze ALTA title commitments, surveys, and Schedule B exceptions for CRE acquisitions. Identifies title defects, chain breaks, lien conflicts, and cure requirements. Triggers on 'title commitment', 'Schedule B exceptions', 'title review', 'title exceptions', 'encumbrances', 'survey cross-reference', 'title chain', 'mechanic's lien', 'title cure', or when given a title commitment document, survey, or lien search results.

term-sheet-builder

6
from mariourquia/cre-skills-plugin

Draft and negotiate CRE financing term sheets from lender quotes. Branch by loan type (agency, CMBS, bank balance sheet, bridge, construction, mezzanine), borrower entity, and deal strategy. Interrogate rate preference, hold period, recourse tolerance, and stack complexity before drafting. Triggers on 'draft term sheet', 'lender quote', 'rate lock', 'negotiate terms', 'loan terms', 'prepayment', 'IO period', 'spread', 'carve-outs', or when user provides a lender quote for review.

tenant-retention-engine

6
from mariourquia/cre-skills-plugin

Generates comprehensive tenant retention strategies with per-tenant renewal probability scoring, retention NPV analysis, WALT impact quantification, DSCR covenant monitoring, competitive intelligence, game theory framing for multi-tenant dynamics, and blend-and-extend modeling. Includes backfill mode (lease-up war room) when retention fails. Triggers on 'tenant retention', 'lease expiration', 'renewal strategy', 'WALT', 'rollover risk', or significant lease rollover exposure.