Strasmore Research
Learn 2026-07-02

What Is a Bid-Ask Spread? Real Costs, Real Market Data

Learn what a bid-ask spread is, how to calculate it, and what it costs per trade — with real spreads measured from tick-level quote data on US stocks.

A bid-ask spread is the gap between the highest price any buyer is currently willing to pay for a stock (the bid) and the lowest price any seller is currently willing to accept (the ask). It is the built-in cost of trading: buy at the ask, sell at the bid, and the difference stays with whoever supplied the quote. Every spread figure on this page is measured from tick-level quote data, with the exact query behind each number attached to it.

What is a bid-ask spread? A plain-English definition

At any moment of the trading day a stock has two prices, not one. The bid is the best standing offer to buy. The ask (sometimes called the offer) is the best standing offer to sell. The bid-ask spread is the distance between them.

A hypothetical example: a stock quoted at $20.00 bid / $20.05 ask has a five-cent spread. Anyone who wants to buy immediately pays $20.05; anyone who wants to sell immediately receives $20.00. That nickel is not a brokerage fee — it is the price of immediacy, and it goes to the trader on the other side of the quote, most often a professional market maker who stands ready to buy at the bid and sell at the ask all session long.

In US stocks, the best bid and best ask across every exchange are consolidated into one national best bid and offer — the NBBO. That is the quote your brokerage app shows, and it is the data this post measures. (Finance uses "spread" for other gaps too: the 2s10s spread is a difference between Treasury yields, not stock prices.)

Bid vs. ask: how to read a stock quote

Below is a real NBBO record for Apple — the last quote in our data window, pulled from the consolidated feed.

QueryAAPL — the last recorded NBBO quote in our data window
The exact SQL behind every number
SELECT stock,
       toDecimalString(bid, 2) AS bid_price,
       toDecimalString(ask, 2) AS ask_price,
       toDecimalString(ask - bid, 2) AS spread,
       toDecimalString((ask + bid) / 2, 2) AS midpoint_price,
       round((ask - bid) / ((ask + bid) / 2) * 100, 3) AS spread_pct,
       quote_time_et
FROM (
    SELECT ticker AS stock,
           argMax(toFloat64(bid_price), sip_timestamp) AS bid,
           argMax(toFloat64(ask_price), sip_timestamp) AS ask,
           formatDateTime(toTimeZone(max(sip_timestamp), 'America/New_York'), '%Y-%m-%d %H:%i') AS quote_time_et
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'AAPL'
      AND sip_timestamp >= now() - INTERVAL 7 DAY
      AND bid_price > 0
      AND ask_price > bid_price
    GROUP BY ticker
)

Read it left to right: the best bid was $294.43, the best ask was $294.70, and the spread — ask minus bid — was $0.27, stamped 2026-07-01 19:59 ET. The midpoint, $294.56, sits halfway between the two and is the usual reference for a stock's fair value at that instant.

One detail worth noticing: this quote landed near the end of the extended session, hours after the closing bell. The clock matters for spreads — the intraday chart further down shows how much.

How to calculate the spread: cents, percent, and basis points

The same gap can be expressed three ways:

  1. Dollars and cents. Spread = ask minus bid. Simple, but hard to compare across stocks trading at different prices.
  2. Percent. Spread ÷ midpoint × 100. A five-cent spread on a $20 stock is 0.25% of the price; the same five cents on a $200 stock is 0.025%.
  3. Basis points (bps). Hundredths of a percent — the professional convention. Multiply the percentage by 100: 0.25% equals 25 bps.

Applied to the real Apple quote above: $0.27 ÷ $294.56 works out to 0.092% of the share price — an after-hours reading, and still well under 1% of the price.

Tight vs. wide spreads: real numbers from liquid and thin stocks

Most explainers stop at "liquid stocks have narrow spreads." Here is the actual size of that difference, measured across every NBBO update in a recent multi-day window. The table pairs six heavily traded names with two genuinely thin small caps — Nathan's Famous (NATH) and Seneca Foods (SENEA). "Typical" means the median quote in the window, and the last column converts that spread into dollars on a 100-share round trip — cents per share and dollars per 100 shares are the same number.

QueryTypical quoted spread — six liquid names vs. two thin small caps, with the 100-share cost
The exact SQL behind every number
SELECT ticker,
       round(median_spread_usd * 100, 1) AS typical_spread_cents,
       round(median_spread_bps, 1) AS typical_spread_bps,
       toDecimalString(median_spread_usd * 100, 2) AS spread_cost_100_shares
FROM (
    SELECT ticker,
           quantileDeterministic(0.5)(toFloat64(ask_price - bid_price), toUInt64(sip_timestamp)) AS median_spread_usd,
           quantileDeterministic(0.5)(toFloat64(ask_price - bid_price) / (toFloat64(ask_price + bid_price) / 2), toUInt64(sip_timestamp)) * 10000 AS median_spread_bps
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('SPY', 'AAPL', 'NVDA', 'MSFT', 'KO', 'TSLA', 'NATH', 'SENEA')
      AND sip_timestamp >= now() - INTERVAL 7 DAY
      AND bid_price > 0
      AND ask_price > bid_price
    GROUP BY ticker
)
ORDER BY indexOf(['SPY', 'AAPL', 'NVDA', 'MSFT', 'KO', 'TSLA', 'NATH', 'SENEA'], ticker)

