# Generated by tools/build_contracts.py from tools/algoseek_catalog.py -- do not edit by hand.
# Open Data Contract Standard v3.2.0 (https://bitol-io.github.io/open-data-contract-standard/).
apiVersion: v3.2.0
kind: DataContract
id: urn:alphaswarm:datacontract:algoseek:us-equities-buy-sell-pressure-and-retail-indicators-minute-bar
name: AlgoSeek US Equities Buy/Sell Pressure and Retail Indicators Minute Bar
version: 0.1.0
status: draft
domain: market-data
tags:
- algoseek
- licensed-data
- equity
- us
- analytics
description:
  purpose: One row per ticker per trading minute with volume and trade-count splits, spread statistics
    and probabilistic estimates of retail buy/sell activity (sub-penny TRF prints and odd-lot trades),
    plus derived pressure, ratio, net-flow, imbalance and sentiment indicators (37 columns).
  usage: Backtesting, execution and microstructure research, feature engineering for US equities.
  limitations: 'Delivered as recorded from the source feed: AlgoSeek does not remove crossed or locked
    quotes, bad prints, or out-of-sequence packets unless contracted to. Consumers own cleaning. Bars
    are half-open [TimeBarStart, next bar start): OpenBarTime equals the bar start (.000000000) and CloseBarTime
    is the last nanosecond of the bar (.999999999). The guide''s wording (''greater than start'') is looser
    than this. ''Blank'' means an empty CSV field (no NULL token). Trade-derived price/time/size fields
    are blank when the bar has no qualifying trade; share-volume counters are 0 per the guide (see discrepancies
    for sample deviations). Primary key (Date, Ticker, TimeBarStart) is inferred from the one-file-per-symbol-per-day
    layout; the files carry no security identifier, so symbol changes/re-use across days are not resolved
    by this dataset. Continuous minute bars: a row for every minute from 04:00 ET until the last exchange
    closes; the guide''s carry-forward and quote price-filter rules apply to the underlying NBBO but the
    file exposes only MinSpread/MaxSpread and RelativeSpreadAverage.'
  authoritativeDefinitions:
  - type: businessDefinition
    url: https://algoseek.com/dataset/us-equities-buy-sell-pressure-and-retail-indicators-minute-bar/
  - type: implementation
    url: https://algoseek.com/data-docs/equity-market-data/algoseek.US.Equity.Buy.Sell.Pressure.and.Retail.Indicators.Minute.Bar.pdf
  - type: implementation
    url: https://algoseek.com/docs/rest-api/reference
context:
  instructions: Times are local US Eastern clock times (DST-aware), not UTC. Treat TRADE NB / NBBO-flagged
    rows as the backtest-grade subset. Cancellations reference earlier trades and can arrive hours later,
    so aggregate only after the session closes. Prices are unadjusted unless the dataset name says Adjusted;
    join us-equities-*-adjustment-factors on SecId for adjustment.
  verifiedStatements:
  - id: vs1
    question: What time zone are the timestamps in?
    answer: US Eastern local time with daylight saving (the guides label it EST/ET).
  - id: vs2
    question: Are prices adjusted for splits and dividends?
    answer: Only in datasets whose name contains Adjusted; all others are as traded.
  constraints:
  - id: c1
    constraint: 'Licensed vendor data: never export raw rows to a tenant-local destination or include
      them verbatim in a public artifact; serve only through entitlement-checked platform reads.'
  - id: c3
    constraint: Do not treat the vendor's `Ticker` as a stable identity across time; join on an AlgoSeek
      security key (SecId or ASID, which are distinct) or the platform symbol mapping.
servers:
- server: algoseek-s3
  type: s3
  environment: vendor
  description: AlgoSeek flat-file delivery (the layout the schema below describes).
  location: s3://${ALGOSEEK_S3_BUCKET_EQ_RET_INDIC_1MIN}/
  format: csv
  encoding: UTF-8
  customProperties:
  - property: layout
    value: Plain-text CSV with a fixed header row and one data row per bar. By default one file per symbol
      per trading day (e.g. all AAPL bars for 3 Mar 2020 in one file). Files are gzip-compressed (.csv.gz,
      roughly 8:1). The guide gives no bucket or path naming pattern.
  - property: compression
    value: gzip
  - property: header
    value: true
  - property: entitlement
    value: Bucket access is granted per subscription; bucket names arrive with license provisioning.
