Оконные функции 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 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())
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)
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)
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))
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 |
Экспоненциально взвешенное | Отслеживание тренда, быстрый отклик |