Оконные функции Pandas (rolling / expanding / ewm)

Оконные функции используются для выполнения вычислений в скользящем окне по временным рядам или упорядоченным данным и являются важными инструментами в таких областях, как финансовый анализ и обработка сигналов.


rolling Скользящее окно

Базовое использование

Пример

import pandas as pd
import numpy as np

# Создание данных временного ряда
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("Исходные данные (первые 10 строк):")
print(ts.head(10))
print()

# 7-дневное скользящее среднее
ma7 = ts.rolling(window=7).mean()
print("Скользящее среднее за 7 дней (первые 10 строк):")
print(ma7.head(10))
print()

# Скользящая сумма
rolling_sum = ts.rolling(window=5).sum()
print("Скользящая сумма за 5 дней:")
print(rolling_sum.head(10))

Типы скользящих окон

Пример

import pandas as pd
import numpy as np

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

# Фиксированный размер окна
print("Фиксированное окно (3):")
print(s.rolling(3).mean())
print()

# Скользящее окно (временное окно)
# Окно через 1 минуту
s2 = pd.Series([1, 2, 3, 4, 5], index=pd.date_range("2024-01-01", periods=5, freq="T"))
print("Временное окно (1 минута):")
print(s2.rolling("1min").sum())

expanding Расширяющееся окно

Расширяющееся окно накапливается с начала до текущей позиции, при этом размер окна постепенно увеличивается.

Пример

import pandas as pd
import numpy as np

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

# Расширяющееся окно для вычисления кумулятивного среднего
exp_mean = s.expanding().mean()
print("Кумулятивное среднее:")
print(exp_mean)
print()

# Расширяющееся окно для вычисления кумулятивного максимума
exp_max = s.expanding().max()
print("Кумулятивный максимум:")
print(exp_max)
print()

# Расширяющееся окно для вычисления стандартного отклонения
exp_std = s.expanding().std()
print("Накопительное стандартное отклонение:")
print(exp_std)

ewm Экспоненциально взвешенное скользящее

Экспоненциально взвешенное скользящее среднее (EWMA) придаёт больший вес последним данным.

Пример

import pandas as pd
import numpy as np

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

# Чем меньше alpha, тем больше вес последних данных
ewm_05 = s.ewm(alpha=0.5).mean()
ewm_2 = s.ewm(alpha=0.2).mean()

print("Исходные данные:")
print(s.values)
print("\nalpha=0.5:")
print(ewm_05.values)
print("\nalpha=0.2:")
print(ewm_2.values)
print()

# Использование span (связь с alpha: alpha = 2/(span+1))
ewm_span = s.ewm(span=5).mean()
print("span=5:")
print(ewm_span.values)

EWM более чувствителен к изменениям тренда и подходит для сценариев, требующих быстрого реагирования.


Практика: технические индикаторы акций

Пример

import pandas as pd
import numpy as np

# Смоделировать данные о ценах акций
np.random.seed(42)
dates = pd.date_range("2024-01-01", periods=30, freq="D")
df = pd.DataFrame({
    "Date": dates,
    "Close": 100 + np.random.randn(30).cumsum()
})

# Вычислить технические индикаторы
# 5-дневная скользящая средняя
df["MA5"] = df["Close"].rolling(5).mean()

# 10-дневная скользящая средняя
df["MA10"] = df["Close"].rolling(10).mean()

# 5-дневное экспоненциально взвешенное скользящее среднее
df["EMA5"] = df["Close"].ewm(span=5).mean()

# Волатильность (5-дневное скользящее стандартное отклонение)
df["Volatility"] = df["Close"].rolling(5).std()

# Кумулятивная максимальная цена
df["Highest"] = df["Close"].expanding().max()

print("Технические индикаторы акций:")
print(df.round(2))

Сравнение оконных функций

Type Описание Сценарии использования
rolling Окно фиксированного размера Скользящая средняя, волатильность
expanding Кумулятивное окно Кумулятивная статистика, стоп-лосс/тейк-профит
ewm Экспоненциально взвешенное Отслеживание тренда, быстрый отклик
Другие расширения