- server: algoseek-rest-api
  type: api
  environment: vendor
  description: AlgoSeek Datasets REST API (X-API-KEY header; JSON, CSV or gzipped CSV). Returns AlgoSeek's
    normalized API layout, which differs from the flat-file columns in this contract's schema.
  location: https://api.algoseek.com/v1/data/us-equity/ret-indic-1min/:identifier
  customProperties:
  - property: auth
    value: X-API-KEY header issued by AlgoSeek
  - property: columnsEndpoint
    value: https://api.algoseek.com/v1/meta/datasets/{dataset_id}/columns
  - property: statusEndpoint
    value: https://api.algoseek.com/v1/meta/datasets/{dataset_id}/status
  - property: responseFormats
    value:
    - json
    - csv
    - csv_gzip
  - property: pagination
    value: offset + limit; tick endpoints take trade_date and identifier (Ticker or ASID) in the path
schema:
- name: us_equities_buy_sell_pressure_and_retail_indicators_minute_bar
  physicalName: eq_ret_indic_1min
  physicalType: file
  logicalType: object
  businessName: US Equities Buy/Sell Pressure and Retail Indicators Minute Bar
  description: One row per ticker per trading minute with volume and trade-count splits, spread statistics
    and probabilistic estimates of retail buy/sell activity (sub-penny TRF prints and odd-lot trades),
    plus derived pressure, ratio, net-flow, imbalance and sentiment indicators (37 columns).
  dataGranularityDescription: 'one ticker x one trading minute (continuous: a row for every minute from
    04:00 ET until the last exchange closes)'
  properties:
  - name: Date
    logicalType: date
    logicalTypeOptions:
      format: yyyymmdd
    physicalType: string (yyyymmdd) (csv text)
    description: Trading date of the bar (yyyymmdd); also the trading day of the file the row came from.
    primaryKey: true
    primaryKeyPosition: 1
    required: true
    customProperties:
    - property: nullMeaning
      value: Never
    - property: evidence
      value: guide+sample
  - name: Ticker
    logicalType: string
    physicalType: string (csv text)
    description: Symbol name of the security. The guide documents no other identifier or symbology for
      these files.
    primaryKey: true
    primaryKeyPosition: 2
    required: true
    customProperties:
    - property: nullMeaning
      value: Never
    - property: evidence
      value: guide+sample
  - name: TimeBarStart
    logicalType: time
    logicalTypeOptions:
      format: HH:MM
    physicalType: string (time) (csv text)
    description: Bar start time in ET; HH:MM for a minute bar (Table 1).
    primaryKey: true
    primaryKeyPosition: 3
    required: true
    customProperties:
    - property: nullMeaning
      value: Never
    - property: evidence
      value: guide+sample
  - name: OpenBarTime
    logicalType: time
    logicalTypeOptions:
      format: HH:MM:SS.mmmuuunnn
    physicalType: string (timestamp) (csv text)
    description: Nanosecond timestamp of the bar open, i.e. the bar start (e.g. 11:03:00.000000000 for
      a minute bar).
    customProperties:
    - property: nullMeaning
      value: Never
    - property: evidence
      value: guide+sample
  - name: MinSpread
    logicalType: number
    physicalType: decimal (csv text)
    description: Smallest NBBO bid-ask spread in the bar; a crossed market or negative back-quote spread
      is floored to 0.
    required: true
    customProperties:
    - property: unit
      value: USD
    - property: nullMeaning
      value: Never
    - property: evidence
      value: guide+sample
  - name: MaxSpread
    logicalType: number
    physicalType: decimal (csv text)
    description: Largest NBBO bid-ask spread seen in the bar.
    required: true
    customProperties:
    - property: unit
      value: USD
    - property: nullMeaning
      value: Never
    - property: evidence
      value: guide+sample
  - name: ExchangeVolume
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Shares traded on public exchanges only, excluding FINRA/TRF-reported trades. 0 when none.
    customProperties:
    - property: unit
      value: shares
    - property: nullMeaning
      value: '0'
    - property: evidence
      value: guide+sample
  - name: FinraVolume
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Shares in FINRA/TRF-reported trades (dark pools, broker-dealer internalization, OTC);
      0 when none.
    customProperties:
    - property: unit
      value: shares
    - property: nullMeaning
      value: '0'
    - property: evidence
      value: guide+sample
  - name: TotalVolume
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Total shares traded in the bar across public exchanges and FINRA/TRF (Volume + FinraVolume).
    customProperties:
    - property: unit
      value: shares
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: TotalTrades
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Total number of trades in the bar (exchange plus FINRA/TRF where the dataset carries
      both).
    customProperties:
    - property: unit
      value: count
    - property: nullMeaning
      value: '0'
    - property: evidence
      value: guide+sample
  - name: TotalQuoteCount
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Total count of top-of-book bid and ask updates from public exchanges during the bar.
    customProperties:
    - property: unit
      value: count
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: ExchangeTradeCount
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Number of trades on public exchanges in the bar.
    customProperties:
    - property: unit
      value: count
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: FinraTradeCount
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Number of FINRA/TRF-reported trades in the bar.
    customProperties:
    - property: unit
      value: count
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: OddLotTradeCount
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Number of odd-lot (under 100 shares) trades during the bar.
    customProperties:
    - property: unit
      value: count
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: OddLotTotalShares
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Total shares traded in odd-lot trades during the bar.
    customProperties:
    - property: unit
      value: shares
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: RelativeSpreadAverage
    logicalType: number
    physicalType: decimal (csv text)
    description: Mean over the bar's trades of max(ask - bid, 0) / midpoint, using the last NBBO before
      each trade (unitless fraction).
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: TradeCumulDistributionToBid
    logicalType: string
    logicalTypeOptions:
      format: 10 colon-separated cumulative integers (thresholds 0:0.05:0.1:0.2:0.4:0.6:0.8:0.9:0.95:1)
    physicalType: string (csv text)
    description: Ten colon-separated cumulative share totals by trade position from bid (0) to ask (1)
      at thresholds 0, .05, .1, .2, .4, .6, .8, .9, .95, 1.
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: RetailTRFBuySize
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: 'Estimated retail buy shares: TRF trades priced just below a round penny (sub-penny fraction
      in (0.6, 1)); blank when none.'
    customProperties:
    - property: unit
      value: shares
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: RetailTRFSellSize
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: 'Estimated retail sell shares: TRF trades priced just above a round penny (sub-penny
      fraction in (0, 0.4)); blank when none.'
    customProperties:
    - property: unit
      value: shares
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: RetailOddLotBuySize
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Estimated retail buy shares from odd-lot exchange trades priced above the NBBO midpoint.
    customProperties:
    - property: unit
      value: shares
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: RetailOddLotSellSize
    logicalType: integer
    logicalTypeOptions:
      format: i64
    physicalType: integer (csv text)
    description: Estimated retail sell shares from odd-lot exchange trades priced below the NBBO midpoint.
    customProperties:
    - property: unit
      value: shares
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: TRFRetailPress
    logicalType: number
    physicalType: decimal (csv text)
    description: 'TRF retail pressure: (RetailTRFBuySize + RetailTRFSellSize) / TotalVolume.'
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: OddLotPress
    logicalType: number
    physicalType: decimal (csv text)
    description: 'Odd-lot pressure: (RetailOddLotBuySize + RetailOddLotSellSize) / TotalVolume.'
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: TRFRetailOddLotPress
    logicalType: number
    physicalType: decimal (csv text)
    description: 'Combined pressure: (TRF retail buy+sell + odd-lot retail buy+sell) / TotalVolume.'
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: OddLotTRFRetailRatio
    logicalType: number
    physicalType: decimal (csv text)
    description: Odd-lot retail size divided by (TRF retail size + odd-lot retail size), buys plus sells.
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: TRFRetailBuySellRatio
    logicalType: number
    physicalType: decimal (csv text)
    description: RetailTRFBuySize / RetailTRFSellSize.
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: OddLotBuySellRatio
    logicalType: number
    physicalType: decimal (csv text)
    description: RetailOddLotBuySize / RetailOddLotSellSize.
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: TRFRetailOddLotBuySellRatio
    logicalType: number
    physicalType: decimal (csv text)
    description: (RetailTRFBuySize + RetailOddLotBuySize) / (RetailTRFSellSize + RetailOddLotSellSize).
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: RelNetTRFRetailFlow
    logicalType: number
    physicalType: decimal (csv text)
    description: (TRF retail buy - sell) / (buy + sell); positive means retail buying pressure, range
      -1 to 1.
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: RelNetOddLotFlow
    logicalType: number
    physicalType: decimal (csv text)
    description: (odd-lot retail buy - sell) / (buy + sell); positive means buying pressure, range -1
      to 1.
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: RelNetTRFRetailOddLotFlow
    logicalType: number
    physicalType: decimal (csv text)
    description: 'Combined TRF-retail plus odd-lot net flow: (buys - sells) / (buys + sells); range -1
      to 1.'
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: TRFRetImbalance
    logicalType: number
    physicalType: decimal (csv text)
    description: TRF retail buy share = RetailTRFBuySize / (RetailTRFBuySize + RetailTRFSellSize); near
      1 buy-dominant, near 0 sell-dominant.
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: OddLotImbalance
    logicalType: number
    physicalType: decimal (csv text)
    description: Odd-lot retail buy share = RetailOddLotBuySize / (buy + sell); near 1 buy-dominant, near
      0 sell-dominant.
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: TRFRetOddLotImbalance
    logicalType: number
    physicalType: decimal (csv text)
    description: Combined TRF-retail plus odd-lot buy share of total retail size; near 1 buy-dominant,
      near 0 sell-dominant.
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: TRFRetSentiment
    logicalType: number
    physicalType: decimal (csv text)
    description: Moving average of RelNetTRFRetailFlow (a rolling sentiment gauge; window length is described
      inconsistently in the guide).
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: OddLotSentiment
    logicalType: number
    physicalType: decimal (csv text)
    description: Moving average of RelNetOddLotFlow (a rolling sentiment gauge; window length is described
      inconsistently in the guide).
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  - name: TRFRetOddLotSentiment
    logicalType: number
    physicalType: decimal (csv text)
    description: Moving average of RelNetTRFRetailOddLotFlow (a rolling sentiment gauge; window length
      is described inconsistently in the guide).
    customProperties:
    - property: nullMeaning
      value: Blank
    - property: evidence
      value: guide+sample
  quality:
  - id: row_count_positive
    metric: rowCount
    mustBeGreaterThan: 0
    dimension: completeness
    severity: error
    description: Every delivered partition (trade date, or snapshot) carries at least one row.
  - id: primary_key_unique
    metric: duplicateValues
    mustBe: 0
    arguments:
      properties:
      - Date
      - Ticker
      - TimeBarStart
    dimension: uniqueness
    severity: error
    description: The declared primary key is unique within each delivered partition (one file or table
      snapshot).
  - id: ExchangeTradeCount_non_negative
    type: sql
    description: ExchangeTradeCount is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE ExchangeTradeCount < 0
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: ExchangeVolume_non_negative
    type: sql
    description: ExchangeVolume is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE ExchangeVolume < 0
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: FinraTradeCount_non_negative
    type: sql
    description: FinraTradeCount is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE FinraTradeCount < 0
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: FinraVolume_non_negative
    type: sql
    description: FinraVolume is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE FinraVolume < 0
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: OddLotTradeCount_non_negative
    type: sql
    description: OddLotTradeCount is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE OddLotTradeCount < 0
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: RetailOddLotBuySize_non_negative
    type: sql
    description: RetailOddLotBuySize is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE RetailOddLotBuySize < 0
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: RetailOddLotSellSize_non_negative
    type: sql
    description: RetailOddLotSellSize is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE RetailOddLotSellSize < 0
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: RetailTRFBuySize_non_negative
    type: sql
    description: RetailTRFBuySize is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE RetailTRFBuySize < 0
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: RetailTRFSellSize_non_negative
    type: sql
    description: RetailTRFSellSize is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE RetailTRFSellSize < 0
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: TotalQuoteCount_non_negative
    type: sql
    description: TotalQuoteCount is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE TotalQuoteCount < 0
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: TotalTrades_non_negative
    type: sql
    description: TotalTrades is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE TotalTrades < 0
    mustBe: 0
    dimension: accuracy
    severity: error
  - id: TotalVolume_non_negative
    type: sql
    description: TotalVolume is never negative.
    query: SELECT COUNT(*) FROM {object} WHERE TotalVolume < 0
    mustBe: 0
    dimension: accuracy
    severity: error
