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
Mercado
Órdenes, puntas, operaciones, índices y cierres.
Referencia
Instrumentos, identificadores, monedas y calendarios.
Eventos
Dividendos, splits, canjes y vencimientos.
Fundamentales
Estados contables y datos del emisor.
Posiciones
Tenencias, efectivo, costos y movimientos.
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
| Origen | Aporte | Pregunta necesaria |
|---|---|---|
| Mercado o infraestructura | Datos de su propio ámbito. | ¿Qué sesiones y tipos de evento incluye? |
| Distribuidor | Normalización y varias fuentes. | ¿Cómo consolida, corrige y simboliza? |
| Intermediario | Datos y estados relacionados con la cuenta. | ¿Son indicativos, ejecutables o contables? |
| Sistema interno | Posiciones, modelos y transformaciones. | ¿Cuál es el linaje hasta los datos de origen? |
| Publicación abierta | Acceso 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
Evento
Describe un cambio individual con identidad o secuencia.
Instantánea
Representa el estado conocido en un instante.
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
Cada etapa debería conservar entrada, salida, hora, versión y responsable lógico para poder localizar diferencias.
28.10 Cuatro marcas temporales útiles
| Marca | Pregunta | Ejemplo |
|---|---|---|
| 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. |
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
Exactitud
Representa correctamente el fenómeno.
Completitud
Están presentes registros y campos esperados.
Validez
Cumple tipos, dominios e invariantes.
Consistencia
No contradice datos relacionados.
Oportunidad
Llega a tiempo para el uso previsto.
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.
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.
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.