28. Fuentes de datos, frecuencia, marcas de tiempo y calidad

Un cálculo correcto sobre datos incompletos, antiguos o mal identificados sigue produciendo una respuesta incorrecta. La calidad debe diseñarse desde la fuente hasta el resultado final.

28.1 Los datos no aparecen solos

Cada cotización, operación, instrumento o evento corporativo proviene de una fuente y atraviesa transformaciones antes de llegar a una aplicación. En ese recorrido puede adquirir nuevos identificadores, unidades, marcas temporales y estados.

Conocer el origen permite interpretar alcance, latencia, correcciones y permisos de uso. Un archivo descargado y un flujo en tiempo real pueden contener campos parecidos, pero ofrecer garantías muy diferentes.

Idea central: calidad no significa solamente “sin valores nulos”. Significa que el dato es adecuado para una finalidad definida y conserva suficiente contexto para ser comprendido y verificado.

28.2 Familias de datos financieros

MD

Mercado

Órdenes, puntas, operaciones, índices y cierres.

RF

Referencia

Instrumentos, identificadores, monedas y calendarios.

CA

Eventos

Dividendos, splits, canjes y vencimientos.

FN

Fundamentales

Estados contables y datos del emisor.

PF

Posiciones

Tenencias, efectivo, costos y movimientos.

RG

Regulatorios

Publicaciones y reportes definidos por normas.

Cada familia tiene ritmos, claves y criterios de corrección propios. Un único esquema genérico rara vez conserva toda la semántica.

28.3 Fuente primaria y fuente secundaria

Una fuente primaria origina o registra el dato dentro del proceso pertinente: por ejemplo, un mercado para sus operaciones o un emisor para un anuncio. Una fuente secundaria recopila, normaliza o redistribuye información de otras fuentes.

“Primaria” no significa automáticamente accesible, consolidada ni suficiente. “Secundaria” no significa incorrecta: puede aportar normalización, cobertura y soporte valiosos.

28.4 Proveedores, intermediarios y fuentes internas

OrigenAportePregunta necesaria
Mercado o infraestructuraDatos de su propio ámbito.¿Qué sesiones y tipos de evento incluye?
DistribuidorNormalización y varias fuentes.¿Cómo consolida, corrige y simboliza?
IntermediarioDatos y estados relacionados con la cuenta.¿Son indicativos, ejecutables o contables?
Sistema internoPosiciones, modelos y transformaciones.¿Cuál es el linaje hasta los datos de origen?
Publicación abiertaAcceso sencillo o divulgación.¿Qué licencia, demora y garantía ofrece?

28.5 Elegir una fuente según el uso

Una fuente adecuada para gráficos educativos puede no serlo para enviar órdenes, valorar garantías o producir reportes. Cobertura, oportunidad, exactitud, soporte, costo y derechos deben evaluarse respecto del caso.

Primero la finalidad: definir la decisión que utilizará el dato, el error tolerable y el tiempo disponible antes de elegir formato o proveedor.

28.6 Frecuencia de observación y de actualización

La frecuencia de observación describe con qué periodicidad se mide o agrega un fenómeno. La frecuencia de actualización indica cada cuánto puede recibirse una nueva versión.

Una serie diaria puede revisarse varias veces después del cierre; un flujo evento a evento puede permanecer quieto si no ocurren operaciones. Frecuencia alta no garantiza información nueva ni mayor calidad.

28.7 Evento, instantánea y lote

E

Evento

Describe un cambio individual con identidad o secuencia.

S

Instantánea

Representa el estado conocido en un instante.

B

Lote

Agrupa registros para entrega y procesamiento conjunto.

Confundir una instantánea con una lista de cambios puede duplicar cantidades. Interpretar eventos como estado completo puede borrar información no mencionada.

28.8 Streaming, polling y archivos

En streaming, la fuente impulsa mensajes; con polling, el cliente consulta; en lotes, intercambia archivos o conjuntos completos. El mecanismo de entrega no determina por sí solo si el dato es en tiempo real.

La selección considera latencia, volumen, recuperación, límites de uso y necesidad de reconstrucción. Una arquitectura puede combinar instantánea inicial, incrementos y archivo de cierre.

