Saltar al contenido
Lecciones de Finanzas

Deep Learning para Datos de Mercado

Embeddings para datos categóricos y alternativos

Convertir tickers, sectores, regímenes, calendarios y noticias en vectores densos aprendidos: por qué los embeddings de entidad aplastan al one-hot, las reglas prácticas de dimensión, compartir una representación en un panel agrupado y las trampas de fuga que los embeddings facilitan especialmente.

14 min Actualizado 19 jun 2026

Hasta ahora este curso ha alimentado a vuestras redes con números: rentabilidades, volúmenes, volatilidades, esa materia continua y bien educada que a una multiplicación de matrices le encanta masticar. Pero los datos de mercado reales están plagados de etiquetas: el ticker JPM, el sector “Financiero”, el país “EE. UU.”, el mercado “NYSE”, el día de la semana “lunes”, la etiqueta de régimen “risk-off”. Y luego está el pantano verdaderamente no estructurado: titulares de noticias, informes 10-K, transcripciones de conferencias de resultados.

Una red neuronal no sabe qué significa “Financiero”. Multiplica y suma. No puede multiplicar la cadena "JPM". Así que antes de que toda vuestra maquinaria de RNN / TCN / transformer, ganada con tanto esfuerzo, pueda tocar una categoría, tenéis que convertir esa etiqueta en un vector. La forma perezosa es el one-hot encoding (codificación uno-en-caliente). La forma buena —la que permite que un banco aprenda de lo que hicieron otros bancos— es un embedding (vector denso). Esta lección trata de hacerlo bien, y de las trampas de fuga que los embeddings hacen extraordinariamente fáciles de pisar.

El one-hot encoding es un derroche

Haces one-hot encoding de un universo de 3.000 tickers y metes el resultado directamente en la primera capa densa. ¿Cuál es el mayor problema estructural de esta representación (antes incluso de hablar de parámetros)?

Analogía. El one-hot encoding es como darle a cada empleado de una empresa de 3.000 personas una chapa que es una única luz en un panel de 3.000 luces: la tuya es la luz n.º 1.742, encendida; la de todos los demás está apagada. La chapa te dice quién es alguien y absolutamente nada sobre cómo es. Dos analistas del mismo escritorio están tan “lejos” como el consejero delegado y el vigilante nocturno.

Definición. El one-hot encoding aplica una categoría cc de un vocabulario de cardinalidad KK al vector indicador ec{0,1}Ke_c \in \{0,1\}^K: un vector de longitud KK que vale 11 en la posición cc y 00 en el resto. Todos los vectores one-hot distintos son mutuamente ortogonales: eiej=0e_i \cdot e_j = 0 para iji \neq j, y eiej=2\lVert e_i - e_j \rVert = \sqrt{2} para cada par. Distancia constante, estructura de similitud nula.

Ejemplo resuelto. Tomad un universo de juguete de cuatro tickers y codificadlos:

TickerSectorVector one-hot
JPMFinanciero[1, 0, 0, 0]
BACFinanciero[0, 1, 0, 0]
XOMEnergía[0, 0, 1, 0]
AAPLTecnología[0, 0, 0, 1]

Distancia entre los dos bancos, eJPMeBAC=(10)2+(01)2=21,41\lVert e_{\text{JPM}} - e_{\text{BAC}} \rVert = \sqrt{(1-0)^2 + (0-1)^2} = \sqrt{2} \approx 1{,}41. Distancia entre un banco y la petrolera, eJPMeXOM=21,41\lVert e_{\text{JPM}} - e_{\text{XOM}} \rVert = \sqrt{2} \approx 1{,}41. Idénticas. La codificación insiste en que JPM y BAC no son más parecidos que JPM y XOM.

Ahora ampliad la escala. Con K=3,000K = 3{,}000 tickers, cada entrada es un vector disperso de longitud 3.000. Una primera capa densa con h=64h = 64 unidades ocultas necesita K×h=3,000×64=192,000K \times h = 3{,}000 \times 64 = 192{,}000 pesos solo para leer el ticker, y la mayoría ven un único ejemplo no nulo cada vez, así que se actualizan a paso de tortuga.

Warning:

La maldición, otra vez

Recordad la queja de la lección 1 de que las redes profundas se mueren de hambre con el minúsculo tamaño muestral efectivo de los mercados. El one-hot encoding echa gasolina a ese fuego. Una entrada dispersa de 3.000 columnas multiplica vuestro recuento de parámetros sin añadir información, y la columna de cada ticker solo recibe gradiente en las filas donde aparece ese ticker exacto. Alta cardinalidad + N efectivo bajo es precisamente el régimen en el que el one-hot encoding sobreajusta más rápido.

