Spaces:
Sleeping
Sleeping
Commit
·
35d2f50
1
Parent(s):
2612724
Inicializar backend FastAPI con Dockerfile
Browse files
app.py
CHANGED
|
@@ -167,3 +167,114 @@ def predict(banco: str, req: PredictRequest):
|
|
| 167 |
# === Otro banco no válido ===
|
| 168 |
else:
|
| 169 |
return {"error": "Banco no reconocido. Usa 'bbva' o 'santander'."}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 167 |
# === Otro banco no válido ===
|
| 168 |
else:
|
| 169 |
return {"error": "Banco no reconocido. Usa 'bbva' o 'santander'."}
|
| 170 |
+
|
| 171 |
+
# ============================================================
|
| 172 |
+
# 8️⃣ Nuevo endpoint de simulación — Variar "Open"
|
| 173 |
+
# ============================================================
|
| 174 |
+
|
| 175 |
+
class SimulateRequest(BaseModel):
|
| 176 |
+
factor_open: float = 1.0 # por defecto, sin cambio
|
| 177 |
+
n_future: int = 3 # número de días de predicción
|
| 178 |
+
|
| 179 |
+
|
| 180 |
+
@app.post("/simulate/{banco}")
|
| 181 |
+
def simulate(banco: str, req: SimulateRequest):
|
| 182 |
+
banco = banco.lower()
|
| 183 |
+
n_future = req.n_future
|
| 184 |
+
factor_open = req.factor_open
|
| 185 |
+
|
| 186 |
+
# === BBVA ===
|
| 187 |
+
if banco == "bbva":
|
| 188 |
+
path = "data/bbva_pred.csv"
|
| 189 |
+
df = pd.read_csv(path)
|
| 190 |
+
df["Date"] = pd.to_datetime(df["Date"])
|
| 191 |
+
df = df.set_index("Date")
|
| 192 |
+
df = df.loc["2021-01-01":"2025-10-31"]
|
| 193 |
+
|
| 194 |
+
cols_to_scale = [
|
| 195 |
+
'Open','High','Low','Close','Adj Close',
|
| 196 |
+
'ma_5','close_lag1','close_lag2','close_lag3',
|
| 197 |
+
'Volume','ibex_momentum_5d'
|
| 198 |
+
]
|
| 199 |
+
features = ['Open','High','Low','return_1d','return_3d']
|
| 200 |
+
|
| 201 |
+
# Escalar los datos
|
| 202 |
+
df_scaled = df.copy()
|
| 203 |
+
df_scaled[cols_to_scale] = bbva_scaler_features.transform(df[cols_to_scale])
|
| 204 |
+
|
| 205 |
+
# Tomar la última ventana y modificar solo "Open"
|
| 206 |
+
last_window = df_scaled[features].iloc[-3:].values
|
| 207 |
+
modified_window = last_window.copy()
|
| 208 |
+
modified_window[:, 0] *= factor_open # multiplicar solo el "Open"
|
| 209 |
+
|
| 210 |
+
preds_scaled = []
|
| 211 |
+
window = modified_window.copy()
|
| 212 |
+
for _ in range(n_future):
|
| 213 |
+
X_input = torch.tensor(window, dtype=torch.float32).unsqueeze(0)
|
| 214 |
+
with torch.no_grad():
|
| 215 |
+
pred_scaled = bbva_model(X_input).cpu().numpy().flatten()[0]
|
| 216 |
+
preds_scaled.append(pred_scaled)
|
| 217 |
+
next_day = window[-1].copy()
|
| 218 |
+
window = np.vstack([window[1:], next_day])
|
| 219 |
+
|
| 220 |
+
preds_real = bbva_scaler_target.inverse_transform(np.array(preds_scaled).reshape(-1, 1)).flatten().tolist()
|
| 221 |
+
|
| 222 |
+
last_date = df.index[-1]
|
| 223 |
+
future_dates = pd.date_range(last_date + pd.Timedelta(days=1), periods=n_future, freq="B")
|
| 224 |
+
fechas = [str(d.date()) for d in future_dates]
|
| 225 |
+
|
| 226 |
+
return {
|
| 227 |
+
"banco": "BBVA",
|
| 228 |
+
"factor_open": factor_open,
|
| 229 |
+
"fechas": fechas,
|
| 230 |
+
"predicciones": preds_real
|
| 231 |
+
}
|
| 232 |
+
|
| 233 |
+
# === SANTANDER ===
|
| 234 |
+
elif banco == "santander":
|
| 235 |
+
path = "data/santander_pred.csv"
|
| 236 |
+
df = pd.read_csv(path)
|
| 237 |
+
df["Date"] = pd.to_datetime(df["Date"])
|
| 238 |
+
df = df.set_index("Date")
|
| 239 |
+
df = df.loc["2021-01-01":"2025-10-31"]
|
| 240 |
+
|
| 241 |
+
cols_to_scale = [
|
| 242 |
+
'Open','High','Low','Close','Adj Close',
|
| 243 |
+
'ma_5','close_lag1','close_lag2','close_lag3',
|
| 244 |
+
'Volume','ibex_momentum_5d'
|
| 245 |
+
]
|
| 246 |
+
features = ['Open','High','Low','close_lag1','close_lag2']
|
| 247 |
+
|
| 248 |
+
df_scaled = df.copy()
|
| 249 |
+
df_scaled[cols_to_scale] = santander_scaler_features.transform(df[cols_to_scale])
|
| 250 |
+
|
| 251 |
+
last_window = df_scaled[features].iloc[-3:].values
|
| 252 |
+
modified_window = last_window.copy()
|
| 253 |
+
modified_window[:, 0] *= factor_open
|
| 254 |
+
|
| 255 |
+
preds_scaled = []
|
| 256 |
+
window = modified_window.copy()
|
| 257 |
+
for _ in range(n_future):
|
| 258 |
+
X_input = torch.tensor(window, dtype=torch.float32).unsqueeze(0)
|
| 259 |
+
with torch.no_grad():
|
| 260 |
+
pred_scaled = santander_model(X_input).cpu().numpy().flatten()[0]
|
| 261 |
+
preds_scaled.append(pred_scaled)
|
| 262 |
+
next_day = window[-1].copy()
|
| 263 |
+
window = np.vstack([window[1:], next_day])
|
| 264 |
+
|
| 265 |
+
preds_real = santander_scaler_target.inverse_transform(np.array(preds_scaled).reshape(-1, 1)).flatten().tolist()
|
| 266 |
+
|
| 267 |
+
last_date = df.index[-1]
|
| 268 |
+
future_dates = pd.date_range(last_date + pd.Timedelta(days=1), periods=n_future, freq="B")
|
| 269 |
+
fechas = [str(d.date()) for d in future_dates]
|
| 270 |
+
|
| 271 |
+
return {
|
| 272 |
+
"banco": "Santander",
|
| 273 |
+
"factor_open": factor_open,
|
| 274 |
+
"fechas": fechas,
|
| 275 |
+
"predicciones": preds_real
|
| 276 |
+
}
|
| 277 |
+
|
| 278 |
+
# === Error ===
|
| 279 |
+
else:
|
| 280 |
+
return {"error": "Banco no reconocido. Usa 'bbva' o 'santander'."}
|