Skip to content
RockGroup
DocsETF X-Ray
ETF X-RaySEC N-PORT8 equity ETFs

ETF X-Ray
Documentation

What is actually inside an index fund. ETF X-Ray reads SEC Form N-PORT filings position by position and answers the questions the filing cannot answer directly — sector exposure, what the fund bought and sold, how much two funds overlap, which securities the whole universe is crowding into, and who is borrowing the fund's stock.

Funds8Positions~95.9KUpdatedAug 2026

01. What is ETF X-Ray?

What is ETF X-Ray?

Every US-registered fund files Form N-PORT with the SEC — a complete, position-level statement of what it held at the end of the period, including the share count, the market value, the fair-value level and whether the position was out on loan. It is the most detailed public disclosure a fund makes, and it is almost never read, because a single filing is thousands of rows of XML.

ETF X-Ray parses those filings, enriches each security with a sector and a ticker, and pre-computes the comparisons across funds and across quarters. Four questions it answers that a fund’s own factsheet does not:

What am I actually exposed to?

Sector weights computed from the filed positions themselves — not from the index's marketing description — with the unclassified remainder shown rather than hidden.

What changed since last quarter?

Every position the fund opened, added to, trimmed or exited, measured on SHARE COUNTS. A position whose value rose because the price rose is not a decision, and is reported as unchanged.

Do my two funds actually diversify each other?

Pairwise weight overlap, active share and Jaccard similarity across the universe. A 97% overlap means the second fund is buying you almost nothing.

Who else owns this, and are they adding?

Cross-fund crowding: how many funds hold a security, at what average weight, and whether the universe is net accumulating or distributing it.

ETF X-Ray vs. Fund Tracker. They read different filings and answer different questions. Fund Tracker reads Form 13F — what an institutional manager owned, long US equity only, quarterly. ETF X-Ray reads Form N-PORT — the complete book of a fund, including cash, derivatives, lending and every non-US position. Where 13F is a partial picture of a manager, N-PORT is a total picture of a fund.


02. Data Source & Universe

Where does the data come from?

All data is sourced from SEC Form N-PORTfilings, pulled from EDGAR, transformed by a separate pipeline, and published into a dedicated database that only this site’s server reads. Your browser never talks to the database directly.

Filing form
SEC Form N-PORT
Filed
Monthly
Made public
Quarterly — expect a ~60-day lag
Universe
8 equity ETFs × 8 quarterly periods
Positions on file
~95,900 across 65 filings
Securities master
~9,470 distinct securities
The current universe

Eight large equity ETFs, chosen because between them they cover the US total market, the US large-cap core, the Nasdaq-100, US growth and developed ex-US — so the overlap and crowding panels have something meaningful to compare.

SPYSPDR S&P 500 ETF Trust — State Street
IVViShares Core S&P 500 ETF — BlackRock
VOOVanguard S&P 500 ETF
VTIVanguard Total Stock Market ETF — the largest book here, ~3,600 positions per period
QQQInvesco QQQ Trust — Nasdaq-100
VUGVanguard Growth ETF
VEAVanguard FTSE Developed Markets ETF — ex-US
IEFAiShares Core MSCI EAFE ETF — ex-US, files month-end rather than quarter-end

The dashboard is built to scale to 100+ funds with no interface change: every list is paged and sorted on the server, and adding funds changes the contents of two dropdowns and nothing else.


03. How to Use

Step-by-step guide

1
Pick a fund

The “Start here” card at the top of the page holds a fund picker and a period picker. The first fund's most recent period is selected automatically on load, so the page is never empty.

2
Pick a reporting period

The period list is that fund's own filing dates, newest first. Funds do not share a filing calendar — IEFA files month-end while Vanguard and State Street file quarter-end — so the dates differ between funds by design.

3
Read the KPI strip

Net assets, holdings count, top-10 weight, effective holdings, concentration, net quarterly flow, turnover and the share on loan. Every one of these is a figure computed over the WHOLE filing, never over the rows currently on screen.

4
Start at Sector exposure

The default tab. It shows what the fund is actually exposed to, and — where coverage is incomplete — says so beside the chart rather than quietly omitting the gap.

5
Click a sector to drill in

Clicking a sector bar jumps to the Holdings tab pre-filtered to that sector, so you go from “31% technology” to the names that make it up in one click.

6
Click any security name

In Holdings, Position changes or Crowding, clicking a security opens the cross-fund drawer: every fund in the universe that holds it, every period, with the deltas already computed.

7
Use the header search for a name you already have in mind

The search box in the page header queries the whole security master — ticker, CUSIP, ISIN or name — and opens the same drawer. You do not need to know which fund holds it.

A tab you have not opened costs nothing.Loading the page issues exactly two requests — the fund list and one snapshot document — plus one request for whichever tab you open. Sector exposure and Returns & flows issue no request at all, because their rows already arrived inside the snapshot.


04. The Seven Panels

The seven panels

Sector exposure

Weight by sector for the selected fund-period, as a composition bar plus a ranked list. Click any sector to drill into the holdings behind it. Where sector coverage is incomplete, the gap is stated beside the chart — see Data coverage below.