Cuándo usarlo

El one-hot está bien —incluso es preferible por su simplicidad— cuando la cardinalidad es baja (digamos K10K \le 10: día de la semana, un puñado de regímenes) y tenéis abundantes datos por categoría. A esa escala el coste de parámetros es trivial y la falta de similitud aprendida apenas importa. Solo a alta cardinalidad se convierte en un lastre.

Completa los hechos estructurales sobre los vectores one-hot.

Elige la opción correcta para cada hueco y comprueba.

Dos vectores one-hot distintos cualesquiera son , lo que significa que el modelo recibe información sobre la similitud de categorías, y el recuento de parámetros de una primera capa densa crece de forma con la cardinalidad.

Embeddings de entidad

Una capa de embedding de entidad aplica un id de ticker a un vector denso. ¿De dónde salen los valores de ese vector?

Analogía. Esto es word2vec para acciones. Word2vec aprendió que “rey − hombre + mujer ≈ reina” no porque nadie se lo dijera, sino porque las palabras que aparecen en contextos similares acabaron con vectores similares. Un embedding de entidad hace lo mismo con los tickers: dos bancos que responden igual a los movimientos de tipos reciben un empujón el uno hacia el otro en el espacio de embedding, porque compartir una representación reduce la pérdida. Nunca etiquetáis a mano “estos dos son bancos”: la geometría emerge de la señal de entrenamiento.

Definición. Un embedding aplica cada id de categoría c{1,,K}c \in \{1, \dots, K\} a un vector denso vcRm\mathbf{v}_c \in \mathbb{R}^m mediante una consulta en una matriz de embedding ERK×mE \in \mathbb{R}^{K \times m}, donde la fila cc es vc\mathbf{v}_c. De forma equivalente, es una capa densa sin sesgo y sin activación aplicada al vector one-hot: vc=Eec\mathbf{v}_c = E^{\top} e_c. La matriz EE se entrena de forma conjunta con la tarea. La dimensión de embedding mm (con mKm \ll K) es un hiperparámetro que elegís.

Regla práctica de dimensión. Dos heurísticas populares:

mmin ⁣(50,K2)omK0.25.m \approx \min\!\left(50, \left\lceil \tfrac{K}{2} \right\rceil\right) \qquad \text{o} \qquad m \approx K^{0.25}.

La primera (la regla de fast.ai) limita el tamaño para vocabularios enormes; la segunda crece muy despacio. Ambas codifican el mismo instinto: más categorías merecen un espacio más rico, pero con rendimientos fuertemente decrecientes.

Ejemplo resuelto. Con K=3,000K = 3{,}000 tickers, la regla del mínimo da mmin(50,3000/2)=min(50,1500)=50m \approx \min(50, \lceil 3000/2 \rceil) = \min(50, 1500) = 50. La regla de la raíz cuarta da m30000.257,48m \approx 3000^{0.25} \approx 7{,}4 \to 8. La gente suele quedarse en algún punto intermedio; digamos m=32m = 32. Recuento de parámetros del embedding: K×m=3,000×32=96,000K \times m = 3{,}000 \times 32 = 96{,}000, frente a los 192,000192{,}000 que necesitaba arriba la capa densa one-hot para h=64h=64, y, crucialmente, ahora cada fila acumula estructura compartida en lugar de memorizar un ticker en aislamiento.

PropiedadOne-hot encodingEmbedding de entidad (m=32m=32)
Longitud del vectorK=3,000K = 3{,}000m=32m = 32
Almacenamiento / params (lectura)K×h=192,000K \times h = 192{,}000K×m=96,000K \times m = 96{,}000
¿Codifica similitud?No: todos los pares equidistantesSí: geometría aprendida
¿Generaliza entre categorías?NoSí (los bancos comparten estructura)
Disperso vs. densoDisperso, casi todo cerosDenso, todas las dimensiones usadas
¿Ejes interpretables?Trivialmente (uno por categoría)No directamente (factores latentes)

Une cada concepto con su definición.

Cuándo usarlo

Recurrid a un embedding de entidad cuando una categórica sea de alta cardinalidad y tengáis un panel agrupado grande para que muchas categorías puedan compartir fuerza estadística (más sobre esto abajo). Brilla justo donde el one-hot se ahoga. Pero no es gratis: habéis añadido K×mK \times m parámetros que pueden memorizar, y un espacio aprendido que —como todo lo aprendido aquí— puede filtrar el futuro si os descuidáis.

