Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor · · Updated 2026-07-24

2026년 6월 29일 시장 미세구조 분석

2026년 6월 29일의 전체 Trade 및 Quote Tape, Volume 수정 사항, Nanosecond 수신 데이터 및 FINRA 파일 분석을 제공합니다.

이 보고서는 2026년 6월 29일 시장 요약의 상세 분석 자료입니다. 분 단위 차트 이면의 원천 데이터를 제공합니다. 평범한 월요일 거래 세션 동안 156.1 million 건의 개별 체결505.38 million 건의 NBBO(National Best Bid and Offer, 최우선 매수 및 매도 호가) 업데이트가 발생했습니다. 모든 수치는 저장된 쿼리 결과입니다(정확한 SQL 문을 확인하려면 각 패널을 확장하십시오). 오늘의 두 가지 주요 분석 결과는 다음과 같습니다. 첫째는 데이터 기록 규칙에 따른 거래량 수정 사항이며, 둘째는 S로 끝나는 지점에서 데이터가 중단된 벤더 파일 문제입니다.

거래 내역, 체결 단위별 분석

거래 세션 확인을 우선적으로 수행합니다. 거래소 휴장 일정에 따르면 2026년 6월 29일은 0행에 해당하며, SPY는 정규 거래 시간 내에 정확히 390개의 분봉을 기록했습니다. 이는 뉴욕 시간 기준 오전 9시 30분부터 오후 4시까지의 전체 세션입니다. 연장 거래 시간 동안 통합 테이프에는 156.1 million건의 개별 거래가 기록되었습니다.

조회일일 거래량: 세션 확인 및 모든 체결 규모
모든 수치 뒤에 숨겨진 정확한 SQL
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%은 100주 미만의 거래인 odd lots(단주)였습니다. 그러나 이들이 움직인 총 주식 수는 전체의 8.79%에 불과했습니다. 이 수치는 아래의 거래량 분석 섹션에서 조정된 수치입니다. 중앙값 체결량은 21 shares였으며, 이는 self-verifying bracket probe(자기 검증형 브래킷 프로브)를 통해 측정되었습니다. 이 방식은 19주에서 23주 사이의 누적 횟수를 측정하며, 범위에 해당하지 않으면 0을 반환하고 범위 내에 있으면 해당 값을 유지합니다. 17.9 million건의 체결은 정확히 1주 단위였으며, 4.73%은 소수점 단위의 크기를 포함했습니다. 이러한 패턴은 마켓 메이커가 반대 매매를 수행하는 상황에서 개인용 투자 앱이 한 번에 한 조각씩 시장에 주문을 넣는 양상과 일치합니다.

거래량 분석: 사전(dictionary)을 통한 "매칭 거래량" 도출

모든 체결 데이터의 size 필드를 합산하면 6월 29일 기준 24.79 billion shares(십억 주)가 거래된 것으로 나타납니다. 이 수치는 잘못되었으며, 체결 기록(tape) 자체가 이를 증명합니다. 모든 체결 데이터에는 condition codes(상태 코드)가 포함됩니다. 모든 거래소를 하나의 스트림으로 통합하는 SIP(Securities Information Processor, 증권 정보 처리 장치)는 각 코드가 통합 거래량에 포함되는지 여부를 명시한 사전(dictionary)을 발행합니다. 일부 메시지는 이미 한 번 집계된 거래량을 행정적으로 재방송하는 데이터입니다. 본 게시물은 "알려진" 코드 목록을 직접 입력하는 대신, 사전 자체에서 제외 대상을 도출합니다.

조회제외 세트: Tape(체결 기록) 자체 코드 사전에서 도출(1행)
모든 수치 뒤에 숨겨진 정확한 SQL
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') = 0

