Strasmore Research
Learn Matt ConnorBy Matt Connor

How Mutual Fund NAV Is Calculated: Example

How is mutual fund NAV calculated? The formula, the 4 p.m. ET strike, forward pricing, accrued expenses, and a full worked example you can reproduce yourself.

A mutual fund's NAV, or net asset value, is calculated once each business day with a single formula: total assets minus total liabilities, divided by shares outstanding. The fund strikes that number after the 4:00 p.m. ET close, using the closing price of every security it holds. Any order you place is filled at the NAV computed after the fund receives it, never the one showing on your screen at the moment you clicked.

How a mutual fund NAV is calculated, line by line

NAV per share = (total assets - total liabilities) / shares outstanding

Each input is measured at the same instant, the end of the business day.

  • Total assets: the market value of every holding at its closing price, plus the cash the fund is sitting on, plus money owed to the fund such as dividends declared but not yet paid and proceeds from trades that have not settled.
  • Total liabilities: securities the fund has bought and not yet paid for, redemptions owed to shareholders who sold, and fees accrued since the last payment date.
  • Shares outstanding: the fund's own share count at the end of that day, after the day's purchases and redemptions are booked.

Fund accountants call the daily calculation striking the NAV. It runs in the evening, and the published figure reaches the fund's website and your brokerage statement that night or the following morning.

Which closing prices go into the NAV

For a US listed holding, the mark is the official closing price from its primary exchange, set in the closing auction that runs at 4:00 p.m. ET. That auction is the busiest single stretch of the trading day, which is what the panel below shows: the share of a session's volume that prints in each half hour.

QueryShare of SPY's session volume by half hour, June 2026 average
The exact SQL behind every number
WITH minute_bars AS
(
    SELECT
        toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
        formatDateTime(
            toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE),
            '%H:%i')                                         AS et_time,
        toFloat64(volume)                                    AS shares
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-06-01 00:00:00', 'UTC')
      AND window_start <  toDateTime('2026-07-01 00:00:00', 'UTC')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
),
bucket_totals AS
(
    SELECT session_date, et_time, sum(shares) AS bucket_shares
    FROM minute_bars
    GROUP BY session_date, et_time
),
session_totals AS
(
    SELECT session_date, sum(bucket_shares) AS session_shares
    FROM bucket_totals
    GROUP BY session_date
)
SELECT
    b.et_time                                               AS et_time,
    round(avg(b.bucket_shares / s.session_shares) * 100, 2) AS share_of_volume_pct
FROM bucket_totals AS b
INNER JOIN session_totals AS s ON s.session_date = b.session_date
GROUP BY b.et_time
ORDER BY b.et_time
Run this yourself

Averaged across every June 2026 session, the half hour beginning 15:30 carried 21.92% of the day's SPY volume, against 11.24% in the half hour beginning 09:30 ET. The prices a fund marks its book against are set in that last window, which is also where the trading concentrates.

A worked NAV example you can reproduce

The figures below are invented for the example, kept round enough to check by hand.

  • Holdings valued at their 4:00 p.m. closing prices: $850,000,000
  • Cash and receivables: $14,000,000
  • Total assets: $864,000,000
  • Total liabilities, covering unsettled purchases, redemptions payable and accrued fees: $4,000,000
  • Net assets: $860,000,000
  • Shares outstanding: 40,000,000

$860,000,000 divided by 40,000,000 shares gives a NAV of $21.50 per share. That is the price for every order the fund accepted that day, whether it arrived at 9:35 a.m. or at 3:58 p.m. A $10,000 purchase buys 465.116 shares, which is $10,000 divided by $21.50. Mutual funds issue fractional shares, commonly to three decimal places, so the whole amount goes in with no cash left stranded.

Forward pricing: which NAV your order receives

Rule 22c-1 under the Investment Company Act sets the forward pricing requirement. A fund must fill each purchase or redemption at the next NAV computed after it receives the order. There is no mechanism for buying at a NAV that already exists, and the figure quoted on a fund page today was struck at the previous close. An order reaching the fund at 11:15 a.m. Tuesday is priced at Tuesday's 4:00 p.m. NAV. One reaching it at 4:05 p.m. Tuesday is priced at Wednesday's. The cutoff clock and the intermediary rules around it are covered in when mutual fund orders are priced.

