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 de un vocabulario de cardinalidad al vector indicador : un vector de longitud que vale en la posición y en el resto. Todos los vectores one-hot distintos son mutuamente ortogonales: para , y para cada par. Distancia constante, estructura de similitud nula.
Ejemplo resuelto. Tomad un universo de juguete de cuatro tickers y codificadlos:
| Ticker | Sector | Vector one-hot |
|---|---|---|
| JPM | Financiero | [1, 0, 0, 0] |
| BAC | Financiero | [0, 1, 0, 0] |
| XOM | Energía | [0, 0, 1, 0] |
| AAPL | Tecnología | [0, 0, 0, 1] |
Distancia entre los dos bancos, . Distancia entre un banco y la petrolera, . 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 tickers, cada entrada es un vector disperso de longitud 3.000. Una primera capa densa con unidades ocultas necesita 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.
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 : 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 a un vector denso mediante una consulta en una matriz de embedding , donde la fila es . De forma equivalente, es una capa densa sin sesgo y sin activación aplicada al vector one-hot: . La matriz se entrena de forma conjunta con la tarea. La dimensión de embedding (con ) es un hiperparámetro que elegís.
Regla práctica de dimensión. Dos heurísticas populares:
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 tickers, la regla del mínimo da . La regla de la raíz cuarta da . La gente suele quedarse en algún punto intermedio; digamos . Recuento de parámetros del embedding: , frente a los que necesitaba arriba la capa densa one-hot para , y, crucialmente, ahora cada fila acumula estructura compartida en lugar de memorizar un ticker en aislamiento.
| Propiedad | One-hot encoding | Embedding de entidad () |
|---|---|---|
| Longitud del vector | ||
| Almacenamiento / params (lectura) | ||
| ¿Codifica similitud? | No: todos los pares equidistantes | Sí: geometría aprendida |
| ¿Generaliza entre categorías? | No | Sí (los bancos comparten estructura) |
| Disperso vs. denso | Disperso, casi todo ceros | Denso, 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 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ón | Dimensión típica |
|---|---|---|
| Titular / informe de noticias | Embedding preentrenado de frase/documento | 384–1536 |
| Sentimiento del texto | Puntuación de sentimiento escalar (o vector pequeño) | 1–3 |
| Mezcla de temas del documento | Vector de modelo de temas (p. ej. proporciones LDA) | 20–100 |
| Señal alt. continua | Escalar estandarizado, opcionalmente discretizado + embebido | 1–8 |
| Etiqueta alt. categórica | Embedding de entidad (misma maquinaria que los tickers) | 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
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 para un token
<UNK> (“desconocido”): construir , dirigir todo id no visto a la
fila , 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.
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.
| # | Trampa | Qué se filtra |
|---|---|---|
| a | Embedding ajustado sobre la muestra completa | Las coocurrencias del periodo de test se cuelan en los vectores (preprocesamiento-sobre-datos-completos) |
| b | Supervivencia en el conjunto de entidades | El vocabulario construido a partir de nombres que sobrevivieron hasta hoy descarta silenciosamente a los muertos |
| c | Etiquetas con anticipación (régimen / reclasificación) | Una etiqueta asignada con retrospectiva codifica el resultado que debería predecir |
| d | Una categoría que codifica el futuro | p. ej. un indicador fue_adquirida es una etiqueta haciéndose pasar por característica |
| e | Fuga del objetivo vía memorización | Con 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%:
Esa etiqueta en el instante es una función de las rentabilidades desde hasta . Embebedla, dádsela a un modelo que predice , 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 (un umbral de volatilidad rezagada, un cruce de medias móviles), y asignadlo de forma causal.
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 tickers, 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 mientras que fuera de muestra se estanca o se degrada. Reducid , 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 ( 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 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ón | Cardinalidad | Datos efectivos | Mejor herramienta |
|---|---|---|---|
| 3.000 tickers, 15 años diarios, panel agrupado | Alta | Grande | Embedding de entidad |
| Característica de día de la semana | Baja (7) | Cualquiera | One-hot / codificación cíclica |
| 12 sectores, 800 filas | Baja-media | Pequeños | Target/ordinal encoding o un árbol |
| Características tabulares mixtas, datos modestos | Mixta | Modestos | Árboles de gradient boosting |
| Texto de noticias, señal en el lenguaje | n/a | Datos propios escasos | Embedding de texto preentrenado |
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
- One-hot
Comprobación de embeddings
¿Por qué el one-hot encoding no consigue expresar que dos bancos son similares?
Comprueba tu respuesta para continuar.