3개의 판매 조건은 통합 피드에서 updates_volume = false로 표시됩니다: 15 Market Center Official Close · 16 Market Center Official Open · 38 Corrected Consolidated Close (per listing market). 분석 과정은 다음과 같습니다. 이전 일일 요약 초안에서는 모든 데이터 가이드에 언급되는 공식 개장/종가 메시지인 15번과 16번 코드를 직접 입력했으나, 38번 코드는 완전히 누락되었습니다. 암기된 코드 목록이 아닌 사전이 유일한 진실의 원천(source of truth)입니다.

두 개의 블록으로 나눈 것은 의도적인 설계입니다. 156.1-million-row(백만 행) 규모의 스캔 과정에서 사전(dictionary)에 대한 scalar subquery(스칼라 서브쿼리)를 실행하면 30초 제한 시간을 초과합니다. 따라서 위 블록은 코드 개수와 id checksum(69)을 통해 유효성을 검증하여 집합을 한 행으로 도출하며, 아래 블록은 도출된 리터럴(literals)을 적용합니다. 만약 사전의 내용이 변경되면 checksum이 이 게시물의 검토 필요성을 알리므로, 리터럴 값이 조용히 유효하지 않게 되는 상황을 방지할 수 있습니다.

조회Raw(가공되지 않은) 거래량 대 SIP 집계 거래량: 도출된 제외 세트 적용
모든 수치 뒤에 숨겨진 정확한 SQL
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'

수정된 회계 결과: 원본 데이터 기준 24.79 billion shares, SIP 집계 기준 20.66 billion, 91175개의 행정적 체결 데이터 제외 시 4.13 billion. 하나의 정의로 정확히 설명하면, "matched volume(매칭 거래량)"이란 SIP 자체의 상태 규칙에 따라 통합 합계에 포함되는 거래량을 의미하며, 그 이상도 이하도 아닙니다. 우리는 어떤 거래가 경제적으로 의미 있는지 판단하는 것이 아니라, 체결 기록 자체의 회계 방식을 적용하는 것입니다.

대규모 체결 내역 분석

당일 발생한 가장 큰 규모의 체결 내역은 조건 코드가 단순한 정보 이상의 의미를 갖는 지점입니다:

조회6월 29일 최대 체결 규모 (사전 제외 코드 제거)
모든 수치 뒤에 숨겨진 정확한 SQL
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 10

상단 행들을 예시로 살펴보겠습니다. 당일 최대 체결 건인 61.69 million CAG (Conagra) 주식, 주당 $13.98, 총액 약 $862.5 million은 16:04:53 ET에 코드 8, 41 (8 Closing Prints, 41 Trade Thru Exempt)로 기록되었습니다. 이는 오후 4:00 이후 발표되는 NYSE(New York Stock Exchange) 종가 경매 결과입니다. 이 수치는 거래량에 정확히 한 번만 반영됩니다. 동일한 61.69 million 주식이 코드 15(Market Center Official Close)로 다시 나타나는데, 이는 사전 정의된 사전(dictionary)에서 제외되는 재보고(re-report) 건이며, 위에서 제외된 4.13 billion 중 일부입니다. 코드 15 행은 설계상 위 표에서 제외되므로, 해당 수신 내역은 별도의 단일 행 패널로 제공됩니다:

조회수령 내역: CAG(Closing Auction Generator) 종가 경매 및 code-15 재보고 비교
모든 수치 뒤에 숨겨진 정확한 SQL
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'

CAG에 대한 6개 공식 종가 메시지 중 가장 큰 것은 61.69 million shares를 포함합니다. 이는 경매 수량인 61.69 million과 정확히 일치하며(차이: 0), 16:04:53 ET에 거래소 ID 10(주식 디렉토리의 NYSE)를 통해 기록되었습니다. 즉, 상장 거래소가 자체 경매 결과를 재진술한 것입니다.

나머지 CAG개 행은 성격이 다릅니다. 코드 12, 2 (12 Form T / extended hours, 2 Average Price Trade)로 기록된 15.17 million 주식 체결 건과 코드 12로 기록된 두 건은 경매 이후 FINRA(Financial Industry Regulatory Authority)를 통해 보고된 내역입니다. 이들은 updates_volume = true 조건을 포함합니다. SIP(Securities Information Processor)와 당사의 매칭 수치 모두 이를 실제 체결로 간주합니다.

