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))
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())
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)
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)
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))
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 |