Strasmore Research
Learn Matt ConnorBy Matt Connor · Updated 2026-07-09 · data as of July 9, 2026 · refreshed weekly

What It Costs to Trade a Stock, Measured

Commissions are zero, but every stock trade pays the bid-ask spread. See the real cost of trading stocks, measured in basis points across 12 household names.

The cost of trading stocks did not fall to zero when commissions did. Every marketable order still pays the bid-ask spread — the gap between the highest price buyers will pay and the lowest price sellers will accept — half of it going in, half coming out. This page measures that toll in basis points across twelve household stocks and ETFs, from tick-level quote data, with the exact SQL behind every number attached.

Commissions went to zero — the spread did not

A stock never has one price; it has two. The bid is the best standing offer to buy; the ask is the best standing offer to sell. Trading right now means crossing that gap: a market buy fills at the ask, a market sell at the bid, and the difference stays with whoever posted the quote — most often a professional market maker quoting both sides all session. What a bid-ask spread is covers the mechanics in full; this page prices them.

A hypothetical example makes the arithmetic plain. A stock quoted $20.00 bid / $20.05 ask has a midpoint of $20.025 — the usual reference for its fair value at that instant. A market buy pays $20.05, which sits 2.5 cents above the midpoint: half the quoted width. A market sell receives $20.00, giving up the other half. Do both — a round trip — and the full five cents stays behind on every share, with no commission line anywhere.

The professional unit for this cost is the basis point (bp) — one hundredth of one percent. Quoting the spread as a share of the midpoint puts a single-digit-dollar ETF and a several-hundred-dollar ETF on the same scale, and the differences it reveals are larger than most zero-commission traders expect.

The cost-to-trade ladder: twelve names, measured

Below are twelve widely held stocks and ETFs, ranked by the median quoted spread as a percentage of the midpoint. The data is every update to the NBBO — the consolidated best bid and offer across all US exchanges, the quote a brokerage app displays — counted in a fixed clock window (13:30–19:59 UTC), which lines up with the 9:30 a.m.–4:00 p.m. Eastern regular session during daylight-saving months — the state of every window this page has measured so far. The window covers the most recent completed sessions in our data and deliberately stops a few days short of today, keeping any partially ingested day out of the medians. Updates with a missing side, or with an ask at or below the bid, are excluded from the medians and counted in the last column rather than silently dropped.

QueryThe cost-to-trade ladder — median quoted spread in bps of the midpoint, regular hours, recent completed sessions
The exact SQL behind every number
SELECT ticker,
       round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price) / (toFloat64(ask_price + bid_price) / 2), bid_price > 0 AND ask_price > bid_price) * 10000, 2) AS typical_spread_bps,
       round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price), bid_price > 0 AND ask_price > bid_price) * 100, 1) AS typical_spread_cents,
       round(count() / 1e6, 1) AS quote_updates_m,
       round(100 * countIf(bid_price <= 0 OR ask_price <= 0 OR ask_price <= bid_price) / count(), 2) AS pct_updates_excluded
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT', 'NVDA', 'AMD', 'TSLA', 'KO', 'DIS', 'F', 'SOXS')
  AND sip_timestamp >= toDateTime(today() - 10)
  AND sip_timestamp < toDateTime(today() - 3)
  AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
GROUP BY ticker
ORDER BY typical_spread_bps

At the top sits SPY at 0.27 bps — a fraction of a single basis point — a median resting on 14.3 million quote updates. On the fourth rung, NVDA quotes 1.03 bps. The bottom rung, SOXS, measures 25.41 bps — and its cents column is the quiet lesson of the whole table: the quoted gap is 1¢, a penny-scale gap attached to the board's largest percentage cost. Cents flatter cheap stocks; basis points price them honestly.

One basis point is one dollar per $10,000

The bps column converts to money with fixed arithmetic: on a $10,000 order, one basis point equals one dollar (10,000 × 0.0001 = 1). Read the ladder as a round-trip price list per $10,000 traded: the top rung's 0.27 bps is about $0.27; the bottom rung's 25.41 bps is about $25.41. Crossing once — only buying, or only selling — runs half of each figure.

Frequency scales the toll. A hypothetical 20 bp spread crossed round-trip once a week on the same $10,000 adds up to roughly $1,040 over 52 weeks (20 × $1 × 52) — about one percent of the account, at zero commission. The same habit on a hypothetical 1 bp spread totals about $52 a year. Which rung a name sits on matters more than any commission line ever did.

