Motor determinista predict-then-optimize para una planta solar con batería (PV-BESS) en el mercado eléctrico chileno: pronostica el costo marginal (CMg) nodal y decide cuándo cargar y descargar para arbitrar el diferencial y rescatar energía que se vertería. Día típico del SEN: sobreoferta solar a mediodía, punta vespertina.
Plan plan-1 · política arbitraje-demo v1 · semilla 42 ·
misma entrada → mismo plan (determinista, auditable)
La batería carga cuando el CMg colapsa (absorbe el excedente solar) y descarga en la punta de la tarde. Pasa el cursor —o usa las flechas del teclado— para ver cada hora con el motivo que reconstruye el explicador del dominio.
| Hora | CMg (US$/MWh) | PV (kW) | Acción | Batería (kW) | SoC | Vertido (kWh) | Motivo |
|---|---|---|---|---|---|---|---|
| 00:00 | 75 | 0 | Descargar | +19 | 0% | 0.0 | Descarga: el CMg (75000 mills/MWh) es de los más caros del horizonte; vende lo almacenado. |
| 01:00 | 74 | 0 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (74000 mills/MWh) es intermedio en el horizonte; no hay diferencial que capturar. |
| 02:00 | 73 | 0 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (73000 mills/MWh) es intermedio en el horizonte; no hay diferencial que capturar. |
| 03:00 | 72 | 0 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (72000 mills/MWh) es intermedio en el horizonte; no hay diferencial que capturar. |
| 04:00 | 73 | 0 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (73000 mills/MWh) es intermedio en el horizonte; no hay diferencial que capturar. |
| 05:00 | 75 | 0 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (75000 mills/MWh) es de los más caros del horizonte; no hay diferencial que capturar. |
| 06:00 | 70 | 5 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (70000 mills/MWh) es intermedio en el horizonte; no hay diferencial que capturar. |
| 07:00 | 40 | 20 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (40000 mills/MWh) es intermedio en el horizonte; no hay diferencial que capturar. |
| 08:00 | 5 | 45 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (5000 mills/MWh) es de los más baratos del horizonte; no hay diferencial que capturar. |
| 09:00 | 0 | 65 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (0 mills/MWh) es de los más baratos del horizonte; no hay diferencial que capturar. |
| 10:00 | 0 | 80 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (0 mills/MWh) es de los más baratos del horizonte; no hay diferencial que capturar. |
| 11:00 | 0 | 90 | Cargar | −40 | 38% | 0.0 | Carga: el CMg (0 mills/MWh) es de los más baratos del horizonte; almacena para vender más caro. Con CMg <= 0, inyectar pagaría por generar: absorber es lo óptimo. |
| 12:00 | 0 | 95 | Cargar | −15 | 52% | 0.0 | Carga: el CMg (0 mills/MWh) es de los más baratos del horizonte; almacena para vender más caro. Con CMg <= 0, inyectar pagaría por generar: absorber es lo óptimo. |
| 13:00 | 0 | 90 | Cargar | −50 | 100% | 0.0 | Carga: el CMg (0 mills/MWh) es de los más baratos del horizonte; almacena para vender más caro. Con CMg <= 0, inyectar pagaría por generar: absorber es lo óptimo. |
| 14:00 | 3 | 80 | Retener | 0 | 100% | 0.0 | Retiene: el CMg (3000 mills/MWh) es de los más baratos del horizonte; no hay diferencial que capturar. |
| 15:00 | 10 | 65 | Retener | 0 | 100% | 0.0 | Retiene: el CMg (10000 mills/MWh) es de los más baratos del horizonte; no hay diferencial que capturar. |
| 16:00 | 25 | 45 | Retener | 0 | 100% | 0.0 | Retiene: el CMg (25000 mills/MWh) es intermedio en el horizonte; no hay diferencial que capturar. |
| 17:00 | 60 | 20 | Retener | 0 | 100% | 0.0 | Retiene: el CMg (60000 mills/MWh) es intermedio en el horizonte; no hay diferencial que capturar. |
| 18:00 | 95 | 5 | Retener | 0 | 100% | 0.0 | Retiene: el CMg (95000 mills/MWh) es de los más caros del horizonte; no hay diferencial que capturar. |
| 19:00 | 110 | 0 | Descargar | +50 | 47% | 0.0 | Descarga: el CMg (110000 mills/MWh) es de los más caros del horizonte; vende lo almacenado. |
| 20:00 | 105 | 0 | Descargar | +45 | 0% | 0.0 | Descarga: el CMg (105000 mills/MWh) es de los más caros del horizonte; vende lo almacenado. |
| 21:00 | 95 | 0 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (95000 mills/MWh) es de los más caros del horizonte; no hay diferencial que capturar. |
| 22:00 | 85 | 0 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (85000 mills/MWh) es de los más caros del horizonte; no hay diferencial que capturar. |
| 23:00 | 80 | 0 | Retener | 0 | 0% | 0.0 | Retiene: el CMg (80000 mills/MWh) es de los más caros del horizonte; no hay diferencial que capturar. |
De descargas crudas del mercado real a un plan auditable — ingesta, limpieza, alineación y validación out-of-sample, reproducibles por CLI.
CMg horario real por barra (S.GREGORIO, 2025). Formato hostil: coma decimal chilena, fecha en celdas combinadas, columna titulada por el mnemónico de la barra.
Generación PV de año típico (Antofagasta), ~54 filas de metadatos sobre la tabla y sin calendario común con el CMg.
acopia-datos alinearParseo tolerante + alineación por posición + escala a unidades enteras del dominio
(mills/MWh, W) → planta_2025.csv, 8.754 h alineadas.
7 folds × 24 h out-of-sample, entrenamiento régimen-local (ventana de 720 h): el forecast se valida contra lo que no vio.
Predict-then-optimize: LP (cvxpy + HiGHS) cuantizado a enteros y validado contra el modelo físico de la batería — siempre factible.
El target difícil es el CMg — es el que decide el arbitraje. El Seq2Seq-LSTM entrenado régimen-local recorta el RMSE de CMg −23% frente al baseline; en generación el naive sigue ganando (y así se reporta).
| Modelo | Gen RMSE (W) | CMg RMSE (mills/MWh) | CMg MAPE |
|---|---|---|---|
| Estacional-naive (baseline) | 36.2 | 26,220 | 39.1% |
| SARIMAX | 41.3 | 28,200 | ~40% |
| Seq2Seq-LSTM (ventana 720 h) | 46.5 | 20,300 (−23%) | ~39% |
Cifras direccionales: planta modelo de 1 kW (generación TMY) + CMg real de
una barra; no es telemetría de una planta en operación. La honestidad del reporte es parte
del método: cada cifra sale de un comando reproducible (acopia-datos backtest).