Pesquisa por Pregão¶
A seção filings_b3.search_trading_session lê os arquivos por pregão da B3, baixados de
www.b3.com.br/pesquisapregao/download?filelist=…. Cada dataset é um arquivo (em geral um ZIP,
às vezes contendo XML ou vários membros tabulares); um reader transforma um pregão em um
pandas.DataFrame tipado, validado por contrato e com proveniência.
Veja também: Visão geral da API · Uso · Exemplos
Padrões implementados¶
- Arquivo de instrumentos (BVBG.028.02) —
InstrumentsFileReader: lê oIN{aammdd}.zipdo pregão (um XML ISO-20022InstrumentReport) e devolve uma linha por instrumento registrado — ações, futuros, opções, ouro, estratégias e renda fixa — achatando os blocos específicos de cada tipo num único frame. Inaugura esta seção e é a base da família de 18 variantes de instrumentos. - Instrumentos por tipo — dezessete readers que leem o mesmo
IN{aammdd}.zipe projetam um blocoInstrmInfcada, com a lista completa de campos que a B3 declara para aquele tipo: Ações · Opções sobre ações · Opções sobre disponível e futuros · Exercício de opções sobre ações · Termo de ações · Renda fixa · ADRs · BTC · Contratos futuros · Exercício de opções sobre derivativos · Estratégias · Títulos públicos nacionais · Títulos internacionais · Renda fixa não negociável · Balcão (OTC) · Disponível (cash) · Fundos de investimento (FIC). - Metadados de layout (BVBG.028 UP2DATA) —
InstrumentsLayoutMetaReader: baixa a planilha autoritativa de layout da B3 e devolve um snapshot tipado dos campos declarados (para o datalake e para o job semanal de deriva de contrato).
Cada padrão ganha a sua própria página, com Descrição e Exemplos. Ao migrar um novo dataset
desta seção, acrescente uma página nesta pasta e registre-a no nav: do mkdocs.yml no mesmo
commit.
Duas formas de reader nesta seção¶
A maioria dos datasets desta seção são downloads tabulares (CSV/ZIP) e compartilham a base
Template-Method _base_pregao_reader (download → localizar membro → ler → carimbar). Uma fonte
que não cabe nessa forma — a família instruments_file, que é XML aninhado — usa a base
_base_instruments_file_reader, que implementa o port IngestionReader diretamente,
reaproveitando os mesmos seams internos (download com retry, retenção do artefato bruto,
proveniência), mas achatando o XML pelo seam xml_reader em vez de ler uma tabela.
Um download, dezoito readers¶
O IN{aammdd}.zip traz XML em que cada registro <Instrm> aninha os seus campos
específicos sob exatamente um de 20 blocos <InstrmInf>. Daí duas formas de ler o mesmo
arquivo:
| Quero… | Reader | Resultado |
|---|---|---|
| todos os tipos, layout publicado pela B3 | InstrumentsFileReader |
52 colunas, uma linha por instrumento de qualquer tipo |
| um tipo, com todos os campos dele | InstrumentsFile<Tipo>Reader |
só os registros daquele bloco, com a lista completa de campos do tipo |
Os readers por tipo herdam ainda as colunas de nível de registro comuns a todo instrumento (data de referência, identificação e atributos comuns), que vivem fora do bloco — é o que mantém os frames por tipo comparáveis entre si.
Qual XML de dentro do arquivo¶
O download é um .zip cujo único membro é outro .zip, e é esse que traz os XML — um por
snapshot intradiário que a B3 publicou para o pregão (nos arquivos conferidos, um de
pré-abertura e um de pós-fechamento). Os snapshots são cumulativos: no IN260729 o mais
recente trazia os 183.164 instrumentos do primeiro mais 10, sem remover nenhum.
Por isso todo reader da família lê o snapshot de maior CreDtAndTm — o cabeçalho
BizFileHdr de cada XML declara quando ele foi gerado. Ler qualquer outro descartaria em
silêncio os registros tardios do pregão. Um snapshot sem CreDtAndTm faz o reader falhar
alto, em vez de adivinhar qual é o vigente.
Download incompleto não passa por pregão pequeno¶
O mesmo cabeçalho declara quantos registros o snapshot carrega (TtlNbOfMsg — em
ISO-20022 cada <Instrm> é uma message). Todo reader da família confere esse número contra
os registros efetivamente lidos e falha alto quando eles divergem.
A conferência existe porque um download interrompido é invisível por construção: o XML é bem-formado até onde chegou, cada linha que chegou é válida, o contrato e a tipagem passam — e o frame volta menor, indistinguível de uma sessão com menos instrumentos. A contagem é feita antes do filtro de sub-bloco, então vale igual para o reader consolidado e para os dezessete por tipo, cujas linhas são um recorte do arquivo.
Todo reader tem a mesma forma pública:
Reader(date_ref: datetime.date, path_raw: pathlib.Path | None = None) -> Reader
Reader.read() -> pandas.DataFrame
| Parâmetro | Tipo | Significado |
|---|---|---|
date_ref |
datetime.date |
Pregão a ler. Obrigatório — o endpoint é endereçado por data. |
path_raw |
pathlib.Path, opcional |
Diretório onde manter o artefato bruto baixado (camada bronze do datalake). None (padrão) usa um diretório temporário removido ao final. |
Memória¶
O XML é lido em stream: cada registro é projetado e liberado em seguida, então o pico de
memória acompanha as linhas mantidas, não o tamanho do arquivo. Medido contra um IN260729
real (660 MB, 183.164 registros):
| Leitura | Pico |
|---|---|
um bloco pequeno (ex.: FICInf, 2 linhas) |
~1,13 GB |
InstrumentsFileReader (todos os 183.164 registros) |
~1,86 GB |
Até a 0.3.0 a árvore inteira era materializada e qualquer leitura custava ~3,0–3,6 GB — uma projeção de duas linhas pagava o arquivo todo. Ainda assim, contar com ~2 GB disponíveis é o mínimo razoável para ler este arquivo.
Colunas de proveniência¶
Todo DataFrame devolvido carrega, ao lado das colunas de origem, seis colunas de
proveniência — url, updated_at (UTC, tz-aware), source_key, package_version,
ingestion_run_id, content_hash — anexadas depois da validação de contrato, para que a camada
bronze seja autodescritiva e rastreável.
Artefato bruto — path_raw¶
None(padrão) — o artefato é baixado num diretório temporário, lido e descartado.- Um caminho — o artefato bruto e intacto (
.zip) é gravado ali e mantido, antes de qualquer parsing — os bytes exatos que uma quebra de contrato produziria ficam reproduzíveis.
Validação por contrato¶
Cada reader declara um FileContract (privado, em
_internal/config/contracts/search_trading_session/) que fixa as colunas obrigatórias. Uma fonte
que viola o contrato levanta ContractError. Colunas monetárias e quantidades são decimal.Decimal
exato, nunca float binário.