---
title: "Per-fund NAV time series (yfinance)"
method: GET
path: "/funds/{bw_fund_id}/nav"
tags: ["Funds"]
---

# Per-fund NAV time series (yfinance)

`GET /funds/{bw_fund_id}/nav`

## Request

- Base URL: `https://riskmodels.app/api`
- URL: `https://riskmodels.app/api/funds/{bw_fund_id}/nav`
- Auth: HTTP bearer

Time series of actual fund NAV from yfinance, resampled to month-end and stored in the per-fund `ds_nav.zarr` on GCS (Funds_DAG `fund_nav_zarr` asset). One row per teo with `nav_close` (month-end close) and `nav_return_monthly` (pct_change of consecutive closes).

Pairs with `/funds/{bw_fund_id}/portfolio`: portfolio returns are 13F-derived holdings attribution; NAV returns are what investors actually realised. The gap surfaces intra-quarter trading, fees, and cash drag not visible in 13F.

Returns 404 when the fund has no yfinance-resolvable ticker (institutional SMAs, separately-managed accounts).

Bitemporal: `X-Data-As-Of` reflects the latest teo in the returned slice; `X-Data-Filing-Date` carries the registry's `latest_filing_date`.

## Path parameters

- `bw_fund_id` string, required

## Query parameters

- `start_date` string, date
- `end_date` string, date

## Response `200`

NAV time series rows.

- FundNavHistoryResponse: Per-fund NAV time series. Same shape as the portfolio history response — rows indexed by teo (month-end), filtered to the post-`start_date` / pre-`end_date` window.
  - `bw_fund_id` string, required
  - `ticker` string, nullable
  - `fund_name` string, nullable
  - `equity_style_9box` string, nullable
  - `n_periods` integer, required
  - `start_teo` string, date, required
  - `end_teo` string, date, required
  - `rows` FundNavRow[], required
    - `teo` string, date, required
    - `nav_close` number, float, nullable: Month-end close price from yfinance.
    - `nav_return_monthly` number, float, nullable: pct_change of consecutive month-end closes (the realised return).

## Other responses

- `400`: Malformed date params or start_date > end_date.
- `402`: Insufficient prepaid balance.
- `404`: Fund not found, or no NAV zarr for the date window (e.g. institutional SMA without a yfinance ticker).
- `429`: Rate limit exceeded.

---

[API](https://skmtc.dev/riskmodels/apis/riskmodels-api.md) · [All operations](https://skmtc.dev/riskmodels/apis/riskmodels-api/llms.txt) · [OpenAPI document](https://skmtc.dev/riskmodels/apis/riskmodels-api/revisions/1a034cad408a?raw)
