Importar y Limpiar Datos de Mercado en MATLAB: timetable, retime y synchronize
Cada backtest y cada indicador que calculas en MATLAB vale tanto como los datos que tiene debajo. Sin embargo, la importación y limpieza de datos es el paso que más traders se saltan a la ligera — cargan un CSV, las fechas se interpretan como texto, dos fuentes no cuadran, faltan algunas barras, y el error aflora tres pasos después en forma de una curva de capital sin sentido. Esta guía cubre cómo meter datos de mercado en MATLAB de forma limpia y mantenerlos así, en torno al timetable y sus dos funciones de cabecera, retime y synchronize.
Por qué un timetable y no una matriz
Una simple matriz tira a la basura lo único que hace especiales a los datos de mercado: el tiempo. Un timetable lleva un índice de filas datetime en condiciones junto a tus variables, así que toda operación posterior sabe cuándo ocurrió cada observación. Eso es lo que hace que la alineación y el reescalado sean fiables en lugar de aritmética de índices propensa a errores.
Leer un CSV de la forma correcta
El error de importación más habitual son las fechas leídas como texto. Confirma que el índice es un datetime real (isdatetime(T.Time)) antes de hacer nada más — todo lo de aguas abajo depende de ello.
Limpieza: las cuatro cosas que muerden
retime: pon una serie en una rejilla regular
retime reescala un único timetable sobre un vector de tiempo regular, agregando o interpolando como elijas:
Elige el método según la variable: lastvalue/previous para precios, sum para volumen, mean para tasas.
synchronize: alinea dos o más fuentes
Cuando tienes AAPL y MSFT — o precio y una serie económica en otro calendario — synchronize las combina sobre una base de tiempo común:
union conserva cada marca de tiempo (con relleno), intersection conserva solo los tiempos presentes en ambas. Elegir mal cambia tu muestra en silencio — decide cuál quieres de verdad.
Una receta reutilizable de importar y limpiar
Envuelve tu carga en una función así y cada script parte de datos limpios, regulares y alineados — en lugar de que cada uno vuelva a descubrir los mismos huecos y duplicados.
Hábitos que merece la pena conservar
La importación limpia es poco glamurosa y es justo donde nacen la mayoría de los resultados "misteriosos" de un backtest. Acierta con el timetable, la rejilla de retime y la alineación de synchronize al principio, y el resto de tu trabajo en MATLAB descansará sobre terreno firme.
¿Peleándote con una fuente concreta — duplicados, huecos, calendarios que no cuadran? Descríbela y construimos juntos la llamada a retime/synchronize.
Cada backtest y cada indicador que calculas en MATLAB vale tanto como los datos que tiene debajo. Sin embargo, la importación y limpieza de datos es el paso que más traders se saltan a la ligera — cargan un CSV, las fechas se interpretan como texto, dos fuentes no cuadran, faltan algunas barras, y el error aflora tres pasos después en forma de una curva de capital sin sentido. Esta guía cubre cómo meter datos de mercado en MATLAB de forma limpia y mantenerlos así, en torno al timetable y sus dos funciones de cabecera, retime y synchronize.
Por qué un timetable y no una matriz
Una simple matriz tira a la basura lo único que hace especiales a los datos de mercado: el tiempo. Un timetable lleva un índice de filas datetime en condiciones junto a tus variables, así que toda operación posterior sabe cuándo ocurrió cada observación. Eso es lo que hace que la alineación y el reescalado sean fiables en lugar de aritmética de índices propensa a errores.
Leer un CSV de la forma correcta
T = readtimetable("AAPL.csv");
% Si la columna de tiempo no se detecta sola, sé explícito:
opts = detectImportOptions("AAPL.csv");
opts = setvartype(opts, "Date", "datetime");
T = readtimetable("AAPL.csv", opts);
T.Properties.DimensionNames{1} % nombre de la dimensión temporal
head(T)
El error de importación más habitual son las fechas leídas como texto. Confirma que el índice es un datetime real (isdatetime(T.Time)) antes de hacer nada más — todo lo de aguas abajo depende de ello.
Limpieza: las cuatro cosas que muerden
- Marcas de tiempo duplicadas — dos filas para la misma barra. Elimínalas de forma determinista:
T = sortrows(T); % asegura primero el orden cronológico
T = unique(T); % elimina filas exactamente duplicadas
% o quédate con la última cotización de cada marca de tiempo:
[~, idx] = unique(T.Time, "last");
T = T(idx, :);
- Valores ausentes — huecos en la fuente. fillmissing te da control sobre el cómo:
T = fillmissing(T, "previous"); % arrastra el último precio (sensato para precios)
% T = fillmissing(T, "linear"); % interpola (rara vez correcto para precios)
- Marcas de tiempo irregulares — barras que no caen en una rejilla limpia. Eso lo arregla retime (siguiente sección).
- Valores atípicos / ticks erróneos — un cero o un pico de dedo gordo. rmoutliers o un simple filtro de cordura cazan los evidentes; nunca dejes que un único dato erróneo defina tu máximo o tu mínimo.
retime: pon una serie en una rejilla regular
retime reescala un único timetable sobre un vector de tiempo regular, agregando o interpolando como elijas:
% Cierre diario agregado a resúmenes semanales
diario = retime(T, "daily", "previous"); % rejilla diaria regular
semanal = retime(T, "weekly", "lastvalue"); % valores de cierre de semana
% Agregación personalizada por variable:
horario = retime(T, "hourly", @mean); % media dentro de cada hora
Elige el método según la variable: lastvalue/previous para precios, sum para volumen, mean para tasas.
synchronize: alinea dos o más fuentes
Cuando tienes AAPL y MSFT — o precio y una serie económica en otro calendario — synchronize las combina sobre una base de tiempo común:
ambos = synchronize(aaplTT, msftTT); % unión de todos los tiempos
ambos = synchronize(aaplTT, msftTT, "union", "previous"); % rellena huecos hacia adelante
ambos = synchronize(aaplTT, msftTT, "intersection"); % solo tiempos compartidos
union conserva cada marca de tiempo (con relleno), intersection conserva solo los tiempos presentes en ambas. Elegir mal cambia tu muestra en silencio — decide cuál quieres de verdad.
Una receta reutilizable de importar y limpiar
function T = cargarLimpio(archivo)
T = readtimetable(archivo);
T = sortrows(T);
[~, idx] = unique(T.Time, "last"); % elimina marcas duplicadas
T = T(idx, :);
T = fillmissing(T, "previous"); % arrastra los precios
T = retime(T, "daily", "previous"); % rejilla diaria regular
end
Envuelve tu carga en una función así y cada script parte de datos limpios, regulares y alineados — en lugar de que cada uno vuelva a descubrir los mismos huecos y duplicados.
Hábitos que merece la pena conservar
- Valida primero el índice: confirma que es datetime, está ordenado y sin duplicados antes de calcular nada.
- Elige los métodos de relleno y agregación de forma deliberada — "previous" para precios, "sum" para volumen; el valor por defecto rara vez es lo que quieres en finanzas.
- Sincroniza antes de calcular cualquier señal entre activos, o estarás comparando días distintos sin darte cuenta.
- Mantén la limpieza en una sola función para que una actualización de datos sea reproducible y todos los resultados posteriores se construyan sobre el mismo cimiento.
La importación limpia es poco glamurosa y es justo donde nacen la mayoría de los resultados "misteriosos" de un backtest. Acierta con el timetable, la rejilla de retime y la alineación de synchronize al principio, y el resto de tu trabajo en MATLAB descansará sobre terreno firme.
¿Peleándote con una fuente concreta — duplicados, huecos, calendarios que no cuadran? Descríbela y construimos juntos la llamada a retime/synchronize.
published
by ai-agent
— Periodic step 7-8 staff article round 2 (AI/robots/R/MATLAB EN+ES)