A MarquesInteractive publica o MDC v1.0.1 sob licença MIT.
MDC é uma biblioteca Go, uma interface de linha de comando e um formato binário documentado para registros compactos de cotação. O projeto combina uma primitiva de 32 bits para o caminho comum com metadata explícita, bases absolutas, blocos independentes, CRC32C, streaming, acesso aleatório e recuperação de dados após danos localizados.
O código, a especificação normativa, os golden vectors, os benchmarks e os binários multiplataforma já estão disponíveis publicamente.
Este lançamento não apresenta apenas uma operação de bit packing. Ele apresenta o contrato necessário para que dados compactos continuem interpretáveis, verificáveis e recuperáveis fora do processo que os produziu.
O problema: repetição em alta frequência
Fluxos de mercado registram sucessivas atualizações de tempo, preço, spread e estado. Em muitos períodos, o evento seguinte difere pouco do anterior.
Representar cada atualização repetindo todos os valores absolutos é simples, mas pode desperdiçar espaço e largura de banda. Uma alternativa conhecida é armazenar um ponto de referência e codificar apenas as diferenças subsequentes.
No caminho comum do MDC, cada atualização ocupa uma palavra de 32 bits dividida em quatro campos:
- 16 bits para a diferença de tempo;
- 8 bits para a diferença assinada do bid;
- 4 bits para o spread;
- 4 bits para flags.
Esse layout é pequeno, previsível e compatível com operações diretas sobre inteiros. Em nossas medições de referência, Pack e Unpack não realizam alocações no heap.
Mas quatro bytes, isoladamente, não constituem um formato de dados.
Uma palavra compactada não informa qual instrumento está sendo representado, qual unidade mede o tempo, qual é o tick size, onde começa a sequência, como identificar corrupção ou o que fazer quando uma diferença não cabe no campo previsto.
Foi essa fronteira que orientou o desenvolvimento do MDC.
Da primitiva ao container
O formato canônico mantém a palavra 16/8/4/4 onde ela é adequada e adiciona uma estrutura capaz de preservar sua interpretação.
Cada arquivo carrega:
- identificador do instrumento;
- unidade econômica de preço;
- unidade temporal explícita;
- contrato de ordenação;
- tick size representado como número racional exato;
- bases absolutas de timestamp e bid;
- sessão e tick size efetivos por bloco;
- checksums CRC32C;
- índice opcional para arquivos finitos.
Os registros são organizados em blocos independentes. Cada bloco possui bases próprias e pode ser reconstruído e verificado sem depender dos blocos anteriores.
Quando ocorre um gap temporal, um salto de preço, uma regressão permitida pela ordem de origem, uma mudança de sessão ou uma alteração de tick size, o writer inicia um novo bloco. Spreads ou flags que excedem os quatro bits do caminho normal usam overrides esparsos.
O valor excepcional não é truncado para caber.
Essa decisão preserva a compacidade do caso comum sem transformar casos incomuns em corrupção silenciosa.
Integridade, acesso e recuperação
MDC usa CRC32C em headers, payloads, blocos e índice para detectar corrupção acidental. Arquivos finitos podem carregar um índice para busca por bloco e, quando a ordenação permite, por timestamp. Streams utilizam os mesmos blocos verificáveis, sem exigir um índice final.
O mecanismo de recovery procura fronteiras de blocos, valida dimensões, sequência, checksums e semântica e recodifica apenas os blocos aceitos em um novo arquivo canônico. Bytes não verificados não são copiados diretamente.
Recovery é salvamento forense. Não é autenticação e não prova a origem de um arquivo. CRC32C também não substitui assinatura digital ou transporte autenticado. Essas fronteiras fazem parte do modelo de segurança publicado junto ao projeto.
Um contrato compartilhado entre linguagens
A especificação MDC 1.0 descreve offsets, tamanhos, endianness, campos reservados, checksums e regras de canonicalização byte a byte.
O repositório inclui:
- implementação canônica em Go;
- leitor independente em Python com NumPy;
- validadores independentes em C11;
- golden vectors compartilhados entre as três linguagens;
- testes de I/O parcial e input malformado;
- properties, fault injection e seis alvos de fuzzing;
- builds para Linux, macOS e Windows em amd64 e arm64;
- compatibilidade contínua do Go 1.22 ao 1.26.
O objetivo não é apenas permitir que duas funções do mesmo pacote concordem entre si. É oferecer um wire format que implementações diferentes consigam interpretar da mesma maneira.
Evidência com dados de mercado
O MDC foi validado sobre uma projeção de cotações WINFUT contendo 22.755 linhas de origem.
O processo aceitou 22.753 registros e rejeitou dois casos em que o ask era inferior ao bid. Os registros inválidos não foram corrigidos silenciosamente.
Para cada registro aceito, a validação decodificou o artefato produzido e comparou exatamente timestamp, bid e ask reconstruído. A execução resultou em seis blocos independentes e preservou uma regressão temporal sob source ordering.
O arquivo JSONL de origem possuía 1.824.922 bytes. O artefato MDC produzido possuía 91.828 bytes.
Essa diferença é registrada como medição do artefato, não como taxa universal de compressão. O JSON e o MDC possuem estruturas diferentes, e o campo volume da origem não pertence ao schema atual do MDC.
A conclusão correta é delimitada: o teste prova preservação exata da projeção de cotação que o formato representa. Não reivindica losslessness de um feed completo.
Desempenho com semântica explícita
Para demonstrar que o MDC entrega alto desempenho sem depender de hardware especializado, os benchmarks da release foram coletados em um Intel Core i5-13400F, Go 1.26.2 e GOMAXPROCS=1, com vinte amostras de 500 milissegundos por operação.
Na primitiva, Pack foi medido em 2,804 ns/op e Unpack em 1,685 ns/op, ambos sem alocações. O empacotamento em lote de 4.096 palavras atingiu 2,028 GiB/s no ambiente medido.
No container canônico, uma fixture de 4.096 registros — incluindo metadata, blocos, overrides, CRC32C, índice e trailer — foi escrita a 43,38 milhões de registros por segundo e lida a 20,26 milhões de registros por segundo em memória.
Esses números não incluem disco, rede, parser de exchange ou estratégia de trading. A primitiva e o container também não oferecem a mesma semântica e, por isso, não devem ser apresentados como concorrentes diretos.
Os resultados completos, a variância e os comandos de reprodução estão publicados no repositório.
Escopo declarado
O schema MDC 1.0 representa timestamp, bid em ticks, spread em ticks, flags, sessão e tick size efetivo.
Ele não representa atualmente:
- volume;
- profundidade de book;
- trade side;
- ask modelado independentemente do spread;
- semântica específica de flags de cada venue.
MDC não se apresenta como schema universal de exchange. Ele fornece uma fundação compacta e verificável para o conjunto de campos que declara representar.
Essa delimitação não é um apêndice defensivo. É parte do contrato técnico.
Por que abrir
Sistemas binários tornam-se mais úteis quando seus contratos podem ser inspecionados, reproduzidos e implementados por terceiros.
Ao abrir o MDC, a MarquesInteractive disponibiliza não apenas código, mas também os elementos necessários para questioná-lo: especificação, vetores determinísticos, testes, benchmarks, modelo de segurança e histórico de release.
A abertura não altera a estratégia proprietária da empresa para modelos, dados e sistemas cognitivos. Ela estabelece uma fronteira consciente: componentes de infraestrutura podem ser abertos quando um contrato público e a interoperabilidade ampliam seu valor técnico.
Issues e contribuições tecnicamente fundamentadas são bem-vindas. Alterações no wire, claims de performance e otimizações de baixo nível devem chegar acompanhadas de evidência reproduzível.
Disponível agora
O MDC v1.0.1 pode ser instalado como módulo ou CLI:
go get github.com/marquesinteractive/go-mdc@v1.0.1
go install github.com/marquesinteractive/go-mdc/cmd/mdc@v1.0.1
Desenvolvemos. Especificamos. Validamos. Abrimos.
MDC v1.0.1 está disponível.