Embeddings de datos alternativos y de texto

Quieres meter el flujo de noticias de ayer en un modelo de rentabilidad. ¿Qué enfoque convierte un titular en algo que la red pueda consumir de verdad, sin que tú programes las características a mano?

Analogía. Un embedding de texto preentrenado es un traductor que habéis contratado y que ya habla el idioma con fluidez. No le enseñáis español desde cero con vuestros 4.000 días de trading de titulares: le pasáis la frase y os devuelve un compacto “vector de significado”. Vuestro modelo de abajo solo tiene que aprender qué implica ese significado para las rentabilidades, no qué es el español.

Definición y taxonomía. “Embeddings de datos alternativos” significa en realidad producir una representación vectorial densa de entradas no estructuradas o semiestructuradas:

Entrada de datos alt.RepresentaciónDimensión típica
Titular / informe de noticiasEmbedding preentrenado de frase/documento384–1536
Sentimiento del textoPuntuación de sentimiento escalar (o vector pequeño)1–3
Mezcla de temas del documentoVector de modelo de temas (p. ej. proporciones LDA)20–100
Señal alt. continuaEscalar estandarizado, opcionalmente discretizado + embebido1–8
Etiqueta alt. categóricaEmbedding de entidad (misma maquinaria que los tickers)K0.25K^{0.25} aprox.

La idea es uniforme: para cuando llega a la red, todo —ticker, sector, noticias, sentimiento— es un vector denso, y a las capas de abajo les da igual qué columna salió de una tabla de consulta y cuál de un modelo de lenguaje.

Ejemplo resuelto (fuera de vocabulario). Vuestro universo de entrenamiento tiene K=3,000K = 3{,}000 tickers. En trading en vivo aparece un nombre recién salido a bolsa que la tabla de embedding nunca ha visto. Con una consulta en bruto, no hay fila para él: el modelo se cae o lo aplica silenciosamente a basura. El arreglo es reservar una fila extra en el índice 00 para un token <UNK> (“desconocido”): construir ER(K+1)×mE \in \mathbb{R}^{(K+1) \times m}, dirigir todo id no visto a la fila 00, y entrenar esa fila aplicando aleatoriamente algunos tickers raros a <UNK> durante el entrenamiento para que aprenda un vector sensato de “nombre nuevo genérico”. El mismo truco maneja las palabras fuera de vocabulario en los codificadores de texto.

Info:

Disciplina de cardinalidad

Antes de hacer embedding de cualquier categórica, contad los valores distintos tal como existen en el momento de la decisión y decidid una política de OOV (fuera de vocabulario). Un campo “país” con 40 valores es barato; un campo “URL de fuente de noticias” con 80.000 valores es una trampa de memorización a menos que metáis la cola larga en <UNK>. La cardinalidad es una decisión de diseño, no un dato dado.

Cuándo usarlo

Los embeddings de texto preentrenados se ganan el sueldo cuando la señal vive en el lenguaje (el tono de un informe, la novedad de un titular) y vuestro propio conjunto de datos es demasiado pequeño para aprender español desde cero, lo cual es esencialmente siempre en finanzas. Saltaos el codificador pesado cuando una puntuación de sentimiento de una línea ya capture todo aquello sobre lo que vais a actuar; un vector de 1.536 dimensiones alimentando a un modelo con 3.000 días de entrenamiento es una vía rápida al sobreajuste.

Clasifica cada entrada de mercado según la representación que mejor le encaje.

Coloca cada elemento en su grupo.

  • Texto completo de una transcripción de conferencia de resultados
  • Sección de factores de riesgo de un 10-K
  • Etiqueta de sector GICS
  • Una cadena de titular de noticia
  • Id de ticker de un universo de 3.000 nombres
  • Código de mercado / centro de negociación

Trampas de fuga que los embeddings facilitan

Aprendes un embedding de ticker sobre TODO tu conjunto de datos (2010–2025), luego ejecutas un backtest walk-forward purgado sobre esos vectores congelados y reportas un Sharpe precioso. ¿Por qué sigue estando contaminado el resultado?

Esta es la sección que importa. Los embeddings son una representación aprendida, y cualquier cosa aprendida puede memorizar el futuro. Cada lección de fuga de Machine Learning para Alfa —preprocesamiento-sobre-datos-completos, supervivencia, anticipación— tiene una versión con forma de embedding que es más fácil de cometer y más difícil de detectar.

Las cinco trampas.

