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

# Adjusted Close vs. Close: Which Stock Price to Use

> Close vs. adjusted close explained: how splits and dividends change historical prices, when to use each, and how to compute total returns in SQL on Snowflake.

*By Fruit Stand Team · October 20, 2026 · Guides*

Every end-of-day price feed gives you two closing prices for the same day:
`close` and `adjusted_close`. They look interchangeable until a stock
splits or pays a dividend, and then a chart, a return figure or a backtest
built on the wrong one is quietly off. This post covers what each column
means, how the adjustment is calculated, and which one to reach for, with
SQL you can run against the [Historical Stock Prices
dataset](https://fruitstand.dev/datasets/historical-stock-prices.md) in Snowflake.

## The short answer

| Use case | Column |
| - | - |
| What did it actually trade at on that day? | `close` |
| Matching a broker statement or trade confirm | `close` |
| Market cap on a historical date | `close` |
| Returns over any period | `adjusted_close` |
| Price charts across long periods | `adjusted_close` |
| Backtests, volatility, correlations | `adjusted_close` |
| Candlestick charts, daily ranges, ATR | `adjusted_open`, `adjusted_high`, `adjusted_low`, `adjusted_close` |

If the question involves change over time, use `adjusted_close`. If it
involves the price on a specific day, use `close`.

## What close means

`close` is the official last price for the trading day (for a mutual
fund, the day's net asset value). It's a historical fact and it never
changes after the day ends. That's also the problem: when a company does
a 4-for-1 split, its `close` drops by about 75% overnight even though no
shareholder lost anything. A return computed straight from `close` across
that date reports a crash that didn't happen.

## What adjusted close means

`adjusted_close` rewrites history so that every past price is comparable
to today's. Two kinds of events trigger an adjustment:

**Splits.** For an N-for-1 split, every price before the split date is
divided by N. A $400 close before a 4-for-1 split becomes $100, in line
with how the stock trades afterward.

**Dividends and distributions.** On the ex-dividend date the price falls
by roughly the payout, because the cash has left the company. To keep
that from showing up as a loss, every earlier price is multiplied by a
factor:

```text theme={null}
dividend_factor = 1 - (dividend / close_on_day_before_ex_date)
```

So a $1 dividend on a $100 stock multiplies every earlier adjusted price
by 0.99. Stack those factors over decades of dividends and splits and the
adjusted price of an old trade can be a small fraction of what it traded
at, which is expected.

Because these factors apply backward, **adjusted close history changes
every time a split or dividend posts**. A value you pulled last month for
a date in 2015 may be different today. Any pipeline that stores adjusted
prices has to restate history when corporate actions land, not just
append new days. Ours refetches a security's full history whenever a new
split or dividend appears, and restates every security twice a week.

## Total return from adjusted close

Since dividends are folded into `adjusted_close`, the ratio of two
adjusted prices is the total return, with dividends treated as
reinvested:

```text theme={null}
total_return = (end_adjusted_close / start_adjusted_close) - 1
```

In SQL, for a 10-year window:

```sql theme={null}
select
    code,
    max_by(adjusted_close, date) / min_by(adjusted_close, date) - 1 as total_return_10y
from security_price_history_vw
where code in ('AAPL', 'VTI', 'VFIAX')
  and exchange_code = 'US'
  and date between '2016-01-01' and '2025-12-31'
group by code;
```

To annualize a multi-year return (CAGR), raise the ratio to the power of
`365.25 / days_between`:

```sql theme={null}
select
    code,
    power(
        max_by(adjusted_close, date) / min_by(adjusted_close, date),
        365.25 / datediff('day', min(date), max(date))
    ) - 1 as cagr
from security_price_history_vw
where code = 'VTI'
  and exchange_code = 'US'
  and date between '2016-01-01' and '2025-12-31'
group by code;
```

## Price return vs. total return

You can split the two effects by comparing `close` and `adjusted_close`
over a window with no splits:

* **Price return** (`end_close / start_close - 1`) ignores dividends.
* **Total return** (from `adjusted_close`) includes them.

The gap between the two is roughly the dividend yield over the window,
small for growth stocks, large for income funds. For mutual funds that
pay sizable year-end capital gains distributions, the NAV can drop
sharply in December with no loss to holders, so price returns on fund
NAVs can be badly misleading. Always use the adjusted series for funds.

## Daily returns and a common mistake

For daily returns, use `lag` over adjusted prices:

```sql theme={null}
select
    code,
    date,
    adjusted_close / lag(adjusted_close) over (
        partition by code, exchange_code order by date
    ) - 1 as daily_return
from security_price_history_vw
where code = 'AAPL'
  and exchange_code = 'US'
order by date desc
limit 5;
```

The mistake to avoid: mixing columns, for example a `close` from one
source with an `adjusted_close` from another, or caching adjusted prices
and appending new days without restating old ones. Either one produces
jumps on split and ex-dividend dates.

## F.A.Q.

> **Is adjusted close the same as total return?**
>
> The ratio of two adjusted closes is the total return between those dates, assuming dividends are reinvested on the ex-date. A single adjusted close on its own is just a restated price.

> **Why did a historical adjusted close change?**
>
> A new split or dividend posted after you pulled it. Adjustment is applied backward across the whole history, so every earlier adjusted price moves when a corporate action lands. Raw `close` never changes.

> **Are open, high, low and volume adjusted?**
>
> In the [Historical Stock Prices dataset](https://fruitstand.dev/datasets/historical-stock-prices.md), `adjusted_open`, `adjusted_high` and `adjusted_low` apply the same day's factor (`adjusted_close / close`) to the raw prices, so you get a full adjusted OHLC bar alongside the as-traded `open`, `high`, `low` and `close`. `volume` is adjusted for splits only. Vendors differ here (some only split-adjust OHLC, some adjust volume, some don't), so check the docs before mixing sources.

> **Should I use adjusted close for mutual funds?**
>
> Yes. Mutual funds pass income and capital gains through as distributions, which drop the NAV on the ex-date. Without adjustment, those drops look like losses.

If you want daily open, high, low, close and adjusted close for every US
stock, ETF and mutual fund in Snowflake, see the [Historical Stock Prices
dataset](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.