Analisi microstructure 29 giugno 2026
Analisi tecnica del tape e delle quote: correzioni volume tramite dictionary e analisi dei file FINRA con dati su trade e aggiornamenti NBBO.
Questo è il documento tecnico di approfondimento relativo a il riepilogo di mercato del 29 giugno 2026: il flusso di dati grezzi sotto le candele a un minuto — 156.1 milioni di singoli trade e 505.38 milioni di aggiornamenti NBBO quote in una normale sessione di lunedì. Ogni numero è il risultato di una query salvata (espandere ogni pannello per il codice SQL esatto), e le due scoperte forensi della giornata ricevono un'analisi completa: una correzione del volume richiesta dal dizionario del codice del tape, e un file del vendor che si interrompe senza preavviso alla lettera S.
Il tape delle negoziazioni, operazione per operazione
Il controllo della sessione avviene per primo, mai per assunzione: il calendario delle festività della borsa contiene 0 righe per il 29 giugno 2026, e SPY ha registrato esattamente 390 candele da un minuto all'interno della finestra regolare — una sessione completa, dalle 9:30 alle 16:00 ora di New York. Durante la sessione estesa, il tape consolidato ha registrato 156.1 milioni di singoli trade.
L'esatto SQL dietro ogni numero
WITH
(SELECT count() FROM global_markets.stocks_market_holidays WHERE date = '2026-06-29') AS holiday_rows,
(
SELECT countIf(window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00')
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2026-06-29 00:00:00' AND window_start < '2026-06-30 00:00:00'
) AS spy_bars
SELECT
holiday_rows AS holiday_rows_jun29,
spy_bars AS spy_regular_session_bars,
round(count() / 1e6, 1) AS trades_m,
round(100.0 * countIf(size < 100) / count(), 2) AS odd_lot_pct_of_trades,
round(100.0 * toFloat64(sumIf(size, size < 100)) / toFloat64(sum(size)), 2) AS odd_lot_pct_of_shares,
multiIf(
countIf(size <= 19) >= 0.5 * count(), 19,
countIf(size <= 20) >= 0.5 * count(), 20,
countIf(size <= 21) >= 0.5 * count(), 21,
countIf(size <= 22) >= 0.5 * count(), 22,
countIf(size <= 23) >= 0.5 * count(), 23,
0) AS median_print_shares,
round(countIf(size = 1) / 1e6, 1) AS one_share_trades_m,
round(100.0 * countIf(size != round(size)) / count(), 2) AS fractional_pct_of_trades
FROM global_markets.stocks_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'72.61% di tutti i print erano odd lots — ovvero trade inferiori a 100 share — ma hanno movimentato solo il 8.79% delle share grezze — il totale non corretto che la sezione di analisi del volume sottostante riduce. Il print mediano è stato di 21 share, misurato con una sonda a parentesi auto-verificante — conteggi cumulativi da 19 a 23 share — che restituisce 0 se la parentesi manca, ed è limitata in modo che una mancanza mantenga il valore successivo. 17.9 milioni di print erano per esattamente una share e 4.73% presentavano frazioni — un pattern coerente con le app retail che colpiscono il tape una frazione alla volta, con market maker che prendono la controparte.
Analisi dei volumi: derivare il "matched volume" dal dictionary
Sommando il campo size di ogni print, il 29 giugno risulta uno scambio di 24.79 miliardi di azioni. Quel dato è errato, e lo stesso tape lo conferma. Ogni print contiene codici di condizione e il SIP — il Securities Information Processor che consolida ogni venue in un unico stream — pubblica un dictionary che indica, codice per codice, se un print aggiorna il volume consolidato. Alcuni messaggi sono re-broadcast amministrativi di volumi già conteggiati. Invece di inserire manualmente una lista di codici "noti", questo post deriva l'insieme delle esclusioni dal dictionary stesso:
L'esatto SQL dietro ogni numero
SELECT
count() AS excluded_codes,
sum(id) AS excluded_id_checksum,
arrayStringConcat(arraySort(groupArray(concat(toString(id), ' ', name))), ' · ') AS codes
FROM global_markets.stocks_condition_codes
WHERE asset_class = 'stocks'
AND type = 'sale_condition'
AND JSONExtractBool(update_rules, 'consolidated', 'updates_volume') = 03 condizioni di vendita riportano updates_volume = false sul feed consolidato: 15 Market Center Official Close · 16 Market Center Official Open · 38 Corrected Consolidated Close (per listing market). Ecco la lezione appresa: una versione precedente del recap giornaliero conteneva i codici 15 e 16 hardcoded — i due messaggi ufficiali di open/close citati in ogni guida ai dati — e ometteva completamente il codice 38. Il dictionary, e non una lista di codici memorizzata, è la fonte di verità.
L'uso di due blocchi è intenzionale: una scalar subquery sul dictionary all'interno di uno scan da 156.1 milioni di righe supera il nostro limite di 30 secondi. Pertanto, il blocco sopra deriva l'insieme come un'unica riga — con limiti di controllo sul numero di codici e un id checksum (69) — e il blocco sotto applica i letterali derivati. Se il dictionary dovesse cambiare, il checksum segnalerà la necessità di revisionare questo post; i letterali non diventeranno mai obsoleti senza che ce ne accorgiamo.
L'esatto SQL dietro ogni numero
SELECT
round(toFloat64(sum(size)) / 1e9, 2) AS raw_shares_bn,
round(toFloat64(sumIf(size, NOT hasAny(conditions, [15, 16, 38]))) / 1e9, 2) AS matched_shares_bn,
round(toFloat64(sumIf(size, hasAny(conditions, [15, 16, 38]))) / 1e9, 2) AS excluded_shares_bn,
countIf(hasAny(conditions, [15, 16, 38])) AS excluded_prints
FROM global_markets.stocks_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'Il conteggio corretto: 24.79 miliardi di azioni raw, 20.66 miliardi contati dal SIP, 4.13 miliardi esclusi su 91175 print amministrativi. Una sola definizione, espressa con precisione: "matched volume" indica il volume che le regole di condizione del SIP sommano al totale consolidato — nient'altro. Non stiamo valutando quali trade siano economicamente significativi; stiamo applicando la contabilità del tape.
Analisi dei volumi principali
I volumi più elevati della giornata indicano quando i codici di condizione diventano rilevanti:
L'esatto SQL dietro ogni numero
SELECT
ticker,
formatDateTime(toTimeZone(sip_timestamp, 'America/New_York'), '%H:%i:%S') AS et_time,
round(toFloat64(size) / 1e6, 2) AS shares_m,
toFloat64(price) AS price,
round(toFloat64(size) * toFloat64(price) / 1e6, 1) AS notional_usd_m,
round(100 * (toFloat64(size) * toFloat64(price)) / max(toFloat64(size) * toFloat64(price)) OVER (), 1) AS pct_of_biggest_dollar_print,
arrayStringConcat(arrayMap(c -> toString(c), conditions), ', ') AS condition_id
FROM global_markets.stocks_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
AND size >= 10000000
AND NOT hasAny(conditions, [15, 16, 38])
ORDER BY size DESC
LIMIT 10Considerate le prime righe come un esempio pratico. Il maggior volume della giornata — 61.69 milioni di azioni CAG (Conagra) a $13.98, per circa $862.5 milioni, registrato alle 16:04:53 ET con codici 8, 41 (8 Closing Prints, 41 Trade Thru Exempt) — è il risultato dell'auction di chiusura NYSE pubblicato dopo le 16:00. Viene conteggiato nel volume una sola volta. Le stesse 61.69 milioni di azioni riappaiono poi sotto il codice 15, Market Center Official Close: una ricollegazione che il dizionario esclude e che fa parte dei 4.13 miliardi rimossi sopra. La riga con codice 15 è esclusa intenzionalmente dalla tabella precedente, pertanto la sua ricezione ha un proprio pannello dedicato:
L'esatto SQL dietro ogni numero
SELECT
round(toFloat64(maxIf(size, has(conditions, 8))) / 1e6, 2) AS auction_print_shares_m,
round(toFloat64(maxIf(size, has(conditions, 15))) / 1e6, 2) AS official_close_reprint_shares_m,
round(toFloat64(maxIf(size, has(conditions, 8))) - toFloat64(maxIf(size, has(conditions, 15))), 2) AS share_difference,
formatDateTime(toTimeZone(argMaxIf(sip_timestamp, size, has(conditions, 15)), 'America/New_York'), '%H:%i:%S') AS reprint_et,
argMaxIf(exchange, size, has(conditions, 15)) AS reprint_exchange_id,
countIf(has(conditions, 15)) AS cag_code15_prints
FROM global_markets.stocks_trades
WHERE ticker = 'CAG'
AND sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'Il maggiore tra i 6 messaggi di chiusura ufficiale su CAG riguarda 61.69 milioni di azioni — esattamente i 61.69 milioni dell'auction (differenza: 0) — registrato alle 16:04:53 ET dall'id exchange 10, NYSE nella directory delle azioni: il mercato di quotazione che riafferma la propria auction.
Le altre CAG righe sono diverse — il print da 15.17 milioni di azioni sotto i codici 12, 2 (12 Form T / extended hours, 2 Average Price Trade) e altre due sotto il codice 12 sono print post-auction riportati tramite FINRA i cui codici presentano updates_volume = true. Il SIP li considera print reali, così come il nostro dato accoppiato.
In altri punti, il codice 9 indica le chiusure Nasdaq — la chiusura da $3389.5 milioni di NVDA è il print più grande della tabella per valore monetario — e i codici sul print SNAP (53, 41) includono il 53, un Qualified Contingent Trade.
L'orologio: dieci minuti dominano la giornata
A risoluzione al minuto, il nastro delle negoziazioni si concentra quasi interamente agli estremi della sessione:
L'esatto SQL dietro ogni numero
SELECT
formatDateTime(toTimeZone(toStartOfMinute(sip_timestamp), 'America/New_York'), '%H:%i') AS et_minute,
round(count() / 1e6, 2) AS trades_m
FROM global_markets.stocks_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
GROUP BY et_minute
ORDER BY trades_m DESC
LIMIT 10Il minuto 15:59 ET ha registrato 3.98 milioni di trade — oltre sessantamila al secondo. Determinare se il resto della top ten si concentri sull'apertura e sulla chiusura richiede una singola misurazione:
L'esatto SQL dietro ogni numero
SELECT
countIf(NOT (et_minute BETWEEN '09:30' AND '09:39' OR et_minute BETWEEN '15:50' AND '16:00')) AS entries_outside_open_close,
countIf(et_minute BETWEEN '09:30' AND '09:39' OR et_minute BETWEEN '15:50' AND '16:00') AS entries_in_open_close,
maxIf(et_minute, NOT (et_minute BETWEEN '09:30' AND '09:39' OR et_minute BETWEEN '15:50' AND '16:00')) AS outside_entry_minute,
maxIf(trades_m, NOT (et_minute BETWEEN '09:30' AND '09:39' OR et_minute BETWEEN '15:50' AND '16:00')) AS outside_entry_trades_m
FROM (
SELECT
formatDateTime(toTimeZone(toStartOfMinute(sip_timestamp), 'America/New_York'), '%H:%i') AS et_minute,
round(count() / 1e6, 2) AS trades_m
FROM global_markets.stocks_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
GROUP BY et_minute
ORDER BY trades_m DESC
LIMIT 10
)9 dei dieci si trovano nei dieci minuti di apertura o nei dieci minuti finali prima della chiusura. L'unica eccezione — 10:15 ET, con un picco di 0.88 milioni di operazioni — è una vera anomalia di metà mattina; la causa non è determinabile da questi dati e non la inventeremo. Lo stesso orario compare sotto.
Il flusso delle quotazioni: mezzo miliardo di aggiornamenti
Il National Best Bid and Offer — il miglior prezzo di acquisto e vendita su ogni exchange, ripubblicato ad ogni variazione — ha registrato 505.38 milioni di aggiornamenti il 29 giugno, a fronte di 156.1 milioni di trade.
L'esatto SQL dietro ogni numero
WITH
(
SELECT (round(countIf(ticker = 'QQQ') / 1e6, 2), round(countIf(ticker = 'NVDA') / 1e6, 2),
round(countIf(ticker = 'AAPL') / 1e6, 2), round(countIf(ticker = 'TSLA') / 1e6, 2))
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('QQQ', 'NVDA', 'AAPL', 'TSLA')
AND sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
) AS pinned
SELECT
round(count() / 1e6, 2) AS updates_m,
pinned.1 AS qqq_updates_m,
pinned.2 AS nvda_updates_m,
round(pinned.1 - pinned.2, 2) AS qqq_minus_nvda_updates_m,
round(pinned.2 - greatest(pinned.3, pinned.4), 2) AS nvda_minus_next_single_m
FROM global_markets.cache_stocks_quotes
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'I prodotti indicizzati dominano le quotazioni: solo QQQ ha registrato 5.23 milioni di aggiornamenti rispetto ai 1.8 milioni di NVDA, il titolo singolo più quotato tra quelli analizzati — 0.67 milioni di aggiornamenti di vantaggio rispetto al secondo titolo della lista. Un censimento completo per ogni ticker non rientra nel limite di 30 secondi, pertanto la classifica sottostante è un set verificato e non un ranking esaustivo:
L'esatto SQL dietro ogni numero
SELECT ticker, round(count() / 1e6, 2) AS updates_m
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('QQQ', 'SPY', 'TQQQ', 'IWM', 'SQQQ', 'NVDA', 'AAPL', 'TSLA')
AND sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
GROUP BY ticker
ORDER BY updates_m DESCQQQ ha guidato il set verificato con 5.23 milioni di aggiornamenti; la parte alta della classifica è composta da fondi indicizzati e dai relativi prodotti leveraged, non da titoli comuni.
SPY sotto la lente: ricevute al nanosecondo e lo spread in due modi
L'esatto SQL dietro ogni numero
WITH
(
SELECT (formatDateTime(toTimeZone(toStartOfSecond(sip_timestamp), 'America/New_York'), '%H:%i:%S'), count())
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'SPY' AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 20:00:00'
GROUP BY toStartOfSecond(sip_timestamp)
ORDER BY count() DESC, toStartOfSecond(sip_timestamp) ASC
LIMIT 1
) AS busiest_sec,
ordered AS (
SELECT
toFloat64(ask_price - bid_price) AS spread,
bid_price,
ask_price,
toFloat64(sip_timestamp - lagInFrame(sip_timestamp) OVER (ORDER BY sip_timestamp, sequence_number)) AS gap_s,
greatest(toFloat64(least(leadInFrame(sip_timestamp, 1, toDateTime64('2026-06-29 20:00:00', 9)) OVER (ORDER BY sip_timestamp, sequence_number ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING), toDateTime64('2026-06-29 20:00:00', 9)) - sip_timestamp), 0) AS dwell_s,
rowNumberInAllBlocks() AS rn
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'SPY' AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 20:00:00'
)
SELECT
round(count() / 1e6, 2) AS spy_updates_m,
busiest_sec.1 AS busiest_second_et,
toUInt8(startsWith(busiest_sec.1, '10:15')) AS busiest_second_in_1015,
busiest_sec.2 AS busiest_second_updates,
round(minIf(gap_s, rn > 0 AND gap_s > 0) * 1e9) AS min_gap_between_updates_ns,
round(quantileExactIf(0.5)(gap_s, rn > 0) * 1e6, 1) AS median_gap_us,
countIf(rn > 0 AND gap_s = 0) AS identical_timestamp_pairs,
round(sumIf(spread * dwell_s, bid_price > 0 AND ask_price >= bid_price) / sumIf(dwell_s, bid_price > 0 AND ask_price >= bid_price) * 100, 2) AS time_weighted_avg_spread_cents,
round(avgIf(spread, bid_price > 0 AND ask_price >= bid_price) * 100, 2) AS per_update_avg_spread_cents,
round((avgIf(spread, bid_price > 0 AND ask_price >= bid_price) - sumIf(spread * dwell_s, bid_price > 0 AND ask_price >= bid_price) / sumIf(dwell_s, bid_price > 0 AND ask_price >= bid_price)) * 100, 2) AS per_update_premium_cents,
countIf(bid_price > 0 AND ask_price > 0 AND ask_price < bid_price) AS crossed_updates,
countIf(bid_price <= 0 OR ask_price <= 0) AS zero_bid_or_ask_updates
FROM orderedIl prezzo di SPY è cambiato 3.98 milioni di volte solo durante l'orario regolare. Il secondo più intenso — 10:15:43 ET, all'interno del 10:15 minuto indicato sopra — ha registrato 1461 aggiornamenti. Il gap minimo tra aggiornamenti consecutivi è stato di 1375 nanosecondi, la mediana di 245.6 microsecondi, e 75138 coppie consecutive presentavano lo stesso timestamp in nanosecondi — nemmeno la risoluzione al nanosecondo può ordinare completamente il moderno tape.
Quei nanosecondi servono a misurare il bid-ask spread. Contando ogni aggiornamento in modo uniforme, lo spread medio di SPY è stato di 2.72 centesimi; ponderando ogni quotazione in base alla sua durata, lo spread è stato di 2.34 centesimi. Il valore per singolo aggiornamento risulta meccanicamente più ampio di 0.38 centesimi: gli aggiornamenti si concentrano proprio nei momenti in cui lo spread è ampio e in movimento, mentre un ordine passivo viene misurato in tempo cronologico. Ogni volta che si analizza una statistica sullo spread, bisogna verificare quale orologio sia stato utilizzato per la misurazione. I dati del censimento sono espliciti, non nascosti: 1544 aggiornamenti durante l'orario regolare hanno subito un crossing (l'ask era inferiore al bid, a causa dell'intercalazione di quotazioni provenienti da diverse venue) e 0 presentavano un bid o un ask pari a zero; le statistiche sullo spread escludono entrambi i casi e contano ciò che viene escluso.
Lo spread segue un ciclo temporale
Suddividere lo spread quotato di SPY in intervalli di mezz'ora trasforma la microstruttura in una curva utilizzabile da ogni trader:
L'esatto SQL dietro ogni numero
SELECT
formatDateTime(toTimeZone(toStartOfInterval(sip_timestamp, INTERVAL 30 MINUTE), 'America/New_York'), '%H:%i') AS et_time,
round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price), bid_price > 0 AND ask_price >= bid_price) * 100, 1) AS median_spread_cents,
count() AS quote_updates
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'SPY' AND sip_timestamp >= '2026-06-29 08:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
GROUP BY et_time
ORDER BY et_timeUna mediana di 8 centesimi nel bucket premarket delle 04:00, 3 centesimi nel bucket di apertura delle 09:30 e 2 centesimi entro le 14:00 — scambiare la stessa azione all'apertura del premarket costa circa quattro volte lo spread di un ordine nel primo pomeriggio. Lo spread non è costante; è un programma prestabilito.
Analisi forense: il file che si è fermato alla S
Ogni file giornaliero dei vendor viene sottoposto a un controllo di completezza prima della pubblicazione di qualsiasi dato: contiamo i ticker, verifichiamo l'intervallo alfabetico e confrontiamo i dati con i giorni precedenti. Il file FINRA relativo al volume short off-exchange del 29 giugno spiega il motivo di tale procedura:
L'esatto SQL dietro ogni numero
SELECT
date,
uniqExact(ticker) AS tickers,
min(ticker) AS first_ticker,
max(ticker) AS last_ticker,
countIf(ticker = 'TSLA') AS tsla_rows,
round(100 * sum(short_volume) / sum(total_volume), 2) AS short_pct_of_reported
FROM global_markets.stocks_short_volume
WHERE date BETWEEN '2026-06-26' AND '2026-06-30'
GROUP BY date
ORDER BY dateIl file del 26 giugno copre 15052 ticker, da A a ZYME. Il file del 29 giugno copre 5489, da A a SSUS — si interrompe semplicemente a metà della sezione dei nomi che iniziano con la S. Ogni ticker in ordine alfabetico dopo quel punto — incluso TSLA, con 0 righe per il 29 giugno contro 1 del 26 giugno — risulta mancante; entro il 30 giugno il file torna a coprire 15362 ticker. Un controllo di completezza non è altro che una verifica simile a questa ricevuta di una riga al giorno: la differenza tra pubblicare una statistica e pubblicare un artefatto.
Con questa precisazione — e solo con essa — ecco il rapporto: il volume marked-short corrisponde al 45.85% del volume off-exchange riportato il 29 giugno, rispetto al 46.89% del 26 giugno e al 48.82% del 30 giugno. Il dato del 29 giugno copre solo la sezione dalla A alla S, pertanto va considerato come un dato parziale. Una quota short vicina alla metà è il livello standard mostrato da ogni sessione limitrofa — e il volume short giornaliero non è short interest.
Note sui dati
Note complete sui dati
- Il calo delle quotazioni tra le 17:00 e le 18:00. Il flusso di quotazioni di SPY si interrompe quasi completamente nella mezz'ora ET 17:00 (233) e riprende entro le 18:00 (40608) — si tratta di un pattern di sessione/feed cross-ticker, non di dati mancanti.
- Le frazioni di azioni sono diffuse. Il 4.73% delle operazioni presenta dimensioni non intere; il volume deve essere sommato come decimale.
- Il dizionario dei codici riutilizza gli id tra diverse tipologie. L'id 15 rappresenta sia una condizione di vendita (Market Center Official Close) sia una condizione di quotazione (Closed); ogni query del dizionario qui presente filtra per asset_class = 'stocks' AND type = 'sale_condition'. Una ricerca diretta per id causa errori di etichettatura dei codici.
- Le esclusioni sulla qualità delle quotazioni sono conteggiate in linea. I conteggi per i prezzi incrociati (crossed) e per bid/ask pari a zero sono presenti nel pannello microscopico di SPY soprastante; nessuna statistica sullo spread nasconde i relativi cali.
- Le scansioni dell'intero tape sono pannelli solo batch. I blocchi relativi all'intero mercato qui presenti sono stati misurati per circa trenta secondi ciascuno su una cache fredda (un blocco in timeout viene riprovato una volta; il passaggio su cache calda supera il limite); vengono eseguiti una sola volta al momento dell'elaborazione tramite il percorso di sola lettura protetto, non sono mai in tempo reale per i lettori, e i risultati memorizzati costituiscono il record ufficiale.
Metodologia
- I timestamp sono memorizzati in UTC e filtrati con limiti UTC grezzi (gli orari regolari del 29 giugno sono dalle 13:30 alle 20:00 UTC); la funzione toTimeZone appare solo nelle liste SELECT.
- Il tipo di sessione viene verificato rispetto al calendario delle festività e alla finestra regolare osservata di 390 bar — non viene mai assunto a priori.
- Il "volume contato dal SIP (matched)" è il volume che le regole di condizione del SIP conteggiano nel totale consolidato; l'insieme delle esclusioni è derivato dal dizionario, limitato dal checksum, mai codificato manualmente.
- Le statistiche sullo spread per aggiornamento assegnano lo stesso peso a ogni aggiornamento NBBO; le statistiche ponderate per il tempo assegnano un peso a ogni quotazione in base alla sua durata. Entrambe dichiarano le proprie esclusioni.
- Le colonne decimali di prezzo/size vengono sommate nativamente e convertite in float a 64 bit prima di qualsiasi calcolo di ratio o prezzo per dimensione.
- Le tabelle tick conservano la cronologia completa senza scadenza rotativa; questi risultati archiviati e versionati costituiscono il record duraturo. Stato del warehouse al 3 luglio 2026.
Ogni pannello sopra riportato è un singolo oggetto archiviato — grafico, tabella e SQL insieme. Apri uno qualsiasi di essi, copia la query e utilizzala ulteriormente sul terminale Strasmore.