Holdings

Every position in the filing, 50 at a time. Name, ticker, sector, share balance, market value, weight, fair-value level and whether the position is on loan. Search matches name, ticker or CUSIP; sector filter and sort are applied by the server across the whole book, not just the visible page.

Position changes

New, increased, reduced, unchanged and exited positions between this period and the previous one, ordered by the size of the value change. Deltas are on SHARE COUNTS: a position that only moved in value because the price moved is correctly reported as unchanged.

Returns & flows

The fund's own reported monthly total return for each month of the quarter, alongside sales, redemptions, reinvestment and net flow. Monthly figures print at the precision the filer used; the quarter figure is compounded from the months and labelled as derived, because the filing reports months only.

Overlap

How much this fund shares with every other fund in the universe: weight overlap, active share, Jaccard index, shared position count and shared value. Where the two funds' filing dates differ, both real dates and the gap in days are named.

Crowding

Universe-wide rather than fund-specific. The most widely held securities, the most heavily weighted, and the most accumulated — with how many funds are adding versus reducing each name.

Lending

Securities-lending counterparties and derivative counterparties for the fund-period: who is borrowing, notional exposure and share of net assets. This is disclosed in N-PORT and almost no free tool surfaces it.

There is no duration or credit-risk panel, and that is correct.DV01, credit-spread sensitivity and effective duration come from N-PORT Item B.3, which only funds holding debt are required to report. This universe is equity-only, so no filing in it carries those figures. Rather than render an empty panel, the product surfaces counterparty and lending exposure instead — real data that is genuinely hard to find elsewhere.


05. Metrics Explained

What the numbers mean

Every figure below is read from the filing or pre-computed in the warehouse. None of them is derived in your browser, which is why the totals do not change as you page through a table.

Net assetsTotal net assets of the fund at the period end, as reported.
HoldingsNumber of positions in the filing. VTI carries ~3,600; QQQ carries ~100.
Top 10 weightShare of net assets in the ten largest positions. This is shaded warm above 25% and warmer above 40% — deliberately inverting the usual “bigger is better” convention, because concentration is a risk rather than a score.
Effective holdingsThe number of equally weighted positions that would give the same concentration. QQQ files ~100 positions but has roughly 32 effective ones — this is the single most useful concentration figure on the page.
Concentration (HHI)The Herfindahl index: the sum of squared percentage weights, on the conventional 0–10,000 scale. Shown as a raw number, deliberately without the antitrust “concentrated / unconcentrated” bands — see the note below.
Net quarterly flowMoney in minus money out over the quarter — creations less redemptions, plus reinvestment. Positive means the fund grew by subscription rather than by market movement.
TurnoverPortfolio turnover for the period, as reported by the filer.
On loanShare of net assets lent out to borrowers, computed from the filer’s own per-position reported loan values. Real values in this universe run roughly 0.002% to 0.94%, so it is printed with extra decimals — rounding to two would turn a real 0.0020% into “0.00%”. A zero here is a genuine zero: two funds in the universe simply do not lend.
Weight overlapOf two funds, the percentage of weight held in common. High overlap is shown in red, which is the second deliberate inversion on the page: 97% overlap means the two funds are not diversifying each other.
Active shareThe mirror of overlap — the share of the portfolio that differs. Two index funds tracking the same benchmark have almost none.
Accumulation scoreA crowding measure: whether the funds holding a security are, on balance, adding to it or reducing it. It is an algorithmic output, labelled as such, not a judgement about the security.
Fair-value levelHow the position was priced. 1 is a quoted market price (most reliable), 2 uses observable inputs, and 3 is model-derived (least transparent).

Why HHI carries no verdict label.The familiar antitrust bands (below 1,500 “unconcentrated”, above 2,500 “highly concentrated”) are a poor fit for cap-weighted equity funds: every fund in this universe scores under 1,500 and would read “well diversified” — including QQQ, which has about 32 effective holdings and 46.8% of its assets in its top ten. A label that says “diversified” for every input is not a label. Use effective holdings or top-10 weight instead; those discriminate.


06. Security Drill-Through

Following one security across every fund

Any security name in Holdings, Position changes or Crowding is clickable, as is any result from the header search. All four routes open the same drawer, which answers one question: who owns this, how much, and what did they do with it?

One row per fund-periodEach fund that holds the security, for each period it held it — share balance, market value and weight within that fund.
Deltas already computedThe previous balance, the change, the percentage change and the status (new / increased / reduced / unchanged / exited) are computed in the database, not re-derived here, so every panel agrees on what “reduced” means.
Search understands identifiersTicker, CUSIP and ISIN are matched exactly and ranked first; names are matched by prefix and then by fuzzy similarity, so “micro” ranks MICROSOFT above SMITH MICRO.
Null tickers are normalBonds, futures and many ex-US lines legitimately have no ticker. A blank ticker column is not a missing value — the security genuinely does not have one.

On a phone the drawer becomes a bottom sheet with the close control at the top, because a right-edge close button on a six-inch screen is a thumb stretch.


07. Sorting & Paging Rules

