Tutorial Fallback: ES

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.

Distribución de beneficios diarios mostrando alta variabilidad durante 365 dí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 funciona.

Preguntas

  1. ¿Cómo varían los beneficios diarios con restricciones a lo largo de un mes?
  2. ¿Cuál es la distribución de beneficios diarios (mejores días vs peores días)?
  3. ¿Hay patrones semanales en la rentabilidad?
  4. ¿Cuál es una proyección anual realista basada en datos simulados?
  5. ¿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')
30 días de beneficios simulados
Resultados de simulación diaria

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?

Gráfico de barras e histograma de beneficios diarios con restricciones
Distribución de beneficios diarios con restricciones
Estadísticas de beneficios

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?

Gráfico de barras mostrando beneficio medio con restricciones por día de la semana

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:

Gráfico de barras mostrando beneficios anuales conservadores, esperados y optimistas
Beneficios anuales proyectados al 95% de disponibilidad
Proyección anual

Análisis financiero

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

Costes de inversión y cálculo de retorno
Análisis financiero
Gráfico de barras mostrando flujos de caja anuales y retornos acumulados

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.

Subscribe to our newsletter

Get weekly insights on data, automation, and AI.

© 2026 Datons. All rights reserved.