Blog / Institutional holdings
Institutional holdings

13F Analysis: Measuring Concentration and Ownership Changes

A practical guide to 13F analysis: how to compare quarters, measure institutional ownership concentration, and spot new or exited positions in code.

By the SecFeed teamOctober 27, 20266 min read
Key takeaways

A single 13F filing is a snapshot: one manager's long positions on one day, published up to 45 days later. 13F analysis means putting filings side by side, across quarters or across managers, to see what changed. This guide covers the two most common techniques, where the data misleads if you read it wrong, and how to pull the comparison with code instead of by hand.

What 13F analysis actually measures

Most 13F analysis falls into one of two questions:

  1. For one manager, what changed this quarter? New positions, exits, and share count increases or decreases compared with the prior quarter.
  2. For one security, how concentrated is institutional ownership? How many managers report holding it, and how much of the reported float sits with the largest few.

Both start from the same information table rows, filed by any institutional manager with at least $100 million in qualifying securities, but they group the data differently: one groups by manager across time, the other groups by security across managers.

Quarter-over-quarter position changes

To see what a single manager did, pull the same manager's holdings for two consecutive quarters and compare by CUSIP:

ComparisonWhat it means
CUSIP in quarter 2 but not quarter 1New position
CUSIP in quarter 1 but not quarter 2Exited position
Share count higher in quarter 2Increased position
Share count lower in quarter 2Decreased position
Share count unchangedHeld flat
Compare share counts, not dollar values. A manager's reported value moves with the stock price between quarters even if they never traded, so a dollar change alone can look like a position change when it is really a price change.

Get this data as clean JSON

SecFeed turns SEC filings into structured data with one API call: GET /v1/form-13f/holdings?cusip=037833100&period=06-30-2026. Free key, no card needed.

Get a free API key →

Measuring ownership concentration

For a single security, concentration analysis flips the grouping: instead of one manager's full portfolio, pull every manager that reported the same CUSIP for one quarter. From there you can compute:

This is the same technique research desks use to publish crowding and concentration write-ups on well known names; it works the same way for any CUSIP once you can pull the rows.

Doing the comparison in code

The Form 13F holdings API returns one row per position, filterable by CUSIP and quarter-end period, so you do not need to download and parse each manager's XML yourself. To compare two quarters for one security:

curl "https://secfeedapi.com/v1/form-13f/holdings?cusip=037833100&period=03-31-2026&size=1000" \
  -H "Authorization: Bearer YOUR_API_KEY"

curl "https://secfeedapi.com/v1/form-13f/holdings?cusip=037833100&period=06-30-2026&size=1000" \
  -H "Authorization: Bearer YOUR_API_KEY"

Each row looks like this:

{
  "filer": "EXAMPLE CAPITAL MANAGEMENT LLC",
  "cik": "0001067983",
  "period": "06-30-2026",
  "cusip": "037833100",
  "shares": 4310000,
  "value": 1250000000,
  "sh_prn": "SH"
}

In Python, grouping both quarters by filer CIK and diffing share counts gives you the new, exited and changed positions for that security:

from secfeed import Client

sf = Client("YOUR_API_KEY")
q1 = {r["cik"]: r["shares"] for r in sf.holdings_13f(cusip="037833100", period="03-31-2026")}
q2 = {r["cik"]: r["shares"] for r in sf.holdings_13f(cusip="037833100", period="06-30-2026")}

new = [cik for cik in q2 if cik not in q1]
exited = [cik for cik in q1 if cik not in q2]
changed = {cik: q2[cik]-q1[cik] for cik in q2 if cik in q1 and q2[cik] != q1[cik]}

print("new managers:", len(new), "exited:", len(exited), "changed:", len(changed))

The same cik parameter run without a CUSIP filter pulls one manager's full portfolio for a quarter, which is the pattern you want for the manager-by-manager comparison instead of the security-by-security one.

Where 13F analysis misleads

Frequently asked questions

Is 13F analysis the same as tracking insider trading?

No. 13F filings report institutional managers' holdings in other companies' stock. Insider trading reports (Forms 3, 4 and 5) report a company's own officers, directors and large shareholders trading that company's stock. They are separate filing regimes with separate forms.

Can 13F analysis tell me what a manager is buying right now?

No. The data is a quarterly snapshot published up to 45 days after quarter end, so any comparison describes positioning that is already somewhat in the past, not current trading activity.

Why do dollar values change even when share counts do not?

The value field is the position's market value at quarter end. If the share count is unchanged but the stock price moved, the reported value moves with it, which is why share-count comparisons are more reliable for spotting an actual trade.

How do I compare 13F data across many managers at once instead of one at a time?

Query the holdings endpoint by CUSIP and period without a manager filter, which returns every manager's reported position in that security for that quarter in one call, instead of pulling each manager's filing separately.

Does 13F analysis cover ETFs and mutual funds?

13(f) securities include many exchange traded products, but the filing only shows positions, not fund flows or redemptions. A mutual fund family's own 13F shows what the fund complex holds, not which investors are buying or selling the fund itself.

Get this data as clean JSON

SecFeed turns SEC filings into structured data with one API call: GET /v1/form-13f/holdings?cusip=037833100&period=06-30-2026. Free key, no card needed.

Get a free API key →

For information only, not investment advice. Data from public SEC filings; verify important figures on SEC.gov. See our AI Disclosure.