RSI в трейдинге: от теории до Python-графика с Plotly

Как использовать силу технического анализа на практике? Разбираем один из самых популярных индикаторов — RSI. Пишем код, строим графики, и, конечно же, обсуждаем стратегии.
Что такое RSI?
RSI (Relative Strength Index) — это осциллятор, который измеряет скорость и изменение ценового движения. Впервые предложен Дж. Уэллсом Уайлдером в 1978 году, он до сих пор один из ключевых инструментов технического анализа.
RSI колеблется между 0 и 100:
- Значения выше 70 говорят о перекупленности — возможен разворот вниз.
- Значения ниже 30 говорят о перепроданности — возможен отскок вверх.
Главное — RSI показывает не цену, а импульс, то есть силу движения. Он может сигнализировать о том, что актив «перегрет», до того, как это станет очевидно на графике цены.
Преимущества и недостатки RSI
Плюсы:
- Прост в интерпретации.
- Хорошо работает в боковике.
- Часто используется в популярных стратегиях (например, RSI + SMA).
Минусы:
- Может давать ложные сигналы в тренде.
- Не всегда успевает за резкими рыночными движениями.
Из-за минусов выше лучше всего применять RSI в связке с другими индикаторами или фильтрами.
Строим график RSI в Python с помощью Plotly
Давай напишем код, который:
- Загружает исторические данные.
- Строит свечной график.
- Добавляет под ним RSI с уровнями 30/70.
Шаг 1: Загружаем данные и готовим DataFrame
# Импорт библиотеки pandas для работы с таблицами
import pandas as pd
# Импорт модулей из plotly для построения графиков
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# Загрузка CSV-файла с данными и преобразование столбца 'Open time' в формат даты
df = pd.read_csv("btc_4h_data_2018_to_2025.csv", parse_dates=["Open time"])
# Преобразование нужных столбцов в тип float для корректных математических операций
df["Open"] = df["Open"].astype(float)
df["High"] = df["High"].astype(float)
df["Low"] = df["Low"].astype(float)
df["Close"] = df["Close"].astype(float)
df.head(
Шаг 2: Считаем RSI
# Функция для вычисления RSI (Relative Strength Index)
def calculate_rsi(data, period=14):
# Вычисление разницы между текущей и предыдущей ценой закрытия
delta = data.diff()
# Отделение положительных изменений (прибыль)
gain = delta.where(delta > 0, 0)
# Отделение отрицательных изменений (убыток)
loss = -delta.where(delta < 0, 0)
# Расчёт среднего значения прибыли за заданный период
avg_gain = gain.rolling(window=period).mean()
# Расчёт среднего значения убытка за заданный период
avg_loss = loss.rolling(window=period).mean()
# Расчёт отношения прибыли к убытку
rs = avg_gain / avg_loss
# Итоговая формула RSI
rsi = 100 - (100 / (1 + rs))
return rsi
df["RSI"] = calculate_rsi(df["Close"])
Здесь мы вычисляем изменения цены, делим их на «прибыльные» и «убыточные» участки, а затем считаем классическую формулу RSI.
Шаг 3: Строим график цены и RSI
# Создаём область для двух графиков (цена и RSI)
fig = make_subplots(
rows=2, cols=1, # два ряда, один столбец
shared_xaxes=True, # общая ось X для обоих графиков
vertical_spacing=0.03, # отступ между графиками
row_heights=[0.7, 0.3], # пропорции высоты графиков (70% и 30%)
subplot_titles=("Свечной график (OHLC)", "RSI (Relative Strength Index)") # заголовки подграфиков
)
# Добавление свечного графика (OHLC) в первый ряд
fig.add_trace(go.Candlestick(
x=df["Open time"], # ось X — время открытия
open=df["Open"], # цена открытия
high=df["High"], # максимальная цена
low=df["Low"], # минимальная цена
close=df["Close"], # цена закрытия
name="OHLC" # имя графика в легенде
), row=1, col=1)
# Добавление линии RSI во второй ряд
fig.add_trace(go.Scatter(
x=df["Open time"], # ось X — время
y=df["RSI"], # значение RSI
mode="lines", # тип графика — линия
name="RSI", # имя линии в легенде
line=dict(color="white") # цвет линии
), row=2, col=1)
# Добавляем горизонтальную линию на уровне 70 (перекупленность) во втором ряду
fig.add_hline(y=70, line_dash="dot", line_color="red", row=2, col=1)
# Добавляем горизонтальную линию на уровне 30 (перепроданность) во втором ряду
fig.add_hline(y=30, line_dash="dot", line_color="green", row=2, col=1)
# Настройка внешнего вида всего графика
fig.update_layout(
title="График цены и RSI", # заголовок графика
xaxis2_title="Дата", # подпись оси X (для нижнего графика)
yaxis1_title="Цена", # подпись оси Y верхнего графика
yaxis2_title="RSI", # подпись оси Y нижнего графика
xaxis_rangeslider_visible=False, # отключаем ползунок под графиком
template="plotly_dark", # тёмная тема оформления
height=800 # общая высота фигуры
)
# Отображение финального графика
fig.show()
Вуаля! У нас есть живой, динамичный график, где можно легко отследить моменты перекупленности и перепроданности.

RSI в стратегии: как применять?
Теперь поговорим о реальных примерах использования RSI в трейдинге.
Простейшая стратегия
Условия:
- Покупка, когда RSI < 30 (перепроданность).
- Продажа, когда RSI > 70 (перекупленность).
Но! Важно не торговать «вслепую». Лучше подтверждать сигналы другими инструментами.
RSI + скользящая средняя (SMA)
- Используем RSI < 30 как потенциальный вход.
- Входим, если цена выше 200-дневной SMA — тренд бычий, вероятен отскок.
- Выходим, когда RSI > 60 или по трейлинг-стопу.
RSI-дивергенции
Если цена обновляет минимум, а RSI — нет, это может быть признаком ослабления тренда и намёком на разворот. Такие сигналы особенно сильны на дневных графиках.
Заключение
Наша команда не использует параметры RSI по умолчанию, мы обычно использует настройки 90 — 10 вместо классических 70 — 30, это дает нам возможность ловить более сильные импульсы.
- RSI — это не магия, но очень полезный инструмент.
- Он отлично показывает силу текущего движения, помогает ловить моменты «перегрева».
- Его сила — в простоте и сочетании с другими фильтрами.
- А в связке с Python и Plotly — ещё и отличное визуальное решение для аналитики.
КОД как всегда залил на GitHub. Не забудь подписаться на профиль GitHub и поставить звездочку репозиторию. Если ты интересуешься data science в трейдинге, подписывайся на блог — впереди больше разборов, кода и реальных стратегий.