Esta es una fila de un archivo diario de acciones. NVDA, viernes 7 de junio de 2024, la última sesión antes de que entrara en vigor el split de 10 por 1.
| Columna | Valor |
|---|---|
| fecha | 2024-06-07 |
| cierre | 1208.88 |
| volumen | 42,800,000 (redondeado) |
| split_factor | 1.0 |
| dividendo | 0.00 |
| adj_close | 120.8781 |
He omitido deliberadamente las columnas OHLC de esta vista. Vuelven casi al final, y son las que fallan sin que nadie se dé cuenta.
Todo lo interesante de esta fila está en la diferencia entre la segunda columna y la sexta. El 7 de junio, el mercado marcó 1208.88. Nadie volverá a operar a ese precio, porque la acción a la que se refería ya no existe como unidad. El 120.8781 es una reconstrucción, y no se obtiene simplemente dividiendo 1208.88 entre diez. Veamos cada columna.
fecha: 2024-06-07, y las otras dos fechas que importan más
El split se anunció el 22 de mayo de 2024 junto con los resultados. La fecha
de registro fue el 6 de junio. La negociación con el ajuste del split comenzó
el lunes 10 de junio. Son tres fechas, y la columna
split_factor de tu proveedor corresponde exactamente a una de
ellas, normalmente a la primera sesión con el split ajustado. Un desfase de un
día es el error de acciones corporativas más común que veo, y no se detecta en
los agregados: la curva de capital sufre un gap del 90% a la baja o del 900%
al alza en un solo día; el Sharpe calculado sobre 2,000 días apenas lo
refleja, pero el drawdown máximo o una regla de stop-loss sí lo notan sin
duda.
El dividendo también tiene un problema de fechas, y en 2024 cambió para todos. El dividendo trimestral de NVDA tras el split, de $0.01, tuvo fecha de registro el 11 de junio. La liquidación en EE. UU. pasó a T+1 el 28 de mayo de 2024, lo que significa que la fecha exdividendo y la fecha de registro ahora coinciden. Cualquier cargador que calcule la fecha exdividendo como «fecha de registro menos un día hábil» —lo correcto durante décadas— empezó a generar ajustes por dividendo en silencio una sesión antes, en junio de 2024. No se produce ningún error. El factor simplemente queda en la fila equivocada.
El fallo del código de acciones corporativas nunca es una excepción. Es una cifra desplazada un día que parece completamente verosímil.
close: 1208.88 — el precio que no aparece en el archivo
Este es el precio registrado en bruto y, en la mayoría de los flujos de
investigación, solo existe como una columna que nadie lee. Las señales se
calculan sobre adj_close. Y cualquier regla que haga referencia a
un nivel de precio por acción en dólares ahora apunta a una cifra que ningún
participante del mercado vio jamás.
La escalada de NVDA hacia los $1,000 en la primavera de 2024 fue real y estuvo respaldada por un flujo de órdenes real: los precios redondos atraían órdenes, las opciones se concentraban en strikes de 950 y 1000, y cada acercamiento traía riesgo en los titulares. En los datos ajustados, todo ese episodio ocurre a $100. Si pruebas el comportamiento en niveles psicológicos, la lógica de cierre de gaps cerca de números redondos o una característica de proximidad al strike, lo haces sobre una serie de precios reescalada por un evento que todavía no había sucedido.
Lo mismo ocurre con los filtros del universo. «Excluir acciones por debajo de $5» es un indicador válido de un conjunto real de problemas de microestructura: spreads relativos amplios, reglas de margen y regímenes de tick. Si lo aplicas a datos históricos ajustados, excluyes empresas durante periodos en los que cotizaban a $30 y que luego hicieron un split inverso. Si filtras por «precio superior a $500», NVDA desaparece silenciosamente de todos los años anteriores a junio de 2024. Los filtros de precio deben aplicarse a precios sin ajustar. Punto.
split_factor: 1.0 — y el 0.1 de la fila siguiente
El factor es un producto acumulado que se calcula hacia atrás desde hoy. Cada fila anterior al 10 de junio de 2024 lleva un 0.1 de este split, multiplicado por el 0.25 del split de 4 por 1 de 2021, y por lo que hubiera antes. El historial de NVDA anterior a 2021 se escala por 0.025, así que una barra que marcó $200 en 2019 aparece como $5.00.
Hay dos consecuencias que conviene tener presentes. Primero, el historial ajustado cambia cada vez que se produce una nueva acción corporativa. Un backtest que ejecutaste en mayo de 2024 y otro que ejecutas hoy arrojan cifras distintas con el mismo código y las mismas fechas; si guardaste características en caché por símbolo y fecha sin registrar la versión de los datos, ahora tienes una caché que mezcla dos escalas. Incluimos la época de ajuste en la clave de las características precisamente por este motivo; aprendimos la lección tras una tarde bastante confusa.
Segundo, con un factor de escala de 0.025, una acción que cotizaba en incrementos de $0.01 ahora se mueve en incrementos de $0.00025. La lógica de redondeo al tick, las comparaciones de «¿es un nuevo máximo?» y las comprobaciones de igualdad de números de punto flotante: todo opera ahora muy por debajo de la resolución real que tenía el mercado.
dividendo: 0.01 — la cifra que saca de la cuadrícula todos los precios anteriores
Un centavo. Parece ruido, y es la razón por la que
adj_close muestra 120.8781 en lugar de un 120.888 redondo.
El cierre del 10 de junio fue 121.79. El factor exdividendo es (121.79 − 0.01) / 121.79 = 0.99991789. Ese factor se multiplica por todos los precios anteriores al 11 de junio, así que el 120.888 ajustado por el split pasa a 120.878074. Es una diferencia pequeña, permanente, que se aplica de nuevo en cada una de las más de sesenta fechas exdividendo del historial de NVDA. Lo que importa es el efecto acumulado: para cuando llegas a 2015, miras un precio multiplicado por docenas de factores algo irracionales. Ningún precio histórico ajustado cae exactamente en la cuadrícula de centavos.
Eso significa que toda comparación de == con un nivel redondo es
falsa, que toda comprobación de «¿tocamos el precio límite?» requiere una
tolerancia y que el OHLC reconstruido ya no cumple la invariante de que low ≤
open ≤ high después de un redondeo ingenuo a 4 decimales. También significa
que adj_close es una serie de rentabilidad total, mientras que
close es una serie de rentabilidad del precio; si calculas los
retornos con una y los drawdowns con la otra, mezclas dos definiciones
distintas de lo ocurrido.
volumen: 42,800,000 — el divisor que nadie aplica de forma coherente
Hay que multiplicar por 10 el volumen de acciones para poder compararlo con las sesiones posteriores al split. Algunos proveedores lo hacen. Otros, no. Algunos ajustan el OHLC y dejan el volumen en bruto; es la peor opción de las tres, porque el archivo parece coherente hasta que multiplicas precio por volumen.
Lo sensato es dejar de usar el volumen de acciones como característica y usar el volumen en dólares, que por definición no cambia con los splits. Un filtro de liquidez basado en el volumen medio en dólares de 20 días no requiere ninguna lógica de ajuste y no puede fallar por una acción corporativa. La invariancia de las características es mejor que tener un código de ajuste correcto, porque hay que seguir acertando con ese código.
Tres formatos de archivo de proveedor, tres modos de fallo.
| Qué incluye | Qué falla |
|---|---|
| Solo cierre ajustado, OHLC en bruto | La lógica de gaps y movimientos intradía calcula entre dos escalas de precios |
| OHLC ajustado, volumen en bruto | Volumen en dólares desviado por el ratio del split; fallan los filtros de ADV |
| OHLCV en bruto más columnas de factores | Nada, si los aplicas. Todo, si los aplicas en la fila equivocada |
Las columnas que faltan: adj_open, adj_high, adj_low
Ahora volvamos a incluir el OHLC. Si un feed solo ajusta el cierre y tu
estrategia calcula un gap nocturno como
open / prev_adj_close − 1, el 10 de junio de 2024 obtiene 120.37
/ 120.8781 − 1, una cifra válida, de aproximadamente −0.4%. Ejecuta el mismo
código para el 7 de junio de 2024 y calcula la apertura con el archivo en
bruto (cerca de 1207) frente a un cierre ajustado por 0.025 debido a splits
anteriores, lo que da un gap de varios miles por ciento.
Cualquier operación que mezcle una columna en bruto con una ajustada hace cálculos entre dos sistemas de coordenadas. Ahora trato las lecturas con ajustes mezclados como una aserción en el nivel del cargador, en vez de dejar que cada investigador tenga que acordarse, porque no se acordarán, yo incluido.
Lo que ninguna columna te dice: cuántas acciones habrías comprado realmente
Este es el caso que le cuesta dinero al modelo de costes del backtest, y la razón por la que escribo sobre un split de acciones.
Las comisiones de acciones en EE. UU. suelen cobrarse por acción. Supongamos $0.005, con un mínimo de $1.00 por orden, una tarifa fija común en los brókeres minoristas. Ahora prueba un backtest con una posición de $400,000 en NVDA un año antes del split, cuando el precio en bruto rondaba los $400 y el ajustado aparece como $40.
| Acciones | Comisión | |
|---|---|---|
| Lo que ocurrió realmente (precio en bruto de $400) | 1,000 | $5.00 |
| Lo que ve el backtest (precio ajustado de $40) | 10,000 | $50.00 |
La misma exposición, la misma operación, 10 veces el coste modelado. Son $45 ficticios por tramo, $90 por operación de ida y vuelta, y una estrategia con rotación diaria acumula unos $22,000 al año en costes que nunca existieron. En una cartera de $400k, son 5.6 puntos porcentuales de rentabilidad anual, fabricados por completo por un divisor. En este caso, hace que el resultado parezca peor que la realidad, algo que se puede sobrellevar.
Los splits inversos funcionan al revés, y esa es la dirección peligrosa. Un split inverso de 1 por 10 hace que el historial ajustado muestre precios 10 veces más altos y recuentos de acciones 10 veces más bajos que los que habrías negociado. El modelo de costes divide silenciosamente entre diez la comisión por acción. Los splits inversos son habituales en el universo de pequeña capitalización, por debajo de $5 y con spreads amplios, donde las comisiones por acción son el mayor concepto individual de la estructura de costes. El backtest favorece justo a las empresas que debería penalizar.
La solución es sencilla y estructural: dimensiona las posiciones en dólares, conviértelas en acciones usando el precio sin ajustar de esa fecha y cobra las comisiones por acción sobre ese recuento. Conserva para siempre la columna de precios en bruto en el cargador, no como registro de auditoría, sino como entrada activa del motor de ejecución.
- Señales y retornos: serie ajustada.
- Recuento de acciones, comisiones por acción, redondeo al tick y filtros por nivel de precio: serie sin ajustar.
- Liquidez y capacidad: volumen en dólares, que no requiere ninguna de las dos.
Seis columnas, una fila, una acción corporativa bastante corriente anunciada con tres semanas de antelación que no sorprendió a nadie. El mercado la procesó en una mañana. Reconstruirla fielmente en un flujo de investigación es bastante más difícil, y la señal de que un flujo no lo ha hecho casi nunca es un mensaje de error.
← Todos los artículos


