Cómo validamos la exactitud de los datos macro antes de servirlos banner image

Builders

Engineering

Cómo validamos la exactitud de los datos macro antes de servirlos

Una mirada dentro de la tubería de validación de datos de varias etapas que garantiza que cada indicador macro servido por FXMacroData sea preciso, oportuno y consistente desde la ingesta inicial y las comprobaciones de esquema hasta el filtrado de valores atípicos, la conciliación entre fuentes y las reglas de integridad del día hábil.

Disponible también en English
Datos estructurados: artículo El héroe conduce .

Ingeniería

Los datos macro son tan útiles como lo son . es exactoAquí está cómo cada punto de datos servido por FXMacroData pasa por una tubería de validación de cinco etapas antes de llegar a su aplicación.

Cuando un banco central publica una decisión sobre las tasas de interés o una oficina de estadísticas publica una nueva impresión de inflación, el anuncio en bruto a menudo llega con ruido: codificación de artefactos, páginas parciales, campos faltantes o revisiones que contradicen el mes anterior.

En FXMacroData tratamos la calidad de los datos como una preocupación de producto de primera clase. Cada indicador de cada moneda pasa por una tubería de validación determinista antes de ser escrita en Firestore y expuesta a través de la API. Este post atraviesa esa tubería capa por capa desde el momento en que un buscador descarga una respuesta en bruto hasta el momento que un valor se vuelve consultable en puntos finales como /v1/announcements/{currency}/{indicator}- ¿ Qué ?

Llamada de la línea de tuberías .

Una mirada a las tuberías

1 Ingestión ¿Qué es? 2 Verificación de esquemas ¿Qué es? 3 Rango y filtro de valores extremos ¿Qué es? 4 Reconciliación entre fuentes ¿Qué es? 5 Integridad en el día a día

Estadio 1: Ingestión

Fase 1 Ingestión: Recogedores de fuentes estructuradas

La validación comienza antes de que se extraiga un solo valor. Cada moneda tiene una clase de buscadores dedicada que se dirige a una fuente principal oficial el sitio web del banco central, la oficina nacional de estadísticas o un portal de datos gubernamentales. Evitamos deliberadamente los agregadores secundarios en la ruta de ingestión: su retraso, términos de licencia y revisiones silenciosas ocasionales introducen incertidumbre que no podemos controlar.

Los fetchers son clases asíncronas de Python que implementan un async with En la entrada se abre un aiohttp.ClientSession con una visión realista. User-Agent y tiempos de espera controlados; en la salida se cierran limpiamente independientemente de si la búsqueda tuvo éxito o se levantó. lxml ¿ Qué ? BeautifulSoup utilizando selectores de elementos exactos en lugar de fallbacks regex contra marcado en bruto, y las API de JSON se acceden a través de teclas de acceso escritas que se elevan inmediatamente si un campo está ausente o se renombra aguas arriba.

Cuadro de resaltado de código

Contrato de recogida claves de salida requeridas

{
    "date": "2026-03-31",          # ISO-8601 cadena de fechas
    "val": 3.5,                    # flote  nunca cuerda
    "announcement_datetime": "..." # UTC ISO-8601 si está disponible
}

El contrato de salida se ejecuta en el límite de la recepción: cualquier registro faltante date ¿ Qué ? val Se descarta antes de llegar a la siguiente etapa. announcement_datetime es opcional al ingerirlo, pero es necesario para los puntos finales de publicación que exponen el tiempo de evento a los consumidores de API.


La primera fase es la de la verificación de los esquemas.

Etapa 2 Verificación del esquema: validación del tipo y de la integridad

La salida del buscador en bruto se entrega a un validador de esquemas que aplica cuatro comprobaciones en cada registro:

Formato de fecha

Se analiza como una fecha ISO-8601. Las cadenas no analizables, las fechas futuras más allá de una ventana de gracia de dos días y las feches anteriores a 1960 se rechazan.

Tipo de valor

val debe coaccionar a un Python finito float- ¿ Qué ? NaN¿ Qué ? Inf, y cadenas no numéricas (por ejemplo , "n/a", cuerdas vacías) son rechazadas en lugar de ser forzadas a cero.

Detección de duplicados

Si dos registros comparten el mismo (currency, indicator, date) La llave, la tubería guarda la más reciente ingerida y registra la colisión.

Emparejamiento de divisas con indicadores

Cada registro se valida con el catálogo de indicadores publicado. unemployment para una moneda que no exponga ese indicador, se produce un error y se detiene el lote.

Los fallos de esquema aparecen como entradas de registro de nube estructuradas etiquetadas con severity=ERROR¿ Qué ? stage=schema_checkEsto hace que la diferenciación de ejecución cruzada sea sencilla en la consola GCP.


