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.
- 13F analysis means comparing the same manager or security across quarters, not reading one filing in isolation.
- The two common measures are quarter-over-quarter position changes for one manager and ownership concentration across all managers for one security.
- Compare share counts, not dollar values, because values move with price even when nobody traded.
- 13F data is quarterly and up to 45 days delayed, so analysis describes positioning in the past, not current activity.
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:
- For one manager, what changed this quarter? New positions, exits, and share count increases or decreases compared with the prior quarter.
- 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:
| Comparison | What it means |
|---|---|
| CUSIP in quarter 2 but not quarter 1 | New position |
| CUSIP in quarter 1 but not quarter 2 | Exited position |
| Share count higher in quarter 2 | Increased position |
| Share count lower in quarter 2 | Decreased position |
| Share count unchanged | Held flat |
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.
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:
- Manager count: how many distinct filers reported a position.
- Top holder share: what fraction of total reported shares the largest few managers hold.
- New entrants and exits: which managers started or dropped the position since the prior quarter, using the same comparison as above, applied manager by manager.
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
- No short positions. A manager's 13F shows long holdings only. A position that looks like growing conviction could sit next to a short elsewhere that the filing never shows.
- Up to 45 days stale. Positions are as of quarter end, not the filing date, so by the time you read a change it may already be out of date in the manager's live book.
- Confidential treatment delays some rows. The SEC can let a manager omit a position temporarily, so a "new" position in a later quarter might actually have been held, just not disclosed yet.
- Amendments restate history. A 13F-HR/A can change prior figures, so a clean before-and-after comparison should check for amendments on both periods before concluding anything changed.
- CUSIPs can change. A corporate action or reclassification can give the same company a new CUSIP between quarters, which looks like an exit followed by a new position unless you also check the company's CIK, CUSIP and ticker mapping.
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.
For information only, not investment advice. Data from public SEC filings; verify important figures on SEC.gov. See our AI Disclosure.