Tras un largo periodo totalmente desconectados, volvemos a escribir algunos apuntes para vosotros. En esta ocasion, vamos a programar desde cero, todo un proceso de research, y en lugar de ir a por un activo concreto, vamos a crear un metodo completo, que se reutilizable en el futuro, para poder lanzarlo contra cualquier activo.
El objetivo de esta articulo, es crear un algoritmo que analice el comportamiento estacional intradario de algun producto. De forma independiente, no obtendremos ninguna ventaja operable, pero si encontraremos el edge desnudo, un pequeno desequilibro estadistico, que nos servira de base para poder encontrar ventajas mas robustas hasta llegar a encontrar una estrategia operable.
Personalmente he encontrado bastantes ventajas desnudas, que con un una logica superior, se han convertido en algoritmos, que durante algun periodo de tiempo, han sido rentables. La experiencia me cuenta que ningun algoritmo es una fuente de alpha infinita e inmortal. Todas las ventjas nacen de desquilibros, que con el tiempo son corregidos por los diferentes actores del mercado. Y el objetivo de esta herramienta es poder escanear un activo en concreto, para tras sus posteriores procesos de validacion estadistica, puedan convertirse en un alpha mas en nuestra cartera.
Este articulo tiene mas partes disponibles, puedes acceder en los siguientes links


Que es la estacionalidad Intradiaria.
Definiriamos la estacionalidad intradiaria como patrones predecibles y recurrentes en el comportamiento de los precios, la volatilidad, el volumen y la liquidez que ocurren durante determinadas horas del día.
Caracteristicas de la estacionalidad intradiaria.
La estacionalidad intradiaria se manifiesta como patrones sistemáticos que se repiten regularmente en momentos específicos del día de negociación. Estos patrones pueden observarse en:
- Movimientos de precios: Tendencias alcistas o bajistas que ocurren consistentemente en momentos específicos del día
- Volatilidad: Patrones en forma de U donde la volatilidad es mayor durante la apertura y el cierre del mercado, y menor durante el medio día
- Volumen de negociación: Variaciones predecibles en la actividad comercial durante ciertas horas
- Liquidez: Cambios en los diferenciales de oferta/demanda (spreads) en momentos específicos
Causas de la estacionalidad intradia
Los factores causantes de la estacionalidad intradiaria, son niveles de conocimiento superior, que no podemos definir con total exactitud, pero podemos inferir de forma logica algunos de los factores que fomentan la aparicion de dichos fenomenos. Sin hablar sobre un activo en general sino sobre el efecto en general, los patrones mas relevantes que podriamos determinar como causa de dicho fenomeno serian
- Flujo de Informacion
- La publicacion programada de datos que ocurren en horarios especificos, como anuncios macroeconomicos, o de cualquier otro orden, que afecten al comportamiento natural del precio.
- Comportamiento de los participantes del mercado
- Inversores institucionales que compran o venden de forma sistematica en ciertos momentos del dia, hablando tanto de fondos, como de consumidores naturales
- Diferencias entre negociacion informada y no informada
- Los operadores informados son operadores institucionales, que generalmente consiguen mejores condiciones de precio en sus operaciones, mostrando un comportamiento mas persistente en sus patrones de negociacion, suelen actuar como iniciadores de las transacciones del mercado en los cambios de cualidades, y pese a que pueden ocultar todo su volumen, no necesariamente intentan ocultarse en el flujo de ordenes, tal como sugiere parte de la literatura
- En en otro lado, los operadores no informados, esta asociado con inversores minoristas, que muestran alta persistencia con dias de alto volumen no informado seguido por dias similares, tienen adversion a la operativa cuando preven la presencia de operadores informados, y adoptan estrategias en reaccion a los altos rendimientos previos de las operaciones de los participantes informados. Gran parte de estas operaciones son operaciones de seguimiento de tendencia, en reaccion a los altos rendimientos de las operaciones de los operadores informados.
- Riesgo de Inventario
- Una de las causas de la estacionalidad intradiaria, viene por parte de los creadores de mercado, donde ajustan sistematicamente en momentos especificos del dia sus inventarios, para evitar riesgos, creando un patron observable y explotable por parte de los participantes no informados. Asumiendo el riesgo que liberan los creadores de mercado.
Requisitos de analisis para la estacionlidad intradiaria
Para poder crear nuestro modelo que nos ayude a identificar estos patrones estacionales vamos a necesitar
- Datos de alta calidada. Los datos son la materia prima del research, a mayor calidad de datos, mas extrapolable seran las ventajas encontradas. En este caso, voy a dejarlos un pequeno fragmento de historico sobre algun futuro, para todos aquellos que no dispongais de un proveedor de datos de calidad
Vamos a utilizar un futuro continuo, calculado como la creacion de series de precios sinteticas y continuas enlazando diferentes contratos de futuros individuales, que vencen en diferentes momentos, asignando unas reglas fijas de rollover predefinidas.
Este proceso elimina los saltos causados por los vencimientos de contratos y proporciona una serie temporal historica de precios continua, y confiable que resulta util para el backtesting de estrategias, modelando el movimiento de los precios.
Pese a que muchos analistas a la hora de rolar el futuro continuo optan por un rollover en funcion del interes abierto o su volumen, nosotros vamos a trabajar de la forma mas estricta que se trata de un rollover mediante calendario.
Es decir, que los contratos avanzan segun sus fechas de vencimiento asegurando la estabilidad de la secuencia basada unicamente en el paso del tiempo, y no en la negociacion del activo.
Es la forma mas apropiada para encontrar estacionalidad, ya que de forma anticipada vamos a conocer los contratos que tendremos dentro del futuro, incluso cuando no tengan volumen, o no hayan sido creados, eliminando parte de incertidumbre en el modelo, y dando veracidad a la serie.
Para descargar los datos, ves al final del articulo.
Los datos corresponden al futuro de 6E, desde el ano 2013 al 2023. Con un historico de 10 anos es mas que suficiente para poder realizar este analisis, pero para poder realizar esots analisis, te recomiendo que obtengas un proveedor de datos que te proporcione actualizaciones y variedad de activos.
Estructura del proyecto
La estructura del proyecto tendra el siguiente orden

