Proyecto para la proyección semanal (horizonte corto) del precio de la acción de Repsol mediante una red recurrente GRU (Gated Recurrent Unit) y un flujo de trabajo que integra: ingestión de datos, limpieza, ingeniería de características, escalado, generación de secuencias temporales, búsqueda de hiperparámetros, selección de variables con SHAP, persistencia de artefactos y predicción reproducible.
- Consolidar series temporales de fuentes financieras (acción Repsol, IBEX 35, precio del petróleo, divisa EUR/USD, etc.).
- Generar variables derivadas (spreads, medias móviles exponenciales) que capturen relaciones y microestructura.
- Entrenar un modelo GRU para pronosticar el precio (horizonte de 1 semana / próximo punto temporal tras una ventana corta).
- Optimizar el modelo mediante búsqueda (grid search) y seleccionar atributos relevantes con interpretabilidad SHAP.
- Producir un pipeline de inferencia reproducible que emplee artefactos serializados (scalers, modelo, variables seleccionadas) y registre resultados.
El proyecto tiene fines educativos y exploratorios. No constituye recomendación de inversión. Las predicciones están sujetas a incertidumbre y a cambios estructurales del mercado.
Árbol lógico (raíz del repositorio):
.
├── LICENSE # Licencia MIT
├── README.md # Documentación principal
├── requirements.txt # Dependencias del entorno
└── src/
├── main.py # Script de inferencia / generación de predicciones
├── notebook.ipynb # Exploración y análisis interactivo
├── funciones/
│ ├── __init__.py
│ └── utilidades_datos.py # Utilidades: spread, RSI, creación de secuencias
├── modelos/
│ ├── gru/
│ │ ├── __init__.py
│ │ ├── Clase_GRU.py # Definición de la arquitectura GRU
│ │ ├── forecast_repsol.pt# Modelo entrenado (inferencias)
│ │ └── gru_sel.pt # Modelo utilizado para selección de variables con SHAP
│ ├── scalers/
│ │ ├── scaler_x.pkl # Escalador de variables independientes
│ │ └── scaler_y.pkl # Escalador de variable objetivo
│ └── shap/
│ └── explainer_shap.pkl# Objeto explicador SHAP serializado
└── data/
├── raw/ # Datos brutos (ingesta original)
│ ├── repsol_raw.csv
│ ├── repsol_yahoo.csv
│ ├── ibex_35_raw.csv
│ ├── petroleo_raw.csv
│ └── dolar_euro.csv
├── clean/ # Datos limpios y consistentes
│ ├── repsol_clean.csv
│ ├── ibex_35_clean.csv
│ ├── petroleo_clean.csv
│ ├── train_escalado.csv
│ ├── val_escalado.csv
│ ├── test_escalado.csv
│ ├── y_train_escalado.csv
│ ├── y_val_escalado.csv
│ └── y_test_escalado.csv
├── tensor/ # Tensores para entrenamiento, validación y test
│ ├── X_tensor_train.pt
│ ├── X_tensor_val.pt
│ ├── X_tensor_test.pt
│ ├── y_tensor_train.pt
│ ├── y_tensor_val.pt
│ └── y_tensor_test.pt
├── grid_search/ # Resultados de búsqueda de hiperparámetros
│ ├── df_search_results.csv
│ └── df_sel_search_results.csv
├── shap/ # Artefactos de selección de variables con SHAP
│ ├── variables.csv # Variables seleccionadas finales
│ └── shap_values.pkl # Valores SHAP (Tensor tridimensional con los periodos y variables)
└── predicciones/ # Predicciones generadas por main.py
└── predicciones_YYYYMMDD_HHMMSS.csv
- Ingesta: Descarga de series (p.ej.
repsol_raw.csv, índices, commodities, divisas) desde APIs (yfinance, investpy u otras). - Limpieza y Normalización: Tratamiento de valores nulos (interpolación temporal), alineación de índices y formatos en
data/clean. - Ingeniería de Características:
- Cálculo de spreads (Repsol vs. Petróleo; Repsol vs. IBEX 35) mediante regresión lineal para residuales.
- Medias móviles exponenciales (EMA semanal) y potencialmente otros indicadores (ej. RSI disponible en utilidades).
- Escalado: Ajuste de
scaler_x.pkl(variables independientes) yscaler_y.pkl(target) y persistencia para inferencia reproducible. - Creación de Secuencias: Conversión de las series escaladas en ventanas temporales (longitud
seq_len=3en el script actual) concrear_secuencias. - División del Conjunto: Generación de tensores train / val / test (
data/tensor). - Búsqueda de Hiperparámetros: Exploración sistemática (GRU: capas, unidades ocultas, dropout, bidireccionalidad) con resultados en
grid_search/. - Entrenamiento: Ajuste del modelo GRU (definido en
Clase_GRU.py) y selección del mejor checkpoint (forecast_repsol.pt). - Interpretabilidad: Cálculo de contribuciones SHAP, filtrado de variables relevantes y exportación a
variables.csv(orden esperado por el pipeline de inferencia). - Inferencia: Ejecución de
main.pyque reconstruye el conjunto de características, verifica el conjunto de variables, escala, forma secuencias y genera la predicción del siguiente paso temporal. - Evaluación: Cálculo de error porcentual y MAE (Error Absoluto Medio) sobre el rango de predicciones reconstruidas.
- Registro y Persistencia: Exportación de un CSV fechado en
data/predicciones/para trazabilidad.
| Componente | Descripción |
|---|---|
utilidades_datos.py |
Funciones auxiliares para cálculo de RSI, spreads y creación de secuencias (ventanas deslizantes). |
Clase_GRU.py |
Arquitectura GRU configurable: bidireccional opcional, BatchNorm, capa totalmente conectada con activación ReLU y dropout. |
variables.csv |
Lista ordenada de variables finales utilizadas durante la inferencia (control de consistencia). |
forecast_repsol.pt |
Modelo entrenado final listo para predicción. |
explainer_shap.pkl |
Objeto SHAP para reanálisis interpretativo. |
grid_search/*.csv |
Métricas consolidadas de exploración de hiperparámetros y selección. |
predicciones_*.csv |
Archivo de salida con columnas Fecha, Precio_Actual, Prediccion_Semana, Error_Porcentual. |
La red GRU procesa secuencias de longitud fija (actualmente 3 pasos temporales) y produce una predicción escalar. Características técnicas:
- Bidireccionalidad para capturar patrones de dependencia contextual.
- Normalización por lotes en la salida temporal agregada (
out[:, -1, :]). - Capa intermedia densa (linear_size) con ReLU y dropout para regularización.
- Objetivo: estimar el valor futuro del precio de Repsol (escala invertida tras la predicción).
Se emplea SHAP para:
- Cuantificar contribuciones marginales de cada variable al output.
- Filtrar y ordenar las variables por importancia agregada.
- Garantizar reproducibilidad: la inferencia afirma (
assert) que el conjunto y orden de columnas coincide convariables.csv(Los scalers no funcionan con columnas adicionales o en diferente orden).
El archivo requirements.txt fija versiones (principalmente Python 3.12 y librerías científicas). Para una instalación más ligera, pueden seleccionarse únicamente dependencias mínimas (ej.: pandas, numpy, scikit-learn, torch, shap, joblib, yfinance, investpy). Sin embargo, para reproducibilidad exacta se recomienda instalar el listado completo.
Clonar el repositorio oficial:
git clone https://github.com/Rubenvalrom/Proyeccion-Repsol-con-Pytorch.git
cd Proyeccion-Repsol-con-PytorchLos ficheros bajo data/raw no se regeneran automáticamente en el script de inferencia actual. Si se desea reconstruir el pipeline desde origen, será necesario:
- Descargar/actualizar series históricas (ej. vía yfinance / investpy).
- Aplicar limpieza y alineación temporal.
- Recalcular spreads y EMAs.
- Reajustar escaladores y regenerar tensores.
- Reentrenar el modelo y volver a calcular SHAP.
Estas etapas pueden implementarse en notebooks o scripts adicionales (no incluidos explícitamente en este repositorio en su forma actual).
Ejecutar el script principal (asumiendo que las rutas relativas se mantienen y que los artefactos ya existen):
python src/main.pySalida esperada:
- Conteo de filas y nulos antes/después de interpolación.
- Confirmación de columnas y verificación de variables seleccionadas.
- Generación de archivo en
src/data/predicciones/predicciones_YYYYMMDD_HHMMSS.csv. - Cálculo de MAE porcentual agregado.
- Añadir indicadores técnicos: Incorporar cálculos (RSI ya disponible) en
procesar_datosy actualizarvariables.csvtras un nuevo análisis SHAP. - Optimización avanzada: Repetir grid search con métricas adicionales (RMSE, Huber Loss) y agregar validación cruzada temporal (rolling / expanding window), aunque eso necesitaría una mayor potencia computacional.
- Despliegue: Empaquetar el pipeline de inferencia como servicio o tarea programada.
- Separación de responsabilidades (utilidades, modelo, artefactos).
- Persistencia explícita de escaladores y variables seleccionadas (control de deriva de esquema).
- Interpretabilidad integrada con SHAP para trazabilidad de decisiones del modelo.
- Versionado reproducible vía
requirements.txt.
Distribuido bajo la Licencia MIT. Véase LICENSE para más detalles.