Between the click and the strike, the market keeps moving. The panel below pins one ordinary session, June 17, 2026, and marks SPY every fifteen minutes from the open through the close.

QueryOne session's price path, SPY every 15 minutes on June 17, 2026
The exact SQL behind every number
SELECT
    formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') AS et_time,
    round(toFloat64(argMax(close, window_start)), 2)                      AS spy_price
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
  AND window_start >= toDateTime('2026-06-17 13:30:00', 'UTC')
  AND window_start <= toDateTime('2026-06-17 20:00:00', 'UTC')
  AND toMinute(toTimeZone(window_start, 'America/New_York')) % 15 = 0
GROUP BY et_time
ORDER BY et_time
Run this yourself

The first mark, at 09:30 ET, printed $750.93. The last, at 16:00 ET, printed $741.83. Every point in between is a real trade at a real price, and exactly one of them, the last, enters a NAV calculation.

How far does a portfolio typically travel between a mid morning order and the strike? The next panel measures the gap on SPY from 10:00 a.m. ET to the closing print for every session in the trailing year, averaged by month.

QueryDistance from the 10:00 a.m. ET price to the close, SPY, by month
The exact SQL behind every number
WITH session_marks AS
(
    SELECT
        toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
        argMinIf(toFloat64(close), window_start,
                 (toHour(toTimeZone(window_start, 'America/New_York')) * 60
                  + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 600) AS price_at_10am,
        argMax(toFloat64(close), window_start)                                      AS price_at_close,
        countIf((toHour(toTimeZone(window_start, 'America/New_York')) * 60
                 + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 600)  AS bars_after_10am
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2025-08-01 00:00:00', 'UTC')
      AND window_start <  toDateTime('2026-08-01 00:00:00', 'UTC')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
    GROUP BY session_date
    HAVING bars_after_10am > 30
)
SELECT
    formatDateTime(session_date, '%Y-%m')                       AS month,
    formatDateTime(session_date, '%b %Y')                       AS month_label,
    round(avg(abs(price_at_close / price_at_10am - 1) * 100), 2) AS avg_move_pct,
    round(max(abs(price_at_close / price_at_10am - 1) * 100), 2) AS largest_move_pct
FROM session_marks
GROUP BY month, month_label
ORDER BY month
Run this yourself

In Aug 2025 the average distance ran 0.32%, and in Jul 2026 it ran 0.36%. The widest single session inside that final month came to 1.09%. Those percentages are the size of the window a fund order sits in while it waits for a price.

Where the expense ratio sits inside the NAV

The fee is inside the number, and this is the part most explanations leave out. A fund charging 0.60% a year against $860,000,000 of net assets owes $5,160,000 over a year. It books a slice of that every day rather than billing it in one lump. On a 365 day accrual the daily slice comes to about $14,137. That accrual sits in the liabilities line of the formula above and pulls the NAV down by roughly $0.00035 a share each day, before the figure is published.

Two consequences follow. A fund's published NAV and its published returns are already net of the expense ratio, so there is nothing further to subtract when you compare funds. And no fee line for it appears on your statement. It never leaves your account as cash. The deduction happens inside the calculation.

Fair value pricing when a fund holds foreign stocks

A US fund holding Japanese shares runs into a timing gap. Tokyo's session ends at 2:00 a.m. ET, so the last traded price of those shares is fourteen hours old when the US fund strikes its NAV at 4:00 p.m. ET. Frankfurt and Paris finish at 11:30 a.m. ET, roughly four and a half hours ahead of the strike.

Under SEC Rule 2a-5, the fund's board designates a valuation process that replaces a stale closing price with a fair value estimate whenever the last quoted price has stopped being a good measure at the moment of the strike. Pricing vendors supply the adjustment factors, often keyed to what US listed proxies did during the hours after the foreign market closed.

The size of that gap is measurable. The panel takes four US listed funds tracking foreign markets, plus SPY for reference, and measures how far each travelled between 11:30 a.m. ET and the 4:00 p.m. close.

QueryAverage move from the 11:30 a.m. ET European close to the 4:00 p.m. close, Q2 2026
The exact SQL behind every number
WITH afternoon_bars AS
(
    SELECT
        ticker,
        toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
        toFloat64(close)                                     AS px,
        window_start
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('EWJ', 'EWG', 'VGK', 'EFA', 'SPY')
      AND window_start >= toDateTime('2026-04-01 00:00:00', 'UTC')
      AND window_start <  toDateTime('2026-07-01 00:00:00', 'UTC')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 690
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
),
per_session AS
(
    SELECT
        ticker,
        session_date,
        abs(argMax(px, window_start) / argMin(px, window_start) - 1) * 100 AS afternoon_move_pct
    FROM afternoon_bars
    GROUP BY ticker, session_date
    HAVING count() > 30
)
SELECT
    ticker,
    round(avg(afternoon_move_pct), 3) AS avg_afternoon_move_pct,
    round(max(afternoon_move_pct), 3) AS largest_afternoon_move_pct
FROM per_session
GROUP BY ticker
ORDER BY avg_afternoon_move_pct DESC
Run this yourself

Over the second quarter of 2026, EWG moved an average of 0.428% across that stretch, with one session reaching 2.212%. The quietest of the 5 funds averaged 0.366%. A fund carrying untouched Tokyo or Frankfurt marks into a 4:00 p.m. strike would be pricing a book that has visibly travelled since those exchanges shut. Fair value procedures exist for that window.

An ETF's market price is set continuously by buyers and sellers, and it publishes a daily NAV as well, with the two figures usually sitting within pennies of each other. A mutual fund has one number a day and no intraday price at all. Mutual funds versus ETFs walks the full comparison.

Settlement is a separate date again. Your NAV is fixed on trade day. The cash and the shares change hands one business day later for most funds, which is the subject of mutual fund settlement time. Distributions move the NAV on their own schedule: on the day a fund pays out, the NAV falls by the per share amount distributed, matched by cash or reinvested shares landing in your account. When mutual funds pay dividends covers that calendar, and selling mutual funds at a loss covers what a sale below your cost basis means at tax time.

Which leaves the point readers most often get wrong. An intraday market move does not change the NAV you receive unless it is still present in the closing prices. A portfolio that jumps 2% at 11:00 a.m. and gives all of it back by 3:45 p.m. strikes the same NAV it would have without the round trip. The formula reads the last price of the day and nothing before it.

FAQ

What time is a mutual fund's NAV calculated?

Once per business day, after the 4:00 p.m. ET close. The fund values its holdings at their closing prices, subtracts liabilities, and divides by shares outstanding. Most funds publish the figure the same evening.

What is the formula for a mutual fund's NAV per share?

NAV per share equals total assets minus total liabilities, divided by shares outstanding. Total assets cover the market value of every holding plus cash and receivables. Liabilities cover unpaid trades and accrued fees.

If the market rallies at lunchtime, does my mutual fund order get that price?

No. The order is filled at the NAV struck after 4:00 p.m. ET, and that calculation reads closing prices only. A midday move changes your NAV only to the extent it is still there at the close.

Does the expense ratio come out of my NAV?

Yes. The fund accrues a daily slice of its annual expense ratio as a liability, and that accrual is subtracted inside the NAV calculation. Published NAVs and published returns are already net of it.

Why does a mutual fund's NAV drop on the day it pays a distribution?

The cash leaves the fund's assets and arrives in your account as cash or as reinvested shares. The NAV falls by the per share amount paid out, and the total value of your position is unchanged at that moment.


Every panel here ships with the SQL that produced it, so you can open one and see exactly which minutes were counted. To measure how far a holding travelled between a morning price and the closing print on any date you pick, ask the question in plain English on the Strasmore terminal.

#mutual funds#nav#forward pricing#fund mechanics#fund pricing