A mega-cap vs. a leveraged inverse ETF

The bottom rung of the ladder deserves a name, and so does a mega-cap from its tight top third. NVIDIA (NVDA) is a mega-cap semiconductor stock. SOXS is the Direxion Daily Semiconductor Bear 3X shares — a leveraged inverse ETF built to move three times opposite to a semiconductor index each day, resetting daily. Both measured over the same window, the same way:

QueryNVDA vs SOXS — median quoted spread over the window, with the smallest single-session gap
The exact SQL behind every number
WITH per_day AS (
    SELECT toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS et_date,
           quantileExactIf(0.5)(toFloat64(ask_price - bid_price) / (toFloat64(ask_price + bid_price) / 2), ticker = 'NVDA' AND bid_price > 0 AND ask_price > bid_price) * 10000 AS nvda_bps,
           quantileExactIf(0.5)(toFloat64(ask_price - bid_price) / (toFloat64(ask_price + bid_price) / 2), ticker = 'SOXS' AND bid_price > 0 AND ask_price > bid_price) * 10000 AS soxs_bps
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('NVDA', 'SOXS')
      AND sip_timestamp >= toDateTime(today() - 10)
      AND sip_timestamp < toDateTime(today() - 3)
      AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
    GROUP BY et_date
),
whole AS (
    SELECT quantileExactIf(0.5)(toFloat64(ask_price - bid_price) / (toFloat64(ask_price + bid_price) / 2), ticker = 'NVDA' AND bid_price > 0 AND ask_price > bid_price) * 10000 AS nvda_bps,
           quantileExactIf(0.5)(toFloat64(ask_price - bid_price) / (toFloat64(ask_price + bid_price) / 2), ticker = 'SOXS' AND bid_price > 0 AND ask_price > bid_price) * 10000 AS soxs_bps
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('NVDA', 'SOXS')
      AND sip_timestamp >= toDateTime(today() - 10)
      AND sip_timestamp < toDateTime(today() - 3)
      AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
)
SELECT round((SELECT nvda_bps FROM whole), 2) AS nvda_spread_bps,
       round((SELECT soxs_bps FROM whole), 2) AS soxs_spread_bps,
       round((SELECT soxs_bps FROM whole) / (SELECT nvda_bps FROM whole), 1) AS times_wider,
       (SELECT count() FROM per_day) AS sessions_measured,
       round((SELECT min(soxs_bps / nvda_bps) FROM per_day), 1) AS smallest_daily_gap_x

NVDA's median quoted spread measured 1.03 bps. SOXS's measured 25.41 bps — 24.8 times wider. Across all 4 sessions in the window, the single-session gap never compressed below 22 times. The same pair sat at the extremes of July 7's semiconductor break — a session that measured this exact contrast tick by tick at its morning lows.

QueryNVDA vs SOXS — median quoted spread by session (bps of the midpoint)
The exact SQL behind every number
SELECT et_date,
       nvda_spread_bps,
       soxs_spread_bps,
       round(soxs_spread_bps / nvda_spread_bps, 1) AS times_wider
FROM (
    SELECT toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS et_date,
           round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price) / (toFloat64(ask_price + bid_price) / 2), ticker = 'NVDA' AND bid_price > 0 AND ask_price > bid_price) * 10000, 2) AS nvda_spread_bps,
           round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price) / (toFloat64(ask_price + bid_price) / 2), ticker = 'SOXS' AND bid_price > 0 AND ask_price > bid_price) * 10000, 2) AS soxs_spread_bps
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('NVDA', 'SOXS')
      AND sip_timestamp >= toDateTime(today() - 10)
      AND sip_timestamp < toDateTime(today() - 3)
      AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
    GROUP BY et_date
)
ORDER BY et_date

On 2026-06-29, the first session of the window, NVDA's median quote sat 1.03 bps wide against 24.36 bps for SOXS — 23.7 times the cost. The ordering never budges session to session: the cheap name stays cheap, the expensive one stays expensive. A name's rung on the cost ladder is a standing property, not a day's mood.

Why a cheap share costs more to trade than an expensive one

