Как построить среднюю скользящую Moving Average на Python

Средняя скользящая (Moving Average, MA) — это один из самых популярных индикаторов технического анализа, используемый трейдерами для определения трендов на рынке. Она помогает сгладить колебания цен и позволяет лучше понять направление движения актива. В статье рассказываем, как построить Moving Average с помощью Python.
Что такое средняя скользящая?
Средняя скользящая — это математическая техника, которая вычисляет среднее значение цен актива за определённый период времени.
Она может быть простая (SMA — Simple Moving Average) или экспоненциальная (EMA — Exponential Moving Average).
- SMA — рассчитывается как обычное арифметическое среднее за заданный период.
- EMA — учитывает больше вес для более свежих данных, что делает её более чувствительной к изменениям цены.
Почему важна средняя скользящая для трейдеров?
- Определение тренда: Скользящая средняя помогает выявить долгосрочные и краткосрочные тренды.
- Подтверждение сигналов: Когда цена пересекает скользящую среднюю, это может быть сигналом о смене тренда.
- Фильтрация шумов: Скользящая средняя сглаживает резкие колебания цен, давая более чёткую картину движения рынка.
Пошаговое руководство: как вычислить и использовать скользящую среднюю на Python
Для примера мы будем использовать простую скользящую среднюю (SMA), но аналогичный подход можно применить для экспоненциальной (EMA).
Шаг 1: Установка необходимых библиотек
Для работы с данными и вычисления средней скользящей нам понадобятся библиотеки pandas
(для обработки данных) и matplotlib
(для визуализации). Установим их с помощью pip:
pip install pandas matplotlib
Шаг 2: Загрузка исторических данных
Для примера загрузим исторические данные о ценах криптовалюты с помощью библиотеки ccxt
. Эта библиотека позволяет работать с данными с различных криптовалютных бирж.
Пример кода для получения исторических данных о криптовалюте с биржи Binance:
import ccxt
import pandas as pd
import matplotlib.pyplot as plt
# Подключаемся к бирже Binance
exchange = ccxt.binance()
# Получаем исторические данные по Bitcoin (BTC/USDT) за последние 30 дней
ohlcv = exchange.fetch_ohlcv('BTC/USDT', '1d', limit=30)
# Преобразуем данные в DataFrame для удобства
data = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
data['timestamp'] = pd.to_datetime(data['timestamp'], unit='ms')
data.set_index('timestamp', inplace=True)
#Выводим данные
print(data.head())
Этот код подключается к бирже Binance и получает последние 30 дней данных о ценах для пары BTC/USDT в формате OHLCV (Open, High, Low, Close, Volume).
Шаг 3: Расчёт средней скользящей
Теперь вычислим простую скользящую среднюю для закрывающих цен (Close) на основе данных, которые мы только что загрузили.
# Период для расчёта SMA
period = 7
# Вычисляем простую скользящую среднюю (SMA)
data['SMA'] = data['close'].rolling(window=period).mean()
# Выводим данные с вычисленной SMA
print(data[['close', 'SMA']].tail())
Здесь:
- Мы используем метод
.rolling(window=period)
для создания окна из 7 дней (можно изменить на любой другой период). - Метод
.mean()
вычисляет среднее значение для каждого окна.
Шаг 4: Визуализация данных
Теперь, когда мы рассчитали скользящую среднюю, можем визуализировать её на графике. Это поможет нам лучше понять, как цена и скользящая средняя взаимодействуют.
# Строим график
plt.figure(figsize=(10,6))
# График закрывающих цен
plt.plot(data.index, data['close'], label='BTC/USDT Close Price', color='blue')
# График скользящей средней
plt.plot(data.index, data['SMA'], label=f'{period}-Day SMA', color='red', linestyle='--')
# Настройки графика
plt.title(f'BTC/USDT Price and {period}-Day SMA')
plt.xlabel('Date')
plt.ylabel('Price (USDT)')
plt.legend()
# Показать график
plt.show()

