Imported from arjundrath-star/klade-analyst (
clients/_archived/reid/skills/benchmark-construction/SKILL.md). Install upstream withnpx skills add arjundrath-star/klade-analyst --skill benchmark-construction. Copyright stays with the author.
benchmark-construction
Construct a custom performance benchmark tailored to a specific portfolio's mandate, style, and constraints. A bad benchmark makes every performance number meaningless — if you're measuring a small-cap value fund against the S&P 500, you're measuring noise, not skill. This skill builds proper benchmarks from index constituents, blended indices, factor exposures, or peer group returns, following CFA Institute / GIPS standards.
Trigger
- "Build a benchmark for [portfolio/fund/strategy]"
- "Custom benchmark for [mandate]"
- "Blended benchmark using [indices]"
- "Peer group benchmark for [strategy type]"
- "Is [index] the right benchmark?"
- "Benchmark appropriateness review"
Inputs
Required
- Portfolio description: mandate, strategy type, asset classes, constraints
- Holdings or allocation: current portfolio composition (even approximate)
Optional
- Candidate benchmarks: indices to evaluate or blend (default: skill selects based on mandate)
- Peer group: list of comparable funds/strategies for peer-based benchmark
- Weighting scheme: market-cap, equal-weight, fundamental-weight (default: market-cap)
- Rebalancing frequency: monthly / quarterly / annual (default: quarterly)
- Currency: base currency for multi-asset benchmarks (default: USD)
- Custom constraints: ESG exclusions, sector caps, geography limits
Dependencies
- financial-data-api — data source stack (see
../financial-data-api/SKILL.md)
⚠️ DATA SOURCING MANDATE (NON-NEGOTIABLE)
-
Massive.com API (PRIMARY for index and constituent prices):
web_fetch("https://api.massive.com/v2/aggs/ticker/{TICKER}/range/1/day/{FROM}/{TO}?adjusted=true&apiKey=${MASSIVE_API_KEY}")for historical prices- Use for all return calculations on benchmark components
-
FRED API (PRIMARY for macro benchmarks and rates):
- Treasury indices, inflation data, credit spread indices
web_fetch("https://api.stlouisfed.org/fred/series/observations?series_id={ID}&api_key=${FRED_API_KEY}&file_type=json")- Key series: DGS10, DGS2, DTB3, BAMLH0A0HYM2, BAMLC0A0CM, CPIAUCSL
-
SEC EDGAR (for fundamental-weighted benchmarks):
- Revenue, earnings, book value for fundamental weighting schemes
- CIK lookup + XBRL extraction per standard protocol
-
web_search (SUPPLEMENTARY):
- Index methodology documents, constituent lists, fund fact sheets
- Historical index returns when direct calculation isn't feasible
- NEVER use for price data that Massive.com provides
Methodology
Step 1: Assess the Portfolio Mandate
Before constructing anything, characterize the portfolio along these dimensions:
| Dimension | Options | Why It Matters |
|---|---|---|
| Asset class | Equity, FI, multi-asset, alternatives | Determines benchmark universe |
| Geography | US, developed ex-US, EM, global | Must match investable universe |
| Market cap | Large, mid, small, all-cap | Size factor drives huge return differences |
| Style | Growth, value, core/blend | Style drift detection requires style match |
| Sector focus | Broad, sector-specific, thematic | Sector benchmarks for concentrated mandates |
| Income objective | Total return, income, real return | Yield benchmarks for income mandates |
| Constraints | ESG, SRI, Shariah, tax-aware | Constrained benchmarks for constrained mandates |
CFA Institute benchmark properties (ALL must be satisfied):
- Specified in advance — defined before the measurement period
- Appropriate — reflects the manager's style and universe
- Measurable — returns can be calculated on a timely basis
- Unambiguous — constituents and weights are clearly defined
- Reflective of manager's knowledge — manager knows and could hold the constituents
- Investable — a passive alternative exists or could be constructed
- Owned — manager accepts it as the standard for comparison
Step 2: Identify Candidate Benchmarks
Based on the mandate assessment, identify 3-5 candidate benchmarks:
web_search("[asset class] [geography] [style] index benchmark [provider]")
web_search("[strategy type] standard benchmark institutional")
web_search("[index name] methodology constituents factsheet")
Common benchmark families:
| Asset Class | Provider | Examples |
|---|---|---|
| US Large Cap | S&P | S&P 500, S&P 500 Growth/Value |
| US Large Cap | Russell | Russell 1000, R1000 Growth/Value |
| US Mid Cap | S&P/Russell | S&P 400, Russell Midcap |
| US Small Cap | Russell | Russell 2000, R2000 Growth/Value |
| International | MSCI | MSCI EAFE, MSCI ACWI ex-US |
| Emerging Markets | MSCI | MSCI EM, MSCI EM IMI |
| US Agg Bond | Bloomberg | Bloomberg US Aggregate |
| US IG Corp | Bloomberg | Bloomberg US Corporate |
| US HY | Bloomberg/ICE | ICE BofA US HY Master |
| US Treasury | Bloomberg | Bloomberg US Treasury |
| Real Estate | FTSE | FTSE NAREIT |
| Commodities | Bloomberg | BCOM, S&P GSCI |
Step 3: Evaluate Benchmark Fit
For each candidate, calculate fit metrics:
Holdings overlap:
Overlap = Σ min(w_portfolio_i, w_benchmark_i) for all securities i
Target: >60% overlap for the benchmark to be "appropriate."
Style/factor alignment:
- Compute portfolio vs benchmark factor exposures (market beta, size, value, momentum)
- Large factor mismatches indicate the benchmark doesn't reflect the portfolio's style
Tracking error analysis:
Historical TE = std(R_portfolio - R_benchmark) × √252
Expected TE should be consistent with the manager's expected alpha and risk budget.
Return correlation:
Correlation = corr(R_portfolio, R_benchmark)
Target: >0.90 for the benchmark to be representative.
Step 4: Construct the Benchmark
Option A: Single Index
- Select the best-fit index from Step 3
- Document why alternatives were rejected
Option B: Blended Benchmark When no single index fits, create a weighted blend:
R_benchmark = w_1 × R_index1 + w_2 × R_index2 + ... + w_n × R_indexn
Blending rules:
- Weights must sum to 100%
- Each component must have ≥5% weight (below that, it's noise)
- Maximum 5 components (beyond that, the benchmark itself becomes opaque)
- Weights rebalanced at specified frequency (quarterly default)
- Document the rationale for each weight
Example: Balanced fund benchmark:
60% S&P 500 + 30% Bloomberg US Aggregate + 10% MSCI EAFE = Balanced 60/30/10
Option C: Peer Group Benchmark When constructing from peer returns:
- Identify universe of comparable funds/strategies (minimum 20 for statistical validity)
- Calculate equal-weight or AUM-weight average return of the peer group
- Show distribution: 25th, 50th, 75th percentile
- Limitation: peer groups have survivorship bias (failed funds drop out) — document this
Option D: Factor-Based / Custom Benchmark When the mandate has unique constraints (ESG, sector caps):
- Start with the closest standard index
- Apply the portfolio's constraints to the index constituents
- Reweight remaining constituents per the chosen scheme
- Rebalance at specified frequency
- Document every constraint applied
Step 5: Build Historical Return Series
For the chosen benchmark construction, compute historical returns:
- Pull adjusted daily prices for all constituents from Massive.com
- Apply the weighting scheme at each rebalance date
- Calculate daily benchmark returns between rebalances
- At rebalance dates, update weights per methodology
- Chain-link daily returns into a cumulative NAV series
NAV_t = NAV_{t-1} × (1 + R_benchmark_t)
R_benchmark_t = Σ(w_i,t × R_i,t) for all constituents i
Step 6: Validate the Benchmark
Run validation checks:
Statistical validation:
- Tracking error vs portfolio: is it in the expected range?
- Correlation with portfolio: >0.90?
- Information ratio: does excess return look like alpha or benchmark mismatch?
Practical validation:
- Is the benchmark investable? Could you buy an ETF that tracks it?
- Is the benchmark transparent? Can returns be independently verified?
- Does the manager agree this is a fair comparison?
Gaming detection:
- Is the benchmark chosen to make the manager look good? (e.g., small-cap fund benchmarked to large-cap index)
- Does the benchmark have a known structural beta mismatch?
- Is the blend overly complex to obscure poor performance?
Step 7: Document Benchmark Specification
Create a formal benchmark specification document suitable for IPS (Investment Policy Statement) inclusion.
Output Format
📐 Benchmark Construction — [Portfolio/Strategy Name]
Prepared: [Date] | Base Currency: [CCY] | Rebalancing: [Frequency]
━━━ PORTFOLIO MANDATE ASSESSMENT ━━━
| Dimension | Portfolio Characteristic |
|----------------|------------------------------|
| Asset Class | [e.g., US Equity] |
| Geography | [e.g., Domestic] |
| Market Cap | [e.g., Large-cap] |
| Style | [e.g., Growth] |
| Sector Focus | [e.g., Broad / Technology] |
| Constraints | [e.g., ESG exclusions] |
| Income Target | [e.g., Total return] |
━━━ CANDIDATE BENCHMARK EVALUATION ━━━
| Benchmark | Ticker | Overlap | Correlation | Tracking Error | Fit Score |
|-------------------|--------|---------|-------------|----------------|-----------|
| [Index 1] | XXX | XX.X% | 0.XX | XX.X% | [A/B/C] |
| [Index 2] | XXX | XX.X% | 0.XX | XX.X% | [A/B/C] |
| [Index 3] | XXX | XX.X% | 0.XX | XX.X% | [A/B/C] |
| [Blended Custom] | — | XX.X% | 0.XX | XX.X% | [A/B/C] |
Fit scoring: A = excellent (overlap >70%, corr >0.95) | B = acceptable | C = poor fit
━━━ SELECTED BENCHMARK ━━━
Type: [Single Index / Blended / Peer Group / Custom]
[If blended:]
| Component | Ticker | Weight | Rationale |
|------------------|--------|--------|----------------------------------|
| [Index 1] | XXX | XX% | [Core equity exposure] |
| [Index 2] | XXX | XX% | [Fixed income allocation match] |
| [Index 3] | XXX | XX% | [International sleeve] |
| **Total** | | 100% | |
Rebalancing: [Quarterly on last business day]
Reconstitution: [Per underlying index methodology]
━━━ CFA BENCHMARK PROPERTIES CHECKLIST ━━━
| Property | Status | Notes |
|------------------------|--------|------------------------------------|
| Specified in advance | ✅/⚠️ | [Defined as of YYYY-MM-DD] |
| Appropriate | ✅/⚠️ | [Style and universe match] |
| Measurable | ✅/⚠️ | [Daily returns available] |
| Unambiguous | ✅/⚠️ | [Constituents and weights defined] |
| Reflective of knowledge| ✅/⚠️ | [Manager familiar with holdings] |
| Investable | ✅/⚠️ | [ETF proxy: [TICKER]] |
| Owned by manager | ✅/⚠️ | [Manager acceptance: pending] |
━━━ HISTORICAL VALIDATION ━━━
| Metric | Value | Acceptable Range |
|----------------------------|----------|-----------------|
| Portfolio-Benchmark Corr | 0.XX | >0.90 |
| Annualized Tracking Error | XX.X% | X-X% |
| Information Ratio | X.XX | >0.00 |
| Avg Monthly Excess Return | X.XX% | — |
| Active Share | XX.X% | 20-80% |
━━━ BENCHMARK SPECIFICATION (IPS LANGUAGE) ━━━
"The portfolio shall be measured against [benchmark name/blend], rebalanced [frequency],
calculated on a total-return basis in [currency]. The benchmark is composed of:
[list components and weights]. The benchmark was selected because [rationale].
Performance will be evaluated over rolling [3/5]-year periods."
━━━ TRIPLE-THREAT LENS ━━━
🏦 **Banker:** [Is this benchmark appropriate for marketing materials? Would institutional investors accept it? How does it compare to what peers use? Is there a standard benchmark the consultant community expects?]
📊 **Accountant:** [Is the benchmark return independently verifiable? Are the constituent weights transparent? Does the rebalancing methodology introduce return drag vs. the portfolio? Tax lot implications of benchmark replication?]
💰 **Wealth Manager:** [Can the client understand this benchmark? Is there an investable ETF proxy for the "just buy the benchmark" conversation? What's the expected tracking error budget — will the client tolerate periods of underperformance?]
━━━ SOURCES ━━━
[List all index providers, data sources, methodology documents referenced]
Quality Gates
- Portfolio mandate fully characterized (asset class, geography, cap, style, constraints)
- At least 3 candidate benchmarks evaluated with quantitative fit metrics
- CFA benchmark properties checklist completed — all 7 properties assessed
- Overlap, correlation, and tracking error calculated against portfolio history
- If blended: weights sum to 100%, each component ≥5%, maximum 5 components
- Benchmark returns independently reproducible from constituent data
- IPS-ready specification language provided
- Investable proxy identified (ETF or replicable strategy)
- Gaming/appropriateness check performed — benchmark isn't cherry-picked
- Historical validation shows reasonable tracking error and correlation
- Triple-threat lens references specific fit metrics
Professional Standards
What separates A from B:
- A-grade: Multiple candidates evaluated with quantitative fit metrics. CFA properties checklist completed. Blended benchmark has documented rationale for each component and weight. Historical validation shows the benchmark is a fair measuring stick. Gaming detection performed. IPS-ready specification provided.
- B-grade: Single index selected based on asset class match only. No overlap or correlation analysis. No documentation of why alternatives were rejected. No CFA properties assessment.
Common pitfalls:
- Choosing a benchmark after seeing results (backfitting the benchmark to flatter performance)
- Using an investable ETF as benchmark when it has significant tracking differences from the underlying index
- Blending too many indices — a 7-component benchmark is impossible to explain to clients
- Ignoring currency effects in international benchmarks
- Using peer group benchmarks without addressing survivorship bias
- Selecting a broad market index for a concentrated sector fund
- Not rebalancing the blended benchmark — drift causes the benchmark to deviate from the original intent
See Also
backtest-engine— test strategies against the constructed benchmarkconcentration-risk-report— assess active risk vs benchmarkmulti-currency-portfolio— currency considerations for international benchmarks