Donde
- En la carpeta download_data se almacenaran los datos crudos (RAW) y los procesados
- En la carpeta ModelBase se almacenaran el modelo de busqueda y un modelo de backtest rapido
- En la carpeta optimization_results se almacenaran los resultados de la optimizacion
Y el resto de archivos son totalmente prescindibles
Preprocesado de datos
El primer paso, es verificar los datos, el proveedor puede cometer errores, que sean trasladados a nuestro modelo, por consecuencia, hay que revisar los mismos.
Los datos vienen en un timeframe de 1minuto. Lo optimo seria construir las velas desde el los trades ejecutados en el top of orderbook, pero por simplificar vamos a obtener trades de 1m. El dataframe que tenemos es
import pandas as pd
data = pd.read_csv('download_data/6E_continuous.csv', index_col=0, parse_dates=True)
data.info()
Como vemos, hay un dataframe con 2232515 entradas, desde 2013 hasta 2023. Utilizando 171Mb de memoria

El dataframe se estructura con las siguientes columnas, que unicamente vamos a describir las relevantes para este cometido
- Instrument ID Hace referencia al ID del instrumento que esta manejando dentro del calculo del futuro continuo, en cada rollover cambiara
- open: El precio de apertura de la vela
- high: El precio maximo dentro de la vela
- low: El precio minimo dentro de la vela
- close: El precio de cierre de la vela
- volume: El volumen de la vela
- symbol: La forma de calcular el futuro contiuo
Resample de los datos.
El primer paso necesario, es el resample de los datos. Al tratar con datos de 1 minuto, puede ser una carga excesiva sin aportar demasiada informacion extra, por consecuencia, vamos a transformarlos a datos de 15 minutos. Para ello vamos a crear una funcion que cree unas nuevas velas de 15 minutos, utilizando los datos que disponemos de 1 minuto. Agrupando los valores y utilizando
- Para el Open el primer dato del intervalo
- Para el Close el ultimo dato del intervalo
- Para el High el mayor dato del intervalo
- Para el LOw el menor dato del intervalo
- Para el Volume la suma de datos en todo el intervalo
def resample_ohlcv(df, timeframe='15min'):
"""
Resample 1-minute financial data to a larger timeframe.
Parameters:
-----------
df : pandas.DataFrame
DataFrame with OHLCV data. Index must be a DatetimeIndex.
timeframe : str, default '15min'
Pandas-compatible frequency string (e.g., '15min', '1h', '4h', '1d')
Returns:
--------
pandas.DataFrame
Resampled OHLCV data
"""
# Asegurarse de que el df tiene un indice DateTimeIndex
if not isinstance(df.index, pd.DatetimeIndex):
raise ValueError("El DataFrame no tiene un indice apropiado.")
# Define resample rules for OHLCV
resampled = df.resample(timeframe).agg({
'Open': 'first', # First price in the period
'High': 'max', # Highest price in the period
'Low': 'min', # Lowest price in the period
'Close': 'last', # Last price in the period
'Volume': 'sum' # Sum of all volume in the period
})
return resampledAhora vamos a crear una nueva funcion que haga el preporcesado de datos, transformando el timeframe, y ademas creando nuevas caracteristicas, que nos ayudaran posteriormente con el analisis estacional.
Estas caracteristicas son el dia de la semana, la hora y el minuto, acelerando posteriormente la busqueda de edges estacionales mediante el uso de mascaras en pandas.
def process(df):
if not all(col in df.columns for col in ['open', 'high', 'low', 'close', 'volume']):
print("Error: Missing required columns. Expected 'open', 'high', 'low', 'close', 'volume'")
return None
df = df[['open', 'high', 'low', 'close', 'volume']]
df.columns = ['Open', 'High', 'Low', 'Close', 'Volume']
data = resample_ohlcv(df, '15min')
data['Weekday'] = data.index.weekday
data['Hour'] = data.index.hour
data['Minute'] = data.index.minute
return dataPara lanzar el preproceso de datos lo haremos de la siguiente forma, cargaremos el csv y lo enviaremos a preprocesar directamente.
Una vez procesado el DataFrame, deberiamos tener un dataframe de este estilo que sera la materia prima que utilizaremos para la busqueda de patrones estacionales