support:
- channel: algoseek-support
  tool: email
  url: mailto:support@algoseek.com
  scope: issues
  description: Vendor support for data defects, missing days, and entitlement problems.
team:
  name: AlphaSwarm data engineering
slaProperties:
- id: update_frequency
  property: frequency
  value: 1
  unit: d
  driver: analytics
- id: retention
  property: retention
  value: license-term
  description: Retention of landed copies is bounded by the AlgoSeek license; purge on termination.
  driver: regulatory
customProperties:
- property: vendor
  value: AlgoSeek
- property: vendorDataGroup
  value: us-equity
- property: vendorDatasetTextId
  value: eq_ret_indic_1min
- property: vendorSampleUrl
  value: https://as-metadata-services-assets.s3.us-east-1.amazonaws.com/sample_data/cloud_storage/eq_ret_indic_1min.csv
- property: assetClass
  value: equity
- property: venues
  value:
  - NASDAQ
  - BATS
  - NYSE
  - ARCA
  - FINRA TRF
- property: coverage
  value: 'All listed stocks, ETNs, ETFs, ADRs and funds from 15+ US exchanges and marketplaces via the
    consolidated SIP (CTA Tape A/B, UTP Tape C); the product page says the full universe of exchange-listed
    equities (common stocks, ETFs, ETNs, ADRs, funds). Includes FINRA/TRF-reported trades (venue names
    in ''venues'' are only the guide''s examples). Page: full historical archive plus daily updates; history
    start not stated. Guide release 1.0.0 effective 4 Feb 2025.'