28.9 El recorrido del dato

1 · ORIGENOcurre o se publica
2 · CAPTURASe registra
3 · TRANSPORTESe transmite
4 · NORMALIZACIÓNSe transforma
5 · ALMACÉNSe versiona
6 · CONSUMOSe calcula o muestra

Cada etapa debería conservar entrada, salida, hora, versión y responsable lógico para poder localizar diferencias.

28.10 Cuatro marcas temporales útiles

MarcaPreguntaEjemplo
Hora del evento¿Cuándo ocurrió?Ejecución en el mercado.
Hora de publicación¿Cuándo la fuente lo emitió?Mensaje disponible.
Hora de recepción¿Cuándo llegó al sistema?Entrada al consumidor.
Hora de procesamiento¿Cuándo terminó la transformación?Registro almacenado.
latencia extremo a extremo = procesamiento − eventoLas marcas intermedias permiten asignar la demora al tramo correcto.

28.11 UTC, offset y zona horaria

UTC facilita ordenar acontecimientos globales. Un offset como −03:00 identifica el desplazamiento en ese instante; una zona como America/Argentina/Buenos_Aires contiene reglas históricas.

Guardar una hora local sin offset genera ambigüedad. Para mostrar al usuario puede convertirse, pero el valor original y la zona del mercado deben preservarse.

28.12 Fecha de mercado

La fecha de mercado no siempre coincide con la fecha UTC ni con la del servidor. Una sesión nocturna puede pertenecer al día hábil siguiente bajo el calendario del mercado.

Calcular OHLCV diario, vencimientos o cierres requiere una función de calendario y sesión, no cortar cadenas ISO en la medianoche elegida por casualidad.

28.13 Precisión y sincronización de relojes

Milisegundos visibles no garantizan exactitud de milisegundos. La resolución de la fuente, la precisión del reloj y su sincronización son propiedades distintas.

Si dos sistemas tienen relojes desplazados, una latencia puede parecer negativa. Deben monitorearse desviaciones y conservar la incertidumbre cuando corresponda.

28.14 Dimensiones de calidad

EX

Exactitud

Representa correctamente el fenómeno.

CP

Completitud

Están presentes registros y campos esperados.

VL

Validez

Cumple tipos, dominios e invariantes.

CS

Consistencia

No contradice datos relacionados.

OP

Oportunidad

Llega a tiempo para el uso previsto.

UN

Unicidad

No contiene duplicados indebidos.

28.15 Exactitud no es validez

Un precio positivo puede ser válido por formato y, aun así, pertenecer a otro instrumento. Un valor negativo puede ser inválido para una acción pero legítimo para otra variable.

La validación automatizada detecta reglas conocidas; la exactitud suele requerir comparación con el origen, reconciliación o conocimiento del proceso.

28.16 Valores ausentes, cero y no aplicable

Cero es un valor; ausente significa desconocido o no recibido; no aplicable indica que el concepto no corresponde. Convertir los tres a 0 borra información.

También debe distinguirse una cadena vacía de un nulo y una barra sin operaciones de una barra con volumen genuinamente cero según la metodología.

28.17 Esquema, tipos y unidades

Un contrato de datos define campos obligatorios, tipos, enumeraciones, precisión, moneda, unidad y significado. Validar solo que el JSON pueda parsearse es insuficiente.

Ejemplo: volume: 100 podría significar acciones, contratos, lotes o moneda. El tipo numérico no resuelve la unidad.

28.18 Identificadores y datos maestros

Unir por símbolo puede mezclar mercados o reutilizaciones históricas. Las claves deben identificar instrumento, clase, mercado y vigencia.

Los datos maestros parecen estáticos, pero cambian: símbolos, nombres, monedas, lotes y estados tienen fechas efectivas. Las relaciones temporales deben modelarse.

28.19 Duplicados e idempotencia

Un mensaje puede reenviarse después de una reconexión. Procesarlo dos veces duplica volumen o movimientos. Una operación idempotente produce el mismo estado aunque reciba repetidamente el mismo evento.

La clave de deduplicación debe provenir del protocolo: identificador de evento, secuencia dentro de un canal o clave compuesta documentada.

28.20 Brechas y mensajes fuera de orden

