Análisis de arbitraje de baterías a largo plazo
Simula un año completo de operación de batería con restricciones para entender la variabilidad de beneficios y expectativas anuales realistas.
Los beneficios diarios de arbitraje oscilan entre €6 y €84—una diferencia de 14x. Este gráfico muestra por qué el análisis de un solo día es engañoso: necesitas una simulación de un año completo para entender lo que realmente gana el almacenamiento con baterías.

¿La conclusión? A los precios actuales del mercado español, el arbitraje puro apenas cubre los costes operativos. Un beneficio neto anual de ~€7,000 sobre una inversión de €360,000 significa que el arbitraje por sí solo no justifica la batería. Pero este análisis sienta las bases para entender dónde el almacenamiento con baterías sí funciona.
Preguntas
- ¿Cómo varían los beneficios diarios con restricciones a lo largo de un mes?
- ¿Cuál es la distribución de beneficios diarios (mejores días vs peores días)?
- ¿Hay patrones semanales en la rentabilidad?
- ¿Cuál es una proyección anual realista basada en datos simulados?
- ¿Cómo se compara esto con el análisis teórico (sin restricciones)?
Implementación
Cargar datos de precios
Analizaremos 30 días de precios de electricidad de OMIE con resolución de 15 minutos. Ver Obtener precios de electricidad de OMIE para la fuente de datos.
import pandas as pd
import numpy as np
df_prices = pd.read_csv('data/prices.csv', index_col='datetime', parse_dates=True) Cargados 35040 períodos en 365 días (2025-01-01 a 2025-12-31).
Definir simulación con restricciones
Reutilizamos el modelo con restricciones del artículo de un solo día. La función encuentra las ventanas óptimas de carga/descarga y aplica:
- Límites de SOC: 10%-90% (80% de capacidad utilizable)
- Límite de potencia: 150 kW tasa máxima de carga/descarga
- Eficiencia: 90% de ida y vuelta (10% de pérdida de energía)
def simulate_day_constrained(prices, capacity=1000, soc_min=0.10, soc_max=0.90,
max_power=150, efficiency=0.90,
charge_periods=16, discharge_periods=16):
"""Simular un día con todas las restricciones aplicadas."""
n = len(prices)
if n < charge_periods + discharge_periods:
return None
usable_capacity = capacity * (soc_max - soc_min)
hours = charge_periods * 0.25
# Energía limitada por restricción de potencia
energy_charged = min(max_power * hours, usable_capacity)
energy_discharged = energy_charged * efficiency
# Encontrar ventana óptima de carga
min_avg, best_charge_start = float('inf'), 0
for start in range(n - charge_periods + 1):
avg = prices[start:start + charge_periods].mean()
if avg < min_avg:
min_avg, best_charge_start = avg, start
charge_end = best_charge_start + charge_periods
# Encontrar ventana óptima de descarga (después de cargar)
max_avg, best_discharge_start = -float('inf'), charge_end
for start in range(charge_end, n - discharge_periods + 1):
avg = prices[start:start + discharge_periods].mean()
if avg > max_avg:
max_avg, best_discharge_start = avg, start
# Calcular beneficios
charge_cost = energy_charged * min_avg / 1000
discharge_revenue = energy_discharged * max_avg / 1000
theoretical_profit = capacity * (max_avg - min_avg) / 1000
constrained_profit = discharge_revenue - charge_cost
return {
'charge_price': min_avg,
'discharge_price': max_avg,
'spread': max_avg - min_avg,
'theoretical_profit': theoretical_profit,
'constrained_profit': constrained_profit,
'efficiency_ratio': constrained_profit / theoretical_profit if theoretical_profit > 0 else 0
} Ejecutar simulación de 30 días
daily_results = []
for date, day_data in df_prices.groupby(df_prices.index.date):
prices = day_data['price_spain'].values
result = simulate_day_constrained(prices)
if result:
result['date'] = pd.Timestamp(date)
daily_results.append(result)
df_daily = pd.DataFrame(daily_results).set_index('date')
Totales de 30 días:
- Beneficio teórico: €29,084
- Beneficio con restricciones: €15,131 (51% del teórico)
Variabilidad de beneficios
¿Cuánto varían los beneficios diarios con restricciones?

La desviación estándar de €17.29 muestra una variabilidad significativa día a día. Algunos días generan más de €84, mientras que el peor día produjo solo €6.
Patrones semanales
¿Siguen los beneficios con restricciones un patrón semanal?

Días laborables vs fin de semana:
- Días laborables: €41.46/día de media
- Fines de semana: €41.45/día de media
Proyección anual
Usando 30 días de datos simulados, proyectamos los retornos anuales:

Análisis financiero
¿Puede el arbitraje por sí solo justificar una inversión en batería?

Después de 15 años (con 2% de degradación anual), los retornos acumulados son €-287,653.
Conclusiones
La simulación multi-día revela la realidad del arbitraje de baterías:
- Beneficio diario medio: €41.45 (con restricciones)
- Variabilidad: €6 a €84 por día
- Proyección anual (mediana): €14,078 brutos
- Neto anual (después de O&M): €6,878
Conclusión clave: Con beneficios diarios medianos de €41, los ingresos brutos anuales (€14,078) apenas cubren los costes de O&M (€7,200). El arbitraje por sí solo no justifica la inversión en baterías a los precios actuales del mercado español.
Los proyectos BESS exitosos combinan múltiples flujos de ingresos. En España, la hibridación con fotovoltaica emerge como el camino más viable a corto plazo—combinar autoconsumo solar con almacenamiento cambia fundamentalmente la economía. Exploraremos esto en el próximo artículo.