그 외에 코드 9는 Nasdaq 종가 교차(closing crosses)를 나타냅니다. NVDA의 $3389.5 million 교차 건은 표에서 달러 기준 가장 큰 체결 내역입니다. 또한 SNAP 체결 건(53, 41)의 코드에는 Qualified Contingent Trade를 의미하는 53이 포함되어 있습니다.

시계: 하루의 10분이 지배하는 시장

분 단위로 분석했을 때, 거래 기록은 거의 전적으로 세션의 양 끝단에 집중됩니다:

조회거래 Tape 중 가장 활발한 10분 (수백만 건의 체결)
모든 수치 뒤에 숨겨진 정확한 SQL
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

15:59 ET(미국 동부 표준시) 기준 거래량은 3.98 million(백만) 건을 기록했습니다. 이는 초당 6만 건이 넘는 수치입니다. 상위 10개 종목 중 나머지가 개장 직후와 폐장 직전에 집중되는지는 다음 한 줄의 측정값으로 확인할 수 있습니다:

조회가장 활발한 10분 중 개장 및 종장 외 시간의 비중
모든 수치 뒤에 숨겨진 정확한 SQL
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
)

상위 10개 종목 중 9개는 개장 후 10분 이내 또는 폐장 전 마지막 10분 이내에 거래가 발생합니다. 유일한 예외인 10:15 ET의 0.88 million 건 거래 폭증은 이례적인 현상입니다. 해당 데이터만으로는 그 원인을 알 수 없으므로 임의로 추측하지 않습니다. 동일한 시간대 정보가 아래에 다시 나타납니다.

호가 스트림: 5억 건의 업데이트

모든 거래소의 최우선 매수 및 매도 호가인 NBBO(National Best Bid and Offer)는 가격 변동 시마다 재공시되며, 6월 29일 기준 505.38 million 번 업데이트되었습니다. 이는 156.1 million 건의 거래를 상회하는 수치입니다.

조회NBBO(National Best Bid and Offer) 전체 스트림 — QQQ 및 NVDA 지정
모든 수치 뒤에 숨겨진 정확한 SQL
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'

지수 상품이 호가 업데이트를 주도하고 있습니다. QQQ는 단독으로 5.23 million 건의 업데이트를 기록했습니다. 이는 우리가 확인한 개별 종목 중 가장 많이 업데이트된 NVDA의 1.8 million 건보다 많은 수치이며, 차순위 종목보다 0.67 million 건 더 많습니다. 모든 상장 종목에 대한 개별 티커(ticker) 전수 조사는 30초 제한 시간 내에 불가능하므로, 아래 순위표는 전체 목록이 아닌 확인된 데이터 세트입니다.

조회8개 주요 Ticker(종목)의 NBBO 호가 업데이트 (수백만 건)
모든 수치 뒤에 숨겨진 정확한 SQL
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 DESC

확인된 데이터 세트에서 QQQ은(는) 5.23 million 건의 업데이트로 1위를 차지했습니다. 상위권은 일반적인 주식이 아닌 지수 펀드와 레버리지 ETF(Exchange Traded Fund)가 차지하고 있습니다.

SPY 정밀 분석: 나노초 단위의 기록과 양방향 스프레드

조회SPY 미세 분석: 나노초 간격, 양방향 Spread(매수-매도 호가 차이), 호가 품질
모든 수치 뒤에 숨겨진 정확한 SQL
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 ordered

