Spaces:
Sleeping
Sleeping
import gradio as gr | |
import pandas as pd | |
import numpy as np | |
import tensorflow as tf | |
import yfinance as yf | |
from PIL import Image | |
import ast | |
from datetime import datetime, timedelta | |
# Cargar el modelo | |
modelo = tf.keras.models.load_model('best_model.keras') | |
# Definir constantes | |
img_height, img_width = 224, 224 | |
I_min, I_max = -3.5, 3.5 | |
# Definir listas de acciones | |
mineria = ['BHP', 'RIO', 'VALE', 'NEM', 'FCX', 'GOLD', 'SCCO', 'TECK', 'AA', 'AEM'] | |
entretenimiento = ['DIS', 'NFLX', 'CMCSA', 'EA', 'TTWO', 'SONY', 'LYV', 'CNK', 'IMAX', 'AMC'] | |
tecnologia = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'META', 'INTC', 'NVDA', 'CSCO', 'ORCL', 'IBM'] | |
alimentacion = ['KO', 'PEP', 'MDLZ', 'TSN', 'GIS', 'K', 'CAG', 'HSY', 'SYY', 'HRL'] | |
otros = ['JNJ', 'PG', 'WMT', 'XOM', 'JPM', 'V', 'PFE', 'HD', 'BA', 'MCD'] | |
acciones = mineria + entretenimiento + tecnologia + alimentacion + otros | |
# Funci贸n para calcular fechas | |
def calcular_fechas(fecha_fin_str): | |
fecha_fin = datetime.strptime(fecha_fin_str, '%Y-%m-%d') | |
if fecha_fin.weekday() == 0: # Lunes es 0 | |
fecha_inicio = fecha_fin - timedelta(days=3) | |
else: | |
fecha_inicio = fecha_fin - timedelta(days=1) # Resta un d铆a en otros casos | |
fecha_fin_mas_uno = fecha_fin + timedelta(days=1) | |
return fecha_inicio.strftime('%Y-%m-%d'), fecha_fin_mas_uno.strftime('%Y-%m-%d') | |
# Funci贸n para escalar la matriz a RGB | |
def escalar_matriz_rgb(matriz, I_min, I_max): | |
matriz_normalizada = 2 * ((matriz - I_min) / (I_max - I_min)) - 1 | |
rojo = (1 - matriz_normalizada.clip(max=0)) * 255 | |
verde = matriz_normalizada.clip(min=0) * 255 | |
azul = (1 - abs(matriz_normalizada)) * 255 | |
imagen_rgb = np.stack([rojo, verde, azul], axis=-1).astype('uint8') | |
return imagen_rgb | |
# Funci贸n para preparar la imagen | |
def preparar_imagen(imagen): | |
imagen = imagen.resize((img_height, img_width)) | |
imagen_array = np.array(imagen) / 255.0 | |
imagen_array = np.expand_dims(imagen_array, axis=0) | |
return imagen_array | |
# Funci贸n para combinar las puntuaciones en una matriz de intensidades | |
def combinar_puntuaciones(z_vector): | |
z_columna = z_vector.reshape(-1, 1) | |
z_fila = z_vector.reshape(1, -1) | |
matriz_intensidad = (z_columna + z_fila) / 2 | |
return matriz_intensidad | |
# Funci贸n principal para procesar y predecir | |
def procesar_y_predecir(fecha_fin_str): | |
# Valores fijos de desviaci贸n est谩ndar y media | |
desviacion_retornos = pd.Series({ | |
'AA': 0.033874, 'AAPL': 0.018052, 'AEM': 0.024548, 'AMC': 0.088641, 'AMZN': 0.020669, | |
'BA': 0.025481, 'BHP': 0.021584, 'CAG': 0.016168, 'CMCSA': 0.015756, 'CNK': 0.034773, | |
'CSCO': 0.015871, 'DIS': 0.017589, 'EA': 0.018129, 'FCX': 0.034673, 'GIS': 0.013253, | |
'GOLD': 0.024993, 'GOOGL': 0.017890, 'HD': 0.015374, 'HRL': 0.014172, 'HSY': 0.013699, | |
'IBM': 0.014975, 'IMAX': 0.029040, 'INTC': 0.022295, 'JNJ': 0.011410, 'JPM': 0.017179, | |
'K': 0.013803, 'KO': 0.011238, 'LYV': 0.023748, 'MCD': 0.012875, 'MDLZ': 0.013368, | |
'META': 0.023727, 'MSFT': 0.017148, 'NEM': 0.022646, 'NFLX': 0.027685, 'NVDA': 0.030759, | |
'ORCL': 0.017283, 'PEP': 0.011764, 'PFE': 0.014615, 'PG': 0.011667, 'RIO': 0.020612, | |
'SCCO': 0.022382, 'SONY': 0.018923, 'SYY': 0.018709, 'TECK': 0.035790, 'TSN': 0.017928, | |
'TTWO': 0.021477, 'V': 0.015461, 'VALE': 0.030546, 'WMT': 0.013344, 'XOM': 0.017617 | |
}) # Coloca aqu铆 las desviaciones | |
media_retornos = pd.Series({ | |
'AA': 0.000632, 'AAPL': 0.001083, 'AEM': 0.000843, 'AMC': 0.001134, 'AMZN': 0.001229, | |
'BA': 0.000451, 'BHP': 0.000543, 'CAG': 0.000287, 'CMCSA': 0.000366, 'CNK': 0.000569, | |
'CSCO': 0.000543, 'DIS': 0.000201, 'EA': 0.000629, 'FCX': 0.000933, 'GIS': 0.000337, | |
'GOLD': 0.000649, 'GOOGL': 0.000899, 'HD': 0.000776, 'HRL': 0.000279, 'HSY': 0.000421, | |
'IBM': 0.000449, 'IMAX': 0.000262, 'INTC': 0.000170, 'JNJ': 0.000359, 'JPM': 0.000777, | |
'K': 0.000341, 'KO': 0.000398, 'LYV': 0.000882, 'MCD': 0.000679, 'MDLZ': 0.000443, | |
'META': 0.001095, 'MSFT': 0.001097, 'NEM': 0.000790, 'NFLX': 0.001496, 'NVDA': 0.002764, | |
'ORCL': 0.000768, 'PEP': 0.000434, 'PFE': 0.000253, 'PG': 0.000441, 'RIO': 0.000662, | |
'SCCO': 0.000949, 'SONY': 0.000867, 'SYY': 0.000538, 'TECK': 0.001210, 'TSN': 0.000411, | |
'TTWO': 0.000924, 'V': 0.000747, 'VALE': 0.000822, 'WMT': 0.000593, 'XOM': 0.000433 | |
}) # Coloca aqu铆 las medias | |
# Calcular fechas de inicio y fin | |
fecha_inicio, fecha_fin_mas_uno = calcular_fechas(fecha_fin_str) | |
# Descargar datos y calcular los retornos | |
datos_acciones = yf.download(acciones, start=fecha_inicio, end=fecha_fin_mas_uno)['Adj Close'] | |
datos_acciones.fillna(media_retornos, inplace=True) | |
valores = datos_acciones.pct_change().dropna().values[0] | |
# Calcular puntuaciones z y generar la imagen | |
puntuaciones_z = (valores - media_retornos) / desviacion_retornos | |
puntuaciones_z_limited = puntuaciones_z.clip(lower=-3.5, upper=3.5) | |
matriz_intensidad = combinar_puntuaciones(puntuaciones_z_limited.values) | |
matriz_rgb = escalar_matriz_rgb(matriz_intensidad, I_min, I_max) | |
imagen = Image.fromarray(matriz_rgb, mode='RGB') | |
imagen_resized = imagen.resize((224, 224)) | |
imagen_procesada = preparar_imagen(imagen_resized) | |
# Predecir con el modelo | |
prediccion = modelo.predict(imagen_procesada) | |
predicted_class = int((prediccion > 0.5).astype(int).flatten()[0]) | |
mensaje = "La NYSE tendr谩 ganancias en el pr贸ximo cierre." if predicted_class == 1 else "La NYSE tendr谩 p茅rdidas en el pr贸ximo cierre." | |
return imagen_resized, mensaje | |
# Interfaz de Gradio | |
iface = gr.Interface( | |
fn=procesar_y_predecir, | |
inputs=gr.Textbox(label="Fecha", placeholder="Ingrese la fecha en formato AAAA-MM-DD (debe ser un d铆a h谩bil de la NYSE)"), | |
outputs=[gr.Image(type="pil"), gr.Textbox(label="Predicci贸n")] | |
) | |
iface.launch() | |