Por que os timestamps dos dados de mercado divergem

Equipamentos de rede em um data center, ilustrando por que os timestamps dos dados de mercado divergem
Photo by panumas nikhomkhai on Pexels

Uma negociação acontece uma vez. Quando chega a um banco de dados, ela traz três ou quatro horários diferentes, nenhum deles errado, e cada um mede algo ligeiramente distinto. A maioria das discussões sobre reconciliação, na verdade, trata de qual relógio alguém quis dizer.

Os relógios em um fluxo normal

TimestampDefinido porDiferença típica em relação ao anterior
Horário do motor de matchingA bolsa, no momento do matchingPonto de referência
Horário de publicação do feedA camada de distribuição da bolsa10 a 500 microssegundos
Horário de recebimento no gatewaySeu broker ou fornecedor1 a 50ms em redes públicas
Horário de recebimento localSeu próprio processo0.1 a 20ms, mais jitter de agendamento
Horário de gravação no banco de dadosSua camada de armazenamentoQualquer valor, e não é um evento de mercado

A última linha é a que causa problemas, porque é a mais fácil de registrar e a menos significativa. Ordenar eventos pelo horário de gravação no banco de dados produz uma sequência que geralmente está certa e, às vezes, sob carga, está muito errada.

De onde vem a divergência

  • Relógios diferentes. A bolsa, o gateway e seu host mantêm cada um o seu próprio relógio, sincronizados segundo padrões variados.
  • Eventos diferentes. Matching, publicação, recebimento e armazenamento são quatro momentos distintos, não quatro leituras de um só.
  • Resoluções diferentes. Um feed em milissegundos e um log em microssegundos nunca vão coincidir exatamente, e o arredondamento esconde o sentido do erro.
  • Horário de verão e convenções da bolsa. Menos comuns do que antes, mas ainda não desapareceram, e sempre são descobertos no dia em que os relógios mudam.

O que fazer

  1. Armazene todos os timestamps que receber, cada um em sua própria coluna, em UTC.
  2. Registre seu próprio horário de recebimento com uma fonte monotônica, não com o relógio de parede.
  3. Monitore a diferença entre seu host e uma referência e configure alertas para desvios, em vez de verificar isso depois de um incidente.
  4. Escolha um relógio como chave de ordenação, registre essa decisão e faça com que cada relatório informe qual foi usado.
  5. Quando dois sistemas divergirem, compare o mesmo relógio em ambos antes de presumir que algum deles está com defeito.

O objetivo não é fazer os relógios coincidirem, porque eles medem coisas diferentes e nunca vão coincidir. É saber de qual relógio veio cada número, para que uma discrepância seja um fato sobre o fluxo, e não um mistério sobre os dados.

Perguntas frequentes

Qual timestamp devo armazenar?

Todos, em colunas separadas. Armazenar apenas um é uma decisão que não dá para desfazer, e o custo de três colunas bigint é insignificante perto do custo de reconstruir o histórico porque você manteve o relógio errado.

Qual costuma ser a diferença entre o horário da bolsa e o horário local?

Em uma conexão de varejo pela internet pública, geralmente 20 a 150ms, com desvios ocasionais muito maiores. Em um ambiente co-localizado, cai para microssegundos. A variação importa mais que o número.

NTP é suficiente?

Para estratégias medidas em segundos, sim, geralmente com precisão de poucos milissegundos. Para qualquer coisa medida em microssegundos, você precisa de PTP e timestamping por hardware, e deve monitorar a diferença em vez de presumir que está tudo certo.