?>
ESC to close

ETF & Mutual Fund Comparison API

Maintained by Piyush Arora

Last updated:

Compare two to six ETFs or mutual funds across every metric on file — fees, returns, flows, concentration, sector and country exposure, look-through valuation, tracking, and risk ratios — in a single call. The endpoint does the part a caller cannot do for itself: it works out which of the 138 comparable metrics actually differ at the precision a reader would see, names which way is better where that is a fact rather than an opinion, and tells you outright when two tickers are the same portfolio in different wrappers. The API is free to use.

Use this endpoint to:

Answer "VOO vs VTI" Surface Only What Differs Detect Share Classes Of One Fund
GET https://data.businessquant.com/funds/compare?tickers={tickers}&api_key={api_key}

Related endpoints: Find candidates to compare with the ETF & Mutual Fund Screener API. For one fund in depth, see the Fund Overview, Fund Holdings, Portfolio Exposure, Fund Flows and Fund Risk Factors APIs. To compare positions rather than metrics, pull both portfolios from Fund Holdings. New here? Start at the API Overview.

1. Request Parameters

Two parameters, one of them optional. A comparison is a small, bounded request by design.

ParameterDescription
api_key
Required
Your unique API key for authentication.
tickers
Required Identifier
Two to six comma-separated fund or ETF tickers. Duplicates are collapsed before the count is checked, so VOO,VOO is one ticker and returns a 400. Order is preserved: the columns come back in the order you asked for them.
Example: tickers=VOO,SPY,IVV
include_metrics
Optional
true also embeds the flat metric catalogue in metadata.metrics. You rarely need it here — metadata.groups already carries the label, unit, datatype and description of every metric in the comparison.
Example cURL Request
curl -X GET "https://data.businessquant.com/funds/compare?tickers=VOO,SPY,IVV&api_key=YOUR_API_KEY"
Sample Response (VOO vs SPY vs IVV, abridged)
{
    "metadata": {
        "endpoint": "/funds/compare",
        "grain": "share class ticker",
        "requested": [
            "VOO",
            "SPY",
            "IVV"
        ],
        "resolved": [
            "VOO",
            "SPY",
            "IVV"
        ],
        "missing": [],
        "count": 3,
        "max_compare": 6,
        "same_portfolio": false,
        "series_id": null,
        "metrics_total": 144,
        "differing_count": 92,
        "groups": [
            {
                "statement": "Profile",
                "order": 1,
                "metrics": [
                    {
                        "field": "category",
                        "label": "Category",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Coarse bucket derived from what the fund HOLDS, not from its name, measured on classified exposure only. Other when under half the portfolio is classified.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "fund_tags",
                        "label": "Tags",
                        "unit": "list",
                        "datatype": "list",
                        "description": "Fund types as filed in N-CEN: Index Fund, Fund of Funds, Target Date, Money Market, Inverse, Underlying Fund, Interval Fund, Exchange-Traded Managed. A fund can carry several.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "geography_focus",
                        "label": "Geography",
                        "unit": "text",
                        "datatype": "text",
                        "description": "US (80%+ US assets), International (20% or less) or Global. Derived from holdings.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "registrantFullName",
                        "label": "Family",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Registrant / trust name. The issuer filter: Vanguard, iShares, SPDR.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "structure_tags",
                        "label": "Structure",
                        "unit": "list",
                        "datatype": "list",
                        "description": "Structural facts from N-CEN: Non-Diversified (may concentrate), Lends Securities, Foreign Subsidiary.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Fees",
                "order": 2,
                "metrics": [
                    {
                        "field": "acquired_fund_fees_pct",
                        "label": "AFFE",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Fees charged by the underlying funds a fund holds. Material for funds of funds and usually excluded from the waiver.",
                        "differs": false,
                        "direction": "lower",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "gross_expense_ratio_pct",
                        "label": "Gross Expense",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Total annual operating expenses before any waiver. Above the net ratio when a waiver is in force, which may expire.",
                        "differs": true,
                        "direction": "lower",
                        "leaders": [
                            "VOO",
                            "IVV"
                        ],
                        "laggards": [
                            "SPY"
                        ]
                    },
                    {
                        "field": "min_initial_investment_usd",
                        "label": "Min. Investment",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Smallest initial purchase the prospectus accepts. Absent for most ETFs, which have none.",
                        "differs": false,
                        "direction": "lower",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "net_expense_ratio_pct",
                        "label": "Net Expense",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "What the investor actually pays after fee waivers. THE expense ratio. 0.03 means three basis points, not 3%.",
                        "differs": true,
                        "direction": "lower",
                        "leaders": [
                            "VOO",
                            "IVV"
                        ],
                        "laggards": [
                            "SPY"
                        ]
                    }
                ]
            },
            {
                "statement": "Size",
                "order": 3,
                "metrics": [
                    {
                        "field": "net_assets_usd",
                        "label": "AUM",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Fund-level assets under management from the latest N-PORT. Fund grain, so every share class of a fund shows the same figure.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Returns",
                "order": 4,
                "metrics": [
                    {
                        "field": "cal_return_2021_pct",
                        "label": "2021",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Calendar-year 2021 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "cal_return_2022_pct",
                        "label": "2022",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Calendar-year 2022 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "cal_return_2023_pct",
                        "label": "2023",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Calendar-year 2023 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "cal_return_2024_pct",
                        "label": "2024",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Calendar-year 2024 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "cal_return_2025_pct",
                        "label": "2025",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Calendar-year 2025 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "pro_return_10y_pct",
                        "label": "10Y Ann. (Prospectus)",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Average annual total return over ten years, before taxes, as printed in the prospectus.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "pro_return_5y_pct",
                        "label": "5Y Ann. (Prospectus)",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Average annual total return over five years, before taxes, as printed in the prospectus. Stale by up to a year — see Returns As Of.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "pro_return_incep_pct",
                        "label": "Since Inception (Prospectus)",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Average annual total return since inception, before taxes, as printed in the prospectus.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "pro_worst_quarter_pct",
                        "label": "Worst Quarter (Prospectus)",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst calendar quarter in the prospectus bar chart. The drawdown proxy.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "return_1m_pct",
                        "label": "1M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing one-month PRICE return. Excludes distributions, so it understates total return by roughly the yield.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "return_1y_pct",
                        "label": "1Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing one-year PRICE return, measured back from Price As Of (the latest trading day). The primary performance filter — current, daily, ~77% of the universe. NOT comparable with Total Return 12M, whose window ends at the last N-PORT filing up to five months earlier.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "return_3m_pct",
                        "label": "3M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing three-month price return.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "return_3y_ann_pct",
                        "label": "3Y Ann.",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised three-year price return. Null unless three years of history exist.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "return_5y_ann_pct",
                        "label": "5Y Ann.",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised five-year price return. Null unless five years of history exist.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "return_6m_pct",
                        "label": "6M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing six-month price return.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO",
                            "SPY"
                        ]
                    },
                    {
                        "field": "return_ytd_pct",
                        "label": "YTD",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Year-to-date price return, measured from the last close of the prior year.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO",
                            "SPY"
                        ]
                    },
                    {
                        "field": "total_return_12m_pct",
                        "label": "Total 12M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Twelve N-PORT monthly total returns chained. NULL unless all twelve months are present, so a partial chain cannot rank funds by how completely they file. Its window ends at Total Return As Of — the last N-PORT filing, typically one to five months stale — NOT at today. DO NOT difference it against Return 1Y: over an identical window it runs ~1.25pp above the price return (that gap is the distribution: ETFs 2.5pp, mutual funds 5.3pp), but the raw difference between the two columns is mostly the market move in the months their windows do not share.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "total_return_1m_pct",
                        "label": "Total 1M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "The filer's own monthly TOTAL return from N-PORT Item B.5 — distributions INCLUDED, unlike the price returns above. Share-class grain: two classes of one fund differ by their fee.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VOO"
                        ],
                        "laggards": [
                            "IVV"
                        ]
                    },
                    {
                        "field": "total_return_3m_pct",
                        "label": "Total 3M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Three N-PORT monthly total returns chained geometrically. NULL unless all three months are on file.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "total_return_6m_pct",
                        "label": "Total 6M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Six N-PORT monthly total returns chained geometrically. NULL unless all six months are on file.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Market Cap",
                "order": 5,
                "metrics": [
                    {
                        "field": "large_cap_pct",
                        "label": "Large Cap",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of covered equity in companies of $10B to $200B.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "market_cap_coverage_pct",
                        "label": "Cap Coverage",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of equity exposure that resolved to a market cap. US-only source, so international funds run low: VOO 96%, VWO 3%. BELOW 70 THE CAP AND VALUATION COLUMNS ARE BLANKED — do not render them.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "mega_cap_pct",
                        "label": "Mega Cap",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of covered equity in companies above $200B.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "micro_cap_pct",
                        "label": "Micro Cap",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of covered equity in companies below $300M.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "mid_cap_pct",
                        "label": "Mid Cap",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of covered equity in companies of $2B to $10B.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "size_style",
                        "label": "Size Style",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Large Cap, Mid Cap, Small Cap or Multi Cap, from the cap ladder. Null below 70% coverage.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "small_cap_pct",
                        "label": "Small Cap",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of covered equity in companies of $300M to $2B.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "wavg_market_cap_usd",
                        "label": "Avg Mkt Cap",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Value-weighted average market capitalisation of the equity holdings. Null below 70% coverage.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Valuation",
                "order": 6,
                "metrics": [
                    {
                        "field": "lookthrough_dividend_yield_pct",
                        "label": "Look-Through Yield",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Value-weighted dividend yield of the equity holdings. Arithmetic, because yields are additive. NOT the fund's own distribution yield, which we cannot yet serve.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "lookthrough_ev_ebitda",
                        "label": "EV/EBITDA",
                        "unit": "number",
                        "datatype": "int",
                        "description": "Harmonic weighted enterprise value to EBITDA of the equity holdings.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "lookthrough_pe",
                        "label": "P/E",
                        "unit": "number",
                        "datatype": "int",
                        "description": "Harmonic weighted price/earnings of the equity holdings — the index-provider standard. Loss-makers are excluded rather than dragging the ratio negative. VUG 29.9 vs VTV 20.9 is the growth/value spread.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "lookthrough_ps",
                        "label": "P/S",
                        "unit": "number",
                        "datatype": "int",
                        "description": "Harmonic weighted price/sales of the equity holdings.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Asset Mix",
                "order": 7,
                "metrics": [
                    {
                        "field": "derivative_pct",
                        "label": "Derivatives",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in derivatives. Large for inverse and leveraged funds.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "equity_pct",
                        "label": "Equity",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in equities.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "fixed_income_pct",
                        "label": "Fixed Income",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in bonds and other debt.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "fund_cash_pct",
                        "label": "Fund & Cash",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in other funds and cash equivalents.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "other_asset_pct",
                        "label": "Other Assets",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure the classifier had no opinion on. Not an asset class — a coverage gap, and excluded from the Category denominator for that reason.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Sector",
                "order": 8,
                "metrics": [
                    {
                        "field": "sector_basic_materials_pct",
                        "label": "Basic Materials",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Basic Materials. Percent of absolute market value, renormalised to 100.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_communication_services_pct",
                        "label": "Communication Services",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Communication Services. Percent of absolute market value, renormalised to 100.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_consumer_discretionary_pct",
                        "label": "Consumer Discretionary",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Consumer Discretionary. Percent of absolute market value, renormalised to 100.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_consumer_staples_pct",
                        "label": "Consumer Staples",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Consumer Staples. Percent of absolute market value, renormalised to 100.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_energy_pct",
                        "label": "Energy",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Energy. Percent of absolute market value, renormalised to 100.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_financial_services_pct",
                        "label": "Financial Services",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Financial Services. Percent of absolute market value, renormalised to 100.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_healthcare_pct",
                        "label": "Healthcare",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Healthcare. Percent of absolute market value, renormalised to 100.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_industrials_pct",
                        "label": "Industrials",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Industrials. Percent of absolute market value, renormalised to 100.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_other_pct",
                        "label": "Other / Unclass.",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure with no equity sector: every bond, plus foreign listings absent from the industry classification. Median 60%. LARGE IS NORMAL — VOO 6%, AGG 36%, VWO 91%. Do not hide, merge or rename it.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_real_estate_pct",
                        "label": "Real Estate",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Real Estate. Percent of absolute market value, renormalised to 100.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_technology_pct",
                        "label": "Technology",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Technology. Percent of absolute market value, renormalised to 100.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_utilities_pct",
                        "label": "Utilities",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Utilities. Percent of absolute market value, renormalised to 100.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "top_sector",
                        "label": "Top Sector",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Largest classified sector, excluding the unclassified bucket.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "top_sector_pct",
                        "label": "Top Sector %",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Weight of the largest classified sector.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Bond Character",
                "order": 9,
                "metrics": [
                    {
                        "field": "average_coupon_pct",
                        "label": "Avg Coupon",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Market-value-weighted average annual coupon of the fund's debt holdings, as filed. Not a yield: it ignores the price paid, so it says what the bonds pay, not what the investor earns.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "corporate_pct",
                        "label": "Corporate",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in corporate issuers.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "dated_holdings_count",
                        "label": "Dated Holdings",
                        "unit": "number",
                        "datatype": "int",
                        "description": "How many positions carried a maturity date. The denominator behind Effective Maturity, and the gate for whether to show it at all: zero means the fund filed no dated instrument.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "duration_band",
                        "label": "Rate Sensitivity",
                        "unit": "number",
                        "datatype": "str",
                        "description": "Which interest-rate sensitivity band the fund falls in, from its own effective duration: Limited under 3.5 years, Moderate 3.5 to 6, Extensive above 6. The axis bond funds are actually compared on, and the peer group the maturity schedule is measured against. Null wherever effective duration is.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "effective_duration_years",
                        "label": "Effective Duration",
                        "unit": "number",
                        "datatype": "float",
                        "description": "How much the fund moves when rates move: the percentage change in value for a one-percentage-point shift in rates. Taken from the fund's own DV01 as filed under N-PORT Item B.3, so it carries the manager's own prepayment and call assumptions, and it reproduces published factsheets to within about 2%. This, not maturity, is the number to compare bond funds on for rate risk -- under 3 is short, 3-7 intermediate, over 7 long. Null for a fund with no rate exposure or an implausible filing; do not render it as zero.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "effective_maturity_years",
                        "label": "Effective Maturity",
                        "unit": "number",
                        "datatype": "float",
                        "description": "When the fund's principal is actually expected back, which is what a factsheet means by average effective maturity and the figure to compare a bond fund on. Modelled from the filing's own terms -- amortisation for mortgage and asset-backed paper, the call for perpetual preferreds -- and calibrated so the projection reproduces the duration the fund itself filed, so the prepayment speed is the manager's rather than ours. It matches published figures to about 2%. Null where the filed rate-risk data was not good enough to calibrate against.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "municipal_pct",
                        "label": "Municipal",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in municipal issues. The tax-exempt income screen.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "non_us_sovereign_pct",
                        "label": "Non-US Sovereign",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in non-US sovereign and state issuers.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "us_agency_gse_pct",
                        "label": "Agency & GSE",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in US government agency and government-sponsored entity issues.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "us_treasury_pct",
                        "label": "Treasury",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in US Treasury issues.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "weighted_average_maturity_years",
                        "label": "Avg Legal Maturity",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Market-value-weighted average years to maturity across the fund's dated holdings, measured from the portfolio date. This is when the paper legally comes due, not how it behaves: on a mortgage book it runs 40-54% above the fund's own Effective Duration, because a 30-year pool prepays. Screen rate risk on Effective Duration and use this for the legal profile. Null for a fund holding nothing dated, which is every equity fund -- do not render it as zero. Perpetual issues are excluded from the average and counted separately.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Geography",
                "order": 10,
                "metrics": [
                    {
                        "field": "country_us_pct",
                        "label": "US Weight",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in US-domiciled issuers. Region rollups are NOT shipped: N-PORT reports country of incorporation, so offshore-incorporated issuers land in the wrong region.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "top_country",
                        "label": "Top Country",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Largest issuer country by gross exposure.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Portfolio",
                "order": 11,
                "metrics": [
                    {
                        "field": "holdings_count",
                        "label": "Holdings",
                        "unit": "count",
                        "datatype": "int",
                        "description": "Number of positions in the latest snapshot. Median 87, maximum 18,136.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "short_pct",
                        "label": "Short",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in short positions. Zero for a long-only fund, which is most of them.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Concentration",
                "order": 12,
                "metrics": [
                    {
                        "field": "effective_holdings",
                        "label": "Effective Holdings",
                        "unit": "count",
                        "datatype": "int",
                        "description": "1 divided by the sum of squared weights: the number of EQUAL-weighted positions carrying the same concentration. VOO holds 506 securities and has an effective 48.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "top10_weight_pct",
                        "label": "Top 10",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Combined weight of the ten largest positions, computed on gross exposure.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "top1_weight_pct",
                        "label": "Largest Position",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Weight of the single largest position.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "topholding_cusip",
                        "label": "topholding_cusip",
                        "unit": "text",
                        "datatype": "text",
                        "description": "CUSIP of the largest position's issuer.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "topholding_name",
                        "label": "Top Holding",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Name of the largest position, as the holding was filed. Group or filter on topholding_ticker instead: the same issuer is filed under many spellings.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "topholding_ticker",
                        "label": "topholding_ticker",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Ticker of the largest position's issuer. The groupable form of topholding_name; null where the holding has no listed issuer -- cash sweeps, money-market funds, Treasuries, munis -- which is roughly a fifth of funds.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Flows",
                "order": 13,
                "metrics": [
                    {
                        "field": "flow_positive_months_pct",
                        "label": "Positive Months",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of observed months with net inflows. A persistence measure, not a magnitude.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VOO"
                        ],
                        "laggards": [
                            "SPY"
                        ]
                    },
                    {
                        "field": "net_flow_12m_pct",
                        "label": "Flow 12M %",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing twelve-month net flow as a percent of net assets.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "net_flow_12m_usd",
                        "label": "Flow 12M",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Trailing twelve-month net flow in dollars. Negative means redemptions exceeded sales. Sorting on this re-sorts by fund size; use the percent version.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "net_flow_1m_pct",
                        "label": "Flow 1M %",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing one-month net flow as a percent of net assets. Size-neutral — rank on this, not the dollar figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "net_flow_3m_pct",
                        "label": "Flow 3M %",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing three-month net flow as a percent of net assets.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    }
                ]
            },
            {
                "statement": "Cost of Ownership",
                "order": 14,
                "metrics": [
                    {
                        "field": "fund_age_years",
                        "label": "Fund Age",
                        "unit": "years",
                        "datatype": "int",
                        "description": "Years since the fund began operations. Fund-level, not share-class.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "portfolio_turnover_pct",
                        "label": "Turnover",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Percent of holdings replaced during the last fiscal year. High turnover implies trading cost and tax drag. Figures beyond 1500% are filer errors and are nulled.",
                        "differs": true,
                        "direction": "lower",
                        "leaders": [
                            "VOO"
                        ],
                        "laggards": [
                            "IVV"
                        ]
                    }
                ]
            },
            {
                "statement": "Risk",
                "order": 15,
                "metrics": [
                    {
                        "field": "credit_spread_hy_10y_usd",
                        "label": "Spread HY",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Non-investment-grade spread duration risk at the 10-year tenor, in dollars per basis point.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "credit_spread_ig_10y_usd",
                        "label": "Spread IG",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Investment-grade spread duration risk at the 10-year tenor, in dollars per basis point.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "dv01_10y_bp_per_10k",
                        "label": "DV01 10Y",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Dollar change per basis point at the 10-year tenor, scaled to a $10,000 holding. THE size-neutral duration proxy. Bond funds only — roughly 30% coverage is the bond share of the universe, not a gap.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "liabilities_pct_net_assets",
                        "label": "Liabilities %",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Total liabilities as a percent of net assets. The broadest leverage read.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "tracking_difference_pct",
                        "label": "Tracking Diff.",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Index fund return minus its index, after expenses, as filed in N-CEN. Negative is normal and roughly equals the fee — IVV -0.02, VOO -0.169, median -0.185. THE measure of whether an index fund does its job.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "tracking_error_pct",
                        "label": "Tracking Error",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Daily standard deviation of that return difference, after expenses. Near zero for a domestic index fund (IVV 0.03); large for international funds, where fair-value pricing makes daily NAV and index diverge.",
                        "differs": true,
                        "direction": "lower",
                        "leaders": [
                            "VOO"
                        ],
                        "laggards": [
                            "IVV"
                        ]
                    }
                ]
            },
            {
                "statement": "Risk Ratios",
                "order": 16,
                "metrics": [
                    {
                        "field": "std_dev_6m_pct",
                        "label": "Std Dev 6M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised standard deviation of daily price returns over the trailing 6M window, in percent. THE volatility measure. Barely affected by the price-not-total-return basis, so it is directly comparable across funds.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "std_dev_ytd_pct",
                        "label": "Std Dev YTD",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised standard deviation of daily price returns over the trailing YTD window, in percent. THE volatility measure. Barely affected by the price-not-total-return basis, so it is directly comparable across funds.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "std_dev_1y_pct",
                        "label": "Std Dev 1Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised standard deviation of daily price returns over the trailing 1Y window, in percent. THE volatility measure. Barely affected by the price-not-total-return basis, so it is directly comparable across funds.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "std_dev_2y_pct",
                        "label": "Std Dev 2Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised standard deviation of daily price returns over the trailing 2Y window, in percent. THE volatility measure. Barely affected by the price-not-total-return basis, so it is directly comparable across funds.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "std_dev_3y_pct",
                        "label": "Std Dev 3Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised standard deviation of daily price returns over the trailing 3Y window, in percent. THE volatility measure. Barely affected by the price-not-total-return basis, so it is directly comparable across funds.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "std_dev_5y_pct",
                        "label": "Std Dev 5Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised standard deviation of daily price returns over the trailing 5Y window, in percent. THE volatility measure. Barely affected by the price-not-total-return basis, so it is directly comparable across funds.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "max_drawdown_6m_pct",
                        "label": "Max Drawdown 6M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst peak-to-trough decline inside the trailing 6M window, in percent and NEGATIVE. Measured on daily closes, so it is the loss an investor who bought the peak actually lived through — not a month-end approximation.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "max_drawdown_ytd_pct",
                        "label": "Max Drawdown YTD",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst peak-to-trough decline inside the trailing YTD window, in percent and NEGATIVE. Measured on daily closes, so it is the loss an investor who bought the peak actually lived through — not a month-end approximation.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "SPY",
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "max_drawdown_1y_pct",
                        "label": "Max Drawdown 1Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst peak-to-trough decline inside the trailing 1Y window, in percent and NEGATIVE. Measured on daily closes, so it is the loss an investor who bought the peak actually lived through — not a month-end approximation.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "SPY",
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "max_drawdown_2y_pct",
                        "label": "Max Drawdown 2Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst peak-to-trough decline inside the trailing 2Y window, in percent and NEGATIVE. Measured on daily closes, so it is the loss an investor who bought the peak actually lived through — not a month-end approximation.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "max_drawdown_3y_pct",
                        "label": "Max Drawdown 3Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst peak-to-trough decline inside the trailing 3Y window, in percent and NEGATIVE. Measured on daily closes, so it is the loss an investor who bought the peak actually lived through — not a month-end approximation.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "max_drawdown_5y_pct",
                        "label": "Max Drawdown 5Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst peak-to-trough decline inside the trailing 5Y window, in percent and NEGATIVE. Measured on daily closes, so it is the loss an investor who bought the peak actually lived through — not a month-end approximation.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sharpe_6m",
                        "label": "Sharpe 6M",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Annualised excess return divided by the annualised standard deviation of that excess return, over the trailing 6M window. Excess is over the 3-month Treasury yield. BIASED LOW by roughly yield/volatility because the return series excludes distributions — ranking within a peer group is sound, an absolute reading is not.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO",
                            "SPY"
                        ]
                    },
                    {
                        "field": "sharpe_ytd",
                        "label": "Sharpe YTD",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Annualised excess return divided by the annualised standard deviation of that excess return, over the trailing YTD window. Excess is over the 3-month Treasury yield. BIASED LOW by roughly yield/volatility because the return series excludes distributions — ranking within a peer group is sound, an absolute reading is not.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO",
                            "SPY"
                        ]
                    },
                    {
                        "field": "sharpe_1y",
                        "label": "Sharpe 1Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Annualised excess return divided by the annualised standard deviation of that excess return, over the trailing 1Y window. Excess is over the 3-month Treasury yield. BIASED LOW by roughly yield/volatility because the return series excludes distributions — ranking within a peer group is sound, an absolute reading is not.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sharpe_2y",
                        "label": "Sharpe 2Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Annualised excess return divided by the annualised standard deviation of that excess return, over the trailing 2Y window. Excess is over the 3-month Treasury yield. BIASED LOW by roughly yield/volatility because the return series excludes distributions — ranking within a peer group is sound, an absolute reading is not.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VOO",
                            "IVV"
                        ],
                        "laggards": [
                            "SPY"
                        ]
                    },
                    {
                        "field": "sharpe_3y",
                        "label": "Sharpe 3Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Annualised excess return divided by the annualised standard deviation of that excess return, over the trailing 3Y window. Excess is over the 3-month Treasury yield. BIASED LOW by roughly yield/volatility because the return series excludes distributions — ranking within a peer group is sound, an absolute reading is not.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VOO"
                        ],
                        "laggards": [
                            "SPY"
                        ]
                    },
                    {
                        "field": "sharpe_5y",
                        "label": "Sharpe 5Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Annualised excess return divided by the annualised standard deviation of that excess return, over the trailing 5Y window. Excess is over the 3-month Treasury yield. BIASED LOW by roughly yield/volatility because the return series excludes distributions — ranking within a peer group is sound, an absolute reading is not.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sortino_6m",
                        "label": "Sortino 6M",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Like Sharpe but penalising only DOWNSIDE deviation, over the trailing 6M window. Downside deviation is the root-mean-square of negative excess returns divided by the full observation count, the standard definition. Carries the same low bias as Sharpe.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "sortino_ytd",
                        "label": "Sortino YTD",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Like Sharpe but penalising only DOWNSIDE deviation, over the trailing YTD window. Downside deviation is the root-mean-square of negative excess returns divided by the full observation count, the standard definition. Carries the same low bias as Sharpe.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "sortino_1y",
                        "label": "Sortino 1Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Like Sharpe but penalising only DOWNSIDE deviation, over the trailing 1Y window. Downside deviation is the root-mean-square of negative excess returns divided by the full observation count, the standard definition. Carries the same low bias as Sharpe.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sortino_2y",
                        "label": "Sortino 2Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Like Sharpe but penalising only DOWNSIDE deviation, over the trailing 2Y window. Downside deviation is the root-mean-square of negative excess returns divided by the full observation count, the standard definition. Carries the same low bias as Sharpe.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VOO"
                        ],
                        "laggards": [
                            "SPY"
                        ]
                    },
                    {
                        "field": "sortino_3y",
                        "label": "Sortino 3Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Like Sharpe but penalising only DOWNSIDE deviation, over the trailing 3Y window. Downside deviation is the root-mean-square of negative excess returns divided by the full observation count, the standard definition. Carries the same low bias as Sharpe.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VOO"
                        ],
                        "laggards": [
                            "SPY"
                        ]
                    },
                    {
                        "field": "sortino_5y",
                        "label": "Sortino 5Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Like Sharpe but penalising only DOWNSIDE deviation, over the trailing 5Y window. Downside deviation is the root-mean-square of negative excess returns divided by the full observation count, the standard definition. Carries the same low bias as Sharpe.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "alpha_6m_pct",
                        "label": "Alpha 6M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised Jensen's alpha against Benchmark over the trailing 6M window, in percent — the intercept of excess fund return regressed on excess benchmark return. BIASED LOW by roughly the fund's yield. Read it against peers, never as an absolute skill figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "alpha_ytd_pct",
                        "label": "Alpha YTD",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised Jensen's alpha against Benchmark over the trailing YTD window, in percent — the intercept of excess fund return regressed on excess benchmark return. BIASED LOW by roughly the fund's yield. Read it against peers, never as an absolute skill figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "IVV"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "alpha_1y_pct",
                        "label": "Alpha 1Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised Jensen's alpha against Benchmark over the trailing 1Y window, in percent — the intercept of excess fund return regressed on excess benchmark return. BIASED LOW by roughly the fund's yield. Read it against peers, never as an absolute skill figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "SPY"
                        ],
                        "laggards": [
                            "VOO"
                        ]
                    },
                    {
                        "field": "alpha_2y_pct",
                        "label": "Alpha 2Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised Jensen's alpha against Benchmark over the trailing 2Y window, in percent — the intercept of excess fund return regressed on excess benchmark return. BIASED LOW by roughly the fund's yield. Read it against peers, never as an absolute skill figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VOO"
                        ],
                        "laggards": [
                            "SPY"
                        ]
                    },
                    {
                        "field": "alpha_3y_pct",
                        "label": "Alpha 3Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised Jensen's alpha against Benchmark over the trailing 3Y window, in percent — the intercept of excess fund return regressed on excess benchmark return. BIASED LOW by roughly the fund's yield. Read it against peers, never as an absolute skill figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VOO"
                        ],
                        "laggards": [
                            "SPY"
                        ]
                    },
                    {
                        "field": "alpha_5y_pct",
                        "label": "Alpha 5Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised Jensen's alpha against Benchmark over the trailing 5Y window, in percent — the intercept of excess fund return regressed on excess benchmark return. BIASED LOW by roughly the fund's yield. Read it against peers, never as an absolute skill figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VOO"
                        ],
                        "laggards": [
                            "SPY"
                        ]
                    },
                    {
                        "field": "beta_6m",
                        "label": "Beta 6M",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Slope of excess fund return regressed on excess benchmark return over the trailing 6M window. 1.0 moves with Benchmark, 0 is uncorrelated, above 1 amplifies. Near zero for a bond fund, which is the correct answer rather than a missing one.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "beta_ytd",
                        "label": "Beta YTD",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Slope of excess fund return regressed on excess benchmark return over the trailing YTD window. 1.0 moves with Benchmark, 0 is uncorrelated, above 1 amplifies. Near zero for a bond fund, which is the correct answer rather than a missing one.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "beta_1y",
                        "label": "Beta 1Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Slope of excess fund return regressed on excess benchmark return over the trailing 1Y window. 1.0 moves with Benchmark, 0 is uncorrelated, above 1 amplifies. Near zero for a bond fund, which is the correct answer rather than a missing one.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "beta_2y",
                        "label": "Beta 2Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Slope of excess fund return regressed on excess benchmark return over the trailing 2Y window. 1.0 moves with Benchmark, 0 is uncorrelated, above 1 amplifies. Near zero for a bond fund, which is the correct answer rather than a missing one.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "beta_3y",
                        "label": "Beta 3Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Slope of excess fund return regressed on excess benchmark return over the trailing 3Y window. 1.0 moves with Benchmark, 0 is uncorrelated, above 1 amplifies. Near zero for a bond fund, which is the correct answer rather than a missing one.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "beta_5y",
                        "label": "Beta 5Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Slope of excess fund return regressed on excess benchmark return over the trailing 5Y window. 1.0 moves with Benchmark, 0 is uncorrelated, above 1 amplifies. Near zero for a bond fund, which is the correct answer rather than a missing one.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Identity",
                "order": 0,
                "metrics": [
                    {
                        "field": "benchmark_ticker",
                        "label": "Benchmark",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Index that alpha and beta on this row were measured against, as the internal id the quote estate mints for it (I:SP500 is the S&P 500). One benchmark for every fund: nothing upstream carries a per-fund benchmark assignment, and guessing one from a fund's name would put an unauditable choice inside a number that reads as objective.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "cik",
                        "label": "CIK",
                        "unit": "id",
                        "datatype": "int",
                        "description": "SEC Central Index Key of the registrant (the trust), not the fund. Never format with thousands separators.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "className",
                        "label": "Share Class",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Share class name, e.g. Admiral Shares, ETF Shares.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "class_id",
                        "label": "Class ID",
                        "unit": "text",
                        "datatype": "text",
                        "description": "SEC share-class identifier (C000nnnnnn). Null for a UIT, which has no share classes.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "data_available",
                        "label": "Data",
                        "unit": "list",
                        "datatype": "list",
                        "description": "Which data families exist for this fund: Holdings, Flows, AUM, Returns, Profile, Prices. Use it to decide which page blocks to render.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "flows_asof",
                        "label": "Flows Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Latest month with a usable flow figure FOR THIS FUND. Trailing flow windows are measured back from here, not from today.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "lastreportperiod",
                        "label": "Portfolio Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Report date of the holdings snapshot. Quarterly for N-PORT funds, fresher where a fund-house feed exists. Every weight on this row is as of this date.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "net_assets_asof",
                        "label": "AUM Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Report date the net assets figure is as of. Can legitimately differ from the portfolio date.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "price_asof",
                        "label": "Price Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Latest trading day priced for this ticker. Price returns are measured back from here.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "pro_returns_asof",
                        "label": "Returns Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Filing date of the prospectus the long-horizon returns were printed in. They are NOT current and can be a year stale.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "prospectus_date",
                        "label": "Prospectus Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Date printed on the prospectus the profile was extracted from.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "series_id",
                        "label": "Series ID",
                        "unit": "text",
                        "datatype": "text",
                        "description": "SEC fund identifier (S000nnnnnn), shared by every class of the fund. UIT+CIK for a unit investment trust such as SPY.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "total_return_asof",
                        "label": "Total Ret. Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Latest month with an N-PORT total return for this share class. The Total Return windows are measured back from here, not from today.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            }
        ],
        "identity_fields": [
            "ticker",
            "fund_name",
            "className",
            "vehicle",
            "series_id"
        ],
        "data_asof": {
            "portfolio": "2026-09-08",
            "aum": "2026-08-31",
            "flows": "2026-08-31",
            "price": "2026-09-10",
            "total_return": "2026-07-31",
            "prospectus": "2026-09-08"
        }
    },
    "data": [
        {
            "ticker": "VOO",
            "fund_name": "Vanguard 500 Index Fund",
            "className": "ETF Shares",
            "vehicle": "ETF",
            "series_id": "S000002839",
            "benchmark_ticker": "I:SP500",
            "cik": 1004655,
            "class_id": "C000092055",
            "data_available": [
                "Holdings",
                "Flows",
                "AUM",
                "Returns",
                "Profile",
                "Prices",
                "Ratios"
            ],
            "flows_asof": "2026-06-30",
            "lastreportperiod": "2026-07-31",
            "net_assets_asof": "2026-06-30",
            "price_asof": "2026-09-10",
            "pro_returns_asof": "2026-04-28",
            "prospectus_date": "2026-04-28",
            "total_return_asof": "2026-06-30",
            "category": "Equity",
            "fund_tags": [
                "Index Fund"
            ],
            "geography_focus": "US",
            "registrantFullName": "VANGUARD INDEX FUNDS",
            "structure_tags": [
                "Lends Securities"
            ],
            "acquired_fund_fees_pct": null,
            "gross_expense_ratio_pct": 0.03,
            "min_initial_investment_usd": 3000,
            "net_expense_ratio_pct": 0.03,
            "net_assets_usd": 1671231561960.14,
            "cal_return_2021_pct": 28.66,
            "cal_return_2022_pct": -18.15,
            "cal_return_2023_pct": 26.25,
            "cal_return_2024_pct": 24.98,
            "cal_return_2025_pct": 17.84,
            "pro_return_10y_pct": null,
            "pro_return_5y_pct": null,
            "pro_return_incep_pct": null,
            "pro_worst_quarter_pct": -19.63,
            "return_1m_pct": -1.96,
            "return_1y_pct": 16.18,
            "return_3m_pct": 4.45,
            "return_3y_ann_pct": 19.13,
            "return_5y_ann_pct": 11.21,
            "return_6m_pct": 11.88,
            "return_ytd_pct": 11.09,
            "total_return_12m_pct": 22.2842,
            "total_return_1m_pct": -0.9548,
            "total_return_3m_pct": 15.1925,
            "total_return_6m_pct": 10.1898,
            "large_cap_pct": 34.51,
            "market_cap_coverage_pct": 96.25,
            "mega_cap_pct": 65.22,
            "micro_cap_pct": 0.02,
            "mid_cap_pct": 0.25,
            "size_style": "Large Cap",
            "small_cap_pct": 0,
            "wavg_market_cap_usd": 1625941878367,
            "lookthrough_dividend_yield_pct": 7.81,
            "lookthrough_ev_ebitda": 15.88,
            "lookthrough_pe": 24.57,
            "lookthrough_ps": 3.52,
            "derivative_pct": 0.031,
            "equity_pct": 99.9221,
            "fixed_income_pct": 0,
            "fund_cash_pct": 0.0469,
            "other_asset_pct": 0,
            "sector_basic_materials_pct": 1.9044,
            "sector_communication_services_pct": 1.3414,
            "sector_consumer_discretionary_pct": 8.805,
            "sector_consumer_staples_pct": 4.5825,
            "sector_energy_pct": 3.3203,
            "sector_financial_services_pct": 11.6992,
            "sector_healthcare_pct": 9.0044,
            "sector_industrials_pct": 8.4713,
            "sector_other_pct": 1.851,
            "sector_real_estate_pct": 1.6332,
            "sector_technology_pct": 45.928,
            "sector_utilities_pct": 1.4593,
            "top_sector": "Technology",
            "top_sector_pct": 46.7942,
            "average_coupon_pct": null,
            "corporate_pct": 99.9687,
            "dated_holdings_count": 0,
            "duration_band": null,
            "effective_duration_years": null,
            "effective_maturity_years": null,
            "municipal_pct": 0,
            "non_us_sovereign_pct": 0,
            "us_agency_gse_pct": 0,
            "us_treasury_pct": 0,
            "weighted_average_maturity_years": null,
            "country_us_pct": 97.9133,
            "top_country": "United States",
            "holdings_count": 506,
            "short_pct": 0,
            "effective_holdings": 47.53,
            "top10_weight_pct": 37.6376,
            "top1_weight_pct": 7.5525,
            "topholding_cusip": "67066G104",
            "topholding_name": "NVIDIA Corp.",
            "topholding_ticker": "NVDA",
            "flow_positive_months_pct": 83.33,
            "net_flow_12m_pct": -5.8139,
            "net_flow_12m_usd": -97164387947.86,
            "net_flow_1m_pct": -0.5078,
            "net_flow_3m_pct": 2.1421,
            "fund_age_years": 10.21,
            "portfolio_turnover_pct": 2,
            "credit_spread_hy_10y_usd": null,
            "credit_spread_ig_10y_usd": null,
            "dv01_10y_bp_per_10k": null,
            "liabilities_pct_net_assets": 0.1437,
            "tracking_difference_pct": -0.1689,
            "tracking_error_pct": 0.0127,
            "std_dev_6m_pct": 13.89,
            "std_dev_ytd_pct": 13.37,
            "std_dev_1y_pct": 12.83,
            "std_dev_2y_pct": 15.96,
            "std_dev_3y_pct": 14.96,
            "std_dev_5y_pct": 16.96,
            "max_drawdown_6m_pct": -6.71,
            "max_drawdown_ytd_pct": -9.19,
            "max_drawdown_1y_pct": -9.19,
            "max_drawdown_2y_pct": -18.97,
            "max_drawdown_3y_pct": -18.97,
            "max_drawdown_5y_pct": -25.41,
            "sharpe_6m": 1.405,
            "sharpe_ytd": 0.937,
            "sharpe_1y": 0.947,
            "sharpe_2y": 0.845,
            "sharpe_3y": 0.966,
            "sharpe_5y": 0.491,
            "sortino_6m": 2.139,
            "sortino_ytd": 1.38,
            "sortino_1y": 1.36,
            "sortino_2y": 1.239,
            "sortino_3y": 1.407,
            "sortino_5y": 0.7,
            "alpha_6m_pct": -0.12,
            "alpha_ytd_pct": 0.28,
            "alpha_1y_pct": 0.03,
            "alpha_2y_pct": 0.12,
            "alpha_3y_pct": 0.08,
            "alpha_5y_pct": 0.02,
            "beta_6m": 1.001,
            "beta_ytd": 0.998,
            "beta_1y": 0.994,
            "beta_2y": 0.99,
            "beta_3y": 0.992,
            "beta_5y": 0.993,
            "topholding_kind": "stock"
        },
        {
            "ticker": "SPY",
            "fund_name": "SPDR S&P 500 ETF TRUST",
            "className": null,
            "vehicle": "UIT",
            "series_id": "UIT0000884394",
            "benchmark_ticker": "I:SP500",
            "cik": 884394,
            "class_id": null,
            "data_available": [
                "Holdings",
                "Flows",
                "AUM",
                "Profile",
                "Prices",
                "Ratios"
            ],
            "flows_asof": "2026-06-30",
            "lastreportperiod": "2026-09-04",
            "net_assets_asof": "2026-06-30",
            "price_asof": "2026-09-10",
            "pro_returns_asof": null,
            "prospectus_date": null,
            "total_return_asof": null,
            "category": "Other",
            "fund_tags": [],
            "geography_focus": "US",
            "registrantFullName": "SPDR S&P 500 ETF TRUST",
            "structure_tags": [],
            "acquired_fund_fees_pct": null,
            "gross_expense_ratio_pct": 0.0945,
            "min_initial_investment_usd": null,
            "net_expense_ratio_pct": 0.0945,
            "net_assets_usd": 781188872106.76,
            "cal_return_2021_pct": null,
            "cal_return_2022_pct": null,
            "cal_return_2023_pct": null,
            "cal_return_2024_pct": null,
            "cal_return_2025_pct": null,
            "pro_return_10y_pct": null,
            "pro_return_5y_pct": null,
            "pro_return_incep_pct": null,
            "pro_worst_quarter_pct": null,
            "return_1m_pct": -1.96,
            "return_1y_pct": 16.2,
            "return_3m_pct": 4.47,
            "return_3y_ann_pct": 19.11,
            "return_5y_ann_pct": 11.22,
            "return_6m_pct": 11.92,
            "return_ytd_pct": 11.14,
            "total_return_12m_pct": null,
            "total_return_1m_pct": null,
            "total_return_3m_pct": null,
            "total_return_6m_pct": null,
            "large_cap_pct": 39.61,
            "market_cap_coverage_pct": 98.95,
            "mega_cap_pct": 60.2,
            "micro_cap_pct": 0,
            "mid_cap_pct": 0.2,
            "size_style": "Large Cap",
            "small_cap_pct": 0,
            "wavg_market_cap_usd": 1510135068552,
            "lookthrough_dividend_yield_pct": 7.972,
            "lookthrough_ev_ebitda": 22.1,
            "lookthrough_pe": 27.75,
            "lookthrough_ps": 3.81,
            "derivative_pct": 0.0864,
            "equity_pct": 46.0628,
            "fixed_income_pct": 0.849,
            "fund_cash_pct": 0.1679,
            "other_asset_pct": 52.8339,
            "sector_basic_materials_pct": 1.9589,
            "sector_communication_services_pct": 1.4417,
            "sector_consumer_discretionary_pct": 8.445,
            "sector_consumer_staples_pct": 4.4005,
            "sector_energy_pct": 3.4591,
            "sector_financial_services_pct": 11.6512,
            "sector_healthcare_pct": 9.2463,
            "sector_industrials_pct": 8.1515,
            "sector_other_pct": 1.4062,
            "sector_real_estate_pct": 1.5549,
            "sector_technology_pct": 46.896,
            "sector_utilities_pct": 1.3886,
            "top_sector": "Technology",
            "top_sector_pct": 47.5649,
            "average_coupon_pct": null,
            "corporate_pct": 99.9278,
            "dated_holdings_count": 0,
            "duration_band": null,
            "effective_duration_years": null,
            "effective_maturity_years": null,
            "municipal_pct": 0,
            "non_us_sovereign_pct": 0,
            "us_agency_gse_pct": 0,
            "us_treasury_pct": 0,
            "weighted_average_maturity_years": null,
            "country_us_pct": 97.9722,
            "top_country": "United States",
            "holdings_count": 505,
            "short_pct": 0,
            "effective_holdings": 44.69,
            "top10_weight_pct": 38.3024,
            "top1_weight_pct": 8.4525,
            "topholding_cusip": "67066G104",
            "topholding_name": "NVIDIA CORP",
            "topholding_ticker": "NVDA",
            "flow_positive_months_pct": 52.38,
            "net_flow_12m_pct": 1.601,
            "net_flow_12m_usd": 12507067553.45,
            "net_flow_1m_pct": 0.8611,
            "net_flow_3m_pct": 3.9942,
            "fund_age_years": null,
            "portfolio_turnover_pct": null,
            "credit_spread_hy_10y_usd": null,
            "credit_spread_ig_10y_usd": null,
            "dv01_10y_bp_per_10k": null,
            "liabilities_pct_net_assets": 0.2754,
            "tracking_difference_pct": null,
            "tracking_error_pct": null,
            "std_dev_6m_pct": 13.89,
            "std_dev_ytd_pct": 13.36,
            "std_dev_1y_pct": 12.84,
            "std_dev_2y_pct": 16.51,
            "std_dev_3y_pct": 15.34,
            "std_dev_5y_pct": 17.25,
            "max_drawdown_6m_pct": -6.68,
            "max_drawdown_ytd_pct": -9.13,
            "max_drawdown_1y_pct": -9.13,
            "max_drawdown_2y_pct": -19,
            "max_drawdown_3y_pct": -19,
            "max_drawdown_5y_pct": -25.36,
            "sharpe_6m": 1.41,
            "sharpe_ytd": 0.942,
            "sharpe_1y": 0.948,
            "sharpe_2y": 0.821,
            "sharpe_3y": 0.945,
            "sharpe_5y": 0.486,
            "sortino_6m": 2.153,
            "sortino_ytd": 1.391,
            "sortino_1y": 1.361,
            "sortino_2y": 1.218,
            "sortino_3y": 1.388,
            "sortino_5y": 0.697,
            "alpha_6m_pct": -0.06,
            "alpha_ytd_pct": 0.35,
            "alpha_1y_pct": 0.05,
            "alpha_2y_pct": -0.26,
            "alpha_3y_pct": -0.23,
            "alpha_5y_pct": -0.06,
            "beta_6m": 1.001,
            "beta_ytd": 0.997,
            "beta_1y": 0.995,
            "beta_2y": 1.023,
            "beta_3y": 1.016,
            "beta_5y": 1.009,
            "topholding_kind": "stock"
        },
        {
            "ticker": "IVV",
            "fund_name": "iShares Core S&P 500 ETF",
            "className": "iShares Core S&P 500 ETF",
            "vehicle": "ETF",
            "series_id": "S000004310",
            "benchmark_ticker": "I:SP500",
            "cik": 1100663,
            "class_id": "C000012040",
            "data_available": [
                "Holdings",
                "Flows",
                "AUM",
                "Returns",
                "Profile",
                "Prices",
                "Ratios"
            ],
            "flows_asof": "2026-06-30",
            "lastreportperiod": "2026-09-04",
            "net_assets_asof": "2026-06-30",
            "price_asof": "2026-09-10",
            "pro_returns_asof": "2026-07-27",
            "prospectus_date": "2026-07-31",
            "total_return_asof": "2026-06-30",
            "category": "Equity",
            "fund_tags": [
                "Index Fund"
            ],
            "geography_focus": "US",
            "registrantFullName": "iShares Trust",
            "structure_tags": [
                "Lends Securities"
            ],
            "acquired_fund_fees_pct": null,
            "gross_expense_ratio_pct": 0.03,
            "min_initial_investment_usd": null,
            "net_expense_ratio_pct": 0.03,
            "net_assets_usd": 888128937468.17,
            "cal_return_2021_pct": 28.66,
            "cal_return_2022_pct": -18.13,
            "cal_return_2023_pct": 26.27,
            "cal_return_2024_pct": 24.98,
            "cal_return_2025_pct": 17.85,
            "pro_return_10y_pct": 14.78,
            "pro_return_5y_pct": 14.39,
            "pro_return_incep_pct": null,
            "pro_worst_quarter_pct": -19.6,
            "return_1m_pct": -1.96,
            "return_1y_pct": 16.18,
            "return_3m_pct": 4.48,
            "return_3y_ann_pct": 19.09,
            "return_5y_ann_pct": 11.22,
            "return_6m_pct": 11.97,
            "return_ytd_pct": 11.18,
            "total_return_12m_pct": 22.2905,
            "total_return_1m_pct": -0.9562,
            "total_return_3m_pct": 15.1949,
            "total_return_6m_pct": 10.1943,
            "large_cap_pct": 34.07,
            "market_cap_coverage_pct": 96.44,
            "mega_cap_pct": 65.73,
            "micro_cap_pct": 0.02,
            "mid_cap_pct": 0.18,
            "size_style": "Large Cap",
            "small_cap_pct": 0,
            "wavg_market_cap_usd": 1652388130843,
            "lookthrough_dividend_yield_pct": 7.654,
            "lookthrough_ev_ebitda": 15.95,
            "lookthrough_pe": 24.74,
            "lookthrough_ps": 3.57,
            "derivative_pct": 0,
            "equity_pct": 99.7213,
            "fixed_income_pct": 0,
            "fund_cash_pct": 0.2787,
            "other_asset_pct": 0,
            "sector_basic_materials_pct": 1.9417,
            "sector_communication_services_pct": 1.4109,
            "sector_consumer_discretionary_pct": 8.3719,
            "sector_consumer_staples_pct": 4.363,
            "sector_energy_pct": 3.4297,
            "sector_financial_services_pct": 11.5549,
            "sector_healthcare_pct": 9.1691,
            "sector_industrials_pct": 8.0813,
            "sector_other_pct": 1.9426,
            "sector_real_estate_pct": 1.5411,
            "sector_technology_pct": 46.8175,
            "sector_utilities_pct": 1.3765,
            "top_sector": "Technology",
            "top_sector_pct": 47.745,
            "average_coupon_pct": null,
            "corporate_pct": 99.7213,
            "dated_holdings_count": 0,
            "duration_band": null,
            "effective_duration_years": null,
            "effective_maturity_years": null,
            "municipal_pct": 0,
            "non_us_sovereign_pct": 0,
            "us_agency_gse_pct": 0,
            "us_treasury_pct": 0,
            "weighted_average_maturity_years": null,
            "country_us_pct": 97.8985,
            "top_country": "United States",
            "holdings_count": 509,
            "short_pct": 0.0011,
            "effective_holdings": 45.42,
            "top10_weight_pct": 37.9732,
            "top1_weight_pct": 8.3798,
            "topholding_cusip": "67066G104",
            "topholding_name": "NVIDIA",
            "topholding_ticker": "NVDA",
            "flow_positive_months_pct": 72.62,
            "net_flow_12m_pct": 14.0797,
            "net_flow_12m_usd": 125045813402,
            "net_flow_1m_pct": 4.9087,
            "net_flow_3m_pct": 6.8256,
            "fund_age_years": 26.32,
            "portfolio_turnover_pct": 3,
            "credit_spread_hy_10y_usd": null,
            "credit_spread_ig_10y_usd": null,
            "dv01_10y_bp_per_10k": null,
            "liabilities_pct_net_assets": 0.1698,
            "tracking_difference_pct": -0.02,
            "tracking_error_pct": 0.03,
            "std_dev_6m_pct": 13.85,
            "std_dev_ytd_pct": 13.34,
            "std_dev_1y_pct": 12.85,
            "std_dev_2y_pct": 16.1,
            "std_dev_3y_pct": 15.06,
            "std_dev_5y_pct": 17.08,
            "max_drawdown_6m_pct": -6.64,
            "max_drawdown_ytd_pct": -9.13,
            "max_drawdown_1y_pct": -9.13,
            "max_drawdown_2y_pct": -19.01,
            "max_drawdown_3y_pct": -19.01,
            "max_drawdown_5y_pct": -25.4,
            "sharpe_6m": 1.421,
            "sharpe_ytd": 0.948,
            "sharpe_1y": 0.946,
            "sharpe_2y": 0.838,
            "sharpe_3y": 0.958,
            "sharpe_5y": 0.489,
            "sortino_6m": 2.174,
            "sortino_ytd": 1.402,
            "sortino_1y": 1.361,
            "sortino_2y": 1.23,
            "sortino_3y": 1.396,
            "sortino_5y": 0.698,
            "alpha_6m_pct": 0.14,
            "alpha_ytd_pct": 0.45,
            "alpha_1y_pct": 0.04,
            "alpha_2y_pct": 0.01,
            "alpha_3y_pct": -0.03,
            "alpha_5y_pct": -0.01,
            "beta_6m": 0.996,
            "beta_ytd": 0.993,
            "beta_1y": 0.994,
            "beta_2y": 0.998,
            "beta_3y": 0.998,
            "beta_5y": 1,
            "topholding_kind": "stock"
        }
    ]
}

Six is the ceiling, and it is a readability limit rather than a technical one. A comparison is a table a person reads across; past six columns it stops being one. If you need to rank a larger set on a single metric, that is a screen — use the ETF & Mutual Fund Screener API instead.

2. Response Fields

data is one row per resolved ticker, carrying the whole record — a comparison is the whole record, and six rows is a small response. metadata.groups is where the analysis lives.

metadata

FieldTypeDescription
requested, resolved, missingarrayWhat you asked for, what was found, and what was not. A ticker outside the fund universe lands in missing rather than failing the whole call — unless fewer than two resolve, which is a 404.
count, max_compareintegerFunds actually compared, and the ceiling (6).
same_portfoliobooleantrue when every resolved ticker shares one series_id — they are share classes of a single fund. See the note below; this is the headline answer for a large class of comparisons.
series_idstringThe shared Series ID when same_portfolio is true, otherwise null.
metrics_total, differing_countintegerHow many metrics were compared, and how many actually differ. The ratio is the fastest read on whether a comparison is meaningful at all.
groupsarrayThe metrics arranged by statement — Profile, Fees, Size, Returns, Market Cap, Valuation, Asset Mix, Sector, Bond Character, Geography, Portfolio, Concentration, Flows, Cost of Ownership, Risk, Risk Ratios and Identity. Identity sorts last: its rows are the provenance of the record, not a property of the fund. Bond Character (effective duration, effective maturity, rate-sensitivity band) is populated only for funds with debt holdings and empty for a pure equity comparison.
data_asofobjectSix as-of dates — portfolio, aum, flows, price, total_return, prospectus — one per column group.

metadata.groups[].metrics[] — the comparison itself

FieldTypeDescription
field, label, unit, datatypestringThe key on each data row, the label to print, and enough type information to format the value.
descriptionstringWhat the metric means, for a tooltip.
differsbooleanWhether the values actually differ — decided at the precision a reader would see, not at float precision. Two AUMs that both print $1.99T are not different. All-null is an absence, not a difference, and never counts.
directionstring|null"lower", "higher", or null. Set only where better is a fact — a lower fee, a lower tracking error, a higher return. Null for AUM, turnover and holdings count, where it is an opinion.
leaders, laggardsarrayWhich tickers sit at the good and bad ends. Both are empty when everything ties or everything leads — every fund leading is nobody leading.

No winner is declared. direction is set only for the metrics where "better" is not a matter of taste. A fund with more assets is not a better fund; a higher turnover is not a worse one; and tracking_difference_pct is deliberately left undirected because it is best near zero, which is neither the maximum nor the minimum. The endpoint reports and ranks; it does not recommend.

3. Response Viewer

A real response for tickers=VOO,SPY,IVV — three S&P 500 trackers, 92 of 144 metrics differing. Green is the leader on that metric, red the laggard; both come from the payload, not from this page.

Live Endpoint https://data.businessquant.com/funds/compare

API Response — Fund Comparison

VOO vs SPY vs IVV · three separate portfolios

Metric VOO SPY IVV
Share Class ETF SharesiShares Core S&P 500 ETF
Net Expense (lower is better) 0.03%0.09%0.03%
Gross Expense (lower is better) 0.03%0.09%0.03%
1Y Return (higher is better) 16.18%16.20%16.18%
AUM (no direction) $1.67T$781.19B$888.13B
Holdings (no direction) 506505509
Top Holding NVIDIA Corp.NVIDIA CORPNVIDIA
Series ID S000002839UIT0000884394S000004310

4. The Share-Class Case

The single most-asked comparison in this category is between two tickers that turn out to be one fund. This is the case the endpoint is built to answer honestly.

VTSAX vs VTI returns same_portfolio: true. They share Series ID S000002848: one portfolio, two wrappers. Only 42 of 144 metrics differ, and every holdings, sector and concentration row is identical by construction — not because the data is thin.

That is the answer to the question, and it is more useful than eighty identical rows implying it. What actually separates them is the wrapper: the expense ratio, the minimum investment, and how you buy it.

What Differs — VTSAX vs VTI

Every metric where differs is true

Metric Group Direction Leaders
Category Profile tie
Tags Profile tie
Geography Profile tie
Family Profile tie
Structure Profile tie
AFFE Fees lower tie
Gross Expense Fees lower VTI
Min. Investment Fees lower tie
Net Expense Fees lower VTI
AUM Size tie
2021 Returns higher tie
2022 Returns higher tie
2023 Returns higher tie
2024 Returns higher VTI
2025 Returns higher tie
10Y Ann. (Prospectus) Returns higher tie
5Y Ann. (Prospectus) Returns higher tie
Since Inception (Prospectus) Returns higher tie
Worst Quarter (Prospectus) Returns higher tie
1M Returns higher VTSAX
1Y Returns higher VTSAX
3M Returns higher VTI
3Y Ann. Returns higher VTSAX
5Y Ann. Returns higher VTI
6M Returns higher VTSAX
YTD Returns higher VTSAX
Total 12M Returns higher VTI
Total 1M Returns higher tie
Total 3M Returns higher tie
Total 6M Returns higher tie
Large Cap Market Cap tie
Cap Coverage Market Cap tie
Mega Cap Market Cap tie
Micro Cap Market Cap tie
Mid Cap Market Cap tie
Size Style Market Cap tie
Small Cap Market Cap tie
Avg Mkt Cap Market Cap tie
Look-Through Yield Valuation tie
EV/EBITDA Valuation tie
P/E Valuation tie
P/S Valuation tie
Derivatives Asset Mix tie
Equity Asset Mix tie
Fixed Income Asset Mix tie
Fund & Cash Asset Mix tie
Other Assets Asset Mix tie
Basic Materials Sector tie
Communication Services Sector tie
Consumer Discretionary Sector tie
Consumer Staples Sector tie
Energy Sector tie
Financial Services Sector tie
Healthcare Sector tie
Industrials Sector tie
Other / Unclass. Sector tie
Real Estate Sector tie
Technology Sector tie
Utilities Sector tie
Top Sector Sector tie
Top Sector % Sector tie
Avg Coupon Bond Character tie
Corporate Bond Character tie
Dated Holdings Bond Character tie
Rate Sensitivity Bond Character tie
Effective Duration Bond Character tie
Effective Maturity Bond Character tie
Municipal Bond Character tie
Non-US Sovereign Bond Character tie
Agency & GSE Bond Character tie
Treasury Bond Character tie
Avg Legal Maturity Bond Character tie
US Weight Geography tie
Top Country Geography tie
Holdings Portfolio tie
Short Portfolio tie
Effective Holdings Concentration tie
Top 10 Concentration tie
Largest Position Concentration tie
topholding_cusip Concentration tie
Top Holding Concentration tie
topholding_ticker Concentration tie
Positive Months Flows higher tie
Flow 12M % Flows higher tie
Flow 12M Flows higher tie
Flow 1M % Flows higher tie
Flow 3M % Flows higher tie
Fund Age Cost of Ownership tie
Turnover Cost of Ownership lower tie
Spread HY Risk tie
Spread IG Risk tie
DV01 10Y Risk tie
Liabilities % Risk tie
Tracking Diff. Risk tie
Tracking Error Risk lower tie
Std Dev 6M Risk Ratios tie
Std Dev YTD Risk Ratios tie
Std Dev 1Y Risk Ratios tie
Std Dev 2Y Risk Ratios tie
Std Dev 3Y Risk Ratios tie
Std Dev 5Y Risk Ratios tie
Max Drawdown 6M Risk Ratios higher VTI
Max Drawdown YTD Risk Ratios higher tie
Max Drawdown 1Y Risk Ratios higher tie
Max Drawdown 2Y Risk Ratios higher tie
Max Drawdown 3Y Risk Ratios higher tie
Max Drawdown 5Y Risk Ratios higher tie
Sharpe 6M Risk Ratios higher VTSAX
Sharpe YTD Risk Ratios higher VTSAX
Sharpe 1Y Risk Ratios higher VTSAX
Sharpe 2Y Risk Ratios higher VTSAX
Sharpe 3Y Risk Ratios higher VTSAX
Sharpe 5Y Risk Ratios higher tie
Sortino 6M Risk Ratios higher VTSAX
Sortino YTD Risk Ratios higher VTSAX
Sortino 1Y Risk Ratios higher VTSAX
Sortino 2Y Risk Ratios higher VTSAX
Sortino 3Y Risk Ratios higher VTSAX
Sortino 5Y Risk Ratios higher VTI
Alpha 6M Risk Ratios higher VTI
Alpha YTD Risk Ratios higher VTI
Alpha 1Y Risk Ratios higher VTI
Alpha 2Y Risk Ratios higher VTSAX
Alpha 3Y Risk Ratios higher VTSAX
Alpha 5Y Risk Ratios higher VTSAX
Beta 6M Risk Ratios tie
Beta YTD Risk Ratios tie
Beta 1Y Risk Ratios tie
Beta 2Y Risk Ratios tie
Beta 3Y Risk Ratios tie
Beta 5Y Risk Ratios tie
Benchmark Identity tie
CIK Identity tie
Share Class Identity tie
Class ID Identity tie
Data Identity tie
Flows Date Identity tie
Portfolio Date Identity tie
AUM Date Identity tie
Price Date Identity tie
Returns Date Identity tie
Prospectus Date Identity tie
Series ID Identity tie
Total Ret. Date Identity tie
Full Response (VTSAX vs VTI, differing metrics only)
{
    "metadata": {
        "endpoint": "/funds/compare",
        "grain": "share class ticker",
        "requested": [
            "VTSAX",
            "VTI"
        ],
        "resolved": [
            "VTSAX",
            "VTI"
        ],
        "missing": [],
        "count": 2,
        "max_compare": 6,
        "same_portfolio": true,
        "series_id": "S000002848",
        "metrics_total": 144,
        "differing_count": 42,
        "groups": [
            {
                "statement": "Profile",
                "order": 1,
                "metrics": [
                    {
                        "field": "category",
                        "label": "Category",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Coarse bucket derived from what the fund HOLDS, not from its name, measured on classified exposure only. Other when under half the portfolio is classified.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "fund_tags",
                        "label": "Tags",
                        "unit": "list",
                        "datatype": "list",
                        "description": "Fund types as filed in N-CEN: Index Fund, Fund of Funds, Target Date, Money Market, Inverse, Underlying Fund, Interval Fund, Exchange-Traded Managed. A fund can carry several.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "geography_focus",
                        "label": "Geography",
                        "unit": "text",
                        "datatype": "text",
                        "description": "US (80%+ US assets), International (20% or less) or Global. Derived from holdings.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "registrantFullName",
                        "label": "Family",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Registrant / trust name. The issuer filter: Vanguard, iShares, SPDR.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "structure_tags",
                        "label": "Structure",
                        "unit": "list",
                        "datatype": "list",
                        "description": "Structural facts from N-CEN: Non-Diversified (may concentrate), Lends Securities, Foreign Subsidiary.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Fees",
                "order": 2,
                "metrics": [
                    {
                        "field": "acquired_fund_fees_pct",
                        "label": "AFFE",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Fees charged by the underlying funds a fund holds. Material for funds of funds and usually excluded from the waiver.",
                        "differs": false,
                        "direction": "lower",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "gross_expense_ratio_pct",
                        "label": "Gross Expense",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Total annual operating expenses before any waiver. Above the net ratio when a waiver is in force, which may expire.",
                        "differs": true,
                        "direction": "lower",
                        "leaders": [
                            "VTI"
                        ],
                        "laggards": [
                            "VTSAX"
                        ]
                    },
                    {
                        "field": "min_initial_investment_usd",
                        "label": "Min. Investment",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Smallest initial purchase the prospectus accepts. Absent for most ETFs, which have none.",
                        "differs": false,
                        "direction": "lower",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "net_expense_ratio_pct",
                        "label": "Net Expense",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "What the investor actually pays after fee waivers. THE expense ratio. 0.03 means three basis points, not 3%.",
                        "differs": true,
                        "direction": "lower",
                        "leaders": [
                            "VTI"
                        ],
                        "laggards": [
                            "VTSAX"
                        ]
                    }
                ]
            },
            {
                "statement": "Size",
                "order": 3,
                "metrics": [
                    {
                        "field": "net_assets_usd",
                        "label": "AUM",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Fund-level assets under management from the latest N-PORT. Fund grain, so every share class of a fund shows the same figure.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Returns",
                "order": 4,
                "metrics": [
                    {
                        "field": "cal_return_2021_pct",
                        "label": "2021",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Calendar-year 2021 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "cal_return_2022_pct",
                        "label": "2022",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Calendar-year 2022 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "cal_return_2023_pct",
                        "label": "2023",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Calendar-year 2023 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "cal_return_2024_pct",
                        "label": "2024",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Calendar-year 2024 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTI"
                        ],
                        "laggards": [
                            "VTSAX"
                        ]
                    },
                    {
                        "field": "cal_return_2025_pct",
                        "label": "2025",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Calendar-year 2025 total return before taxes, as printed in the prospectus. Answers 'how did it do in a down year', which an average hides.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "pro_return_10y_pct",
                        "label": "10Y Ann. (Prospectus)",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Average annual total return over ten years, before taxes, as printed in the prospectus.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "pro_return_5y_pct",
                        "label": "5Y Ann. (Prospectus)",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Average annual total return over five years, before taxes, as printed in the prospectus. Stale by up to a year — see Returns As Of.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "pro_return_incep_pct",
                        "label": "Since Inception (Prospectus)",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Average annual total return since inception, before taxes, as printed in the prospectus.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "pro_worst_quarter_pct",
                        "label": "Worst Quarter (Prospectus)",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst calendar quarter in the prospectus bar chart. The drawdown proxy.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "return_1m_pct",
                        "label": "1M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing one-month PRICE return. Excludes distributions, so it understates total return by roughly the yield.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "return_1y_pct",
                        "label": "1Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing one-year PRICE return, measured back from Price As Of (the latest trading day). The primary performance filter — current, daily, ~77% of the universe. NOT comparable with Total Return 12M, whose window ends at the last N-PORT filing up to five months earlier.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "return_3m_pct",
                        "label": "3M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing three-month price return.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTI"
                        ],
                        "laggards": [
                            "VTSAX"
                        ]
                    },
                    {
                        "field": "return_3y_ann_pct",
                        "label": "3Y Ann.",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised three-year price return. Null unless three years of history exist.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "return_5y_ann_pct",
                        "label": "5Y Ann.",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised five-year price return. Null unless five years of history exist.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTI"
                        ],
                        "laggards": [
                            "VTSAX"
                        ]
                    },
                    {
                        "field": "return_6m_pct",
                        "label": "6M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing six-month price return.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "return_ytd_pct",
                        "label": "YTD",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Year-to-date price return, measured from the last close of the prior year.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "total_return_12m_pct",
                        "label": "Total 12M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Twelve N-PORT monthly total returns chained. NULL unless all twelve months are present, so a partial chain cannot rank funds by how completely they file. Its window ends at Total Return As Of — the last N-PORT filing, typically one to five months stale — NOT at today. DO NOT difference it against Return 1Y: over an identical window it runs ~1.25pp above the price return (that gap is the distribution: ETFs 2.5pp, mutual funds 5.3pp), but the raw difference between the two columns is mostly the market move in the months their windows do not share.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTI"
                        ],
                        "laggards": [
                            "VTSAX"
                        ]
                    },
                    {
                        "field": "total_return_1m_pct",
                        "label": "Total 1M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "The filer's own monthly TOTAL return from N-PORT Item B.5 — distributions INCLUDED, unlike the price returns above. Share-class grain: two classes of one fund differ by their fee.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "total_return_3m_pct",
                        "label": "Total 3M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Three N-PORT monthly total returns chained geometrically. NULL unless all three months are on file.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "total_return_6m_pct",
                        "label": "Total 6M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Six N-PORT monthly total returns chained geometrically. NULL unless all six months are on file.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Market Cap",
                "order": 5,
                "metrics": [
                    {
                        "field": "large_cap_pct",
                        "label": "Large Cap",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of covered equity in companies of $10B to $200B.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "market_cap_coverage_pct",
                        "label": "Cap Coverage",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of equity exposure that resolved to a market cap. US-only source, so international funds run low: VOO 96%, VWO 3%. BELOW 70 THE CAP AND VALUATION COLUMNS ARE BLANKED — do not render them.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "mega_cap_pct",
                        "label": "Mega Cap",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of covered equity in companies above $200B.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "micro_cap_pct",
                        "label": "Micro Cap",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of covered equity in companies below $300M.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "mid_cap_pct",
                        "label": "Mid Cap",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of covered equity in companies of $2B to $10B.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "size_style",
                        "label": "Size Style",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Large Cap, Mid Cap, Small Cap or Multi Cap, from the cap ladder. Null below 70% coverage.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "small_cap_pct",
                        "label": "Small Cap",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of covered equity in companies of $300M to $2B.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "wavg_market_cap_usd",
                        "label": "Avg Mkt Cap",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Value-weighted average market capitalisation of the equity holdings. Null below 70% coverage.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Valuation",
                "order": 6,
                "metrics": [
                    {
                        "field": "lookthrough_dividend_yield_pct",
                        "label": "Look-Through Yield",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Value-weighted dividend yield of the equity holdings. Arithmetic, because yields are additive. NOT the fund's own distribution yield, which we cannot yet serve.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "lookthrough_ev_ebitda",
                        "label": "EV/EBITDA",
                        "unit": "number",
                        "datatype": "int",
                        "description": "Harmonic weighted enterprise value to EBITDA of the equity holdings.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "lookthrough_pe",
                        "label": "P/E",
                        "unit": "number",
                        "datatype": "int",
                        "description": "Harmonic weighted price/earnings of the equity holdings — the index-provider standard. Loss-makers are excluded rather than dragging the ratio negative. VUG 29.9 vs VTV 20.9 is the growth/value spread.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "lookthrough_ps",
                        "label": "P/S",
                        "unit": "number",
                        "datatype": "int",
                        "description": "Harmonic weighted price/sales of the equity holdings.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Asset Mix",
                "order": 7,
                "metrics": [
                    {
                        "field": "derivative_pct",
                        "label": "Derivatives",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in derivatives. Large for inverse and leveraged funds.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "equity_pct",
                        "label": "Equity",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in equities.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "fixed_income_pct",
                        "label": "Fixed Income",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in bonds and other debt.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "fund_cash_pct",
                        "label": "Fund & Cash",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in other funds and cash equivalents.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "other_asset_pct",
                        "label": "Other Assets",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure the classifier had no opinion on. Not an asset class — a coverage gap, and excluded from the Category denominator for that reason.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Sector",
                "order": 8,
                "metrics": [
                    {
                        "field": "sector_basic_materials_pct",
                        "label": "Basic Materials",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Basic Materials. Percent of absolute market value, renormalised to 100.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_communication_services_pct",
                        "label": "Communication Services",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Communication Services. Percent of absolute market value, renormalised to 100.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_consumer_discretionary_pct",
                        "label": "Consumer Discretionary",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Consumer Discretionary. Percent of absolute market value, renormalised to 100.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_consumer_staples_pct",
                        "label": "Consumer Staples",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Consumer Staples. Percent of absolute market value, renormalised to 100.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_energy_pct",
                        "label": "Energy",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Energy. Percent of absolute market value, renormalised to 100.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_financial_services_pct",
                        "label": "Financial Services",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Financial Services. Percent of absolute market value, renormalised to 100.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_healthcare_pct",
                        "label": "Healthcare",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Healthcare. Percent of absolute market value, renormalised to 100.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_industrials_pct",
                        "label": "Industrials",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Industrials. Percent of absolute market value, renormalised to 100.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_other_pct",
                        "label": "Other / Unclass.",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure with no equity sector: every bond, plus foreign listings absent from the industry classification. Median 60%. LARGE IS NORMAL — VOO 6%, AGG 36%, VWO 91%. Do not hide, merge or rename it.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_real_estate_pct",
                        "label": "Real Estate",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Real Estate. Percent of absolute market value, renormalised to 100.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_technology_pct",
                        "label": "Technology",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Technology. Percent of absolute market value, renormalised to 100.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sector_utilities_pct",
                        "label": "Utilities",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in Utilities. Percent of absolute market value, renormalised to 100.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "top_sector",
                        "label": "Top Sector",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Largest classified sector, excluding the unclassified bucket.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "top_sector_pct",
                        "label": "Top Sector %",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Weight of the largest classified sector.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Bond Character",
                "order": 9,
                "metrics": [
                    {
                        "field": "average_coupon_pct",
                        "label": "Avg Coupon",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Market-value-weighted average annual coupon of the fund's debt holdings, as filed. Not a yield: it ignores the price paid, so it says what the bonds pay, not what the investor earns.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "corporate_pct",
                        "label": "Corporate",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in corporate issuers.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "dated_holdings_count",
                        "label": "Dated Holdings",
                        "unit": "number",
                        "datatype": "int",
                        "description": "How many positions carried a maturity date. The denominator behind Effective Maturity, and the gate for whether to show it at all: zero means the fund filed no dated instrument.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "duration_band",
                        "label": "Rate Sensitivity",
                        "unit": "number",
                        "datatype": "str",
                        "description": "Which interest-rate sensitivity band the fund falls in, from its own effective duration: Limited under 3.5 years, Moderate 3.5 to 6, Extensive above 6. The axis bond funds are actually compared on, and the peer group the maturity schedule is measured against. Null wherever effective duration is.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "effective_duration_years",
                        "label": "Effective Duration",
                        "unit": "number",
                        "datatype": "float",
                        "description": "How much the fund moves when rates move: the percentage change in value for a one-percentage-point shift in rates. Taken from the fund's own DV01 as filed under N-PORT Item B.3, so it carries the manager's own prepayment and call assumptions, and it reproduces published factsheets to within about 2%. This, not maturity, is the number to compare bond funds on for rate risk -- under 3 is short, 3-7 intermediate, over 7 long. Null for a fund with no rate exposure or an implausible filing; do not render it as zero.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "effective_maturity_years",
                        "label": "Effective Maturity",
                        "unit": "number",
                        "datatype": "float",
                        "description": "When the fund's principal is actually expected back, which is what a factsheet means by average effective maturity and the figure to compare a bond fund on. Modelled from the filing's own terms -- amortisation for mortgage and asset-backed paper, the call for perpetual preferreds -- and calibrated so the projection reproduces the duration the fund itself filed, so the prepayment speed is the manager's rather than ours. It matches published figures to about 2%. Null where the filed rate-risk data was not good enough to calibrate against.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "municipal_pct",
                        "label": "Municipal",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in municipal issues. The tax-exempt income screen.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "non_us_sovereign_pct",
                        "label": "Non-US Sovereign",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in non-US sovereign and state issuers.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "us_agency_gse_pct",
                        "label": "Agency & GSE",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in US government agency and government-sponsored entity issues.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "us_treasury_pct",
                        "label": "Treasury",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in US Treasury issues.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "weighted_average_maturity_years",
                        "label": "Avg Legal Maturity",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Market-value-weighted average years to maturity across the fund's dated holdings, measured from the portfolio date. This is when the paper legally comes due, not how it behaves: on a mortgage book it runs 40-54% above the fund's own Effective Duration, because a 30-year pool prepays. Screen rate risk on Effective Duration and use this for the legal profile. Null for a fund holding nothing dated, which is every equity fund -- do not render it as zero. Perpetual issues are excluded from the average and counted separately.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Geography",
                "order": 10,
                "metrics": [
                    {
                        "field": "country_us_pct",
                        "label": "US Weight",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in US-domiciled issuers. Region rollups are NOT shipped: N-PORT reports country of incorporation, so offshore-incorporated issuers land in the wrong region.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "top_country",
                        "label": "Top Country",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Largest issuer country by gross exposure.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Portfolio",
                "order": 11,
                "metrics": [
                    {
                        "field": "holdings_count",
                        "label": "Holdings",
                        "unit": "count",
                        "datatype": "int",
                        "description": "Number of positions in the latest snapshot. Median 87, maximum 18,136.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "short_pct",
                        "label": "Short",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of gross exposure in short positions. Zero for a long-only fund, which is most of them.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Concentration",
                "order": 12,
                "metrics": [
                    {
                        "field": "effective_holdings",
                        "label": "Effective Holdings",
                        "unit": "count",
                        "datatype": "int",
                        "description": "1 divided by the sum of squared weights: the number of EQUAL-weighted positions carrying the same concentration. VOO holds 506 securities and has an effective 48.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "top10_weight_pct",
                        "label": "Top 10",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Combined weight of the ten largest positions, computed on gross exposure.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "top1_weight_pct",
                        "label": "Largest Position",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Weight of the single largest position.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "topholding_cusip",
                        "label": "topholding_cusip",
                        "unit": "text",
                        "datatype": "text",
                        "description": "CUSIP of the largest position's issuer.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "topholding_name",
                        "label": "Top Holding",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Name of the largest position, as the holding was filed. Group or filter on topholding_ticker instead: the same issuer is filed under many spellings.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "topholding_ticker",
                        "label": "topholding_ticker",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Ticker of the largest position's issuer. The groupable form of topholding_name; null where the holding has no listed issuer -- cash sweeps, money-market funds, Treasuries, munis -- which is roughly a fifth of funds.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Flows",
                "order": 13,
                "metrics": [
                    {
                        "field": "flow_positive_months_pct",
                        "label": "Positive Months",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Share of observed months with net inflows. A persistence measure, not a magnitude.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "net_flow_12m_pct",
                        "label": "Flow 12M %",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing twelve-month net flow as a percent of net assets.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "net_flow_12m_usd",
                        "label": "Flow 12M",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Trailing twelve-month net flow in dollars. Negative means redemptions exceeded sales. Sorting on this re-sorts by fund size; use the percent version.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "net_flow_1m_pct",
                        "label": "Flow 1M %",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing one-month net flow as a percent of net assets. Size-neutral — rank on this, not the dollar figure.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "net_flow_3m_pct",
                        "label": "Flow 3M %",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Trailing three-month net flow as a percent of net assets.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Cost of Ownership",
                "order": 14,
                "metrics": [
                    {
                        "field": "fund_age_years",
                        "label": "Fund Age",
                        "unit": "years",
                        "datatype": "int",
                        "description": "Years since the fund began operations. Fund-level, not share-class.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "portfolio_turnover_pct",
                        "label": "Turnover",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Percent of holdings replaced during the last fiscal year. High turnover implies trading cost and tax drag. Figures beyond 1500% are filer errors and are nulled.",
                        "differs": false,
                        "direction": "lower",
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Risk",
                "order": 15,
                "metrics": [
                    {
                        "field": "credit_spread_hy_10y_usd",
                        "label": "Spread HY",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Non-investment-grade spread duration risk at the 10-year tenor, in dollars per basis point.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "credit_spread_ig_10y_usd",
                        "label": "Spread IG",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Investment-grade spread duration risk at the 10-year tenor, in dollars per basis point.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "dv01_10y_bp_per_10k",
                        "label": "DV01 10Y",
                        "unit": "usd",
                        "datatype": "int",
                        "description": "Dollar change per basis point at the 10-year tenor, scaled to a $10,000 holding. THE size-neutral duration proxy. Bond funds only — roughly 30% coverage is the bond share of the universe, not a gap.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "liabilities_pct_net_assets",
                        "label": "Liabilities %",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Total liabilities as a percent of net assets. The broadest leverage read.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "tracking_difference_pct",
                        "label": "Tracking Diff.",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Index fund return minus its index, after expenses, as filed in N-CEN. Negative is normal and roughly equals the fee — IVV -0.02, VOO -0.169, median -0.185. THE measure of whether an index fund does its job.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "tracking_error_pct",
                        "label": "Tracking Error",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Daily standard deviation of that return difference, after expenses. Near zero for a domestic index fund (IVV 0.03); large for international funds, where fair-value pricing makes daily NAV and index diverge.",
                        "differs": false,
                        "direction": "lower",
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Risk Ratios",
                "order": 16,
                "metrics": [
                    {
                        "field": "std_dev_6m_pct",
                        "label": "Std Dev 6M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised standard deviation of daily price returns over the trailing 6M window, in percent. THE volatility measure. Barely affected by the price-not-total-return basis, so it is directly comparable across funds.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "std_dev_ytd_pct",
                        "label": "Std Dev YTD",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised standard deviation of daily price returns over the trailing YTD window, in percent. THE volatility measure. Barely affected by the price-not-total-return basis, so it is directly comparable across funds.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "std_dev_1y_pct",
                        "label": "Std Dev 1Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised standard deviation of daily price returns over the trailing 1Y window, in percent. THE volatility measure. Barely affected by the price-not-total-return basis, so it is directly comparable across funds.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "std_dev_2y_pct",
                        "label": "Std Dev 2Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised standard deviation of daily price returns over the trailing 2Y window, in percent. THE volatility measure. Barely affected by the price-not-total-return basis, so it is directly comparable across funds.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "std_dev_3y_pct",
                        "label": "Std Dev 3Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised standard deviation of daily price returns over the trailing 3Y window, in percent. THE volatility measure. Barely affected by the price-not-total-return basis, so it is directly comparable across funds.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "std_dev_5y_pct",
                        "label": "Std Dev 5Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised standard deviation of daily price returns over the trailing 5Y window, in percent. THE volatility measure. Barely affected by the price-not-total-return basis, so it is directly comparable across funds.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "max_drawdown_6m_pct",
                        "label": "Max Drawdown 6M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst peak-to-trough decline inside the trailing 6M window, in percent and NEGATIVE. Measured on daily closes, so it is the loss an investor who bought the peak actually lived through — not a month-end approximation.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTI"
                        ],
                        "laggards": [
                            "VTSAX"
                        ]
                    },
                    {
                        "field": "max_drawdown_ytd_pct",
                        "label": "Max Drawdown YTD",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst peak-to-trough decline inside the trailing YTD window, in percent and NEGATIVE. Measured on daily closes, so it is the loss an investor who bought the peak actually lived through — not a month-end approximation.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "max_drawdown_1y_pct",
                        "label": "Max Drawdown 1Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst peak-to-trough decline inside the trailing 1Y window, in percent and NEGATIVE. Measured on daily closes, so it is the loss an investor who bought the peak actually lived through — not a month-end approximation.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "max_drawdown_2y_pct",
                        "label": "Max Drawdown 2Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst peak-to-trough decline inside the trailing 2Y window, in percent and NEGATIVE. Measured on daily closes, so it is the loss an investor who bought the peak actually lived through — not a month-end approximation.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "max_drawdown_3y_pct",
                        "label": "Max Drawdown 3Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst peak-to-trough decline inside the trailing 3Y window, in percent and NEGATIVE. Measured on daily closes, so it is the loss an investor who bought the peak actually lived through — not a month-end approximation.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "max_drawdown_5y_pct",
                        "label": "Max Drawdown 5Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Worst peak-to-trough decline inside the trailing 5Y window, in percent and NEGATIVE. Measured on daily closes, so it is the loss an investor who bought the peak actually lived through — not a month-end approximation.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sharpe_6m",
                        "label": "Sharpe 6M",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Annualised excess return divided by the annualised standard deviation of that excess return, over the trailing 6M window. Excess is over the 3-month Treasury yield. BIASED LOW by roughly yield/volatility because the return series excludes distributions — ranking within a peer group is sound, an absolute reading is not.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "sharpe_ytd",
                        "label": "Sharpe YTD",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Annualised excess return divided by the annualised standard deviation of that excess return, over the trailing YTD window. Excess is over the 3-month Treasury yield. BIASED LOW by roughly yield/volatility because the return series excludes distributions — ranking within a peer group is sound, an absolute reading is not.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "sharpe_1y",
                        "label": "Sharpe 1Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Annualised excess return divided by the annualised standard deviation of that excess return, over the trailing 1Y window. Excess is over the 3-month Treasury yield. BIASED LOW by roughly yield/volatility because the return series excludes distributions — ranking within a peer group is sound, an absolute reading is not.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "sharpe_2y",
                        "label": "Sharpe 2Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Annualised excess return divided by the annualised standard deviation of that excess return, over the trailing 2Y window. Excess is over the 3-month Treasury yield. BIASED LOW by roughly yield/volatility because the return series excludes distributions — ranking within a peer group is sound, an absolute reading is not.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "sharpe_3y",
                        "label": "Sharpe 3Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Annualised excess return divided by the annualised standard deviation of that excess return, over the trailing 3Y window. Excess is over the 3-month Treasury yield. BIASED LOW by roughly yield/volatility because the return series excludes distributions — ranking within a peer group is sound, an absolute reading is not.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "sharpe_5y",
                        "label": "Sharpe 5Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Annualised excess return divided by the annualised standard deviation of that excess return, over the trailing 5Y window. Excess is over the 3-month Treasury yield. BIASED LOW by roughly yield/volatility because the return series excludes distributions — ranking within a peer group is sound, an absolute reading is not.",
                        "differs": false,
                        "direction": "higher",
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "sortino_6m",
                        "label": "Sortino 6M",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Like Sharpe but penalising only DOWNSIDE deviation, over the trailing 6M window. Downside deviation is the root-mean-square of negative excess returns divided by the full observation count, the standard definition. Carries the same low bias as Sharpe.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "sortino_ytd",
                        "label": "Sortino YTD",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Like Sharpe but penalising only DOWNSIDE deviation, over the trailing YTD window. Downside deviation is the root-mean-square of negative excess returns divided by the full observation count, the standard definition. Carries the same low bias as Sharpe.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "sortino_1y",
                        "label": "Sortino 1Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Like Sharpe but penalising only DOWNSIDE deviation, over the trailing 1Y window. Downside deviation is the root-mean-square of negative excess returns divided by the full observation count, the standard definition. Carries the same low bias as Sharpe.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "sortino_2y",
                        "label": "Sortino 2Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Like Sharpe but penalising only DOWNSIDE deviation, over the trailing 2Y window. Downside deviation is the root-mean-square of negative excess returns divided by the full observation count, the standard definition. Carries the same low bias as Sharpe.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "sortino_3y",
                        "label": "Sortino 3Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Like Sharpe but penalising only DOWNSIDE deviation, over the trailing 3Y window. Downside deviation is the root-mean-square of negative excess returns divided by the full observation count, the standard definition. Carries the same low bias as Sharpe.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "sortino_5y",
                        "label": "Sortino 5Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Like Sharpe but penalising only DOWNSIDE deviation, over the trailing 5Y window. Downside deviation is the root-mean-square of negative excess returns divided by the full observation count, the standard definition. Carries the same low bias as Sharpe.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTI"
                        ],
                        "laggards": [
                            "VTSAX"
                        ]
                    },
                    {
                        "field": "alpha_6m_pct",
                        "label": "Alpha 6M",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised Jensen's alpha against Benchmark over the trailing 6M window, in percent — the intercept of excess fund return regressed on excess benchmark return. BIASED LOW by roughly the fund's yield. Read it against peers, never as an absolute skill figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTI"
                        ],
                        "laggards": [
                            "VTSAX"
                        ]
                    },
                    {
                        "field": "alpha_ytd_pct",
                        "label": "Alpha YTD",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised Jensen's alpha against Benchmark over the trailing YTD window, in percent — the intercept of excess fund return regressed on excess benchmark return. BIASED LOW by roughly the fund's yield. Read it against peers, never as an absolute skill figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTI"
                        ],
                        "laggards": [
                            "VTSAX"
                        ]
                    },
                    {
                        "field": "alpha_1y_pct",
                        "label": "Alpha 1Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised Jensen's alpha against Benchmark over the trailing 1Y window, in percent — the intercept of excess fund return regressed on excess benchmark return. BIASED LOW by roughly the fund's yield. Read it against peers, never as an absolute skill figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTI"
                        ],
                        "laggards": [
                            "VTSAX"
                        ]
                    },
                    {
                        "field": "alpha_2y_pct",
                        "label": "Alpha 2Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised Jensen's alpha against Benchmark over the trailing 2Y window, in percent — the intercept of excess fund return regressed on excess benchmark return. BIASED LOW by roughly the fund's yield. Read it against peers, never as an absolute skill figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "alpha_3y_pct",
                        "label": "Alpha 3Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised Jensen's alpha against Benchmark over the trailing 3Y window, in percent — the intercept of excess fund return regressed on excess benchmark return. BIASED LOW by roughly the fund's yield. Read it against peers, never as an absolute skill figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "alpha_5y_pct",
                        "label": "Alpha 5Y",
                        "unit": "percent",
                        "datatype": "%",
                        "description": "Annualised Jensen's alpha against Benchmark over the trailing 5Y window, in percent — the intercept of excess fund return regressed on excess benchmark return. BIASED LOW by roughly the fund's yield. Read it against peers, never as an absolute skill figure.",
                        "differs": true,
                        "direction": "higher",
                        "leaders": [
                            "VTSAX"
                        ],
                        "laggards": [
                            "VTI"
                        ]
                    },
                    {
                        "field": "beta_6m",
                        "label": "Beta 6M",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Slope of excess fund return regressed on excess benchmark return over the trailing 6M window. 1.0 moves with Benchmark, 0 is uncorrelated, above 1 amplifies. Near zero for a bond fund, which is the correct answer rather than a missing one.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "beta_ytd",
                        "label": "Beta YTD",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Slope of excess fund return regressed on excess benchmark return over the trailing YTD window. 1.0 moves with Benchmark, 0 is uncorrelated, above 1 amplifies. Near zero for a bond fund, which is the correct answer rather than a missing one.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "beta_1y",
                        "label": "Beta 1Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Slope of excess fund return regressed on excess benchmark return over the trailing 1Y window. 1.0 moves with Benchmark, 0 is uncorrelated, above 1 amplifies. Near zero for a bond fund, which is the correct answer rather than a missing one.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "beta_2y",
                        "label": "Beta 2Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Slope of excess fund return regressed on excess benchmark return over the trailing 2Y window. 1.0 moves with Benchmark, 0 is uncorrelated, above 1 amplifies. Near zero for a bond fund, which is the correct answer rather than a missing one.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "beta_3y",
                        "label": "Beta 3Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Slope of excess fund return regressed on excess benchmark return over the trailing 3Y window. 1.0 moves with Benchmark, 0 is uncorrelated, above 1 amplifies. Near zero for a bond fund, which is the correct answer rather than a missing one.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "beta_5y",
                        "label": "Beta 5Y",
                        "unit": "number",
                        "datatype": "float",
                        "description": "Slope of excess fund return regressed on excess benchmark return over the trailing 5Y window. 1.0 moves with Benchmark, 0 is uncorrelated, above 1 amplifies. Near zero for a bond fund, which is the correct answer rather than a missing one.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            },
            {
                "statement": "Identity",
                "order": 0,
                "metrics": [
                    {
                        "field": "benchmark_ticker",
                        "label": "Benchmark",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Index that alpha and beta on this row were measured against, as the internal id the quote estate mints for it (I:SP500 is the S&P 500). One benchmark for every fund: nothing upstream carries a per-fund benchmark assignment, and guessing one from a fund's name would put an unauditable choice inside a number that reads as objective.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "cik",
                        "label": "CIK",
                        "unit": "id",
                        "datatype": "int",
                        "description": "SEC Central Index Key of the registrant (the trust), not the fund. Never format with thousands separators.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "className",
                        "label": "Share Class",
                        "unit": "text",
                        "datatype": "text",
                        "description": "Share class name, e.g. Admiral Shares, ETF Shares.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "class_id",
                        "label": "Class ID",
                        "unit": "text",
                        "datatype": "text",
                        "description": "SEC share-class identifier (C000nnnnnn). Null for a UIT, which has no share classes.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "data_available",
                        "label": "Data",
                        "unit": "list",
                        "datatype": "list",
                        "description": "Which data families exist for this fund: Holdings, Flows, AUM, Returns, Profile, Prices. Use it to decide which page blocks to render.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "flows_asof",
                        "label": "Flows Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Latest month with a usable flow figure FOR THIS FUND. Trailing flow windows are measured back from here, not from today.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "lastreportperiod",
                        "label": "Portfolio Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Report date of the holdings snapshot. Quarterly for N-PORT funds, fresher where a fund-house feed exists. Every weight on this row is as of this date.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "net_assets_asof",
                        "label": "AUM Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Report date the net assets figure is as of. Can legitimately differ from the portfolio date.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "price_asof",
                        "label": "Price Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Latest trading day priced for this ticker. Price returns are measured back from here.",
                        "differs": true,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "pro_returns_asof",
                        "label": "Returns Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Filing date of the prospectus the long-horizon returns were printed in. They are NOT current and can be a year stale.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "prospectus_date",
                        "label": "Prospectus Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Date printed on the prospectus the profile was extracted from.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "series_id",
                        "label": "Series ID",
                        "unit": "text",
                        "datatype": "text",
                        "description": "SEC fund identifier (S000nnnnnn), shared by every class of the fund. UIT+CIK for a unit investment trust such as SPY.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    },
                    {
                        "field": "total_return_asof",
                        "label": "Total Ret. Date",
                        "unit": "date",
                        "datatype": "date",
                        "description": "Latest month with an N-PORT total return for this share class. The Total Return windows are measured back from here, not from today.",
                        "differs": false,
                        "direction": null,
                        "leaders": [],
                        "laggards": []
                    }
                ]
            }
        ],
        "identity_fields": [
            "ticker",
            "fund_name",
            "className",
            "vehicle",
            "series_id"
        ],
        "data_asof": {
            "portfolio": "2026-09-08",
            "aum": "2026-08-31",
            "flows": "2026-08-31",
            "price": "2026-09-10",
            "total_return": "2026-07-31",
            "prospectus": "2026-09-08"
        }
    },
    "data": [
        {
            "ticker": "VTSAX",
            "fund_name": "Vanguard Total Stock Market Index Fund",
            "className": "Admiral Shares",
            "vehicle": "Mutual Fund",
            "series_id": "S000002848",
            "benchmark_ticker": "I:SP500",
            "cik": 36405,
            "class_id": "C000007806",
            "data_available": [
                "Holdings",
                "Flows",
                "AUM",
                "Returns",
                "Profile",
                "Prices",
                "Ratios"
            ],
            "flows_asof": "2026-06-30",
            "lastreportperiod": "2026-07-31",
            "net_assets_asof": "2026-06-30",
            "price_asof": "2026-09-09",
            "pro_returns_asof": "2026-04-28",
            "prospectus_date": "2026-04-28",
            "total_return_asof": "2026-06-30",
            "category": "Equity",
            "fund_tags": [
                "Index Fund"
            ],
            "geography_focus": "US",
            "registrantFullName": "VANGUARD INDEX FUNDS",
            "structure_tags": [
                "Lends Securities"
            ],
            "acquired_fund_fees_pct": null,
            "gross_expense_ratio_pct": 0.04,
            "min_initial_investment_usd": 1,
            "net_expense_ratio_pct": 0.04,
            "net_assets_usd": 2297839156547.89,
            "cal_return_2021_pct": 25.71,
            "cal_return_2022_pct": -19.53,
            "cal_return_2023_pct": 26.01,
            "cal_return_2024_pct": 23.74,
            "cal_return_2025_pct": 17.12,
            "pro_return_10y_pct": 14.24,
            "pro_return_5y_pct": 13.06,
            "pro_return_incep_pct": null,
            "pro_worst_quarter_pct": -20.87,
            "return_1m_pct": -1.6,
            "return_1y_pct": 16.98,
            "return_3m_pct": 3.21,
            "return_3y_ann_pct": 19.26,
            "return_5y_ann_pct": 10.13,
            "return_6m_pct": 12.31,
            "return_ytd_pct": 12,
            "total_return_12m_pct": 23.1467,
            "total_return_1m_pct": -0.329,
            "total_return_3m_pct": 15.6587,
            "total_return_6m_pct": 11.0684,
            "large_cap_pct": 35.85,
            "market_cap_coverage_pct": 96.36,
            "mega_cap_pct": 57.7,
            "micro_cap_pct": 0.13,
            "mid_cap_pct": 5.37,
            "size_style": "Large Cap",
            "small_cap_pct": 0.96,
            "wavg_market_cap_usd": 1433247423179,
            "lookthrough_dividend_yield_pct": 6.707,
            "lookthrough_ev_ebitda": 14.93,
            "lookthrough_pe": 24.02,
            "lookthrough_ps": 3.11,
            "derivative_pct": 0.0893,
            "equity_pct": 99.5656,
            "fixed_income_pct": 0,
            "fund_cash_pct": 0.3451,
            "other_asset_pct": 0,
            "sector_basic_materials_pct": 2.0662,
            "sector_communication_services_pct": 1.3472,
            "sector_consumer_discretionary_pct": 8.6377,
            "sector_consumer_staples_pct": 4.3502,
            "sector_energy_pct": 3.4785,
            "sector_financial_services_pct": 12.1175,
            "sector_healthcare_pct": 9.6603,
            "sector_industrials_pct": 10.0863,
            "sector_other_pct": 2.1234,
            "sector_real_estate_pct": 2.0545,
            "sector_technology_pct": 42.5845,
            "sector_utilities_pct": 1.4938,
            "top_sector": "Technology",
            "top_sector_pct": 43.5084,
            "average_coupon_pct": null,
            "corporate_pct": 99.9023,
            "dated_holdings_count": 0,
            "duration_band": null,
            "effective_duration_years": null,
            "effective_maturity_years": null,
            "municipal_pct": 0,
            "non_us_sovereign_pct": 0,
            "us_agency_gse_pct": 0.0028,
            "us_treasury_pct": 0,
            "weighted_average_maturity_years": null,
            "country_us_pct": 97.6902,
            "top_country": "United States",
            "holdings_count": 3487,
            "short_pct": 0,
            "effective_holdings": 61.47,
            "top10_weight_pct": 33.2129,
            "top1_weight_pct": 6.3949,
            "topholding_cusip": "67066G104",
            "topholding_name": "NVIDIA Corp.",
            "topholding_ticker": "NVDA",
            "flow_positive_months_pct": 65.48,
            "net_flow_12m_pct": -0.9063,
            "net_flow_12m_usd": -20826365151.3199,
            "net_flow_1m_pct": 0.1603,
            "net_flow_3m_pct": 0.019,
            "fund_age_years": 10.21,
            "portfolio_turnover_pct": 3,
            "credit_spread_hy_10y_usd": null,
            "credit_spread_ig_10y_usd": null,
            "dv01_10y_bp_per_10k": null,
            "liabilities_pct_net_assets": 0.0939,
            "tracking_difference_pct": -0.1473,
            "tracking_error_pct": 0.0433,
            "std_dev_6m_pct": 14.08,
            "std_dev_ytd_pct": 13.66,
            "std_dev_1y_pct": 13.14,
            "std_dev_2y_pct": 16.4,
            "std_dev_3y_pct": 15.41,
            "std_dev_5y_pct": 17.52,
            "max_drawdown_6m_pct": -6.78,
            "max_drawdown_ytd_pct": -9.2,
            "max_drawdown_1y_pct": -9.2,
            "max_drawdown_2y_pct": -19.64,
            "max_drawdown_3y_pct": -19.64,
            "max_drawdown_5y_pct": -26.2,
            "sharpe_6m": 1.442,
            "sharpe_ytd": 1.013,
            "sharpe_1y": 0.98,
            "sharpe_2y": 0.856,
            "sharpe_3y": 0.937,
            "sharpe_5y": 0.425,
            "sortino_6m": 2.204,
            "sortino_ytd": 1.501,
            "sortino_1y": 1.412,
            "sortino_2y": 1.257,
            "sortino_3y": 1.364,
            "sortino_5y": 0.605,
            "alpha_6m_pct": -0.45,
            "alpha_ytd_pct": 0.36,
            "alpha_1y_pct": -0.46,
            "alpha_2y_pct": -0.19,
            "alpha_3y_pct": -0.54,
            "alpha_5y_pct": -1.07,
            "beta_6m": 1.019,
            "beta_ytd": 1.02,
            "beta_1y": 1.02,
            "beta_2y": 1.014,
            "beta_3y": 1.018,
            "beta_5y": 1.023,
            "topholding_kind": "stock"
        },
        {
            "ticker": "VTI",
            "fund_name": "Vanguard Total Stock Market Index Fund",
            "className": "ETF Shares",
            "vehicle": "ETF",
            "series_id": "S000002848",
            "benchmark_ticker": "I:SP500",
            "cik": 36405,
            "class_id": "C000007808",
            "data_available": [
                "Holdings",
                "Flows",
                "AUM",
                "Returns",
                "Profile",
                "Prices",
                "Ratios"
            ],
            "flows_asof": "2026-06-30",
            "lastreportperiod": "2026-07-31",
            "net_assets_asof": "2026-06-30",
            "price_asof": "2026-09-10",
            "pro_returns_asof": "2026-04-28",
            "prospectus_date": "2026-04-28",
            "total_return_asof": "2026-06-30",
            "category": "Equity",
            "fund_tags": [
                "Index Fund"
            ],
            "geography_focus": "US",
            "registrantFullName": "VANGUARD INDEX FUNDS",
            "structure_tags": [
                "Lends Securities"
            ],
            "acquired_fund_fees_pct": null,
            "gross_expense_ratio_pct": 0.03,
            "min_initial_investment_usd": 1,
            "net_expense_ratio_pct": 0.03,
            "net_assets_usd": 2297839156547.89,
            "cal_return_2021_pct": 25.72,
            "cal_return_2022_pct": -19.5,
            "cal_return_2023_pct": 26.03,
            "cal_return_2024_pct": 23.75,
            "cal_return_2025_pct": 17.14,
            "pro_return_10y_pct": null,
            "pro_return_5y_pct": null,
            "pro_return_incep_pct": null,
            "pro_worst_quarter_pct": -20.89,
            "return_1m_pct": -2.2,
            "return_1y_pct": 15.98,
            "return_3m_pct": 4.24,
            "return_3y_ann_pct": 18.76,
            "return_5y_ann_pct": 10.16,
            "return_6m_pct": 11.91,
            "return_ytd_pct": 11.32,
            "total_return_12m_pct": 23.158,
            "total_return_1m_pct": -0.3318,
            "total_return_3m_pct": 15.6584,
            "total_return_6m_pct": 11.0713,
            "large_cap_pct": 35.85,
            "market_cap_coverage_pct": 96.36,
            "mega_cap_pct": 57.7,
            "micro_cap_pct": 0.13,
            "mid_cap_pct": 5.37,
            "size_style": "Large Cap",
            "small_cap_pct": 0.96,
            "wavg_market_cap_usd": 1433247423179,
            "lookthrough_dividend_yield_pct": 6.707,
            "lookthrough_ev_ebitda": 14.93,
            "lookthrough_pe": 24.02,
            "lookthrough_ps": 3.11,
            "derivative_pct": 0.0893,
            "equity_pct": 99.5656,
            "fixed_income_pct": 0,
            "fund_cash_pct": 0.3451,
            "other_asset_pct": 0,
            "sector_basic_materials_pct": 2.0662,
            "sector_communication_services_pct": 1.3472,
            "sector_consumer_discretionary_pct": 8.6377,
            "sector_consumer_staples_pct": 4.3502,
            "sector_energy_pct": 3.4785,
            "sector_financial_services_pct": 12.1175,
            "sector_healthcare_pct": 9.6603,
            "sector_industrials_pct": 10.0863,
            "sector_other_pct": 2.1234,
            "sector_real_estate_pct": 2.0545,
            "sector_technology_pct": 42.5845,
            "sector_utilities_pct": 1.4938,
            "top_sector": "Technology",
            "top_sector_pct": 43.5084,
            "average_coupon_pct": null,
            "corporate_pct": 99.9023,
            "dated_holdings_count": 0,
            "duration_band": null,
            "effective_duration_years": null,
            "effective_maturity_years": null,
            "municipal_pct": 0,
            "non_us_sovereign_pct": 0,
            "us_agency_gse_pct": 0.0028,
            "us_treasury_pct": 0,
            "weighted_average_maturity_years": null,
            "country_us_pct": 97.6902,
            "top_country": "United States",
            "holdings_count": 3487,
            "short_pct": 0,
            "effective_holdings": 61.47,
            "top10_weight_pct": 33.2129,
            "top1_weight_pct": 6.3949,
            "topholding_cusip": "67066G104",
            "topholding_name": "NVIDIA Corp.",
            "topholding_ticker": "NVDA",
            "flow_positive_months_pct": 65.48,
            "net_flow_12m_pct": -0.9063,
            "net_flow_12m_usd": -20826365151.3199,
            "net_flow_1m_pct": 0.1603,
            "net_flow_3m_pct": 0.019,
            "fund_age_years": 10.21,
            "portfolio_turnover_pct": 3,
            "credit_spread_hy_10y_usd": null,
            "credit_spread_ig_10y_usd": null,
            "dv01_10y_bp_per_10k": null,
            "liabilities_pct_net_assets": 0.0939,
            "tracking_difference_pct": -0.1473,
            "tracking_error_pct": 0.0433,
            "std_dev_6m_pct": 14.07,
            "std_dev_ytd_pct": 13.58,
            "std_dev_1y_pct": 13.11,
            "std_dev_2y_pct": 16.6,
            "std_dev_3y_pct": 15.51,
            "std_dev_5y_pct": 17.58,
            "max_drawdown_6m_pct": -6.55,
            "max_drawdown_ytd_pct": -9.2,
            "max_drawdown_1y_pct": -9.2,
            "max_drawdown_2y_pct": -19.59,
            "max_drawdown_3y_pct": -19.59,
            "max_drawdown_5y_pct": -26.2,
            "sharpe_6m": 1.393,
            "sharpe_ytd": 0.946,
            "sharpe_1y": 0.917,
            "sharpe_2y": 0.817,
            "sharpe_3y": 0.916,
            "sharpe_5y": 0.425,
            "sortino_6m": 2.119,
            "sortino_ytd": 1.396,
            "sortino_1y": 1.317,
            "sortino_2y": 1.207,
            "sortino_3y": 1.342,
            "sortino_5y": 0.607,
            "alpha_6m_pct": -0.33,
            "alpha_ytd_pct": 0.41,
            "alpha_1y_pct": -0.36,
            "alpha_2y_pct": -0.33,
            "alpha_3y_pct": -0.65,
            "alpha_5y_pct": -1.1,
            "beta_6m": 1.015,
            "beta_ytd": 1.014,
            "beta_1y": 1.015,
            "beta_2y": 1.028,
            "beta_3y": 1.026,
            "beta_5y": 1.026,
            "topholding_kind": "stock"
        }
    ]
}

5. More Request Examples

Comparisons people actually run.

The S&P 500 trio
GET /funds/compare?tickers=VOO,SPY,IVV&api_key=YOUR_API_KEY
Total market vs S&P 500
GET /funds/compare?tickers=VTI,VOO&api_key=YOUR_API_KEY
Share classes of one fund — which wrapper to buy
GET /funds/compare?tickers=VTSAX,VTI,VITSX&api_key=YOUR_API_KEY
Python — print only what differs
import requests

r = requests.get(
    "https://data.businessquant.com/funds/compare",
    params={"tickers": "VTSAX,VTI", "api_key": "YOUR_API_KEY"},
    timeout=30,
).json()

md   = r["metadata"]
rows = {row["ticker"]: row for row in r["data"]}

if md["same_portfolio"]:
    print(f"These are share classes of one fund (series {md['series_id']}).")
    print("Identical holdings by construction -- compare the wrapper, not the portfolio.\n")

print(f"{md['differing_count']} of {md['metrics_total']} metrics differ:\n")
for group in md["groups"]:
    for metric in group["metrics"]:
        if not metric["differs"]:
            continue
        values = "  ".join(
            f"{t}={rows[t].get(metric['field'])}" for t in md["resolved"]
        )
        arrow = ""
        if metric["direction"]:
            arrow = f"  ({metric['direction']} is better; leads: {', '.join(metric['leaders']) or 'tie'})"
        print(f"  {metric['label']:<28} {values}{arrow}")

6. Use Cases

Where a comparison beats two lookups.

"X vs Y" Content Pages

One call fills a whole comparison page, and differs tells you which rows are worth printing. A table of ninety identical values buries the ten that decide the question.

Share-Class Selection

same_portfolio plus the fee rows answer "which wrapper should I buy" directly — the portfolios are identical, so the decision is cost, minimum and account type.

Advisor Fund Swaps

Justify moving a client from one fund to another with the metrics that actually changed, and with direction distinguishing a real improvement from a difference of taste.

Model Portfolio Review

Compare the candidates for one sleeve — up to six at a time — on cost, tracking error and concentration in a single request rather than six.

Only-Differences UIs

Ship a "show only differences" toggle without computing it client-side. The server decides at display precision, so the flag and the rendered table can never disagree.

Screen, Then Compare

Feed the top rows of a Fund Screener result straight in. The screener narrows a universe; this explains the shortlist.

Frequently Asked Questions

The questions developers ask most often about this endpoint.

What does same_portfolio actually tell me?

That every ticker you sent resolves to the same SEC Series ID — they are share classes of one fund, not competing funds. VTSAX and VTI are the canonical example: one portfolio, two wrappers, identical holdings by construction. When it is true, the holdings, sector and concentration rows agreeing is the expected result rather than a sign of missing data, and the comparison is really about fee, minimum and how you buy it.

How is "differs" decided?

At the precision a reader would see, not at float precision. Dollar figures are compacted to three significant figures, percentages to one or two decimals depending on magnitude, counts to whole numbers. So two AUMs that both render as $1.99T are not "different", and a metric is flagged only when the difference would actually be visible. A metric that is null for every fund is an absence, not a difference, and never counts — it is still returned so you can render or hide it as you choose.

Why is direction null on so many metrics?

Because for most of them "better" is an opinion, and the endpoint does not have one. A fund with more assets under management is not a better fund. A higher portfolio turnover is not automatically worse. direction is set only where it is a fact — lower is better for fees, minimums and tracking error; higher is better for returns and flows. tracking_difference_pct is deliberately undirected because it is best near zero, so marking either extreme would be wrong.

Why are leaders and laggards sometimes both empty?

Because every fund leading is nobody leading. If all the compared values are equal — which includes the two-fund tie, where the best and worst value are the same number — both arrays come back empty rather than marking everything green. They are also empty wherever direction is null, since there is no good end to sit at.

What happens if one of my tickers is not a fund?

It is reported in metadata.missing and the comparison proceeds with the rest. If fewer than two tickers resolve, the call returns a 404 naming the ones that were not found — there is nothing to compare. Sending fewer than two, or more than six, returns a 400. Duplicates are collapsed before that count is taken, so tickers=VOO,VOO is one ticker.

Can I compare holdings overlap between two funds?

Not directly — this endpoint compares fund-level metrics, including concentration measures like top10_weight_pct and effective_holdings, but not position-by-position overlap. For that, pull both portfolios from the Fund Holdings API and intersect them on ticker, or use the Portfolio Exposure API to compare sector and country weights without transferring every position.

Is the ETF & Mutual Fund Comparison API free to use?

Yes. A comparison is bounded — at most six named funds, all of which a Free key could already read one at a time — so it is open on every account. What it adds is the analysis, not extra access. The ETF & Mutual Fund Screener API, which ranks the whole universe, is Max and Enterprise. See pricing.