Why some columns sort and others do not

Whether a column header is clickable is not a styling decision. It depends on whether the panel holds the complete answer or only the page you are looking at.

Sorting a paged table in the browser orders one page and presents it as the answer. If Holdings shows 50 of 3,600 rows and you sort those 50 by weight, the largest weight in the fund is almost certainly not among them. So paged tables re-query the server to sort, and any column the server cannot order by is left inert with a tooltip that says why — rather than silently lying.

HoldingsServer-paged, 50 of up to ~3,600. Clicking a sortable header re-issues the query for the whole book. Columns the server cannot order by are not clickable.
Position changesServer-paged, and fixed to the largest absolute value change first. No column sorting — there is no server ordering to request.
CrowdingA ranked top 100 of the universe. The ranking pills re-query; clicking a column reorders only those 100, and the footer says so.
Sector exposureAbout a dozen rows, all present. Sort freely.
LendingAll counterparties for the fund-period are present. Sort freely.
Security drawerAll funds for that security are present. Sort freely.
Returns & flowsDeliberately not sortable. Reordering the months of a quarter destroys the sequence the compounded figure is built from.

Below 700px every table is replaced by one labelled card per row. An eleven-column table cannot be read on a phone even with horizontal scrolling — the header scrolls out of view sideways and every number loses its label. Where the clickable headers were the only way to sort, a select box takes their place.


08. Data Coverage & Known Gaps

What is complete, what is not, and why

A data-quality badge sits beside the fund summary on every page, and it reports the real coverage of the selected fund-period. It is shown rather than hidden, because a gap you can see is a caveat and a gap you cannot see is a wrong answer.

Sector coverage by fund

N-PORT contains no sector field. Sector is derived by matching each issuer to its SEC-assigned SIC code — a source that exists only for companies that file with the SEC. That produces a sharp split by geography:

VUG · QQQ · IVV · SPY · VOO · VTIroughly 96.6% – 98.5% of market value classified. The unclassified remainder is a small-weight long tail; the chart is sound.
VEA · IEFAroughly 27% – 31% of market value classified. Their holdings are ~4,800 non-US issuers — Toyota, Siemens, Samsung, Commonwealth Bank — which file no SEC report, so no SIC code exists to map.

For the two ex-US funds the sector chart is still shown, preceded by a dismissible notice stating the real coverage and followed by a banner that stays beside the chart. An earlier version collapsed the chart behind a “show anyway” button; that was worse, because the button was clicked without being read and the caveat disappeared along with it, leaving an unlabelled chart. The obligation is that the gap is stated, not that the data is withheld.

This gap is structural, not a bug, and closing it requires a commercial sector feed — a licensing decision rather than a code fix. The threshold that triggers the warning is read from the measured coverage of the selected fund, never from a hardcoded list of tickers, so a new ex-US fund is flagged automatically and these two stop being flagged the day a sector source exists. Security tickers, by contrast, resolve well everywhere — over 93% even for the ex-US funds.

Three more things that look like bugs and are not
The most recent period is ~60 days old

N-PORT is filed monthly but only made public quarterly. This is the SEC's disclosure schedule, not a sync delay. ETF X-Ray is a structural tool, not a real-time one — for real-time, see AI Sentiment Pro.

A number changed since your last visit

Funds can amend a period they have already reported. Amended filings supersede the original, and the dashboard always shows the current version. A figure moving between visits is an amendment restating history.

Two funds are compared on different dates

Funds do not share a filing calendar. The overlap panel pairs each fund with the book it actually filed within 45 days of the anchor date, and where those dates differ it names both of them and the gap. Presenting a 30-day-apart comparison as same-date would be dishonest.


09. Disclaimer

Important limitations

N-PORT is a point-in-time snapshot, not a live portfolio. It states what the fund held on the last day of the reporting period. Because the data is published quarterly with a lag, a fund’s current holdings may differ materially from the most recent filing by the time you read it.

Sector is derived, not filed. Every sector classification on this site is an enrichment applied by our pipeline, not a figure the fund reported. Where it is unavailable it is shown as unclassified rather than guessed, and the unclassified bucket is retained so weights still sum to 100%.

Not investment advice

Nothing in ETF X-Ray constitutes investment advice, a recommendation to buy, sell or hold any security or fund, or a guarantee of any market outcome. It is a research and informational tool.

Values are as filed

Market values are those reported by the fund at the period end. They are not marked to today's prices and should not be read as current.

Concentration and crowding measures are algorithmic

Overlap, effective holdings, HHI and accumulation scores are formulas applied to filed data. The formula is stated beside each figure. They are not judgements about any fund or security.

Filing accuracy passes through

We parse EDGAR data as filed. An error in the original filing is reproduced faithfully in the data, and will be corrected only when the fund files an amendment.

Coverage is limited and expanding

Eight funds and eight quarters today. Verify any figure against the original filing before acting on it.

Original filings are public. Look any of them up on SEC EDGAR by fund name or CIK and compare.

Ready to explore?

Rock Group · ETF X-Ray Documentation · Last updated August 2026
Questions? Contact us