Part of the gap is market plumbing. US stocks and ETFs priced above $1 quote in one-cent increments, and one cent is the smallest gap a quote can show. A fixed penny is a different fraction of different share prices: barely visible against a $700 ETF, enormous against a $4 one. The table below measures how hard that floor binds — the share of each name's quote updates sitting at exactly one cent, what a penny equals in bps at that share price, and how far the median spread sits above the floor.

QueryThe one-cent floor — share price, percent of quotes exactly one cent wide, and what a penny costs in bps
The exact SQL behind every number
SELECT ticker,
       typical_share_price,
       pct_quotes_at_one_cent,
       round(100 / typical_share_price, 2) AS one_cent_in_bps,
       typical_spread_bps,
       round(abs(typical_spread_bps - 100 / typical_share_price), 2) AS dist_from_floor_bps
FROM (
    SELECT ticker,
           round(quantileExactIf(0.5)((toFloat64(ask_price) + toFloat64(bid_price)) / 2, bid_price > 0 AND ask_price > bid_price), 2) AS typical_share_price,
           round(100 * countIf(bid_price > 0 AND ask_price > bid_price AND abs(toFloat64(ask_price - bid_price) - 0.01) < 0.001) / countIf(bid_price > 0 AND ask_price > bid_price), 1) AS pct_quotes_at_one_cent,
           round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price) / (toFloat64(ask_price + bid_price) / 2), bid_price > 0 AND ask_price > bid_price) * 10000, 2) AS typical_spread_bps
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('SPY', 'AAPL', 'KO', 'F', 'SOXS')
      AND sip_timestamp >= toDateTime(today() - 10)
      AND sip_timestamp < toDateTime(today() - 3)
      AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
    GROUP BY ticker
)
ORDER BY typical_share_price DESC

SPY, trading near $743.88 a share, spends 21.5% of its updates exactly one cent wide — and for the priciest share on the board, a penny is just 0.13 bps. Mid-board, KO near $82.34 sits at the floor for 68.6% of updates. Then the floor takes over completely: F near $13.86 is one cent wide for 99.3% of updates, and SOXS near $3.94 for 99.9% — with median spreads within 0 and 0.03 bps of their one-cent floors. For the cheapest shares, the percentage cost of trading is the share price wearing a different unit: the quote cannot get narrower than a penny.

Keeping the toll down

  • Limit orders name the price. A market order takes whatever the quote shows; a limit order fills at the stated price or better. A buy resting at the bid collects the spread instead of paying it when a seller comes to meet it — the trade-off is that it may never fill.
  • The clock matters. Quoted spreads sit widest before the open, around the close, and in extended hours, and tightest through the liquid middle of the regular session — the intraday chart in our bid-ask spread guide shows the U-shape on real data.
  • Read basis points, not cents. The same penny is 0.13 bps on SPY and 25.38 bps on SOXS. A "tight" one-cent quote can be the most expensive line on the board.
  • Count the round trips. Each one pays the full quoted width once, and the toll scales with turnover, not with account size or intent. Activity gauges like relative volume measure when a name is trading far above its own normal — heavy-turnover habits are where spread costs quietly pile up.

FAQ

How much does it cost to trade a stock with zero commissions?

Half the quoted bid-ask spread on the way in and half on the way out. Measured across our twelve-name ladder, that round trip ranged from 0.27 bps of the trade's value (SPY) to 25.41 bps (SOXS) — roughly $0.27 to $25.41 per $10,000 traded.

What is a basis point in dollar terms?

One basis point is one hundredth of one percent: $1 per $10,000, $10 per $100,000. A spread quoted in bps doubles as a round-trip price per $10,000 — a hypothetical 20 bp spread costs about $20.

Why do leveraged ETFs have such wide spreads in percentage terms?

Low share prices meet the one-cent minimum quote increment. The cheapest name on our board, SOXS, traded near $3.94 with 99.9% of its quotes exactly one penny wide — and a penny on that share price is 25.38 bps of every trade.

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

Far less than for active traders. A single round trip at the ladder's top rung measured 0.27 bps — about $0.27 per $10,000 — and paying that once a decade is noise. The toll scales with turnover, not with holding period.

Is the spread the only trading cost left?

It is the per-trade toll every marketable order pays, and the one this page measures. Separate meters exist: large orders can move the price before they finish filling, funds charge expense ratios over time, and margin carries interest. None of those replaces the spread; they stack on top of it.


Every panel above carries the exact SQL that produced it — open one, swap in the tickers you actually trade, and price your own cost-to-trade ladder on the Strasmore terminal.