정규 거래 시간 동안 SPY의 호가는 3.98백만 번 변경되었습니다. 가장 거래가 활발했던 초는 10:15:43 ET이며, 위에서 표시된 10:15분 구간 내에 해당합니다. 이 시기에 1461번의 업데이트가 발생했습니다. 연속된 업데이트 사이의 최소 간격은 1375 나노초였으며, 중앙값은 245.6 마이크로초였습니다. 또한 75138개의 연속된 쌍은 동일한 나노초 타임스탬프를 기록했습니다. 이는 현대적인 거래 기록(tape)을 나노초 해상도로도 완전히 정렬할 수 없음을 의미합니다.

이러한 나노초 데이터는 매수-매도 스프레드(bid-ask spread)를 측정하는 데 사용됩니다. 모든 업데이트를 동일하게 계산했을 때 SPY의 평균 스프레드는 2.72센트였습니다. 각 호가가 유지된 시간을 가중치로 적용하면 2.34센트입니다. 업데이트당 수치는 기계적으로 0.38센트 더 넓게 나타납니다. 업데이트는 스프레드가 넓고 변동성이 큰 순간에 집중되는 반면, 대기 주문은 시간 흐름에 따라 유지되기 때문입니다. 스프레드 통계치를 확인할 때는 어떤 시계(clock)를 기준으로 측정되었는지 확인해야 합니다. 통계 데이터는 다음과 같이 공개됩니다. 1544번의 정규 거래 시간 업데이트에서 일시적인 교차(ask가 bid보다 낮은 상태, 즉 서로 다른 거래소의 호가가 섞임)가 발생했으며, 0번의 업데이트는 매수 또는 매도 호가가 0이었습니다. 스프레드 통계에서는 이 두 경우를 모두 제외하고 계산합니다.

스프레드에는 시간 흐름이 존재합니다

SPY의 호가 스프레드(spread)를 30분 단위로 분류하면, 모든 트레이더가 활용할 수 있는 곡선 형태의 미시 구조가 나타납니다.

조회SPY의 30분 단위 중앙값 호가 Spread (ET 04:00 ~ 20:00)
모든 수치 뒤에 숨겨진 정확한 SQL
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_time

04:00 ET 프리마켓(premarket) 구간의 중앙값은 8 센트이며, 09:30 개장 구간은 3 센트, 14:00 시점에는 2 센트입니다. 즉, 프리마켓 개장 시점에 동일한 주식을 거래하는 비용은 오후 초반에 주문을 넣을 때보다 스프레드 기준으로 대략 네 배 더 높습니다. 스프레드는 고정된 값이 아니라 일정한 일정을 따릅니다.

분석 사례: S에서 멈춘 파일

모든 일일 벤더 파일은 수치를 발표하기 전 완전성 검사를 거칩니다. 티커(ticker) 개수를 세고, 알파벳 범위를 확인하며, 인접한 날의 데이터와 비교합니다. 6월 29일자 FINRA(미국 금융산업규제기구) 장외 공매도 거래량 파일이 그 이유를 보여주는 사례입니다.

조회완전성 조사: FINRA short-volume 파일 커버리지, 6월 26-30일
모든 수치 뒤에 숨겨진 정확한 SQL
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 date

6월 26일 파일은 15052개의 티커를 포함하며, 범위는 A부터 ZYME까지입니다. 6월 29일 파일은 5489개를 포함하며, 범위는 A부터 SSUS까지입니다. 이 파일은 S로 시작하는 이름 중간에서 단순히 멈춰 있습니다. 그 지점 이후의 모든 알파벳 티커, 즉 6월 26일 1행 대비 6월 29일 0행인 TSLA를 포함하여 모두 누락되었습니다. 6월 30일이 되자 파일은 다시 15362개의 티커를 포함하게 되었습니다. 완전성 검사는 이처럼 하루에 한 줄씩 기록된 영수증과 다를 바 없으며, 이는 통계치를 발표하는 것과 오류가 있는 결과물을 발표하는 것의 차이입니다.