Un salto de secuencia puede revelar pérdida; una secuencia menor, retraso o duplicación. La respuesta depende del flujo: pausar, almacenar temporalmente, solicitar retransmisión o cargar una instantánea.

Continuar como si nada puede producir un estado coherente en apariencia pero incorrecto, una falla más peligrosa que un error visible.

28.21 Reconciliación entre fuentes

Reconciliar compara registros que deberían representar el mismo hecho o saldo. Las diferencias pueden surgir por alcance, horarios, redondeo, correcciones o errores.

diferencia = valor interno − valor de referenciaUna tolerancia debe justificarse por unidad y finalidad, no ocultar cualquier discrepancia.

28.22 Linaje y procedencia

El linaje permite recorrer el camino desde un resultado hasta sus entradas y transformaciones. Incluye fuente, archivo o mensaje, versión del código, parámetros y hora de proceso.

Sin linaje, corregir una fuente obliga a adivinar qué resultados quedaron afectados. Con linaje se pueden invalidar y recalcular dependencias concretas.

28.23 Licencias, retención y privacidad

Acceso técnico no implica derecho a redistribuir, almacenar indefinidamente o crear productos derivados. Contratos de datos pueden diferenciar visualización, uso no visible y categorías de usuario.

Los datos de cuentas y clientes agregan obligaciones de privacidad y seguridad. Deben recopilarse solo los campos necesarios y controlarse acceso, retención y auditoría.

28.24 Observabilidad y acuerdos de nivel

Un proceso debe exponer métricas: mensajes recibidos, demora, errores, duplicados, brechas, registros rechazados y hora del último evento válido.

Un acuerdo de nivel de servicio define compromisos de disponibilidad o tiempo; un objetivo interno define la meta operativa. Ninguno reemplaza controles semánticos del dato.

28.25 Laboratorio: evaluar un lote

Modificá las observaciones del lote. El puntaje es una rúbrica educativa con igual peso para cinco dimensiones; no constituye un estándar universal y supone que inválidos y duplicados son grupos separados.

Control ficticio · cotizaciones ABC

Umbral de oportunidad: 30 segundos. Cada brecha descuenta 20 puntos de continuidad.

Puntaje didáctico96,53Calidad alta
Completitud
98,00%
Validez
98,98%
Unicidad
98,98%
Oportunidad
86,67%
Continuidad
100,00%
Faltantes2
Registros utilizables96
FuenteDirecta
DecisiónAceptar con advertencias

El lote es utilizable, pero contiene faltantes, inválidos o duplicados que deben quedar registrados.

28.26 Validar un registro con JavaScript

function validarCotizacion(dato) {
  const errores = [];
  if (typeof dato.instrumentoId !== "string" || !dato.instrumentoId) errores.push("instrumentoId");
  if (!Number.isFinite(dato.bid) || dato.bid < 0) errores.push("bid");
  if (!Number.isFinite(dato.ask) || dato.ask < 0) errores.push("ask");
  if (dato.bid > dato.ask) errores.push("puntas cruzadas");
  if (Number.isNaN(Date.parse(dato.horaEvento))) errores.push("horaEvento");
  if (!dato.moneda) errores.push("moneda");
  return { valida: errores.length === 0, errores };
}

console.log(validarCotizacion({
  instrumentoId: "ABC-ORD-A", bid: 99.8, ask: 100.2,
  horaEvento: "2026-09-14T14:30:00.125Z", moneda: "ARS"
}));

28.27 Calcular métricas de un lote

function metricasLote({ esperados, recibidos, invalidos, duplicados }) {
  if (esperados <= 0 || recibidos < 0 || invalidos < 0 || duplicados < 0 ||
      invalidos + duplicados > recibidos) {
    throw new RangeError("Conteos incompatibles");
  }
  return {
    completitud: Math.min(recibidos / esperados, 1),
    validez: recibidos === 0 ? 0 : (recibidos - invalidos) / recibidos,
    unicidad: recibidos === 0 ? 0 : (recibidos - duplicados) / recibidos,
    utilizables: recibidos - invalidos - duplicados
  };
}

console.log(metricasLote({ esperados: 100, recibidos: 98, invalidos: 1, duplicados: 1 }));