#TrampaQué se filtra
aEmbedding ajustado sobre la muestra completaLas coocurrencias del periodo de test se cuelan en los vectores (preprocesamiento-sobre-datos-completos)
bSupervivencia en el conjunto de entidadesEl vocabulario construido a partir de nombres que sobrevivieron hasta hoy descarta silenciosamente a los muertos
cEtiquetas con anticipación (régimen / reclasificación)Una etiqueta asignada con retrospectiva codifica el resultado que debería predecir
dUna categoría que codifica el futurop. ej. un indicador fue_adquirida es una etiqueta haciéndose pasar por característica
eFuga del objetivo vía memorizaciónCon datos minúsculos el embedding aprende un mapa id→resultado en lugar de estructura

Ejemplo resuelto (anticipación de régimen). Supongamos que etiquetáis cada día con una etiqueta de régimen y la embebéis. Definís “risk-off” comprobando si los siguientes 20 días tuvieron una caída superior al 10%:

reˊgiment={risk-offsi min1k20rt+kcum<0,10risk-onen otro caso.\text{régimen}_t = \begin{cases} \text{risk-off} & \text{si } \min_{1 \le k \le 20}\, r_{t+k}^{\text{cum}} < -0{,}10 \\ \text{risk-on} & \text{en otro caso.} \end{cases}

Esa etiqueta en el instante tt es una función de las rentabilidades desde t+1t{+}1 hasta t+20t{+}20. Embebedla, dádsela a un modelo que predice rt+1r_{t+1}, y vuestra “característica” ya contiene la respuesta: el embedding de “risk-off” parecerá espectacularmente predictivo, y con datos en vivo, donde no podéis ver los siguientes 20 días, se evapora. El arreglo: definid el régimen usando solo información disponible en o antes de tt (un umbral de volatilidad rezagada, un cruce de medias móviles), y asignadlo de forma causal.

Warning:

Los embeddings blanquean la fuga: auditad cada categoría como a un testigo hostil

El peligro es que un embedding es opaco, así que la fuga se esconde dentro de un vector denso en lugar de en una columna con nombre que marcaríais en la revisión. Tres hábitos: (1) Ajustad el embedding solo dentro del fold de entrenamiento: reajustadlo por ventana walk-forward, nunca sobre la muestra completa agrupada; tratadlo exactamente como un escalador ajustado. (2) Construid el vocabulario point-in-time (en el momento exacto): el conjunto de tickers/sectores debe ser el universo tal como se conocía en la fecha de decisión, incluyendo nombres que luego salieron de cotización, o habréis reimportado la supervivencia por la puerta de atrás. (3) Interrogad cada categórica: “¿podría un humano asignar esta etiqueta sin conocer el futuro?”. Si una etiqueta de régimen, una reclasificación de sector o un indicador fue_adquirida necesitan retrospectiva, es un objetivo, no una característica, por muy denso que sea el vector que la esconda.

¿Cuáles de estas configuraciones de embedding filtran información del futuro? Selecciona todas las que lo hagan.

Cuando la fuga es sutil

El caso más desagradable es (e), memorización con datos minúsculos. Con K=3,000K = 3{,}000 tickers, m=32m = 32 y solo unos ~1.000 días de historia agrupada, el embedding puede aprender calladamente un mapa de consulta id→rentabilidad-media: un elegante target-encoding ajustado sobre las etiquetas de entrenamiento. Valida mal fuera de muestra y le echaréis la culpa al “cambio de régimen”. La señal delatora: el ajuste en muestra mejora bruscamente con mm mientras que fuera de muestra se estanca o se degrada. Reducid mm, añadid regularización/dropout sobre el embedding, o cuestionaos si tenéis los datos para hacer embedding de esta categoría siquiera.

Un compañero reajusta los embeddings de ticker sobre los 15 años completos de historia “por estabilidad”, y luego ejecuta una CV walk-forward purgada encima. ¿Por qué es inútil aquí la purga, en el vocabulario de Machine Learning para Alfa?

Respuesta. La CV purgada protege contra la fuga temporal entre las etiquetas de train y test durante el ajuste del modelo: elimina las ventanas solapadas y pone un embargo cerca de la división. Pero el embedding se ajustó antes de que la CV siquiera empezara, sobre datos que incluyen el periodo de test. Eso es fuga por preprocesamiento-sobre-datos-completos: las características entregadas a la CV ya codifican la estructura del periodo de test, así que purgar el ajuste del modelo no cambia nada. La cura es idéntica a la de los escaladores y el PCA en aquel curso: ajustad la transformación solo dentro del fold de entrenamiento, y luego aplicad la transformación congelada-desde-train a los datos retenidos. Un embedding no es más que una transformación ajustada con parámetros; tratadlo como tal.

Cuándo los embeddings se ganan el sueldo

Tienes una categórica con 12 valores distintos, 800 filas de entrenamiento, y eliges entre un embedding de entidad y un árbol de gradient boosting con manejo nativo de categóricas. ¿Cuál es la decisión sensata?

Analogía. Los embeddings son un deporte de equipo. Toda su ventaja está en dejar que las categorías compartan fuerza: un banco aprendiendo de mil días-banco. Si tenéis dos bancos y un fin de semana largo de datos, no hay equipo con el que compartir; solo estáis memorizando. Los embeddings premian un estadio abarrotado, no uno vacío.

La decisión, hecha precisa. Inclinaos por un embedding cuando se cumplan ambas cosas: (1) la cardinalidad es alta (KK en los cientos-a-miles), así que el one-hot es un derroche y la estructura de similitud merece la pena aprenderse; y (2) tenéis un panel agrupado grande —muchas entidades ×\times muchos periodos— para que el embedding tenga suficientes ejemplos por factor latente para aprender estructura en vez de ids. Evitadlo cuando los datos sean minúsculos (memoriza), cuando la cardinalidad sea baja (un encoding ordinal o de objetivo, o simplemente un one-hot, es más sencillo), o cuando un árbol sirva.

SituaciónCardinalidadDatos efectivosMejor herramienta
3.000 tickers, 15 años diarios, panel agrupadoAltaGrandeEmbedding de entidad
Característica de día de la semanaBaja (7)CualquieraOne-hot / codificación cíclica
12 sectores, 800 filasBaja-mediaPequeñosTarget/ordinal encoding o un árbol
Características tabulares mixtas, datos modestosMixtaModestosÁrboles de gradient boosting
Texto de noticias, señal en el lenguajen/aDatos propios escasosEmbedding de texto preentrenado
Info:

Anticipo de la lección 6

Fijaos en cuántas veces la respuesta honesta de arriba es “usa un árbol”. Los árboles de gradient boosting manejan las categóricas de forma nativa (sin one-hot, sin matriz de embedding), no necesitan GPU y resisten el sobreajuste en los paneles pequeños, ruidosos y de baja señal que definen las finanzas. La próxima lección plantea directamente la tesis incómoda: en la mayoría de problemas tabulares de mercado, los árboles suelen ganar, y los embeddings son la excepción a la que recurrís, no el valor por defecto.

Cuándo usarlo: el compromiso

El intercambio del embedding es poder expresivo y estructura compartida comprado con parámetros, opacidad y una nueva superficie para la fuga. Aceptáis el trato cuando la alta cardinalidad y un panel agrupado profundo hacen que la estructura compartida sea real y aprendible. Lo rechazáis cuando los datos no pueden financiar los parámetros, o cuando un árbol os da el 95% del beneficio con el 5% de los tiros al pie.

Resume la regla de decisión del embedding.

Elige la opción correcta para cada hueco y comprueba.

Los embeddings de entidad rinden cuando la cardinalidad es y el panel agrupado es ; con pocos datos el embedding tiende a , y para paneles tabulares simples un de gradient boosting suele ser el ganador más sencillo.

Repaso

Big picture

Embeddings para datos categóricos y alt.

  • Embeddings
    • One-hot
      • Ortogonal → sin similitud
      • Ancho K, los params explotan
      • OK solo cuando K es pequeño
    • Embedding de entidad
      • Tabla de consulta E (K×m), aprendida
      • m ≈ min(50, ⌈K/2⌉) o K^0.25
      • word2vec para acciones: los bancos se agrupan
    • Datos alt. y de texto
      • Vectores preentrenados de frase/documento
      • Vectores de sentimiento / temas
      • OOV → fila <UNK>
    • Trampas de fuga
      • Ajuste sobre la muestra completa
      • Vocabulario con supervivencia
      • Etiquetas de régimen con anticipación
      • Categoría que codifica el futuro
      • Memorización con datos minúsculos
    • Cuándo embeber
      • Alta cardinalidad + panel grande
      • Ni datos minúsculos ni K bajo
      • Si no: los árboles suelen ganar
De etiquetas a vectores densos aprendidos, y las trampas de fuga por el camino.

Comprobación de embeddings

Pregunta 1 de 50 correct

¿Por qué el one-hot encoding no consigue expresar que dos bancos son similares?

Comprueba tu respuesta para continuar.

Marcar lección como completada