La primera fase es el filtro exterior.

Fase 3 Filtro de rango y valor fuera de serie

La validez estructural es necesaria pero no suficiente. 250.0 La fase 3 aplica dos comprobaciones complementarias para detectar estos errores semánticos.

Límites de alcance duro

Cada indicador tiene una entrada de catálogo que incluye opcionales min_val ¿ Qué ? max_val Los tipos de interés de las políticas, por ejemplo, están limitados entre -5.0 ¿ Qué ? 30.0 La inflación interanual se sitúa entre -30.0 ¿ Qué ? 300.0 Los valores situados fuera de estos límites se ponen en cuarentena en espera de una revisión manual.

Detección de valores atípicos de puntaje z en rodaje

Para indicadores con al menos 24 meses de historia en Firestore, la línea de conducción calcula una media móvil de 36 meses y una desviación estándar y señala cualquier nuevo registro cuyo puntaje z exceda |4.0|A diferencia de los límites duros, las banderas de puntuación z no descartan automáticamente los registros crean una entrada de revisión y adjuntan un outlier_flag: true El campo de control de los datos de la API se puede filtrar en el documento Firestore para que los usuarios de API puedan filtrar opcionalmente los registros con marcas atípicas en sus propios flujos de trabajo.

¿ Por qué 4σ y no 3σ ?

¿Por qué 4σ en lugar de 3σ?

Los indicadores macro realmente muestran colas gordas. Los choques de suministro de COVID-19, la crisis energética de 2022 y los rápidos ciclos de excursión del banco central produjeron lecturas estadísticamente raras pero reales. Un umbral de 3σ pondría en cuarentena los datos legítimos durante los cambios de régimen, exactamente cuando las lectiras precisas son más importantes.


Fase 4: Reconciliación entre fuentes

Fase 4 Reconciliación entre las fuentes

Para un subconjunto de indicadores de gran importancia tasas de interés del banco central, IPC principal y desempleo la línea de conducción mantiene una fuente secundaria para hacer referencia cruzada.

Cuando los valores primarios y secundarios para el mismo (currency, indicator, date) Si el valor de la política de interés se desvía más de una tolerancia configurable, se genera una alerta y se mantiene el valor primario en espera de una investigación. 5 basis pointsPara el IPC es . 0.1 percentage pointsLas tolerancias son intencionalmente estrechas para estos indicadores porque incluso pequeñas discrepancias a menudo indican un error de análisis, un retraso en el reporte o un conflicto de revisión preliminar vs final.

Diseño de dos columnas: primario vs secundario

Fuentes primarias

  • Comunicados oficiales del banco central
  • Oficinas nacionales de estadísticas
  • Portales de datos del gobierno

Fuentes de referencia cruzada

  • Puntos finales oficiales paralelos (por ejemplo, BIS)
  • Registros históricos con la bandera de revisión
  • Control interno de la coherencia con anterioridad al período

Además de las comprobaciones cruzadas por registro, la tubería también tiene un Verificación de continuidad de un mes a otro: si un nuevo registro representa un cambio de más de N Las versiones preliminares difieren con frecuencia de las revisiones finales; el canal registra ambos valores y expone un revised La etiqueta de la fecha se actualiza cuando el valor de una fecha se ha publicado inicialmente.


Fase 5: Integridad del día de trabajo

Etapa 5 Integridad de la jornada laboral

La fase final de validación aborda una limitación sutil pero importante: cada announcement_datetime debe caer en un día hábil válido en el zona horaria del mercado Los organismos de estadística y los bancos centrales no publican anuncios los fines de semana o días festivos así que si la tubería produce una marca de tiempo que aterriza un sábado en Tokio o un día festivo en Sydney, algo salió mal aguas arriba.

El validador llama . is_valid_announcement_date(currency, local_date), que verifica la fecha con las definiciones de zona horaria por moneda y los calendarios completos de vacaciones mantenidos en la base de código. Cada moneda servida por la API AUD, EUR, GBP, JPY, USD, CAD, CHF, NZD y todos los demás tiene su propia zona horario y tabla de vacacciones independientes. Las monedas no heredan de su sesión de divisas; un viernes en Nueva York puede ser sábado en Sydney, y el validador maneja esto con precisión.

Llamada de código: función de validación

Validación del día hábil (simplificada)

- ¿ Qué? es_válido_anuncio_fecha(currency: str, local_date: date) -> bool:
    tz = CURRENCY_TIMEZONE[currency]
    # Rechazar los fines de semana
    if local_date.weekday() >= 5:
        regreso False
    # Rechazar los días festivos
    if local_date in _build_holiday_set(currency, local_date.year):
        regreso False
    regreso True