28.28 Detectar duplicados y brechas

function auditarSecuencias(secuencias) {
  const vistas = new Set();
  const duplicadas = [];
  const unicas = [];
  for (const secuencia of secuencias) {
    if (vistas.has(secuencia)) duplicadas.push(secuencia);
    else { vistas.add(secuencia); unicas.push(secuencia); }
  }
  unicas.sort((a, b) => a - b);
  const brechas = [];
  for (let i = 1; i < unicas.length; i++) {
    if (unicas[i] !== unicas[i - 1] + 1) {
      brechas.push({ desde: unicas[i - 1] + 1, hasta: unicas[i] - 1 });
    }
  }
  return { duplicadas, brechas };
}

console.log(auditarSecuencias([100, 101, 101, 103, 104]));

28.29 Conservar procedencia

function normalizarPrecio(mensaje, contexto) {
  return {
    instrumentoId: contexto.instrumentoId,
    mercado: mensaje.venue,
    moneda: contexto.moneda,
    precio: Number(mensaje.price),
    horaEvento: mensaje.eventTime,
    horaRecepcion: contexto.receivedAt,
    fuente: contexto.source,
    mensajeId: mensaje.id,
    esquemaVersion: contexto.schemaVersion,
    transformacionVersion: "normalize-price-1.2"
  };
}

console.log(normalizarPrecio(
  { id: "M-8", venue: "XMPL", price: "100.25", eventTime: "2026-09-14T14:30:00Z" },
  { instrumentoId: "ABC-A", moneda: "ARS", receivedAt: "2026-09-14T14:30:00.2Z", source: "FEED-X", schemaVersion: "3" }
));

28.30 Errores frecuentes

  • Elegir una fuente antes de definir el uso y la tolerancia al error.
  • Confundir frecuencia de consulta con frecuencia de información nueva.
  • Guardar horas locales sin offset ni zona.
  • Usar la recepción como hora del evento.
  • Convertir ausente, cero y no aplicable al mismo valor.
  • Validar tipos sin comprobar unidades e invariantes.
  • Continuar después de una brecha sin reconstruir el estado.
  • Transformar datos sin conservar fuente, versión y licencia.

28.31 Ejercicio integrador

Un lote esperaba 200 registros y recibió 190. Contiene 5 inválidos y 3 duplicados. La actualización más antigua tiene 12 segundos y el umbral es 30. Hay una brecha de secuencia. Calculá completitud, validez, unicidad, utilizables, oportunidad lineal y continuidad usando la rúbrica del laboratorio.

Ver una solución posible
const esperados = 200;
const recibidos = 190;
const invalidos = 5;
const duplicados = 3;
const antiguedad = 12;
const umbral = 30;
const brechas = 1;

const completitud = recibidos / esperados;
const validez = (recibidos - invalidos) / recibidos;
const unicidad = (recibidos - duplicados) / recibidos;
const utilizables = recibidos - invalidos - duplicados;
const oportunidad = Math.max(0, 1 - antiguedad / umbral);
const continuidad = Math.max(0, 1 - brechas * 0.20);
const puntaje = (completitud + validez + unicidad + oportunidad + continuidad) / 5;

console.log({ completitud, validez, unicidad, utilizables, oportunidad, continuidad, puntaje });

Completitud: 95%; validez: 97,37%; unicidad: 98,42%; utilizables: 182; oportunidad: 60%; continuidad: 80%. El promedio didáctico es aproximadamente 86,16%. La brecha exige investigar o reconstruir aunque el promedio sea alto.

28.32 Ideas para recordar

  • La fuente debe elegirse de acuerdo con una finalidad concreta.
  • Evento, instantánea y lote tienen semánticas diferentes.
  • Frecuencia, latencia y vigencia no son sinónimos.
  • Las marcas de evento, publicación, recepción y proceso explican el recorrido.
  • Calidad combina exactitud, completitud, validez, consistencia, oportunidad y unicidad.
  • Secuencias, reconciliación y observabilidad revelan fallas silenciosas.
  • Linaje, versiones y licencia deben acompañar cada transformación.

En el próximo tema estudiaremos las comisiones, el spread, los impuestos y el costo total de una operación.