- property: timezone
  value: America/New_York
- property: timestampFormat
  value: 'Time-of-day strings with no date or zone (combine with Date). TimeBarStart is HH:MM for minute
    bars; all other timestamps are HH:MM:SS.mmmuuunnn (9 fractional digits, nanosecond resolution). Guide:
    events before 2016 carry millisecond HH:MM:SS.mmm stamps.'
- property: sessionHours
  value: 04:00-20:00 ET. Pre-market 04:00:00 to 09:30:00 (excl.), regular 09:30:00 to 16:00:00 (excl.),
    post-market 16:00:00 to 20:00:00. Minute bars occasionally run several minutes past 20:00. Early closes
    at 13:00:00 on the day before some holidays.
- property: priceAdjustment
  value: n/a (no price columns beyond MinSpread/MaxSpread; built from 'as-is' SIP tick data, no adjustment
    mentioned)
- property: licensedData
  value: true
- property: evidenceGrade
  value: vendor-doc
- property: knownIssues
  value:
  - Primary key is inferred; AlgoSeek's guide does not name one.
  - 'Doc discrepancy: Page and catalog describe a ''Minute Bar'' of indicators without a column count;
    the guide''s field table (Table 2), the guide sample and the CSV header all give 37 columns (the counts
    agree). Table 1 in this guide is a sample-data table and Table 2 the schema.'
  - 'Doc discrepancy: TimeBarStart: sample and Table 2 agree on HH:MM. The FAQ cites HHMMSSmmm / HHMMSSmmmiiinnn,
    which matches neither; Table 2 is treated as authoritative.'
  - 'Doc discrepancy: Bar Notes describe a minute bar as ''greater than 11:04 to less than 11:05'', but
    OpenBarTime is exactly HH:MM:00.000000000; bars are treated as half-open [start, next start).'
  - 'Doc discrepancy: The ExchangeVolume description says ''TotalVolume = Volume + FinraVolume'', but
    there is no Volume column in this file (ExchangeVolume replaces it); sample rows satisfy ExchangeVolume
    + FinraVolume = TotalVolume.'
  - 'Doc discrepancy: Sentiment horizon: the field table describes the Sentiment indicators as pressure
    ''cycles'' with ''1-week cycles'' as the example, while the Additional Indicators section defines
    them over 1-hour cycles as MovingAverage(relative net flow); the window and averaging method are not
    specified.'
  - 'Doc discrepancy: OddLotTradeCount and OddLotTotalShares are described as odd lots ''from public exchanges
    only'' (Trade-X), but OddLotTradeCount exceeds ExchangeTradeCount in all 100 sampled bars (e.g. 6754
    vs 1844), so they evidently include TRF-reported odd lots.'
  - 'Doc discrepancy: TRFRetailPress (and the other metrics) are ''Blank'' when not calculable per Table
    2, but TRFRetailPress is 0 (not blank) in sampled bars where RetailTRFBuySize and RetailTRFSellSize
    are both blank, and OddLotTRFRetailRatio is 1 there.'
  - 'Doc discrepancy: TRFRetailBuySellRatio is blank in 5 sampled bars where RetailTRFBuySize is blank
    and RetailTRFSellSize is positive, although RelNetTRFRetailFlow is -1 and TRFRetImbalance 0 in the
    same bars; the guide does not define a rule for a zero numerator.'
  - 'Doc discrepancy: TRFRetSentiment is non-blank (e.g. 1) in sampled bars whose own TRF retail sizes
    are both blank and blank only in the first bar, so it is carried from earlier bars; the guide does
    not describe this.'
  - 'Doc discrepancy: Bar Notes cite VolumeWeightSpread and SpreadValidTime (apparent leftovers from the
    Extended guide), which are not columns of this dataset.'
contractCreatedTs: '2026-11-02T00:00:00Z'