Cuando una fecha calculada falla en esta comprobación, next_valid_announcement_date El calendario de lanzamiento de una moneda en el catálogo de divisas es un sistema de calendario que permite a los usuarios de las API realizar un seguimiento de la fecha de lanza de una divisa en el calendario comercial de la moneda en cuestión.

Precisión del calendario de liberación: Las fechas de los próximos eventos a partir del punto final del calendario de publicación como la próxima reunión de la Fed o la decisión de la tasa del Banco Central caerán garantizadas en días hábiles válidos en la zona horaria del mercado de la moneda. /api/v1/calendario/{moneda} refleja directamente este calendario validado.


¿Qué es lo que está pasando?

Monitoreo y alerta continuos

Pasar la tubería de validación una vez no es suficiente. La tubería se ejecuta en un cronograma activado por Cloud Tasks y flujos de trabajo de relleno y cada ejecución produce telemetría estructurada que alimenta una capa de monitoreo.

Alertas en fase

Las fallas en cualquier etapa de la tubería emiten una entrada de registro de nube inmediatamente para la clasificación.

Contenido hash

Cada firestore escribe incluye un content_hash para detectar y detectar revisiones silenciosas aguas arriba.

Verificación de la antigüedad

Los lectores detectan cuando los datos almacenados se quedan más de N días detrás del rango solicitado y aparecen una señal de brecha en lugar de devolver silenciosamente valores obsoletos.

Cuando un buscador no devuelve datos tiempo de espera de la red, cambio de sitio de aguas arriba o cambio de estructura de respuesta la tubería no vuelve a las llamadas en vivo en el momento de la solicitud. DataUnavailableError Esto evita que los datos obsoletos o parcialmente validados lleguen a la capa API, incluso temporalmente.


===== Manejo de la revisión =======

Cómo manejar las revisiones y las reformulaciones

Las revisiones de datos macro son un hecho de la vida. Las estimaciones iniciales del PIB se revisan dos o tres veces. Las nóminas se reanudan significativamente. La tubería maneja las revisiones explícitamente en lugar de sobrescribir silenciosamente:

  • Almacenamiento de la primera impresión: La tubería almacena el primer valor para un determinado (currency, indicator, date) con un revised: false La bandera.
  • Detección de revisión: En las siguientes sesiones de ingestión, si el valor de una fecha ha cambiado más que el umbral de revisión del indicador, el documento se actualiza y revised: true está listo.
  • Preservación de la historia: El valor original de la primera impresión se conserva en un prior_val el campo para fines de auditoría y comparación.
  • Transparencia de las API: El revised El campo de datos está expuesto en las respuestas de API para que las aplicaciones que consumen puedan distinguir las lecturas preliminares de las finales.

Esto es más importante para indicadores como las nóminas de pago no agrícolas, donde la impresión preliminar y la revisión posterior pueden diferir en decenas de miles de puestos de trabajo una señal significativa por sí misma para los operadores de divisas que rastrean la narrativa de empleo en dólares a través de la Punto final de las nóminas no agrícolas- ¿ Qué ?


¿Qué significa esto para los consumidores de API?

Lo que esto significa para los consumidores de API

El resultado práctico de este proyecto para cualquiera que pregunte por la API:

  • No , no lo sé . NaN ¿ Qué ? null valores de la serie los registros con valores inválidos se excluyen en la etapa 2 en lugar de pasar como agujeros.
  • Fechas en las que puedes confiar cada fecha de una respuesta es una fecha calendario válida en un día hábil para el mercado de esa moneda, adecuada para su uso directo en calendarios de negociación o motores de backtesting.
  • Marcas de tiempo de anuncio con precisión de segundo cuando esté disponible, announcement_datetime refleja el segundo UTC preciso de la publicación oficial, no un marcador de posición de medianoche.
  • Banderas de revisión el revised El campo de lectura de la información permite distinguir si se trata de una lectura preliminar o final.
  • Unidades de indicadores coherentes Los indicadores de tipos se expresan constantemente en porcentaje, no en decimal (por ejemplo, 5.25 No lo es . 0.0525), que coincide con la representación en los sitios web oficiales del banco central.

Encuentra cualquier indicador tasa de interés, IPC principal, desempleo y la respuesta que recibes ya ha pasado las cinco etapas. El catálogo de indicadores documenta exactamente qué fuentes alimentan cada serie, por lo que puedes verificar la procedencia de cualquier punto de datos de forma independiente.

Cierre del CTA .

Explora los datos

Todos los indicadores del catálogo han pasado por este canal.

Referencia de la API →

Blogroll