> ## Documentation Index
> Fetch the complete documentation index at: https://fruitstand.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Where to Get Daily NAV History for US Mutual Funds in SQL

> Where to get daily NAV history for US mutual funds in SQL: a Snowflake listing with 25,700+ funds back to 1973, CRSP, Tiingo, yfinance and the SEC, compared.

*By [Fruit Stand Team](https://fruitstand.dev/about.md) · November 9, 2026 · Comparisons*

For daily NAV history of US mutual funds in SQL, the main options are
Fruit Stand's Historical Stock Prices listing on the Snowflake Marketplace,
with 25,721 funds and 93.8 million daily NAVs back to 1973, and the CRSP
mutual fund database, which adds delisted funds but is licensed by request.
APIs such as Tiingo and yfinance work if you load the data yourself.

Below is how each option compares, what's in the listing, and the SQL to get
a fund's NAV history, month-end NAVs and total returns.

> [!NOTE]
>
> Fruit Stand publishes the Historical Stock Prices listing, one of the
> options below. Counts were checked in Snowflake on November 9, 2026, and
> other providers' details on their own pages or filings the same week.

## The options at a glance

| Source | Funds | History | How you get it | Price |
| - | - | - | - | - |
| [Historical Stock Prices](https://app.snowflake.com/marketplace/listing/GZTYZTG3LNFA) (Fruit Stand) | 25,721 US mutual funds, plus stocks and ETFs | Daily, back to 1973 for the oldest funds | Snowflake table, refreshed daily | \$100/month after a 30-day trial |
| [CRSP Survivor-Bias-Free US Mutual Fund Database](https://app.snowflake.com/marketplace/listing/GZ1MMZB2UP31/center-for-research-in-security-prices-llc-crsp-survivor-bias-free-us-mutual-fund-database) | 64,000+ funds, including 31,000+ delisted | Daily and monthly NAVs and returns | Licensed database, mostly through universities; Snowflake listing by request | By request |
| Morningstar, LSEG Lipper | Global fund coverage | Long, varies by fund | Licensed feeds and desktop tools | By request |
| [Tiingo](https://www.tiingo.com/about/pricing) | 60,826 ETFs and mutual funds combined | 30+ years | API, one ticker per request | Free tier; $30/month individual, $50 internal business |
| [yfinance](https://github.com/ranaroussi/yfinance) | Any fund Yahoo Finance lists | Varies by fund | Unofficial Python library | Free; personal use, throttled |
| [SEC Form N-PORT data](https://www.sec.gov/data-research/sec-markets-data/form-n-port-data-sets) | Registered funds, by share class | Monthly returns since late 2019, no daily NAVs | Quarterly ZIP files | Free |

Snowflake's free public data share has no mutual funds: its stock price
table returns nothing for VFINX, FXAIX or AGTHX.

## Which source fits which job

* **Every US fund's daily NAV in SQL, kept current:** the Historical Stock
  Prices listing. Mutual funds sit in the same table as stocks and ETFs, so
  one query compares a fund with its ETF twin or a stock.
* **Academic research that needs dead funds:** CRSP. It's the standard
  survivor-bias-free source, with tens of thousands of funds that merged or
  closed.
* **Global funds or ratings and analytics too:** Morningstar or LSEG Lipper.
* **A few funds in a Python project:** Tiingo's API, or yfinance for personal
  use.
* **Monthly returns from filings, free:** SEC N-PORT. It has no daily NAVs,
  and the data starts in late 2019.

## What's in the Historical Stock Prices listing

Mutual fund NAVs are in `security_price_history_vw`, one row per fund per
day:

| Measure | Value, Nov 9, 2026 |
| - | -: |
| Mutual funds with NAVs | 25,721 |
| Daily NAV rows | 93,768,642 |
| Funds with history before 2000 | 3,161 |
| Funds with history before 1990 | 650 |
| Median history per fund | 13 years |
| Earliest NAV | May 3, 1973 |

A mutual fund prices once a day, at its net asset value, so for funds `open`,
`high`, `low` and `close` all hold the NAV, and `volume` is 0. History starts
at the earliest NAV in the data, which can be later than the fund's launch:
Vanguard 500 Index Investor Shares (VFINX) starts on December 26, 1979.

`adjusted_close` is the NAV adjusted for distributions and share splits, for
total returns. The listing includes funds that still report a NAV, plus 80
marked inactive; it doesn't include the history of funds that closed or merged
before they were added, so long backtests across all funds carry survivorship
bias.

## Get a fund's NAV history

`close` is the NAV as reported each day:

```sql theme={null}
select date, close as nav, adjusted_close
from security_price_history_vw
where exchange_code = 'US' and code = 'VFINX'
order by date desc;
```

On November 9, 2026 the latest row was November 6, with VFINX at \$681.28.
Each day's NAV usually arrives with the next morning's refresh, since funds
publish NAVs after the market closes.

To find a fund's ticker by name, filter `security_vw` on `asset_class`:

```sql theme={null}
select s.code, s.name, min(p.date) as first_nav, max(p.date) as latest_nav
from security_vw s
join security_price_history_vw p
    on p.code = s.code and p.exchange_code = s.exchange_code
where s.asset_class = 'fund'
  and s.name ilike '%wellington%'
group by s.code, s.name
order by first_nav;
```

That returns six funds, from Vanguard Wellington Investor Shares (VWELX),
with NAVs from 1979, to Vanguard Global Wellington and a 529 plan option,
both from 2017.

## Month-end NAVs

Many reports need one NAV per month. Take the last NAV in each month with
`max_by`:

```sql theme={null}
select last_day(date) as month_end, code, max_by(close, date) as nav
from security_price_history_vw
where exchange_code = 'US'
  and code in ('VFINX', 'DODGX')
  and date >= '2026-07-01'
group by 1, 2
order by code, month_end;
```

Each row is labeled with the month's last calendar day, and the current
month's row holds the latest NAV so far.

## NAV change isn't the fund's return

A fund's NAV drops every time it pays out a distribution, and some funds
split their shares, so the raw NAV understates what an investor earned.
Over the 20 years to November 6, 2026:

| Fund | NAV then | NAV now | NAV change | Total return |
| - | -: | -: | -: | -: |
| Vanguard 500 Index Investor (VFINX) | \$127.27 | \$681.28 | +435% | +665% |
| Growth Fund of America A (AGTHX) | \$33.46 | \$82.85 | +148% | +661% |
| T. Rowe Price Capital Appreciation (PRWCX) | \$22.27 | \$38.82 | +74% | +592% |
| Fidelity Contrafund (FCNTX) | \$69.38 | \$26.15 | −62% | +1,011% |
| Dodge & Cox Stock (DODGX) | \$155.20 | \$17.82 | −89% | +644% |

Contrafund's NAV fell after a 10-for-1 split in August 2018, and Dodge &
Cox Stock's after a 16-for-1 split in October 2025. Neither shareholder lost
anything. Growth Fund of America pays out capital gains most Decembers, and
its NAV fell 6% or more on its December distribution day in eight of the
last ten years, so most of its return never shows up in the NAV. VFINX's total return of 665% matches SPY's 668% over the same 20 years,
less the difference in fees.

The table comes from one query:

```sql theme={null}
with px as (
    select code, date, close as nav, adjusted_close
    from security_price_history_vw
    where exchange_code = 'US'
      and code in ('VFINX', 'AGTHX', 'DODGX', 'PRWCX', 'FCNTX')
      and date >= '2006-11-06'
)
select code,
       min_by(nav, date) as start_nav,
       max_by(nav, date) as end_nav,
       round(max_by(nav, date) / min_by(nav, date) - 1, 3) as nav_change,
       round(max_by(adjusted_close, date) / min_by(adjusted_close, date) - 1, 3) as total_return
from px
group by code
order by code;
```

For ready-made trailing returns (1-day to 20-year) for every fund, the [Fund
Returns listing](https://fruitstand.dev/datasets/fund-returns.md) has them calculated; [Where to Get
Trailing Returns for Every US Fund and ETF in
Bulk](https://fruitstand.dev/blog/trailing-returns-us-funds-etfs-bulk.md) compares it with other
sources. For why the adjusted column differs from the raw one, see
[Adjusted Close vs. Close](https://fruitstand.dev/blog/adjusted-close-vs-close.md).

## F.A.Q.

> [accordion] Is there free mutual fund NAV history?
>
> For a few funds, yes: yfinance (personal use) and Tiingo's free tier. The SEC's N-PORT files are free but have monthly returns, not daily NAVs. For every fund in SQL, the Historical Stock Prices listing has a 30-day free trial.

> [accordion] How far back does mutual fund NAV history go?
>
> In the Historical Stock Prices listing, to May 1973 for the oldest funds; 650 funds have NAVs from before 1990. Each fund's history starts at its earliest NAV in the data.

> [accordion] Does the data include closed or merged funds?
>
> Not their full history. The listing covers funds that still report a NAV, plus 80 marked inactive. For research that needs every dead fund, use CRSP's survivor-bias-free database.

> [accordion] Why did my fund's NAV drop sharply on one day?
>
> Usually a distribution or a share split. Dodge & Cox Stock's NAV went from $282.70 to $17.78 on October 27, 2025, its 16-for-1 split. Use `adjusted_close` for returns across those dates.

> [accordion] Are ETFs in the same table?
>
> Yes. Stocks, ETFs and mutual funds share `security_price_history_vw`. Filter `security_vw` on `asset_class` (`stock`, `etf` or `fund`).

To query daily NAVs for every US mutual fund in SQL, start a free 30-day
trial of the [Historical Stock Prices listing on the Snowflake
Marketplace](https://app.snowflake.com/marketplace/listing/GZTYZTG3LNFA).
The schema is in the [dataset docs](https://fruitstand.dev/datasets/historical-stock-prices.md).
Questions? Reach out at [contact@fruitstand.dev](mailto:contact@fruitstand.dev).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.