Among the liquid names, SPY's typical quoted spread measured 3¢ — 0.4 bps of its share price — with Coca-Cola at 1¢ (1.2 bps) and Tesla at 9¢ (2.1 bps). Then comes the cliff: Nathan's Famous measured 71¢ (70.1 bps) and Seneca Foods 197¢ (113.4 bps). Same market, same rulebook — the difference is liquidity: how many buyers, sellers, and market makers are competing in each name at the same time.

What the spread costs on a real trade

A useful way to feel the spread is to price a round trip: buy at the ask and sell at the bid an instant later, and you give up the full spread on every share. On 100 shares the conversion is already in the table above — the typical spread in cents per share is the same number in dollars. For the household names the toll is coffee money: $3.00 on 100 shares of Apple, $1.00 on Coca-Cola. The thin names bill differently — $71.00 for Nathan's Famous and $197.00 for Seneca Foods, before any commission and before the order moves the price. These figures assume the order fills at the displayed quote; an order larger than the displayed size can pay more.

When spreads widen: the open, the close, and after hours

Spreads are not constant through the day. The chart below tracks Apple's median quoted spread in 30-minute clock buckets (Eastern Time) across the same window, extended hours included — the pattern most explainers assert and never show.

QueryAAPL median quoted spread by 30-minute bucket (ET, extended hours included)
The exact SQL behind every number
SELECT formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
       round(quantileDeterministic(0.5)(toFloat64(ask_price - bid_price), toUInt64(sip_timestamp)) * 100, 1) AS median_spread_cents
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
  AND sip_timestamp >= now() - INTERVAL 7 DAY
  AND bid_price > 0
  AND ask_price > bid_price
GROUP BY et_time
ORDER BY et_time

The shape is a U with tall edges: wide before the open, pennies through the middle of the day, wide again after the close. Four checkpoints from that curve, pinned by clock time:

QueryThe same curve at four checkpoints — premarket, the open, midday, the close
The exact SQL behind every number
SELECT formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
       round(quantileDeterministic(0.5)(toFloat64(ask_price - bid_price), toUInt64(sip_timestamp)) * 100, 1) AS median_spread_cents
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
  AND sip_timestamp >= now() - INTERVAL 7 DAY
  AND bid_price > 0
  AND ask_price > bid_price
GROUP BY et_time
HAVING et_time IN ('04:00', '09:30', '13:00', '16:00')
ORDER BY et_time

In the 04:00 premarket bucket — the first of the day — Apple's median spread measured 38¢. In the 09:30 bucket, the first half hour of regular trading, it collapsed to 6¢, and the 13:00 early-afternoon bucket sat at 3¢. The 16:00 bucket, which starts at the closing bell, jumped to 20¢, and the gap stayed elevated through the evening — 22¢ in the final bucket of the session. During regular hours (9:30 a.m.–4 p.m. ET) dozens of market makers quote the stock at once; outside those hours far fewer quotes compete, and the gap sits wider.

What makes a spread tight or wide

Four things travel together with tight spreads:

  • Competition. More market makers and more resting orders in a name mean tighter quotes on both sides. A thin stock may have a single active quoter setting the whole market.
  • Trading volume. Heavy volume and tight spreads appear together all across the table above; the heavily traded names sit at a small fraction of the thin names' gaps.
  • Volatility. In fast markets, quotes are re-priced constantly and the gap tends to sit wider until trading calms down.
  • Share price and tick size. US stocks above $1 quote in one-cent increments, and one cent is the floor — the most liquid low-priced names spend much of the day pinned there. On a low-priced stock, that same minimum cent is a bigger percentage of every share.

How to keep your spread costs low

  • Limit orders name the price. A market order takes whatever the quote offers; a limit order fills only at the stated price or better. A buy order resting at the bid earns the spread instead of paying it when a seller comes to meet it — the trade-off is that it may never fill.
  • Liquid names during regular hours are the cheap combination. The intraday chart above shows the scale: midday spreads in liquid stocks are the tightest of the session.
  • Basis points reveal what cents hide. A gap that sounds like pocket change can be a meaningful fraction of a percent on a thin or low-priced stock, as the small-cap rows above show.
  • Fewer round trips mean a smaller toll. Every round trip pays the spread once; the total cost scales with how often a position turns over.

Bid-ask spread FAQ

What is a good bid-ask spread?

There is no official threshold, but the table above gives the scale: in the measured window, SPY's typical spread was 0.4 bps of its share price and Tesla's was 2.1 bps, while the thin small caps ran to 70.1 and 113.4 bps. Single-digit basis points is tight; a spread above roughly 1% of the share price is where a limit order earns its keep.

Who keeps the bid-ask spread?

Whoever supplies the quote — typically a market maker — earns the spread when both sides of its quote fill. It is compensation for standing ready to trade at all times, not a fee collected by your broker or the exchange.

Is a wide bid-ask spread good or bad?

Wide spreads raise your cost per round trip, as the 100-share cost column in the table above shows. A wide spread also carries information: fewer participants are quoting, and the last trade price is a looser estimate of what your order will actually get.

Why is the ask price higher than the bid?

By construction. The bid is the best price buyers will pay and the ask is the best price sellers will accept; whenever the two meet, the exchange matches them into a trade instantly and the quote moves on. A standing quote always shows the ask at or above the bid.

Do bid-ask spreads matter for long-term investors?

Less than for active traders, and the data shows the scale: a 100-share round trip in SPY measured $3.00 in typical spread cost. Paying that once a decade is noise; paying a thin-stock spread every week compounds into real money.


Every number above renders from a stored, inspectable query — expand the SQL under any panel to audit it. To measure the spread on a ticker you own, ask the same questions in plain English on the Strasmore terminal.