Pular para conteúdo

Ofertas de Distribuição de Valores Mobiliários (OFERTA/DISTRIB) — leitura

Leitura (← CVM) do registro das ofertas de distribuição de valores mobiliários, publicado no portal de dados abertos da CVM. Estes readers inauguram o portal root oferta/ (irmão de coord_oferta/, securit/, …) e fecham a issue #14.

Quinta fatia da Wave 4 do #41. ZIP de 2 membros por regime regulatório — a maior tabela de ofertas do portal, no molde do COORD_OFERTA (base privada + membros), mas não um par registro+satélite.

Veja também: Referência da API · Uso.


Descrição

Reader Membro do oferta_distribuicao.zip Colunas Colunas de data Chaves CNPJ
OfertaDistribuicaoReader oferta_distribuicao.csv (histórico, pré-RCVM 160) 76 9 CNPJ_Emissor, CNPJ_Lider, CNPJ_Ofertante
OfertaResolucao160Reader oferta_resolucao_160.csv (RCVM 160) 71 3 CNPJ_Emissor, CNPJ_Lider

OFERTA/DISTRIB publica um ZIP de dois membros, um por regime regulatório: o registro histórico das ofertas (pré-RCVM 160, ~48,9 mil linhas) e os requerimentos de oferta sob a Resolução CVM 160 (~13,9 mil linhas). Cada linha traz os números de processo/registro, emissor/líder/ofertante (nomes e CNPJs), datas, atributos do ativo e da oferta, e a quebra de investidores por tipo. Como os cadastros, é um retrato do estado atual numa URL fixa que a CVM sobrescreve no lugar — por isso não há date_ref, e um path_raw persistido é o único registro do que o arquivo dizia no dia da coleta. Nenhum grão é assumido.

⚠️ Os 2 membros NÃO são um par registro+satélite (ao contrário do COORD_OFERTA) — são duas tabelas de ofertas de regimes diferentes, com colunas disjuntas. Copiar uma na outra embarcaria o contract errado com todos os testes verdes; por isso cada contract é gerado do header publicado e pinado a tests/fixtures/oferta_distribuicao/*_header.csv (76/71 cols = risco real de transcrição), e a diferença tem teste próprio.

Tipagem

As colunas Data_* em ISO viram date puro (9 no histórico, 3 na RCVM 160). Todo o restante mantém o texto exato da CVM — inclusive as dezenas de colunas de contagem (Nr_*, Num_*, Qtd_*, Qtde_*) e os campos monetários (Valor_*, Preco_*), que preservam o texto decimal exato para um cast a Decimal a jusante (o reader é fino; a camada gold computa). O mapa de tipos é derivado do contrato, então os dois não podem divergir.

⚠️ Data_deliberacao_aprovou_oferta (RCVM 160) chega em DD/MM/YYYY (ex. 02/01/2023), não no ISO que todas as outras colunas de data usam. A coerção compartilhada é ISO-only (pd.to_datetime sem dayfirst), então tratá-la como data trocaria dia e mês silenciosamente. Ela é exigida pelo contrato mas fica deliberadamente fora de _DATE_COLS — volta como str exato, e um consumidor parseia com dayfirst=True. Honrado, não "consertado".

META

⚠️ A META deste dataset é um .zip de dois membros (meta_oferta_distribuicao.zip), não um .txt — o palpite meta_oferta_distribuicao.txt devolve 404. A URL do META é uma constante por dataset, nunca derivada da forma de um irmão. Os dois membros compartilham o prefixo oferta_, então com _MEMBER_STEM = "oferta" as section voltam simétricas (distribuicao, resolucao_160) — diferente do INTERMED/COORD_OFERTA, cujo membro de stem puro força o fallback assimétrico.


Política de retry

Todo reader aceita retry_policy: RetryPolicy | None = None e declara o seu padrão em _RETRY_POLICY (padrão paciente: 5 tentativas, backoff ~2, 4, 8, 10 s). Veja a visão geral da leitura.


Exemplos

Ofertas históricas (pré-RCVM 160)

from filings_cvm.ingestion.oferta import OfertaDistribuicaoReader

df_ = OfertaDistribuicaoReader().read()
# df_[["Numero_Registro_Oferta", "Tipo_Oferta", "Nome_Emissor", "Valor_Total"]]

Requerimentos RCVM 160 + persistir a camada bronze

from pathlib import Path
from filings_cvm.ingestion.oferta import OfertaResolucao160Reader

df_ = OfertaResolucao160Reader(
    path_raw=Path("/data/bronze/cvm/oferta_distribuicao"),
).read()
# df_[["Numero_Requerimento", "Status_Requerimento", "Nome_Emissor", "Valor_Total_Registrado"]]
# o ZIP inteiro e os dois membros ficam em disco: um path_raw de qualquer
# reader serve o outro (ambos baixam o mesmo arquivo).

Cada read levanta OSError (falha de download), ContractError (CSV viola o contrato) ou ValueError (membro ausente no arquivo) — falha cedo, sem devolver dados corrompidos.