이러한 사실을 전제로 할 때, 비율은 다음과 같습니다. 6월 29일의 표시된 공매도 거래량은 보고된 장외 거래량의 45.85%이며, 6월 26일은 46.89%, 6월 30일은 48.82%입니다. 6월 29일 수치는 A부터 S까지의 구간만 포함하므로 부분적인 수치로 간주해야 합니다. 공매도 주식 비율이 거의 절반에 달하는 것은 인접한 모든 세션에서 나타나는 일반적인 수준이며, 일일 공매도 거래량은 short interest(공매도 잔고)가 아닙니다.

데이터 참고 사항

전체 데이터 참고 사항
  • 오후 5시에서 6시 사이의 호가 정체. SPY의 호가 스트림은 17:00 ET(동부 표준시) 시간대(233 업데이트)에 거의 중단되었다가 18:00(40608)에 다시 활성화됩니다. 이는 데이터 누락이 아닌, 여러 티커(ticker) 간의 피드 및 세션 패턴입니다.
  • 소수점 주식의 보편화. 4.73%의 체결 내역이 정수가 아닌 크기를 포함합니다. 거래량은 소수점 단위로 합산해야 합니다.
  • 코드 사전의 유형별 ID 재사용. ID 15는 매도 조건(Market Center Official Close)과 호가 조건(Closed)에 모두 사용됩니다. 본 문서의 모든 사전 쿼리는 asset_class = 'stocks' AND type = 'sale_condition'을 필터링합니다. ID만으로 조회할 경우 코드가 잘못 분류될 수 있습니다.
  • 호가 품질 제외 항목의 인라인 계산. 교차 호가 및 매수-매도 호가 부재(zero-bid-or-ask) 수치는 상단의 SPY 현미경 패널에 포함되어 있습니다. 스프레드(spread) 통계에 해당 수치 하락이 숨겨지지 않습니다.
  • 전체 테이프 스캔은 배치(batch) 전용 패널입니다. 여기에 측정된 시장 전체 블록은 콜드 캐시(cold cache) 상태에서 각각 약 30초 동안 실행됩니다(타임아웃된 블록은 한 번 재시도되며, 워밍업된 패스는 제한을 통과합니다). 이 스캔은 작성 시점에 게이트가 있는 읽기 전용 경로를 통해 한 번 실행되며, 독자를 위해 실시간으로 제공되지 않습니다. 저장된 결과가 기록물입니다.

방법론

  • 타임스탬프는 UTC(협정 세계시)로 저장되며 원시 UTC 범위로 필터링됩니다(6월 29일 정규 거래 시간은 13:30부터 20:00 UTC까지임). toTimeZone는 SELECT 목록에만 나타납니다.
  • 세션 유형은 휴일 달력과 관측된 390-bar 정규 거래 시간대를 기준으로 검증되며, 임의로 가정되지 않습니다.
  • "SIP 집계(매칭) 거래량"은 SIP 자체 조건 규칙에 따라 통합 합계에 포함되는 거래량입니다. 제외 세트는 딕셔너리에서 도출되며 체크섬(checksum) 범위 내에서 관리되고, 하드코딩되지 않습니다.
  • 업데이트당 spread(매수-매도 호가 차이) 통계는 각 NBBO(National Best Bid and Offer) 업데이트에 동일한 가중치를 부여합니다. 시간 가중 통계는 각 호가가 유지된 시간에 따라 가중치를 부여합니다. 두 방식 모두 제외 항목을 공개합니다.
  • 소수점 가격/크기 열은 네이티브 방식으로 합산되며, 비율 또는 가격-크기 곱 연산을 수행하기 전에 64비트 부동 소수점으로 변환됩니다.
  • Tick 테이블은 롤링 만기 없이 전체 이력을 유지합니다. 이러한 저장된 버전 관리 결과가 모든 상황에 대한 영구적인 기록입니다. 2026년 7월 3일 기준 데이터 웨어하우스 상태.

위의 모든 패널은 차트, 테이블, SQL이 결합된 하나의 저장된 객체입니다. 어떤 것이든 열어서 쿼리를 복사한 후 Strasmore 터미널에서 추가 분석을 수행하십시오.