How Often Mutual Funds Change Holdings
How often do mutual funds change holdings? What the portfolio turnover ratio measures, and how many days old the holdings list on a fund page usually is.
Mutual funds change holdings continuously, while the holdings list you are allowed to see updates only a handful of times a year. Two different answers hide inside the same question: the portfolio turnover ratio measures how much of a portfolio gets replaced over a year, and the disclosure calendar sets how long you wait to find out what changed. The panels below measure both, and the gap between them is wider than a fund page suggests.
How often do mutual funds change holdings?
Portfolio turnover ratio is the standard measure. Take the fund's purchases of securities over the year and its sales over the same year, keep the lesser of the two, and divide by the fund's average net assets. Keeping the lesser number is what makes the ratio honest about growth: new money arriving buys securities without selling anything, and that inflow is not the manager turning the portfolio over.
A turnover ratio of 100% means the fund traded an amount equal to its entire portfolio during the year. Invert the ratio for a rough average holding period: 100% is about one year, 25% is about four years, 8% is about twelve. Funds disclose the figure in the prospectus and again in the annual report, so a specific fund's own documents are the authority on its own number.
The ranges reported in those documents cluster in two places. Broad index funds tracking a large-cap benchmark commonly disclose single-digit turnover, frequently under 5%. Actively managed US equity funds commonly disclose something in the tens of percent, and strategies built around short holding periods disclose figures above 100%. Turnover describes a mandate rather than a grade. A low figure and a high figure are both ordinary for the strategies that produce them.
What makes an index fund trade at all?
An index fund holds no opinion about any position, and its trading is still never zero. Four mechanical sources account for nearly all of it.
- Index reconstitution, when the index provider adds and drops names on its published schedule.
- Corporate actions: splits, mergers, spin-offs, delistings, and new listings that enter the benchmark.
- Shareholder cash flows, which the fund invests or raises by trading around the close. Our guide to when mutual funds trade covers that timing, and how mutual fund NAV is calculated covers the price it happens at.
- Float and weight revisions from the index provider, which change how much of a name the fund needs to hold.
The second source leaves a countable footprint. The panel below counts two of those corporate events across the whole US market, month by month: split executions and newly listed tickers.
| month | stock_splits | new_listings |
|---|---|---|
| 2025-08 | 115 | 27 |
| 2025-09 | 150 | 32 |
| 2025-10 | 120 | 41 |
| 2025-11 | 99 | 24 |
| 2025-12 | 177 | 31 |
| 2026-01 | 90 | 36 |
| 2026-02 | 113 | 47 |
| 2026-03 | 191 | 17 |
| 2026-04 | 129 | 30 |
| 2026-05 | 142 | 40 |
| 2026-06 | 162 | 35 |
| 2026-07 | 164 | 34 |
| 2026-08 | 124 | 24 |
The exact SQL behind every number
SELECT
month,
sumIf(events, kind = 'split') AS stock_splits,
sumIf(events, kind = 'new_listing') AS new_listings
FROM
(
SELECT
formatDateTime(execution_date, '%Y-%m') AS month,
'split' AS kind,
countDistinct(ticker) AS events
FROM global_markets.stocks_splits
WHERE execution_date >= toStartOfMonth(today() - 400)
AND execution_date < toStartOfMonth(today())
GROUP BY month
UNION ALL
SELECT
formatDateTime(listing_date, '%Y-%m') AS month,
'new_listing' AS kind,
countDistinct(ticker) AS events
FROM global_markets.stocks_ipos
WHERE listing_date >= toStartOfMonth(today() - 400)
AND listing_date < toStartOfMonth(today())
GROUP BY month
)
GROUP BY month
ORDER BY monthIn 2026-08, the tape carried 124 split executions and 24 new listings, against 115 splits and 27 listings in 2025-08. Not every event touches every fund, and the monthly cadence is the point: a portfolio that tracks an index processes this stream all year. A split changes a position's share count while leaving its market value alone, so the fund's books move and its exposure does not. A name entering a benchmark is the expensive kind of event. The fund has to buy it, and the cash has to come from somewhere.
How often can you see a mutual fund's holdings?
Funds report portfolio holdings to the SEC on Form N-PORT, which we cover separately in our guide to Form N-PORT. The cadence is what matters here, and it is a reporting rule rather than a choice each fund makes.
Rule amendments adopted in 2024 moved funds to a monthly report, filed within 30 days of month end, with each report made public 60 days after the month it describes. The largest fund groups came under that schedule in November 2025 and smaller groups follow in November 2026. Under the earlier schedule a fund filed once a quarter, covering each month of the quarter, within 60 days of quarter end, and only the quarter-end month was made public. That is why so many fund pages still show a quarter-end list. Either way, the public list is at least 60 days behind the positions it names, and a quarter-end list runs months behind.
The panel below puts a clock on it. It takes the last trading session of each completed calendar quarter and measures how old that snapshot is as of today, alongside the date a report covering it is required to be public.
| snapshot_period_end | public_by_date | days_old_today | days_until_public |
|---|---|---|---|
| Jun 30, 2026 | Aug 29, 2026 | 90 | 0 |
| Mar 31, 2026 | May 30, 2026 | 181 | 0 |
| Dec 31, 2025 | Mar 1, 2026 | 271 | 0 |
| Sep 30, 2025 | Nov 29, 2025 | 363 | 0 |
| Jun 30, 2025 | Aug 29, 2025 | 455 | 0 |
| Mar 31, 2025 | May 30, 2025 | 546 | 0 |
The exact SQL behind every number
SELECT
formatDateTime(q_end, '%b %e, %Y') AS snapshot_period_end,
formatDateTime(q_end + 60, '%b %e, %Y') AS public_by_date,
dateDiff('day', q_end, today()) AS days_old_today,
greatest(dateDiff('day', today(), q_end + 60), 0) AS days_until_public
FROM
(
SELECT max(date) AS q_end
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= today() - 560
AND date < toStartOfQuarter(today())
GROUP BY toStartOfQuarter(date)
)
ORDER BY q_end DESCThe most recently completed quarter ended Jun 30, 2026, 90 days before today, and a report covering it is required to be public by Aug 29, 2026. The oldest snapshot still in view, Mar 31, 2025, is 546 days old. Read down the age column and the shape of the problem is plain. A quarter-end holdings list arrives around two months stale, then serves as the newest available list until the following quarter clears its own 60-day window, by which time it describes positions roughly five months old.
How stale is a holdings list in practice?
Nothing tells you in advance when a particular fund's next report lands. A neighbouring filing does show how managers use a filing window. Form 13F is the quarterly holdings report filed by large institutional managers, and its deadline is 45 days after quarter end rather than 60. It is a different form covering different filers, which makes it a useful measurement of filing behaviour under the same snapshot-plus-lag design.
| month | filings | median_days_to_file | p90_days_to_file |
|---|---|---|---|
| 2024-06 | 64 | 129 | 171 |
| 2024-09 | 7442 | 38 | 45 |
| 2024-12 | 8121 | 41 | 45 |
| 2025-03 | 8101 | 38 | 45 |
| 2025-06 | 8144 | 38 | 45 |
| 2025-09 | 8151 | 38 | 45 |
| 2025-12 | 8864 | 40 | 48 |
| 2026-03 | 8890 | 37 | 45 |
| 2026-06 | 8898 | 37 | 45 |
The exact SQL behind every number
SELECT
formatDateTime(period_end, '%Y-%m') AS month,
count() AS filings,
round(quantileDeterministic(0.5)(days_to_file, hash_id), 0) AS median_days_to_file,
round(quantileDeterministic(0.9)(days_to_file, hash_id), 0) AS p90_days_to_file
FROM
(
SELECT
cityHash64(accession_number) AS hash_id,
toDateOrNull(toString(any(period))) AS period_end,
dateDiff('day', toDateOrNull(toString(any(period))), any(filing_date)) AS days_to_file
FROM global_markets.stocks_13f_filings
WHERE form_type LIKE '13F-HR%'
AND form_type NOT LIKE '%/A'
AND filing_date >= today() - 730
GROUP BY accession_number
)
WHERE period_end IS NOT NULL
AND days_to_file BETWEEN 0 AND 200
GROUP BY month
HAVING count() >= 50
ORDER BY monthAcross 9 reporting quarters, the 2026-06 quarter drew 8898 filings, the median one arriving 37 days after the quarter ended, with the slowest tenth at 45 days. The line barely moves from quarter to quarter. Filings bunch against the deadline rather than ahead of it, which is the sensible planning assumption for any holdings report: the deadline is the schedule.
Staleness costs accuracy in a second way, since prices move while the list sits. The panel below takes the closing price of a few household names on the last session of the most recent completed quarter and compares it with the latest close on the tape.
| ticker | close_at_quarter_end | latest_close | change_pct |
|---|---|---|---|
| MSFT | 373.02 | 512.49 | 37.4 |
| AAPL | 289.36 | 339.55 | 17.3 |
| NVDA | 200.09 | 227.53 | 13.7 |
| KO | 81.27 | 87.99 | 8.3 |
| JNJ | 253.97 | 270.74 | 6.6 |
| SPY | 746.77 | 767.64 | 2.8 |
The exact SQL behind every number
WITH
(
SELECT max(date)
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date < toStartOfQuarter(today())
) AS snapshot_date,
(
SELECT max(date)
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
) AS latest_date
SELECT
ticker,
round(toFloat64(anyIf(close, date = snapshot_date)), 2) AS close_at_quarter_end,
round(toFloat64(anyIf(close, date = latest_date)), 2) AS latest_close,
round(100 * (toFloat64(anyIf(close, date = latest_date))
/ toFloat64(anyIf(close, date = snapshot_date)) - 1), 1) AS change_pct
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'KO', 'JNJ', 'SPY')
AND date IN (snapshot_date, latest_date)
GROUP BY ticker
HAVING countIf(date = snapshot_date) > 0
AND countIf(date = latest_date) > 0
ORDER BY abs(change_pct) DESCAmong the 6 names, MSFT shows the widest gap between the two dates, moving 37.4% from a close of $373.02 to $512.49. Weights inside a fund drift the same way. A holdings list that was exactly right on its as-of date describes different position sizes by the time a reader opens it, even where the manager has not traded a single share.
Do ETFs show holdings more often?
Yes, and the reason is mechanical. An ETF publishes a basket file every business day, since authorized participants create and redeem ETF shares in large blocks against a named list of securities, and that list has to be current for the day's trading. ETF creation and redemption walks through that exchange step by step, and mutual funds versus ETFs sets the two structures side by side.
Keep the two questions apart. Disclosure frequency is not turnover. A daily-disclosing ETF can sit on the same portfolio for years, and a fund that reports monthly can trade every session.
FAQ
How often do mutual funds report their holdings?
Funds report portfolio holdings to the SEC on Form N-PORT. Under the schedule phased in from November 2025 through November 2026, each monthly report is filed within 30 days of month end and made public 60 days after the month it covers. Funds also publish holdings in their annual and semiannual shareholder reports.
Why is a mutual fund's holdings list out of date?
The reporting rules set a lag between the as-of date of a holdings snapshot and the date it becomes public, and that lag is at least 60 days. A quarter-end list stays the newest public one until the next quarter's report clears its own window, so the list a reader sees is commonly two to five months old.
What does a turnover ratio of 100% mean?
It means the fund bought or sold an amount equal to its whole portfolio over the year, whichever of purchases or sales was smaller. As a rough average holding period, that is about one year. A 25% ratio works out to about four years.
Do mutual funds have to disclose a trade before they make it?
No. Portfolio disclosure is after the fact, through N-PORT reports and shareholder reports. A fund's prospectus describes what kinds of securities it may hold and how actively it intends to trade, and nothing in the regime announces individual trades in advance.
Every panel above ships with the exact SQL beneath it, so expand one to see how each figure was counted. To time your own filing window or measure a price gap between two dates, ask the question in plain English on the Strasmore terminal.