Pourquoi les spreads s'élargissent à l'ouverture
Analyse des données tick-by-tick sur l'élargissement des spreads à l'ouverture. Découvrez l'évolution de la prime de prix et le coût réel du premarket.
Les spreads sont plus larges à l'ouverture que durant presque toutes les autres phases de la session US régulière. Plus la capitalisation boursière est faible, plus l'écart est important. Dans la fenêtre glissante ci-dessous, la première demi-heure de trading présentait un bid-ask spread médian de 3.34x par rapport à celui de midi pour Etsy, une mid-cap, et de 2.02x pour Apple. Le SPY, le plus coté des trois, affichait un ratio agrégé de 1x ; cette ligne horizontale est un artefact dû à la grille de prix d'un centime et non à une ouverture libre. Cette page calcule cet intervalle à partir des cotations tick-by-tick.
Le coût du spread pour un ordre au marché
Chaque action affiche deux prix simultanément : le bid, la meilleure offre d'achat, et l'ask, la meilleure offre de vente. L'écart entre ces deux prix est le bid-ask spread. Un ordre au marché — qui s'exécute immédiatement au meilleur prix disponible — paie cet écart : l'achat s'effectue au prix de l'ask et la vente au prix du bid. La différence est perçue par le fournisseur de liquidité, généralement un market maker. Deux caractéristiques de ce spread sont importantes ici : il varie selon l'heure, avec une volatilité accrue en début de séance, et il progresse par paliers de centimes entiers. Ainsi, le spread minimal d'un ETF à cours élevé et celui d'une mid-cap beaucoup moins chère peut être identique, soit un penny.
L'évolution du spread : une structure, trois niveaux de liquidité
Le graphique suit trois niveaux de liquidité : le SPY, l'ETF S&P 500 ; Apple, une mega-cap ; Etsy, une mid-cap. Chaque mise à jour valide du NBBO — le meilleur bid et offer du marché affiché par votre courtier, détaillé dans notre explication du NBBO — sur une période récente de plusieurs jours est regroupée par intervalles de 30 minutes durant la session régulière. Le spread médian de chaque intervalle est divisé par le spread le plus serré de l'actif ; une valeur de 1 correspond au spread minimal de l'action.
Le SQL exact derrière chaque chiffre
SELECT et_time,
round(anyIf(rel, ticker = 'SPY'), 2) AS spy_x,
round(anyIf(rel, ticker = 'AAPL'), 2) AS aapl_x,
round(anyIf(rel, ticker = 'ETSY'), 2) AS etsy_x
FROM (
SELECT ticker,
et_time,
median_bps / min(median_bps) OVER (PARTITION BY ticker) AS rel
FROM (
SELECT ticker,
formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
quantileExact(0.5)(toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000) AS median_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
AND sip_timestamp >= toDateTime(today() - 14)
AND sip_timestamp < toDateTime(today() - 3)
AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
AND bid_price > 0
AND ask_price > bid_price
GROUP BY ticker, et_time
)
)
GROUP BY et_time
ORDER BY et_timeLes manuels décrivent le profil intraday comme un "U" : spread large à l'ouverture, serré à la mi-journée, et élargissement vers la clôture. Ici, la mesure ressemble à une pente de ski pour les titres dont le spread est volatil. Etsy a ouvert à 5.78x de son niveau le plus serré, est descendu à 2.99x à 10h30 et à 1.86x à l'heure du déjeuner ; Apple a ouvert à 3.04x. Pour ces trois titres, la demi-heure la plus serrée est la dernière — 1x, 1x, 1x — ainsi, l'élargissement du spread associé à la "clôture" concerne la session étendue, après la vente aux enchères de clôture.
La courbe du SPY est plate : 1x lors de l'ouverture, 1x au déjeuner. Son spread médian ne varie pas de la journée. Cela n'indique pas une absence de prime d'ouverture, mais illustre la granularité du tick size.
La grille du centime : où se cache la prime sur les titres les plus serrés
Le spread médian de SPY est de 2¢ à l'ouverture et de 2¢ à la mi-journée — ces deux valeurs sont identiques, la médiane n'indique donc aucune variation. La distribution en revanche est informative. Ce tableau comptabilise, par tranches de trente minutes, la part des mises à jour de cotations situées au minimum d'un centime.
Le SQL exact derrière chaque chiffre
SELECT et_time,
round(100 * countIf(ticker = 'SPY' AND spread_c <= 1.0001) / countIf(ticker = 'SPY'), 1) AS spy_pct_penny,
round(100 * countIf(ticker = 'AAPL' AND spread_c <= 1.0001) / countIf(ticker = 'AAPL'), 1) AS aapl_pct_penny,
round(100 * countIf(ticker = 'ETSY' AND spread_c <= 1.0001) / countIf(ticker = 'ETSY'), 1) AS etsy_pct_penny
FROM (
SELECT ticker,
formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
toFloat64(ask_price - bid_price) * 100 AS spread_c
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
AND sip_timestamp >= toDateTime(today() - 14)
AND sip_timestamp < toDateTime(today() - 3)
AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
AND bid_price > 0
AND ask_price > bid_price
)
GROUP BY et_time
ORDER BY et_timeSPY était au plancher d'un centime pour 20.7% de ses mises à jour lors de la première demi-heure, contre 43.1% lors de la dernière demi-heure ; Apple, 3.1% contre 30.6% ; Etsy, 0.2% contre 8.3%. Chaque titre s'éloigne davantage du plancher à l'ouverture qu'à la clôture, et la queue de distribution suit cette tendance : le spread au 90ème percentile de SPY était de 4¢ à l'ouverture contre 3¢ à la mi-jourée — soit 1.32x, alors que sa médiane affichait 1x. La prime est présente sur SPY ; la grille du centime est trop grossière pour qu'une médiane puisse la détecter.
Pourquoi les spreads s'élargissent-ils à l'ouverture ?
Trois conditions se conjuguent durant la première demi-heure d'ouverture, et aucune ne persiste jusqu'au déjeuner.
- L'accumulation de données de la nuit est déversée d'un coup. Entre la clôture de 16h00 et la mise en vente aux enchères d'ouverture du lendemain, dix-sept heures et demie d'informations s'accumulent — résultats, prévisions, sessions internationales — alors que la négociation continue est interrompue. Les premières cotations suivent le gap, et non la clôture précédente.
- La découverte des prix est toujours en cours. L'enchère compresse ce stock de données en un seul prix ; le marché passe ensuite plusieurs minutes à définir une fourchette autour de celui-ci. Les cotations se réajustent le plus rapidement durant cette phase de recherche.
- Le carnet d'ordres est encore en cours de remplissage. Le trading de pré-ouverture compte beaucoup moins de participants cotant, et l'ouverture de la séance ne réinitialise pas instantanément le carnet.
L'impact d'une suspension sur le timing
Une suspension est la forme extrême de ces mêmes mécanismes. Selon les règles LULD (limit up-limit down), une action dont le prix sort d'une bande autour de sa moyenne récente déclenche une pause de cinq minutes ; une place boursière peut aussi suspendre un titre en attendant une annonce. Pendant la suspension, il n'existe pas de cotation bid-ask pour croiser les ordres — le carnet unilatéral ou croisé affiché à l'écran n'est pas un marché négociable. La reprise des échanges s'effectue via une enchère de réouverture dont les premières cotations portent la charge de l'accumulation de données et de la découverte des prix d'une ouverture de 9h30, compressée en quelques minutes. Une action suspendue près de l'ouverture paie la prime deux fois.
Le premarket est un marché différent
La faible profondeur du carnet d'ordres est un facteur déterminant ; ce panel en évalue le coût — mêmes titres, même période, cinq phases de la journée, exprimé en points de base (bps), soit des centièmes de pourcent du cours de l'action, afin de permettre la comparaison de titres à des prix différents.
Le SQL exact derrière chaque chiffre
SELECT phase,
round(quantileExact(0.5)(spy_b), 2) AS spy_bps,
round(quantileExact(0.5)(aapl_b), 2) AS aapl_bps,
round(quantileExact(0.5)(etsy_b), 2) AS etsy_bps
FROM (
SELECT multiIf(et_min >= 240 AND et_min < 420, 'Premarket 04:00-07:00',
et_min >= 420 AND et_min < 570, 'Premarket 07:00-09:30',
et_min >= 570 AND et_min < 600, 'Open 09:30-10:00',
et_min >= 720 AND et_min < 840, 'Midday 12:00-14:00',
et_min >= 960 AND et_min < 1200, 'After-hours 16:00-20:00', 'other') AS phase,
if(ticker = 'SPY', spread_bps, NULL) AS spy_b,
if(ticker = 'AAPL', spread_bps, NULL) AS aapl_b,
if(ticker = 'ETSY', spread_bps, NULL) AS etsy_b
FROM (
SELECT ticker,
toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60
+ toMinute(toTimeZone(sip_timestamp, 'America/New_York')) AS et_min,
toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000 AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
AND sip_timestamp >= toDateTime(today() - 14)
AND sip_timestamp < toDateTime(today() - 3)
AND bid_price > 0
AND ask_price > bid_price
)
WHERE phase != 'other'
)
GROUP BY phase
ORDER BY indexOf(['Premarket 04:00-07:00', 'Premarket 07:00-09:30', 'Open 09:30-10:00', 'Midday 12:00-14:00', 'After-hours 16:00-20:00'], phase)Le premarket n'est pas une séance d'ouverture de moindre qualité ; c'est un marché différent. Le spread médian coté pour Etsy était de 306.25 bps entre 4h00 et 7h00 ET et de 307.57 bps de 7h00 jusqu'à l'ouverture, contre 30.79 bps durant la première demi-heure d'ouverture et 9.21 bps à la mi-journée — il s'agit de points de pourcentage du prix, et non de centimes. Apple affichait 9.82 bps tôt le matin contre 0.96 bps à la mi-journée ; même le SPY a vu son spread s'élargir à 0.8 bps contre 0.27 bps. Après la clôture de 16h00, l'écart se réduit — 240.45 bps pour Etsy, 6.99 bps pour Apple.
Le coût en centimes : ouverture vs midi
Les coûts s'expriment en centimes. Le tableau compare les mêmes actifs : le spread médian sur la première demi-heure (9h30–10h00 ET) par rapport à la période de midi (12h00–14h00 ET), le 90e percentile des quotes pour chaque période, le nombre de mises à jour des quotes, et les quotes unilatérales, bloquées ou croisées exclues.
Le SQL exact derrière chaque chiffre
SELECT ticker,
round(countIf(isNotNull(spread_cents)) / 1e6, 2) AS valid_updates_m,
round(quantileExactIf(0.5)(spread_cents, clock_min BETWEEN 810 AND 839), 2) AS open30_cents,
round(quantileExactIf(0.5)(spread_cents, clock_min BETWEEN 960 AND 1079), 2) AS midday_cents,
round(quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 810 AND 839), 2) AS open30_bps,
round(quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 960 AND 1079), 2) AS midday_bps,
round(quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 810 AND 839)
/ quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 960 AND 1079), 2) AS open_vs_midday_x,
round(quantileExactIf(0.9)(spread_cents, clock_min BETWEEN 810 AND 839), 2) AS open30_p90_cents,
round(quantileExactIf(0.9)(spread_cents, clock_min BETWEEN 960 AND 1079), 2) AS midday_p90_cents,
round(quantileExactIf(0.9)(spread_bps, clock_min BETWEEN 810 AND 839), 2) AS open30_p90_bps,
round(quantileExactIf(0.9)(spread_bps, clock_min BETWEEN 810 AND 839)
/ quantileExactIf(0.9)(spread_bps, clock_min BETWEEN 960 AND 1079), 2) AS p90_x,
toString(countIf(isNull(spread_cents))) AS dropped_onesided_locked_crossed
FROM (
SELECT ticker,
toHour(sip_timestamp) * 60 + toMinute(sip_timestamp) AS clock_min,
if(bid_price > 0 AND ask_price > bid_price, toFloat64(ask_price - bid_price) * 100, NULL) AS spread_cents,
if(bid_price > 0 AND ask_price > bid_price, toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, NULL) AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
AND sip_timestamp >= toDateTime(today() - 14)
AND sip_timestamp < toDateTime(today() - 3)
AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
)
GROUP BY ticker
ORDER BY indexOf(['SPY', 'AAPL', 'ETSY'], ticker)Le coût en centimes par action est identique au coût en dollars pour 100 actions ; le tableau présente donc une facture : un aller-retour sur 100 actions d'Etsy au quote médian à l'ouverture coûte $24 contre $7 aux quotes de midi ; pour Apple, $6 contre $3. Le spread augmente lorsque la liquidité diminue — 1x pour SPY, 2.02x pour Apple, 3.34x pour Etsy, dont les 0.19 millions de mises à jour de quotes ne représentent qu'une fraction des 8.97 millions d'Apple. La volatilité l'emporte sur l'horaire : la première demi-heure de SPY, 0.27 bps, est plus serrée que la période de midi la plus calme d'Etsy (9.21 bps), dont l'ouverture au pire décile s'élevait à 75.67 bps.
La prime est-elle présente à chaque session ?
Regrouper les cotations par médiane permet de répondre à une question sur la période, et non sur une matinée spécifique. Ce panel recalcule le ratio entre l'ouverture et le milieu de journée session par session : la session typique, la plus calme, la plus volatile, et le titre dont l'écart à l'ouverture était le plus large.
Le SQL exact derrière chaque chiffre
SELECT ticker,
count() AS sessions,
round(quantileExact(0.5)(ratio), 2) AS median_session_x,
round(min(ratio), 2) AS calmest_session_x,
round(max(ratio), 2) AS worst_session_x,
round(100 * countIf(ratio > 1) / count(), 0) AS pct_sessions_open_wider
FROM (
SELECT ticker,
toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS session_date,
quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 810 AND 839)
/ quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 960 AND 1079) AS ratio
FROM (
SELECT ticker,
sip_timestamp,
toHour(sip_timestamp) * 60 + toMinute(sip_timestamp) AS clock_min,
toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000 AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
AND sip_timestamp >= toDateTime(today() - 14)
AND sip_timestamp < toDateTime(today() - 3)
AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
AND bid_price > 0
AND ask_price > bid_price
)
GROUP BY ticker, session_date
HAVING countIf(clock_min BETWEEN 810 AND 839) > 0
AND countIf(clock_min BETWEEN 960 AND 1079) > 0
)
GROUP BY ticker
ORDER BY indexOf(['SPY', 'AAPL', 'ETSY'], ticker)Sur 7 sessions, l'écart à l'ouverture était plus large qu'à la mi-journée pour 71% des SPY, 100% des Apple et 100% des Etsy. La prime de la session typique est de 1x pour le SPY — pour le titre le plus liquide du marché, le spread reste extrêmement serré — contre 2.03x pour Apple et 3.29x pour Etsy, où la prime est manifeste. La dispersion est la clé : la matinée la plus calme d'Etsy s'est ouverte à 2.08x son niveau de mi-journée, et la plus volatile à 4.5x. Une prime à l'ouverture est une moyenne et une valeur extrême, jamais une garantie pour l'ouverture de demain à 9h31.
A stress test: the MU morning of July 7, 2026
Rolling windows smooth away single mornings, so here is one pinned: Micron on Tuesday, July 7, 2026, inside the semiconductor break that day's recap walks through.
Le SQL exact derrière chaque chiffre
WITH prev AS (
SELECT argMax(toFloat64(close), window_start) AS prev_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MU'
AND window_start >= '2026-07-06 13:30:00'
AND window_start < '2026-07-06 20:00:00'
),
day AS (
SELECT argMin(toFloat64(open), window_start) AS day_open
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MU'
AND window_start >= '2026-07-07 13:30:00'
AND window_start < '2026-07-07 20:00:00'
)
SELECT round((SELECT prev_close FROM prev), 2) AS prior_close,
round((SELECT day_open FROM day), 2) AS jul7_open,
round(((SELECT day_open FROM day) - (SELECT prev_close FROM prev)) / (SELECT prev_close FROM prev) * 100, 1) AS overnight_gap_pctMU closed at $984.31 and opened at $923.01 — an overnight gap of -6.2%. Its spread clock that day:
Le SQL exact derrière chaque chiffre
SELECT et_time,
median_spread_cents,
median_spread_bps,
round(100 * median_spread_cents / max(median_spread_cents) OVER (), 1) AS pct_of_widest,
dropped_onesided_locked_crossed
FROM (
SELECT formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price) * 100, bid_price > 0 AND ask_price > bid_price), 1) AS median_spread_cents,
round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price > bid_price), 1) AS median_spread_bps,
toString(countIf(NOT (bid_price > 0 AND ask_price > bid_price))) AS dropped_onesided_locked_crossed
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'MU'
AND sip_timestamp >= '2026-07-07 13:30:00'
AND sip_timestamp < '2026-07-07 20:00:00'
GROUP BY et_time
)
ORDER BY et_timeThe clock kept time. MU's opening half hour ran a median spread of 62¢ — 6.7 bps on a stock opening at $923.01 — the widest half-hour bucket of its session. One bucket later the median was 45¢, then 39¢ at noon and 38¢ in the last half hour. The premium arrived on schedule — and the liquidity tier still ruled: even here MU stayed tighter in percentage terms than Etsy's ordinary open (30.79 bps).
::: Data notes: window, filters, method
The SPY/Apple/Etsy panels roll: eleven calendar days of NBBO updates ending three days before the last refresh (clear of the feed's ingest lag). The regular-hours panels cut the session with a UTC minute-of-day filter on the summer (EDT) clock; the guard below checks it still lands on a 9:30 a.m. ET start at both ends of the window (570 is 9:30 a.m.) — on the winter clock it trips and holds the page for rework. The phases panel converts to the Eastern clock directly, covering 4:00 a.m.–8:00 p.m. ET either way. One-sided (zero bid or ask) and locked or crossed (bid at or above ask) quotes are excluded throughout; session stability keeps only sessions quoting in BOTH windows. Medians and 90th percentiles are exact; the MU panels are pinned to July 6–7, 2026.
Le SQL exact derrière chaque chiffre
SELECT toHour(toTimeZone(toDateTime(today() - 14) + toIntervalMinute(810), 'America/New_York')) * 60
+ toMinute(toTimeZone(toDateTime(today() - 14) + toIntervalMinute(810), 'America/New_York')) AS win_start_et_min,
toHour(toTimeZone(toDateTime(today() - 4) + toIntervalMinute(810), 'America/New_York')) * 60
+ toMinute(toTimeZone(toDateTime(today() - 4) + toIntervalMinute(810), 'America/New_York')) AS win_end_et_min:::
FAQ
What time of day are bid-ask spreads widest?
Premarket — Etsy's median quoted spread measured 306.25 bps between 4:00 and 7:00 a.m. ET against 9.21 bps midday. Inside regular hours the widest stretch is the first half hour after the open; the tightest, the last before the close.
Why does SPY's spread look flat at the open?
US stocks are quoted in whole cents, and SPY's median spread sits at 2¢ most of the day — too coarse a grid to register a small widening. Session by session its open still ran wider than its midday in 71% of sessions, and its 90th-percentile opening spread measured 4¢ against 3¢.
Is it bad to place a market order at the open?
It is among the most expensive stretches of the regular session for demanding immediacy — $24 against $7 on a 100-share Etsy round trip in the window above. A limit order caps that cost, at the risk of not filling, and an order that can wait may cross a narrower gap: Etsy's premium fell from 5.78x to 2.99x within an hour.
Do spreads widen again at the close?
Not within regular hours — the final half-hour bucket was the tightest of the day on all three names. That widening arrives after the 4:00 p.m. bell, in the thinner extended session: Apple quoted 6.99 bps there against 0.96 bps midday.
Do options spreads widen at the open too?
The panels here measure equity quotes only and claim nothing about options. The mechanics point the same way — an option's quote depends on the underlying stock's price, least settled in the first minutes — and our options-cost breakdown measures option spreads directly.
Every panel carries the SQL that produced it — swap in a ticker you trade and time its spread clock on the Strasmore terminal.