spreads_berliner_stunden
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-10-01, from us-market-volume-by-hour-german-time.
| berlin_time | spread_aapl_bps | spread_ko_bps | aufschlag_faktor_aapl | rang_breite |
|---|---|---|---|---|
| 15:30-16:30 | 1.79 | 2.26 | 1.99 | 1 |
| 16:30-17:30 | 1.2 | 1.13 | 1.33 | 4 |
| 17:30-18:30 | 1.2 | 1.13 | 1.33 | 3 |
| 18:30-19:30 | 0.9 | 1.13 | 1 | 6 |
| 19:30-20:30 | 0.9 | 1.13 | 1 | 7 |
| 20:30-21:30 | 1.5 | 1.13 | 1.67 | 2 |
| 21:30-22:00 | 0.9 | 1.14 | 1 | 5 |
- Rows × columns
- 7 × 5
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
berlin_time |
text | 7 distinct values (15:30-16:30, 16:30-17:30, 17:30-18:30…) | |
spread_aapl_bps |
number | 0.9 to 1.79 | |
spread_ko_bps |
number | 1.13 to 2.26 | |
aufschlag_faktor_aapl |
number | 1 to 1.99 | |
rang_breite |
number | 1 to 7 |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
SELECT
berlin_time,
spread_aapl_bps,
spread_ko_bps,
round(spread_aapl_bps / min(spread_aapl_bps) OVER (), 2) AS aufschlag_faktor_aapl,
row_number() OVER (ORDER BY spread_aapl_bps DESC) AS rang_breite
FROM
(
SELECT
intDiv(berlin_minute - 930, 60) AS bucket,
concat(
leftPad(toString(intDiv(930 + 60 * bucket, 60)), 2, '0'), ':',
leftPad(toString(modulo(930 + 60 * bucket, 60)), 2, '0'), '-',
leftPad(toString(intDiv(least(990 + 60 * bucket, 1320), 60)), 2, '0'), ':',
leftPad(toString(modulo(least(990 + 60 * bucket, 1320), 60)), 2, '0')
) AS berlin_time,
round(quantileDeterministicIf(0.5)(spread_bps, sequence_number, ticker = 'AAPL'), 2) AS spread_aapl_bps,
round(quantileDeterministicIf(0.5)(spread_bps, sequence_number, ticker = 'KO'), 2) AS spread_ko_bps
FROM
(
SELECT
ticker,
toUInt64(sequence_number) AS sequence_number,
toHour(toTimeZone(sip_timestamp, 'Europe/Berlin')) * 60
+ toMinute(toTimeZone(sip_timestamp, 'Europe/Berlin')) AS berlin_minute,
10000 * (toFloat64(ask_price) - toFloat64(bid_price))
/ (0.5 * (toFloat64(ask_price) + toFloat64(bid_price))) AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('AAPL', 'KO')
AND sip_timestamp >= '2026-09-16 13:30:00'
AND sip_timestamp < '2026-09-16 20:00:00'
AND bid_price > 0
AND ask_price > bid_price
)
WHERE berlin_minute >= 930 AND berlin_minute < 1320
GROUP BY bucket, berlin_time
HAVING countIf(ticker = 'AAPL') > 0 AND countIf(ticker = 'KO') > 0
)
ORDER BY bucket
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.