Sistema modularizado para entrenar y comparar tres arquitecturas de redes neuronales GRU para la predicción de precios de Bitcoin. Incluye un dashboard interactivo construido con Dash para visualizar y analizar el desempeño de los modelos.
-
Tres modelos GRU diferentes:
- Simple: Arquitectura básica con 1 capa GRU
- Avanzado: Modelo mejorado con 2 capas GRU, normalización y dropout
- Profundo: Arquitectura profunda con 3 capas GRU, regularización completa
-
Dashboard interactivo con:
- Comparación en tiempo real de predicciones vs valores reales
- Selector de rango de fechas
- Métricas RMSE y MAE por modelo
- Análisis de residuos y distribución de errores
- Curvas de aprendizaje durante el entrenamiento
- 4 pestañas temáticas (Comparación General + 1 por modelo)
-
Arquitectura modularizada:
- Separación clara de responsabilidades
- Carga de datos
- Preprocesamiento
- Definición de modelos
- Entrenamiento
- Persistencia
- Dashboard interactivo
tensorflow>=2.10.0
keras>=2.10.0
scikit-learn>=1.0.0
pandas>=1.3.0
numpy>=1.21.0
plotly>=5.0.0
dash>=2.0.0
dash-bootstrap-components>=1.0.0
joblib>=1.0.0
-
Clonar o descargar el proyecto
-
Instalar dependencias:
pip install -r requirements.txt- Asegurarse de tener el archivo CSV de datos:
corr_bitcoin_diario_clausura.csv
El CSV debe contener una columna de precios con uno de estos nombres:
clausuracloseCloseprice
project/
├── main.py # Punto de entrada principal
├── config/
│ ├── custom_loss.py # Función de pérdida personalizada
│ └── settings.py # Configuración global
├── data/
│ ├── load_data.py # Carga de archivos CSV
│ └── preprocess.py # Normalización y creación de ventanas
├── models/
│ ├── architectures.py # Definición de arquitecturas GRU
│ └── train_models.py # Lógica de entrenamiento
├── dashboard/
│ ├── build_dashboard.py # Configuración principal del dashboard
│ ├── app_layout.py # Estructura HTML/componentes
│ └── callbacks.py # Lógica interactiva de gráficos
├── utils/
│ └── persistence.py # Guardar/cargar datos
└── README.md
python main.pyEste comando:
- Carga el archivo CSV
- Normaliza los datos (0-1)
- Crea ventanas temporales (14 días)
- Entrena los 3 modelos con early stopping y reducción de learning rate
- Guarda los modelos en archivos
.h5 - Persiste datos en
datos_dashboard.save - Inicia el dashboard en
http://localhost:8050
Una vez ejecutado python main.py, abre tu navegador en:
http://localhost:8050
CSV → Detección de columna precio → Extracción de serie de precios
Datos originales → Normalización MinMax (0-1) → Creación de ventanas (14 días)
70% entrenamiento | 30% validación → Entrenamiento 100 épocas → Early Stopping
Parámetros de entrenamiento:
- Épocas: 100 (con early stopping si no mejora)
- Batch size: 32
- Validación: 30% de los datos
- Optimizador: Adam
- Loss: MSE personalizado
- Callbacks:
- EarlyStopping: Paciencia de 15 épocas
- ReduceLROnPlateau: Reduce learning rate cada 5 épocas sin mejora
Predicciones sobre datos de test → Cálculo RMSE y MAE → Almacenamiento de métricas
Carga modelos entrenados → Genera predicciones → Muestra visualizaciones interactivas
- Gráfico principal: Superpone predicciones de los 3 modelos con valores reales
- Distribución de errores: Box plots mostrando rango y outliers por modelo
- Métricas comparativas: Barras con RMSE y MAE
- Análisis de residuos: Scatter plot de errores vs predicciones
Cada modelo tiene 5 gráficos:
- Predicciones vs Real: Línea temporal de predicciones superpuesta con valores reales
- Residuos: Errores a lo largo del tiempo con línea de media
- Curva de aprendizaje: Pérdida en entrenamiento vs validación
- Distribución de errores: Histograma de errores
- Métricas temporales: MAE con ventana móvil de 7 días
Filtra todos los gráficos por rango de fechas seleccionado. Por defecto muestra últimos 180 días.
Para modificar parámetros, edita main.py:
VENTANA = 14 # Tamaño de ventana temporal (días)
TRAIN_SIZE = 0.7 # Proporción de datos para entrenamiento
epochs = 100 # Número máximo de épocas
batch_size = 32 # Tamaño de lote
learning_rate = 0.001 # Tasa de aprendizaje (modelos avanzado/profundo)- Penaliza más los errores grandes
- Mejor para penalizar predicciones muy alejadas
- Unidades: USD
- Rango típico: 100-500 para Bitcoin
- Error promedio absoluto
- Más robusto frente a outliers
- Unidades: USD
- Rango típico: 50-200 para Bitcoin
Mejor modelo: Aquel con RMSE y MAE menores
Después de ejecutar, se crean:
modelo_Simple.h5 # Modelo Simple entrenado
modelo_Avanzado.h5 # Modelo Avanzado entrenado
modelo_Profundo.h5 # Modelo Profundo entrenado
datos_dashboard.save # Datos persistidos (pickle con joblib)
Para limpiar y reentrenar:
rm modelo_*.h5 datos_dashboard.save
python main.pyCausa: El CSV no tiene una columna con nombre clausura, close, Close o price
Solución:
- Verifica los nombres exactos de columnas en tu CSV
- Modifica la línea en
main.py:
price_col = next((col for col in ['tu_columna'] if col in df.columns), None)Causa: El CSV no tiene fechas o están en formato no reconocido
Solución:
- Asegúrate de que el CSV tenga una columna de fechas
- O que el índice sea reconocible como fechas
Causa: Puerto 8050 ya está en uso
Solución:
# En dashboard/build_dashboard.py, cambiar:
app.run(debug=True, port=8051) # Usar otro puertoCausa: Dataset muy grande o modelo profundo
Solución:
- Reducir batch_size de 32 a 16
- Usar ventana más pequeña (10 en lugar de 14)
- Usar modelo Simple en lugar de Profundo
Archivo cargado. Columnas disponibles: ['fecha', 'clausura', 'volumen']
Columna de precio detectada: clausura
⚙️ Entrenando modelo Simple...
✔ Simple - RMSE: 245.32
⚙️ Entrenando modelo Avanzado...
✔ Avanzado - RMSE: 198.45
⚙️ Entrenando modelo Profundo...
✔ Profundo - RMSE: 156.78
Entrenamiento completado. Iniciando dashboard...
Dash is running on http://127.0.0.1:8050
- Tiempo de entrenamiento: ~5-10 minutos en CPU, <2 minutos en GPU
- Tiempo de carga del dashboard: <5 segundos
- Tiempo de actualización de gráficos: <2 segundos por cambio de rango de fechas
- Agregar más modelos (LSTM, Transformer)
- Exportar predicciones a CSV
- Predicciones futuras (forecasting)
- Backtesting de estrategias
- Integración con APIs en tiempo real
- Configuración por archivo YAML
- Tests unitarios
Proyecto educativo sin restricciones de uso.
Para reportar bugs o sugerencias, contacta al desarrollador.