ETF vs Mutual Fund Settlement: Two Clocks
ETF vs mutual fund settlement, side by side: when each trade date starts, what price you get, and the exact day the cash is withdrawable under T+1.
ETF vs mutual fund settlement comes down to one question: when does the clock start? Both legs run one business day. The ETF clock starts at the execution timestamp. The fund clock starts on the pricing day, the day the fund strikes the net asset value your order receives. Same length, two starting guns, and on some afternoons two different dates for spendable cash.
ETF vs mutual fund settlement side by side
Settlement is the day a trade finishes: securities move one way, money the other, and a seller's proceeds turn into withdrawable cash. US-listed stocks and ETFs have run on a one business day cycle since May 2024, written as T+1, where T is the trade date. The general mechanics live in how stock settlement works under T plus 1, so this page stays on the contrast.
For an ETF, the trade date is never in doubt. You take a live offer at 11:04 a.m. and the confirmation carries that date, that price, and a settlement date one business day out.
For a mutual fund, the order is an instruction to the fund rather than a trade with another investor on an exchange. The fund computes one NAV per day after the close, and every order that arrives before its cutoff receives that NAV. The mechanism has a name, forward pricing, covered in the mutual fund forward pricing rule. The pricing day is the trade date, and settlement counts forward from it. A fund's exact cycle sits in its prospectus, with one business day after pricing the common case.
Which day does the cash actually land on?
Both legs count business days, never calendar days, so the wait depends on where the trade date falls in the week. The panel below walks the exchange calendar forward and pairs each upcoming session with the next one, which is the settlement date for anything dated that session.
| trade_date | trade_label | weekday | settles_on | settle_label | days_to_cash |
|---|---|---|---|---|---|
| 2026-10-05 | Oct 5 | Monday | 2026-10-06 | Oct 6 | 1 |
| 2026-10-06 | Oct 6 | Tuesday | 2026-10-07 | Oct 7 | 1 |
| 2026-10-07 | Oct 7 | Wednesday | 2026-10-08 | Oct 8 | 1 |
| 2026-10-08 | Oct 8 | Thursday | 2026-10-09 | Oct 9 | 1 |
| 2026-10-09 | Oct 9 | Friday | 2026-10-12 | Oct 12 | 3 |
| 2026-10-12 | Oct 12 | Monday | 2026-10-13 | Oct 13 | 1 |
| 2026-10-13 | Oct 13 | Tuesday | 2026-10-14 | Oct 14 | 1 |
| 2026-10-14 | Oct 14 | Wednesday | 2026-10-15 | Oct 15 | 1 |
| 2026-10-15 | Oct 15 | Thursday | 2026-10-16 | Oct 16 | 1 |
| 2026-10-16 | Oct 16 | Friday | 2026-10-19 | Oct 19 | 3 |
| 2026-10-19 | Oct 19 | Monday | 2026-10-20 | Oct 20 | 1 |
| 2026-10-20 | Oct 20 | Tuesday | 2026-10-21 | Oct 21 | 1 |
| 2026-10-21 | Oct 21 | Wednesday | 2026-10-22 | Oct 22 | 1 |
| 2026-10-22 | Oct 22 | Thursday | 2026-10-23 | Oct 23 | 1 |
| 2026-10-23 | Oct 23 | Friday | 2026-10-26 | Oct 26 | 3 |
The exact SQL behind every number
SELECT
toString(trade_day) AS trade_date,
concat(formatDateTime(trade_day, '%b'), ' ', toString(toDayOfMonth(trade_day))) AS trade_label,
['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][toDayOfWeek(trade_day)] AS weekday,
toString(settle_day) AS settles_on,
concat(formatDateTime(settle_day, '%b'), ' ', toString(toDayOfMonth(settle_day))) AS settle_label,
dateDiff('day', trade_day, settle_day) AS days_to_cash
FROM
(
SELECT
tupleElement(pair, 1) AS trade_day,
tupleElement(pair, 2) AS settle_day
FROM
(
SELECT arrayJoin(arrayZip(arrayPopBack(sessions), arrayPopFront(sessions))) AS pair
FROM
(
SELECT arraySort(groupArray(d)) AS sessions
FROM
(
SELECT today() + arrayJoin(range(30)) AS d
)
WHERE toDayOfWeek(d) BETWEEN 1 AND 5
AND d NOT IN
(
SELECT date
FROM global_markets.stocks_market_holidays
WHERE status = 'closed'
)
)
)
)
ORDER BY trade_date
LIMIT 15Read the first row as a worked example: a trade dated Oct 5, a Monday, settles on Oct 6, 1 calendar days on. The days_to_cash column is the one that catches people out, and across the 15 sessions in view it is not a constant. Nothing in this panel is specific to ETFs or to funds. It is one calendar, applied to whichever date each leg calls T.
Is the price you get the same?
No, and on a moving day the gap is visible. An ETF has a price every second the market is open. A mutual fund has one price per day. The panel below pins a single past session, September 15, 2026, and tracks SPY in half hour clock buckets through regular trading.
| et_time | spy_close |
|---|---|
| 09:30 | 759.55 |
| 10:00 | 757.48 |
| 10:30 | 756.44 |
| 11:00 | 757.48 |
| 11:30 | 757.12 |
| 12:00 | 757.58 |
| 12:30 | 757.74 |
| 13:00 | 756.88 |
| 13:30 | 757.27 |
| 14:00 | 757.67 |
| 14:30 | 757.49 |
| 15:00 | 756.98 |
| 15:30 | 757.38 |
The exact SQL behind every number
SELECT
formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
round(toFloat64(argMax(close, window_start)), 2) AS spy_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2026-09-15 00:00:00'
AND window_start < '2026-09-16 05:00:00'
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 et_time
ORDER BY et_timeThe 09:30 bucket finished at $759.55 and the 15:30 bucket at $757.38, over 13 buckets in one session. Two ETF buyers on that date, one at 11:00 a.m. and one at 3:45 p.m., hold the same fund at different cost. Two mutual fund investors who sent orders at those same moments hold theirs at one identical NAV, struck after the close.
Widen the same pinned session to six large funds and the pattern repeats across names.
| symbol | abs_gap_pct | range_pct |
|---|---|---|
| DIA | 0.328 | 0.85 |
| IVV | 0.084 | 0.55 |
| IWM | 0.249 | 1 |
| QQQ | 0.04 | 0.84 |
| SPY | 0.078 | 0.56 |
| VTI | 0.078 | 0.66 |
The exact SQL behind every number
SELECT
ticker AS symbol,
round(abs(toFloat64(anyIf(close, et_minute = 660)) / toFloat64(argMax(close, et_minute)) - 1) * 100, 3) AS abs_gap_pct,
round((toFloat64(max(high)) / toFloat64(min(low)) - 1) * 100, 2) AS range_pct
FROM
(
SELECT
ticker,
close,
high,
low,
toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York')) AS et_minute
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ', 'IVV', 'VTI', 'DIA', 'IWM')
AND window_start >= '2026-09-15 00:00:00'
AND window_start < '2026-09-16 05:00:00'
)
WHERE et_minute >= 570 AND et_minute < 960
GROUP BY ticker
HAVING countIf(et_minute = 660) > 0
ORDER BY tickerOn DIA, the 11:00 a.m. print sat 0.328% away from that same fund's closing print, inside a session that traveled 0.85% from its low to its high. Small in percentage terms. On a five figure order they are real dollars, and they exist only on the ETF leg, where the clock sets the price. Mutual funds versus ETFs covers the rest of the structural differences.
Where the two clocks actually split
Before a fund's cutoff, the clocks agree. Sell an ETF at 11:00 a.m. on a Tuesday and redeem a fund at 11:00 a.m. the same Tuesday: both are dated Tuesday, both settle Wednesday. The split opens at the cutoff. An order reaching the fund after its cutoff is priced at the following day's NAV, which makes the next session its trade date and moves settlement one business day out. An ETF sold in the extended session at 5:30 p.m. still carries that day's trade date.
So the usable version of the rule is a conditional. Same day order before the cutoff: one cash date for both legs. Order after the cutoff, including anything entered over a weekend or on a closed day: the fund's clock has not started, while an extended hours ETF trade has already stamped its date. When mutual funds trade has the cutoff timing in detail.
What happens to a Friday order?
Grouping the same forward calendar by weekday turns the weekend roll into one shape.
| weekday | sessions_counted | avg_days_to_cash | max_days_to_cash |
|---|---|---|---|
| Monday | 16 | 1 | 1 |
| Tuesday | 17 | 1 | 1 |
| Wednesday | 17 | 1.06 | 2 |
| Thursday | 16 | 1.38 | 4 |
| Friday | 14 | 3.07 | 4 |
The exact SQL behind every number
SELECT
['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][toDayOfWeek(trade_day)] AS weekday,
count() AS sessions_counted,
round(avg(dateDiff('day', trade_day, settle_day)), 2) AS avg_days_to_cash,
max(dateDiff('day', trade_day, settle_day)) AS max_days_to_cash
FROM
(
SELECT
tupleElement(pair, 1) AS trade_day,
tupleElement(pair, 2) AS settle_day
FROM
(
SELECT arrayJoin(arrayZip(arrayPopBack(sessions), arrayPopFront(sessions))) AS pair
FROM
(
SELECT arraySort(groupArray(d)) AS sessions
FROM
(
SELECT today() + arrayJoin(range(120)) AS d
)
WHERE toDayOfWeek(d) BETWEEN 1 AND 5
AND d NOT IN
(
SELECT date
FROM global_markets.stocks_market_holidays
WHERE status = 'closed'
)
)
)
)
GROUP BY weekday, toDayOfWeek(trade_day)
ORDER BY toDayOfWeek(trade_day)The bars separate cleanly. Friday trade dates carry the longest calendar wait in the window, averaging 3.07 days against 1 for Monday, measured over 14 sessions. The longest single wait on that row runs 4 calendar days. One rule, one calendar, a very different wall clock. A fund order entered Friday after the cutoff stretches further: the pricing day becomes Monday and settlement lands Tuesday, the following week from when the order was placed.
Switching a fund into an ETF in a cash account
Here the two clocks turn into a compliance problem. In a cash account, every purchase has to be paid for with settled cash. Redeem a mutual fund at Monday's NAV and the proceeds settle Tuesday. Buying an ETF with those proceeds on Monday is fine, since that purchase also settles Tuesday. Selling the ETF again on Monday or early Tuesday, before the fund proceeds have settled, means the account sold something it never paid for with settled funds. That is a good faith violation, and brokers count them: three inside a rolling twelve months typically restricts the account to settled cash for ninety days. Good faith violations in cash accounts walks the counting rules, and how long a mutual fund takes to settle dates the fund leg.
Do early closes and holidays change the dates?
A closure removes a business day from the count while leaving the rule untouched. The calendar below lists every closure still ahead, with shortened sessions marked.
| holiday_date | weekday | holiday | day_status | early_close_et | days_away |
|---|---|---|---|---|---|
| 2026-11-26 | Thu | Thanksgiving | closed | 54 | |
| 2026-11-27 | Fri | Thanksgiving | early-close | 01:00 PM | 55 |
| 2026-12-24 | Thu | Christmas | early-close | 01:00 PM | 82 |
| 2026-12-25 | Fri | Christmas | closed | 83 | |
| 2027-01-01 | Fri | New Years Day | closed | 90 | |
| 2027-01-18 | Mon | Martin Luther King, Jr. Day | closed | 107 | |
| 2027-02-15 | Mon | Washington's Birthday | closed | 135 | |
| 2027-03-26 | Fri | Good Friday | closed | 174 | |
| 2027-05-31 | Mon | Memorial Day | closed | 240 | |
| 2027-06-18 | Fri | Juneteenth | closed | 258 | |
| 2027-07-05 | Mon | Independence Day | closed | 275 | |
| 2027-09-06 | Mon | Labor Day | closed | 338 |
The exact SQL behind every number
SELECT
toString(date) AS holiday_date,
formatDateTime(date, '%a') AS weekday,
any(name) AS holiday,
any(status) AS day_status,
any(if(status = 'early-close',
formatDateTime(toTimeZone(close, 'America/New_York'), '%I:%i %p'),
'')) AS early_close_et,
dateDiff('day', today(), date) AS days_away
FROM global_markets.stocks_market_holidays
WHERE date >= today()
GROUP BY date
ORDER BY date12 dated closures sit on the forward calendar, the nearest being Thanksgiving, 54 days out. Two effects to carry. A full closure is not a business day, which extends every settlement straddling it on both legs. On a shortened session the fund cutoff moves with the early close rather than holding at 4:00 p.m., while ETF trading simply stops earlier in the day. Whether mutual funds trade on holidays covers the closed day handling.
FAQ
How long does an ETF take to settle?
One business day after the trade date, the cycle written as T+1. A sale executed Tuesday settles Wednesday, and the proceeds become withdrawable cash that day. A Friday sale settles Monday.
Do mutual funds settle faster than ETFs?
In rule terms neither is faster, since both commonly run one business day. The fund's clock starts later on any order arriving after the cutoff, since the pricing day is the trade date.
Can I use ETF sale proceeds to buy a mutual fund the same day?
Most brokers accept the order against unsettled proceeds in a cash account. The constraint sits on the other side: selling the newly bought position before the first sale settles is what creates a good faith violation.
Does an ETF trade after 4:00 p.m. settle a day later?
No. An extended hours trade carries the same trade date as the session it follows, so it settles on the same T+1 date as a 2:00 p.m. trade from that day.
Why does my broker show cash I cannot withdraw?
Proceeds appear as buying power before they exist as settled cash. A withdrawal waits for the settlement date, which the first panel on this page dates exactly for any session ahead.
Every panel here ships with the SQL underneath it, so you can see how each date was counted. To date a specific settlement, or check whether a session you care about straddles a closure, ask it in plain English on the Strasmore terminal.