На графике будет отображаться:
- Синие линии — цена закрытия (Close).
- Красные пунктирные линии — простая скользящая средняя (SMA).
Шаг 5: Применение стратегий
Теперь, когда мы вычислили скользящую среднюю, можем использовать её для принятия торговых решений. Например, одна из популярных стратегий — это пересечение скользящих средних.
- Сигнал на покупку: Когда цена пересекает скользящую среднюю снизу вверх.
- Сигнал на продажу: Когда цена пересекает скользящую среднюю сверху вниз.
Пример простого кода для генерации сигналов:
# Создаём сигналы для покупки/продажи
data['Signal'] = 0 # Изначально нет сигнала
data['Signal'][data['close'] > data['SMA']] = 1 # Покупка, если цена выше SMA
data['Signal'][data['close'] < data['SMA']] = -1 # Продажа, если цена ниже SMA
# Выводим последние сигналы
print(data[['close', 'SMA', 'Signal']].tail())
Теперь можно анализировать, когда происходят пересечения цены и средней скользящей, и использовать их для торговли.
Как наша команда использует средние скользящие для генерации торговых сигналов
import numpy as np
import pandas as pd
import plotly.graph_objects as go
# Определение параметров скользящих средних
short_window = 20 # Быстрая средняя
long_window = 50 # Медленная средняя
# Вычисление скользящих средних
data['Short_MA'] = data['close'].rolling(window=short_window).mean()
data['Long_MA'] = data['close'].rolling(window=long_window).mean()
# Определение сигналов пересечения
data['Signal'] = 0
data.loc[data['Short_MA'] > data['Long_MA'], 'Signal'] = 1 # Покупка
data.loc[data['Short_MA'] < data['Long_MA'], 'Signal'] = -1 # Продажа
# Поиск точек пересечения
buy_signals = data[(data['Signal'] == 1) & (data['Signal'].shift(1) == -1)]
sell_signals = data[(data['Signal'] == -1) & (data['Signal'].shift(1) == 1)]
# Создание графика с Plotly
fig = go.Figure()
# График цены
fig.add_trace(go.Scatter(x=data.index, y=data['close'], mode='lines',
name='Цена BTC/USDT', line=dict(color='blue')))
# Быстрая скользящая средняя
fig.add_trace(go.Scatter(x=data.index, y=data['Short_MA'], mode='lines',
name=f'{short_window}-дн. MA', line=dict(color='orange')))
# Медленная скользящая средняя
fig.add_trace(go.Scatter(x=data.index, y=data['Long_MA'], mode='lines',
name=f'{long_window}-дн. MA', line=dict(color='deepskyblue')))
# Добавляем точки покупки (пересечение вверх)
fig.add_trace(go.Scatter(
x=buy_signals.index, y=buy_signals['Short_MA'], mode='markers',
name='Сигнал на покупку',
marker=dict(color='green', size=20, symbol='triangle-up')
))
# Добавляем точки продажи (пересечение вниз)
fig.add_trace(go.Scatter(
x=sell_signals.index, y=sell_signals['Short_MA'], mode='markers',
name='Сигнал на продажу',
marker=dict(color='red', size=20, symbol='triangle-down')
))
# Настройки графика
fig.update_layout(
title='BTC/USDT с сигналами пересечения MA',
xaxis_title='Дата',
yaxis_title='Цена (USDT)',
legend=dict(x=0, y=1),
template='plotly_dark'
)
# Отображение графика
fig.show()

Заключение
Средняя скользящая — это мощный инструмент для анализа трендов и поиска точек входа и выхода на рынке. В этой статье я показал, как рассчитать и визуализировать скользящие средние на Python, а также как использовать их для генерации торговых сигналов.
Однако важно помнить, что ни один индикатор не является идеальным. Средние скользящие лучше использовать в сочетании с другими инструментами анализа и учитывать фундаментальные факторы. Удачи в торговле 🚀
Код, написанный для статьи, вы можете найти на Github. Не забывайте поставить звездочку репозиторию и подписаться на наш GitHub.