File size: 5,763 Bytes
7e34e63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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('binary_classification_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 = (matriz - I_min) / (I_max - I_min)
    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):
    # 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']
    valores = datos_acciones.pct_change().dropna().values[0]

    # 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 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 = "Ma帽ana va a ganar la NYSE" if predicted_class == 1 else "Ma帽ana va a perder la NYSE"
    
    return imagen_resized, mensaje

# Interfaz de Gradio
iface = gr.Interface(
    fn=procesar_y_predecir,
    inputs=gr.Textbox(label="Fecha", placeholder="Ingresa la fecha en formato aaaa-mm-dd"),
    outputs=[gr.Image(type="pil"), gr.Textbox(label="Predicci贸n")]
)

iface.launch()