Quando um banco central publica uma decisão de taxa de juros ou um escritório de estatísticas publica uma nova impressão da inflação, o anúncio bruto muitas vezes chega com barulho: codificação de artefatos, páginas parciais, campos faltantes ou revisões que contradizem o mês anterior.
Na FXMacroData tratamos a qualidade dos dados como uma preocupação de produto de primeira classe. Cada indicador de cada moeda passa por um pipeline de validação determinista antes de ser escrito para o Firestore e exposto através da API. Este post atravessa esse pipeline camada por camada desde o momento em que um pesquisador baixar uma resposta crua até o momento que um valor se tornar consultavel em
pontos finais como /v1/announcements/{currency}/{indicator}- Não .
O gasoduto num olhar
Fase 1: Ingestão
Fase 1 Ingestão: Receptores de fontes estruturadas
A validação começa antes de um único valor ser extraído. Cada moeda tem uma classe de captador dedicada que visa uma fonte primária oficial o site do banco central, o escritório nacional de estatísticas ou um portal de dados do governo. Nós deliberadamente evitamos agregadores secundários no caminho de ingestão: seu atraso, termos de licenciamento e revisões silenciosas ocasionais introduzem incertezas que não podemos controlar.
Os Fetchers são classes assíncronas de Python que implementam um async with O padrão de gerenciador de contexto. aiohttp.ClientSession com uma visão realista . User-Agent e timeouts controlados; na saída eles fecham limpam independentemente de a busca ter sucesso ou levantado. lxml Ou ... BeautifulSoup usando selectores de elementos exatos em vez de fallbacks regex contra marcas brutas, e as APIs JSON são acessadas através de teclas de acesso digitadas que aumentam imediatamente se um campo estiver ausente ou renomeado a montante.
Contrato de captura chaves de saída necessárias
{
"date": "2026-03-31", # ISO-8601 data string
"val": 3.5, # flutuar nunca corda
"announcement_datetime": "..." # UTC ISO-8601 se disponível
}
O contrato de saída é executado na fronteira do reator: qualquer registo faltante date Ou ... val é descartado antes de chegar ao próximo estágio. announcement_datetime É opcional na ingestão, mas é necessário para endpoints de publicação que expõem o tempo de evento aos consumidores de API.
Fase 2: Verificação do esquema
Fase 2 Verificação do esquema: validação do tipo e da exaustividade
A saída do captador bruto é entregue a um validador de esquema que aplica quatro verificações em cada registro:
Formato de data
Parsas como uma data ISO-8601. string não parseáveis, datas futuras além de uma janela de graça de dois dias, e datas antes de 1960 são todas rejeitadas.
Tipo de valor
val deve coagir a um Python finito float- Não . NaN- Não . Inf, e cordas não numéricas (por exemplo , "n/a", strings vazios) são rejeitados em vez de forçados a zero.
Detecção de duplicados
Se dois registos compartilharem o mesmo (currency, indicator, date) A tubulação guarda a última ingestão e registra a colisão.
Pares de indicadores de moeda
Cada registo é validado em relação ao catálogo de indicadores publicado. unemployment Para uma moeda que não expor esse indicador, o indicador produz um erro e interrompe o lote.
As falhas de esquema são apresentadas como entradas estruturadas de registro de nuvem marcadas com severity=ERROR- Não . stage=schema_check, e o nome do receptor de origem. Isso torna a diferença de execução cruzada direta no console GCP.
Fase 3: FILTRO EXTERNO
Fase 3 Filtro de intervalo e de valores atípicos
A validade estrutural é necessária mas não suficiente. 250.0 A fase 3 aplica duas verificações complementares para detectar estes erros semânticos.
Limite de alcance difícil
Cada indicador tem uma entrada de catálogo que inclui opcionais min_val E ... max_val A taxa de juro é, por exemplo, limitada entre -5.0 E ... 30.0 A inflação anual está limitada entre -30.0 E ... 300.0 Os valores fora destes limites são colocados em quarentena enquanto se aguarda uma revisão manual.
Detecção de valores anormais de pontuação z em rolamento
Para indicadores com pelo menos 24 meses de história no Firestore, o pipeline calcula uma média móvel de 36 meses e desvio padrão e sinaliza qualquer novo recorde cuja pontuação z exceda |4.0|Ao contrário dos limites rígidos, os sinais de pontuação z não descartam automaticamente os registos criam uma entrada de revisão e anexam um outlier_flag: true campo para o documento Firestore para que os consumidores de API possam filtrar opcionalmente registros com sinalização de outlier em seus próprios fluxos de trabalho.
Por que 4σ em vez de 3σ?
Os indicadores macros mostram realmente caudas gordas. Choques de suprimento do COVID-19, a crise energética de 2022 e ciclos rápidos de caminhada do banco central produziram leituras estatisticamente raras, mas reais. Um limiar de 3σ iria quarentena dados legítimos durante mudanças de regime, exatamente quando leituras precisas são mais importantes.
Fase 4: Reconciliação entre fontes
Fase 4 Reconciliação inter-fonte
Para um subconjunto de indicadores de alta importância taxas de juro do banco central, IPC principal e desemprego o pipeline mantém uma fonte secundária para referência cruzada contra.
Quando os valores primários e secundários para o mesmo (currency, indicator, date) Se as taxas de juro divergirem mais do que uma tolerância configurável, é emitido um alerta e o valor primário é mantido em espera de investigação. 5 basis pointsPara o IPC é . 0.1 percentage pointsAs tolerâncias são intencionalmente estreitas para estes indicadores porque mesmo pequenas discrepâncias indicam frequentemente um erro de análise, um atraso de reporte ou um conflito de revisão preliminar versus final.
Fontes primárias
- Comunicados oficiais do banco central
- Serviços nacionais de estatística
- Portais de dados do governo
Fontes de referência cruzada
- Pontos finais oficiais paralelos (por exemplo, BIS)
- Registros históricos com a marca de revisão
- Verificação interna da coerência anterior ao período
Além das verificações cruzadas por registo, o oleoduto também Verificação de continuidade mensal: se um novo registo representar uma alteração de mais de N A variação de variação da média de 12 meses é considerada como um conflito de revisão candidato. revised A data de publicação é a data em que o valor de uma data é atualizado após a publicação inicial.
Fase 5: INTEGRIDADE no dia de trabalho
Fase 5 Integridade do dia a dia
A fase final de validação aborda uma limitação sutil mas importante: cada announcement_datetime deve cair num dia útil válido no zona horária do mercado Os serviços de estatística e os bancos centrais não publicam anúncios nos fins de semana ou feriados , por isso, se o oleoduto produz um carimbo de hora que atinge um sábado em Tóquio ou um feriado bancário em Sydney, algo deu errado no sentido de upstream.
O validador chama . is_valid_announcement_date(currency, local_date), que verifica a data contra as definições de fusos horários por moeda e calendários completos de feriados mantidos na base de código. Cada moeda servida pela API AUD, EUR, GBP, JPY, USD, CAD, CHF, NZD e todos os outros tem seu próprio fusos de tempo e tabela de feriado independentes. As moedas não herdam de sua sessão FX; uma sexta-feira em Nova York pode ser sábado em Sydney, e o validador lida com isso com precisão.
Validação no dia útil (simplificada)
def é_válido_anúncio_data(currency: str, local_date: date) -> bool: tz = CURRENCY_TIMEZONE[currency] Rejeitar os fins de semana if local_date.weekday() >= 5: retorno False Rejeitar os feriados públicos if local_date in _build_holiday_set(currency, local_date.year): retorno False retorno True
Quando uma data calculada falha esta verificação, next_valid_announcement_date A plataforma de negociação de moeda de mercado também é executada por um conjunto de testes de CI que falha a compilação se qualquer moeda no catálogo estiver faltando fuso horário ou dados de feriados.
Precisão do calendário de lançamento: As datas dos próximos eventos a partir do final do calendário de lançamento como a próxima reunião do Fed ou a decisão da taxa do RBA são garantidas em dias úteis válidos no fuso horário do mercado da moeda. /api/v1/calendário/{moeda} Reflete directamente este calendário validado.
- Não, não.
Monitorização e alerta contínuos
Passar o pipeline de validação uma vez não é suficiente. O pipeline é executado em um cronograma desencadeado por Cloud Tasks e backfill workflows e cada execução produz telemetria estruturada que alimenta uma camada de monitoramento.
Alertas em fase
Falhas em qualquer fase do gasoduto emitem uma entrada de registo de nuvem imediatamente para triagem.
Hash de conteúdo
Todas as firestores incluem um content_hash Detectar e exibir revisões silenciosas a montante.
Verificação da estabilidade
Os leitores detectam quando os dados armazenados ficam mais de N dias atrás do intervalo solicitado e surgem um sinal de lacuna em vez de retornar silenciosamente valores obsoletos.
Quando um captador não retorna dados tempo de espera da rede, mudança de local a montante ou mudança da estrutura de resposta o pipeline não retrocede para chamadas a montante ao momento da solicitação. Em vez disso, emite um falha de validação e retorna um resultado vazio ou um resultado estruturado DataUnavailableError Isto impede que dados obsoletos ou parcialmente validados cheguem à camada API, mesmo temporariamente.
===== MANUALIZAÇÃO DE REVISÃO =======
Tratamento de revisões e reformulações
As revisões de dados macro são um fato da vida. As estimativas iniciais do PIB são revisadas duas e três vezes. As folhas de pagamento são reformuladas significativamente. O pipeline lida com revisões explicitamente em vez de sobrescrever silenciosamente:
- Armazenamento da primeira impressão: O pipeline armazena o primeiro valor para um dado
(currency, indicator, date)com umrevised: falsebandeira. - Detecção de revisão: No caso de uma data em que o valor de um indicador tenha mudado mais do que o limiar de revisão, o documento é atualizado e
revised: trueestá definido. - Preservação da história: O valor original da primeira impressão é preservado num
prior_valcampo para efeitos de auditoria e comparação. - Transparência das API: O ...
revisedO campo é exposto nas respostas da API para que as aplicações que consomem possam distinguir as leituras preliminares das finais.
Isto é mais importante para indicadores como as folhas de pagamento não agrícolas, onde a impressão preliminar e a revisão subsequente podem diferir em dezenas de milhares de empregos um sinal significativo por si só para os operadores de câmbio que acompanham a narrativa de emprego em dólares através do Ponto de partida das folhas de pagamento não agrícolas- Não .
O que isto significa para os consumidores de API.
O que isto significa para os consumidores de API
O resultado prático deste pipeline para quem quer consultar a API:
- Não .
NaNOu ...nullvalores da série os registos com valores inválidos são excluídos na fase 2 em vez de serem passados como buracos. - Datas em que se pode confiar cada data de uma resposta é uma data de calendário válida num dia útil para o mercado dessa moeda, adequada para utilização directa em calendários de negociação ou motores de backtesting.
- Marcas de horário de anúncio com precisão de segundo se disponível,
announcement_datetimeReflete o segundo UTC exato da versão oficial, não um marcador de espaço da meia-noite. - Bandeiras de revisão o
revisedA análise de dados de base permite distinguir se se está a trabalhar numa leitura preliminar ou numa leitora final. - Unidades de indicadores consistentes Os indicadores de taxa são sempre em percentagem, não em decimais (por exemplo,
5.25Não , não .0.0525), correspondendo à representação nos sítios web oficiais do banco central.
O catálogo dos indicadores documenta exactamente quais as fontes de alimentação de cada série, de modo a que possa verificar a proveniência de qualquer ponto de dados de forma independente.
Fechamento do CTA .