Pandas funciones de ventana (rolling / expanding / ewm)

Las funciones de ventana se utilizan para realizar cálculos de ventana deslizante sobre series temporales o datos ordenados, y son una herramienta importante en campos como el análisis financiero y el procesamiento de señales.


rolling ventana deslizante

Uso básico

Ejemplo

import pandas as pd
import numpy as np

# Crear datos de series temporales
np.random.seed(42)
dates = pd.date_range("2024-01-01", periods=20, freq="D")
ts = pd.Series(np.random.randint(100, 200, 20), index=dates)

print("Datos originales (primeros 10):")
print(ts.head(10))
print()

# Media móvil de 7 días
ma7 = ts.rolling(window=7).mean()
print("Media móvil de 7 días (primeros 10):")
print(ma7.head(10))
print()

# Suma deslizante
rolling_sum = ts.rolling(window=5).sum()
print("Suma deslizante de 5 días:")
print(rolling_sum.head(10))

Tipos de ventanas deslizantes

Ejemplo

import pandas as pd
import numpy as np

s = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# Tamaño de ventana fijo
print("Ventana fija (3):")
print(s.rolling(3).mean())
print()

# Ventana móvil (ventana de tiempo)
# Ventana de 1 minuto
s2 = pd.Series([1, 2, 3, 4, 5], index=pd.date_range("2024-01-01", periods=5, freq="T"))
print("Ventana de tiempo (1 minuto):")
print(s2.rolling("1min").sum())

expanding ventana expansiva

La ventana expansiva acumula desde el inicio hasta la posición actual, y el tamaño de la ventana aumenta gradualmente.

Ejemplo

import pandas as pd
import numpy as np

s = pd.Series([1, 2, 3, 4, 5])

# Calcular la media acumulada con ventana expansiva
exp_mean = s.expanding().mean()
print("Media acumulada:")
print(exp_mean)
print()

# Calcular el máximo acumulado con ventana expansiva
exp_max = s.expanding().max()
print("Máximo acumulado:")
print(exp_max)
print()

# Calcular la desviación estándar con ventana expansiva
exp_std = s.expanding().std()
print("Desviación estándar acumulada:")
print(exp_std)

ewm media móvil exponencialmente ponderada

La media móvil exponencialmente ponderada (EWMA) asigna mayor peso a los datos recientes.

Ejemplo

import pandas as pd
import numpy as np

s = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# Cuanto menor es alpha, mayor es el peso de los datos recientes
ewm_05 = s.ewm(alpha=0.5).mean()
ewm_2 = s.ewm(alpha=0.2).mean()

print("Datos originales:")
print(s.values)
print("\nalpha=0.5:")
print(ewm_05.values)
print("\nalpha=0.2:")
print(ewm_2.values)
print()

# Usando span (relación con alpha: alpha = 2/(span+1))
ewm_span = s.ewm(span=5).mean()
print("span=5:")
print(ewm_span.values)

EWM es más sensible a los cambios de tendencia, adecuado para escenarios que requieren una respuesta rápida.


Práctica: indicadores técnicos de acciones

Ejemplo

import pandas as pd
import numpy as np

# Simular datos de precios de acciones
np.random.seed(42)
dates = pd.date_range("2024-01-01", periods=30, freq="D")
df = pd.DataFrame({
    "Fecha": dates,
    "Precio de cierre": 100 + np.random.randn(30).cumsum()
})

# Calcular indicadores técnicos
# Media móvil de 5 días
df["MA5"] = df["Precio de cierre"].rolling(5).mean()

# Media móvil de 10 días
df["MA10"] = df["Precio de cierre"].rolling(10).mean()

# Media móvil exponencialmente ponderada de 5 días
df["EMA5"] = df["Precio de cierre"].ewm(span=5).mean()

# Volatilidad (desviación estándar deslizante de 5 días)
df["Volatility"] = df["Precio de cierre"].rolling(5).std()

# Precio máximo acumulado
df["Highest"] = df["Precio de cierre"].expanding().max()

print("Indicadores técnicos de acciones:")
print(df.round(2))

Comparación de funciones de ventana

Tipo Descripción Escenarios de aplicación
rolling Ventana de tamaño fijo Media móvil, volatilidad
expanding Ventana acumulativa Estadísticas acumuladas, stop loss / take profit
ewm Ponderación exponencial Seguimiento de tendencias, respuesta rápida
Otras extensiones