OJO, este activo no es el mismo que tu estas utilziando, pero las columnas deberian tener el mismo aspecto, ademas asegurate que esta todo correcto ploteando el cierre.
Conclusiones
En estos apuntes, hemos explicado el concepto de estacionalidad intradiaria, y hemos preparado los datos para poder ser tratados de una forma sencilla, en el proximo tomo, empezaremos a programar una clase, que introduciendo este dataframe como materia prima, empiece a buscar patrones estacionales.
Muchisimas gracias a todos por aguantar hasta aqui, y nos vemos en la proxima entrega.
Cualquier duda, podeis conctactar conmigo en mi correo jcx[a]quantarmy.com. Un saludo a todos y nos leemos en la proxima entrega.
Recursos
Todos los recursos estan disponibles unicamente para mientros, registrate y accede a ellos!
Citations:
[1]
[2] [PDF] Forecasting intraday call arrivals using the seasonal moving ...
[3] Intraday Analysis: Techniques and Tips for Day Traders
[4] Data Sources And Preprocessing For Quantitative Trading
[5] Intraday Trading Analytics - QuestDB
[6] Complete overview of intraday trading analytics - QuestDB
[7] 13 Data Preparation Tools To Enhance Your Data Quality | Airbyte
[8] Intraday Trading Strategies - Backtests Analysis
[9] A Simple Way to Read Intraday Volume - Investopedia
[10] Using self-organizing maps to adjust for intra-day seasonality
[11] Preptimize: Automation of Time Series Data Preprocessing and ...
[12] Mastering Data Preparation: The Key to AI-Driven Trading Success
[13] 10 Best Intraday Trading Strategies for Stock Traders (With Examples)
[14] Exponentially weighted methods for forecasting intraday time series ...
[15] 5 Intraday Analysis Tips for Stock Market Traders - Timothy Sykes
[16] How to Choose the Best Tools for Data Preprocessing - LinkedIn
[17] Basic Guide to Trade Options Intraday: Strategies and Risk ...
[18] Intraday Seasonality and Volatility Pattern: An Explanation ... - SSRN
[19] Automating Intraday Strategies: From Manual Complexity ... - LinkedIn
[20] Clean, Transform, Optimize: The Power of Data Preprocessing
[21] Intraday Trading Strategies : r/algotrading - Reddit

