Индекс относительной силы RSI

 
  • Индекс относительной силы RSI
  • Использование индикатора RSI для генерации торговых сигналов на Python с помощью Ta-Lib
  • Индикатор RSI Delta
  • RSI Deep Three Move
  • Модернизация классического индикатора

Индекс относительной силы RSI

Свою популярность инструмент приобрел во многом благодаря простоте интерпретации и качеству подаваемых им сигналов. Точки входа, которые дает этот индикатор самостоятельно и совместно с другими индикаторами показывают очень хорошее соотношение риск-прибыль на волатильных и трендовых рынках.

Что же такое эта сама относительная сила? Этим термином Уайлдер назвал отношение среднего прироста цены к среднему падению за период. Эта величина позволяет оценить, покупатели или продавцы сильнее влияли на цену в выбранном периоде и предположить дальнейшее развитие событий. Для расчета относительной силы выбираются все свечи выбранного промежутка времени, которые показали закрытие выше, чем предшествующая свеча, и определяется среднее значение прироста с помощью формулы экспоненциального скользящего средней. Аналогичная операция производится для свечей, показавших закрытие ниже предшествующей. Отношение этих двух величин и даст значение относительной силы (RS).

RS = EMAn(Up) / EMAn(Down)

Для удобного отображения на графике полученная величина преобразуется таким образом, чтобы значения укладывались в диапазон от 0 до 100%. Полученный результат и есть индекс относительной силы, динамику которого можно увидеть на графике индикатора.

RSI = 100 – 100/ (1+RS)

В QUIK индикатор можно найти под называнием Relative Strength index

Настройка и применение индикатора

Индикатор не требует сложных настроек. Единственный параметр, число периодов, по умолчанию установлен на 14 и в большинстве случаев такое значение оказывается эффективным. Однако в определенные фазы рынка на некоторых таймфреймах другие настройки могут показать себя лучше. Рекомендуется сначала изучить работу индикатора в стандартном виде, а уже потом опытным взглядом подбирать другие варианты.

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

Что касается таймфрейма, здесь лучше ориентироваться на временной интервал и более длинные периоды. «Шум» на младших таймфреймах сильно искажает показания индикатора. Сам автор рекомендовал использовать его на дневных графиках.

Торговые сигналы

Самым распространенным и зарекомендовавшим сигналом RSI остается дивергенция. Если цена делает два возрастающих максимума на вершине тренда, а индикатор RSI демонстрирует их снижение, это явный признак, что рост цены замедляется и новый максимум сформировался не столько за счет притока покупателей, сколько из-за отсутствия продавцов. В такой ситуации стоит воздержаться от новых покупок, поискать оптимальные цены для закрытия текущих длинных позиций, а также рассмотреть возможность игры на понижение актива.

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

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

Помимо вышеописанных сигналов, по аналогии с другими осцилляторами, можно отслеживать на индикаторе зоны перекупленности и перепроданности, в которых в качестве сигналов можно использовать развороты индикатора и его выход из зоны. Уровни при этом определяются посредством наблюдения за конкретным активом и подбираются в соответствии с балансом качество/количество сигналов. Чаще всего применение находят уровни 70% и 30% или 80% и 20%. Однако, иногда при очень сильном тренде это может быть даже уровень 50%.

Заключение

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

Использование индикатора RSI для генерации торговых сигналов на Python с помощью Ta-Lib

 

Я собираюсь обсудить, как вы можете использовать индикатор RSI для генерации сигналов на покупку или продажу в Python с помощью библиотеки TA-LibПрежде чем я напишу код о реализации, давайте немного поговорим о генерации сигналов и RSI.

Что такое сигналы

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

Что такое технический индикатор

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

Что такое индикатор RSI

RSI (индекс относительной силы) — это осциллятор импульса, который измеряет скорость и изменение движения цены. Он находится в диапазоне от 0 до 100 и используется для определения условий перекупленности или перепроданности на рынке. Уровень RSI ниже 30 генерирует сигналы на покупку, а уровень RSI выше 70 генерирует сигналы на продажу.

Реализация

Мы рассмотрели основные термины, теперь напишем код для генерации сигналов на основе значений RSI. Я уже обсуждал настройку разработки здесь, поэтому вы можете обратиться к предыдущей статье об этом. Одна вещь, в отличие от предыдущей статьи, где я использовал API «yfinance», я использую API AlphaVantage, потому что по какой-то причине API yfinance не работают для меня. С другой стороны, Alphavantage предоставляет потрясающие API, у которых также есть бесплатная версия. Я собираюсь использовать конечную точку, которая возвращает ежедневные данные по данному символу. Все, что вам нужно сделать, это зарегистрироваться для получения бесплатного API KEY.

Так… Идея состоит в том, чтобы получить ежедневные данные по определенной акции с помощью API AlphaVantage, а затем использовать функцию RSI TaLib для расчета RSI в датафрейме pandas, используя 14-дневное окно по умолчанию. Я использую jupyter notebook, так как это упрощает задачу. Самое первое, что нужно сделать, это импорт библиотек.

# All Imports

from datetime import datetime as dt
import requests
import talib as ta
import pandas as pd
import matplotlib.pyplot as plt

Следующим шагом является использование API AlphaVantage для получения данных OHLC.

def get_daily_ohlc_data(symbol):
function_name = 'TIME_SERIES_DAILY'
base_url = 'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol={}&apikey={}'.format(symbol,API_KEY)
r = requests.get(base_url)
data = r.json()["Time Series (Daily)"]
return data
ohlc = get_daily_ohlc_data("MSFT")
# Convert to DataFrame
df = pd.DataFrame.from_dict(ohlc, orient="index")
# Rename columns
df = df.rename(columns={
"1. open": "open",
"2. high": "high",
"3. low": "low",
"4. close": "close",
"5. volume": "volume"
})
df = df.apply(pd.to_numeric)
df = df.sort_index(ascending=True)
df

Функция довольно простая. Использование библиотеки запросов для вызова API, а затем доступ к соответствующему ключу dict для получения данных OHLC акций Microsoft. После этого преобразуйте полезную нагрузку в кадр данных pandas. Переименовываю столбцы, чтобы сделать их более читабельными, после этого я вычищаю их в порядке возрастания, чтобы получить последние записи внизу. Когда вы это сделаете, у вас получится что-то вроде приведенного ниже.

Итак, наш необходимый датафрейм доступен, теперь осталось рассчитать RSI

def generate_rsi_signals(data, period=14, overbought_threshold=70, oversold_threshold=30):

# Calculate RSI
data['RSI'] = ta.RSI(data['close'], timeperiod=period)

# Initialize 'Signal' column with 'Neutral'
data['Signal'] = 'Neutral'

# Generate signals
data.loc[data['RSI'] < oversold_threshold, 'Signal'] = 'Buy'
data.loc[data['RSI'] > overbought_threshold, 'Signal'] = 'Sell'

return data

Для того, чтобы рассчитать RSI, нужно назначить период окна, значение по умолчанию 14.

В контексте индекса относительной силы (RSI) период параметра относится к количеству исторических ценовых точек, используемых в расчете. RSI — это осциллятор импульса, который измеряет скорость и изменение движения цены. Формула расчета RSI предполагает сравнение величины недавних прибылей с недавними убытками за определенный период времени.

Итак, вызвав функцию RSI TALIb для периода 14, мы добавляем еще один столбец в наш датафрейм с именем RSI

RSI рассчитывается, но на этом все не заканчивается, следующее, что нам нужно сделать, это сгенерировать сигналы: BuySell и Neutral. Тогда пороговое значение предназначено для формирования сигналов на покупку или продажу.

df_rsi = generate_rsi_signals(df)
df_rsi.tail(17)

Когда приведенная выше функция вызывается и извлекает последние 15 или 17 значений, вы получите датафрейм, подобный приведенному ниже:

Как вы можете видеть, он генерировал разные сигналы в течение периода времени, он генерировал сигнал на продажу, где RSI был более 70 в противном случае нейтральным. Обычно, когда вы создаете торгового бота, который работает все время в течение торговых часов, вы выбираете самое последнее значение, чтобы решить, хотите ли вы купить, продать или держать. Здесь самым последним значением является Neutral или hold, поэтому мы не будем предпринимать никаких действий.

Индикатор RSI Delta

Это изображение имеет пустой атрибут alt; его имя файла - image-40.png

Создание и кодирование новой импульсной стратегии на Python.

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

Я только что опубликовал новую книгу после успеха новых технических индикаторов в Python. Он содержит более полное описание и добавление сложных торговых стратегий со страницей Github, посвященной постоянно обновляемому коду. Если вы чувствуете, что это вас интересует, не стесняйтесь перейти по ссылке ниже или, если вы предпочитаете купить PDF-версию, вы можете связаться со мной по Linkedin.

Индекс относительной силы

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

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

RSI рассчитывается довольно простым способом. Сначала мы начнем с того, что возьмем разницу в цене за один период. Это означает, что мы должны вычесть каждую цену закрытия из предыдущей. Затем мы вычислим сглаженное среднее значение положительных разностей и разделим его на сглаженное среднее значение отрицательных различий. Последний расчет дает нам относительную силу, которая затем используется в формуле RSI для преобразования в меру от 0 до 100.

def rsi(Data, rsi_lookback, what1, what2):

rsi_lookback = (rsi_lookback * 2) - 1 # From exponential to smoothed

# Get the difference in price from previous step
delta = []

for i in range(len(Data)):
try:
diff = Data[i, what1] - Data[i - 1, what1]
delta = np.append(delta, diff)
except IndexError:
pass

delta = np.insert(delta, 0, 0, axis = 0)
delta = delta[1:]

# Make the positive gains (up) and negative gains (down) Series
up, down = delta.copy(), delta.copy()
up[up < 0] = 0
down[down > 0] = 0

up = np.array(up)
down = np.array(down)

roll_up = up
roll_down = down

roll_up = np.reshape(roll_up, (-1, 1))
roll_down = np.reshape(roll_down, (-1, 1))

roll_up = adder(roll_up, 3)
roll_down = adder(roll_down, 3)

roll_up = ema(roll_up, 2, rsi_lookback, what2, 1)
roll_down = ema(abs(roll_down), 2, rsi_lookback, what2, 1)


roll_up = roll_up[rsi_lookback:, 1:2]
roll_down = roll_down[rsi_lookback:, 1:2]
Data = Data[rsi_lookback + 1:,]


RS = roll_up / roll_down
RSI = (100.0 - (100.0 / (1.0 + RS)))
RSI = np.array(RSI)
RSI = np.reshape(RSI, (-1, 1))
RSI = RSI[1:,]

Data = np.concatenate((Data, RSI), axis = 1)return Data

Дельта-трансформация RSI

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

Преобразование RSI Delta обеспечивает еще более возвратный индикатор среднего значения, как показано ниже на графике.

Если вас также интересует больше технических индикаторов и использование Python для создания стратегий, то вас может заинтересовать моя книга-бестселлер по техническим индикаторам:

Давайте теперь рассчитаем корреляцию между дельтой RSI и рыночной ценой, чтобы увидеть, остается ли она по-прежнему сильной или нет.

correlation = 0.51 # For the last 80 observations which is good
def rsi_delta(Data, lookback, what, where):

Data = rsi(Data, lookback, what, 0)

for i in range(len(Data)):
Data[i, where] = Data[i, where - 1] - Data[i - lookback, where - 1]

return Data

Давайте теперь протестируем противоположную стратегию, которая в основном совпадает с той, которую мы использовали бы на обычном RSI.

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

Создание и тестирование дельта-стратегии

Ниже приведены условия для стратегии:

  • Открывайте длинную позицию (покупку) всякий раз, когда текущее значение дельты RSI меньше -40, в то время как предыдущие два значения выше этого уровня. Удерживайте позицию до получения противоположного сигнала.
  • Открывайте короткую позицию (продажу) всякий раз, когда текущее значение дельты RSI выше 40, в то время как предыдущие два значения ниже этого уровня. Удерживайте позицию до получения противоположного сигнала.

Чтобы закодировать сигнальную функцию, мы можем использовать следующее:

def signal(Data, what, buy, sell):

for i in range(len(Data)):

if Data[i, what] < lower_barrier and Data[i - 1, what] > lower_barrier and Data[i - 2, what] > lower_barrier :
Data[i, buy] = 1

if Data[i, what] > upper_barrier and Data[i - 1, what] < upper_barrier and Data[i - 2, what] < upper_barrier :
Data[i, sell] = -1

Возьмем пример бэк-тестов на AUDCAD и AUDNZD. Похоже, что стратегия хорошо работает с низким спредом и системой принудительного вознаграждения за риск 0,25. Система управления рисками основана на среднем истинном диапазоне, который изложен в следующей части.

Несколько слов об управлении рисками

Когда я говорю, что использую систему управления рисками на основе ATR (Average True Range), это означает, что алгоритм выполнит следующие шаги в отношении позиции, которую он занимает.

Длинная позиция (Buy):

  • Алгоритм инициирует ордер на покупку после того, как был сгенерирован сигнал по определенной стратегии.
  • Затем алгоритм будет отслеживать тики, и всякий раз, когда максимум равен некоторой константе, умноженной на значение ATR на момент начала торговли, инициируется ордер на выход (с прибылью). В то же время, если минимум равен некоторой константе, умноженной на значение ATR на момент начала сделки, инициируется выход (при убытке). Выход, встреченный первым, естественно, является принятым событием.

Короткая позиция (на продажу):

  • Алгоритм инициирует короткий ордер на продажу после того, как был сгенерирован сигнал по определенной стратегии.
  • Затем алгоритм будет отслеживать тики, и всякий раз, когда минимум равен некоторой константе, умноженной на значение ATR на момент начала торговли, инициируется ордер на выход (с прибылью). В то же время, если максимум равен некоторой константе, умноженной на значение ATR на момент начала сделки, инициируется выход (при убытке). Выход, встреченный первым, естественно, является принятым событием.

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

Взгляните на последнее значение ATR. Он составляет около 0,0014 (14 пунктов). Если мы инициируем ордер на покупку в соответствии с простым соотношением риска и прибыли 2,00 (рискуя половиной того, что мы ожидаем получить), мы можем разместить ордер следующим образом:

  • Покупайте по текущей рыночной цене.
  • Тейк-профит по текущей рыночной цене + (2 х 14 пунктов).
  • Стоп-позиция по текущей рыночной цене — (1 х 14 пунктов).

Заключение

Почему была написана эта статья? Это, конечно, не метод кормления с ложечки и не путь к прибыльной стратегии. Если вы следите за моими статьями, вы заметите, что я уделяю больше внимания тому, как это сделать, а не здесь, и что я также предоставляю функции, а не полный реплицируемый код. В финансовой индустрии вы должны сами комбинировать кусочки из другой экзогенной информации и данных, только тогда вы овладеете искусством исследования и торговли.

RSI Deep Three Move

Эта статья основана на новой серии исследований, которые демонстрируют несколько торговых методов, основанных на RSI. Торговая техника — это способ использования индикатора. Исследование основано на Pine Script, языке программирования TradingView.

Мягкое введение в RSI

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

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

Расчет RSI включает в себя сравнение среднего прироста ценной бумаги за определенный период со средним убытком ценной бумаги за тот же период. Затем версия RSI по умолчанию строится по шкале от 0 до 100, при этом показания выше 70 считаются перекупленными, а показания ниже 30 считаются перепроданными. RSI является популярным индикатором среди трейдеров, поскольку он может подавать сигналы раннего предупреждения о потенциальных рыночных тенденциях. Например, если RSI ценной бумаги постоянно растет и достигает уровня выше 70, это может указывать на то, что ценная бумага перекуплена и подлежит коррекции. С другой стороны, если RSI последовательно падает и достигает уровня ниже 30, это может указывать на то, что ценная бумага перепродана и должна отскочить.

Стоит отметить, что RSI не следует использовать изолированно в качестве единственной основы для принятия торговых решений. Трейдеры обычно используют RSI в сочетании с другими инструментами технического анализа и рыночными индикаторами, чтобы получить более полное представление о рыночных условиях и принимать обоснованные торговые решения. Как правило, RSI рассчитывается за скользящий период 14.

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

The RSI Deep Three Move

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

  • Бычий сигнал обнаруживается всякий раз, когда RSI находится ниже предыдущего RSI, который, в свою очередь, также ниже предыдущего RSI, а последний также ниже предыдущего RSI. Поскольку он обычно используется с 8-периодными RSI, RSI три периода назад должен быть ниже 20, а один четыре периода назад должен быть выше 20 (чтобы избежать дублирования сигналов).
  • Медвежий сигнал обнаруживается всякий раз, когда RSI находится выше предыдущего RSI, который, в свою очередь, также выше предыдущего RSI, а последний также выше своего предыдущего RSI. Поскольку он обычно используется с 8-периодными RSI, RSI три периода назад должен быть выше 80, а один четыре периода назад должен быть ниже 80 (чтобы избежать дублирования сигналов).

Лучше один раз увидеть, чем сто раз услышать. На следующем рисунке показан бычий сигнал, основанный на технике:

На следующем рисунке показан медвежий сигнал, основанный на технике:

Код в Pine Script (язык программирования TradingView) выглядит следующим образом:

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Sofien-Kaabar

//@version=5
indicator("RSI Technique - Deep Three Move", overlay = true)

lookback = input(defval = 8, title = 'Lookback')

rsi = ta.rsi(close, lookback)

bullish_signal = rsi < rsi[1] and rsi[1] < rsi[2] and rsi[2] < rsi[3] and rsi[3] < 20 and rsi[4] > 20
bearish_signal = rsi > rsi[1] and rsi[1] > rsi[2] and rsi[2] > rsi[3] and rsi[3] > 80 and rsi[4] < 80

plotshape(bullish_signal, style = shape.triangleup, color = color.blue, location = location.belowbar, size = size.small)
plotshape(bearish_signal, style = shape.triangledown, color = color.orange, location = location.abovebar, size = size.small)

На следующем рисунке показано несколько сигналов, основанных на технике:

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

Как вы также можете заметить, во время серьезных тенденций техника работает не так, как ожидалось.

Модернизация классического индикатора

Привет, друзья-финансисты! Вы когда-нибудь натыкались на диаграмму с волнистыми линиями, танцующими вокруг, и задавались вопросом, что они замышляют? Одной из таких линий может быть индекс относительной силы, ласково известный как RSI. Думайте об этом как о персональном фитнес-трекере акций, измеряющем, не бегает ли он слишком быстро или, возможно, не делает ли он слишком много перерывов.

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

RSI был старым другом трейдера, помогая ему понять динамику цен на акции. Это похоже на термометр, но вместо того, чтобы измерять температуру, он измеряет энтузиазм (или его отсутствие) в движении цены акций. Когда цены растут слишком быстро, RSI говорит нам, что, возможно, они становятся слишком горячими (перекупленными). И наоборот, когда цены падают слишком быстро, возможно, становится слишком холодно (перепродано).

Но вот мысль: мы живем в эпоху автомобилей, управляемых искусственным интеллектом, и кофемашин с голосовым управлением. Итак, зачем полагаться на индикатор старой школы, не придав ему немного магии сегодняшних технологий? Именно здесь на сцену выходит машинное обучение. Сочетая проверенную временем надежность RSI с точным пониманием машинного обучения, мы стремимся повысить этот показатель. Каков результат? Более умный и интуитивно понятный инструмент, который предлагает трейдерам более четкую дорожную карту в часто туманном мире торговли акциями.

Готовы увидеть, как мы заставляем старую собаку научиться новым трюкам? Пристегните ремни, и давайте начнем!

Традиционный RSI: освежаем в памяти

График технического анализа RSI

Индекс относительной силы (RSI) сродни старой классике в мире трейдинга. Это как «Битлз» технических индикаторов — неподвластные времени, популярные и с мелодией (или, в данном случае, сигналом), на которые трейдеры привыкли полагаться. Но прежде чем углубиться в его тонкости, давайте сделаем шаг назад и разберемся в его корнях и нюансах.

Понимание сути RSI

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

Разбивка формулы

Чтобы по-настоящему понять RSI, нам нужно засучить рукава и погрузиться в его математическое сердце. Вот формула, которая его поддерживает:

RSI = 100–100/(1+RS)

Где:

  • RS (относительная сила) = Среднее значение ‘n’ дней’ вверх закрытия / Среднее значение ‘n’ дней’ вниз закрытия.

Хотя ‘n’ традиционно устанавливается на 14 дней, он является гибким. Трейдеры могут настраивать его в зависимости от своей стратегии, сродни корректировке приправы в рецепте.

Расшифровка сигналов перекупленности и перепроданности

RSI служит компасом для трейдеров, указывая на потенциальные возможности для покупки или продажи:

  • Территория перекупленности: Значение RSI, взлетающее выше 70, похоже на тревожный звонок, предполагающий, что акция, возможно, слишком сильно расправила крылья и может нуждаться в небольшой передышке или даже развороте тренда.
  • Зона перепроданности: С другой стороны, падение RSI ниже 30 — это вспышка в небе, намекающая на то, что акции, возможно, чувствуют себя немного недооцененными и могут готовиться к ралли.

Хотя пороговые значения 70/30 являются общими ориентирами, они не являются неприкосновенными. В зависимости от рыночных условий и индивидуальных стратегий, трейдеры могут выбрать соотношение 80/20 или даже 85/15.

Бреши в броне RSI

Несмотря на широкое признание, RSI не является непогрешимым. Вот где он может споткнуться:

  • Мираж ложных сигналов: RSI иногда может быть тем чересчур нетерпеливым другом, который прыгает через пистолет. Он может сигнализировать о перекупленности как раз тогда, когда акция набирает обороты, или кричать о перепроданности, когда акция находится на нисходящей спирали.
  • Слепота к общей картине: У RSI немного туннельное зрение. Он фокусируется на исторических движениях цены акций, часто не обращая внимания на более широкие рыночные течения. Таким образом, если на рынке наблюдается бычий или медвежий тренд, RSI может показаться рассинхронизированным.
  • Нервозность из-за волатильности: RSI может скакать в условиях волатильности. Внезапные колебания цены могут привести RSI в состояние замешательства, что приведет к резким движениям, которые могут не быть истинным отражением импульса акции.
  • Один размер не подходит всем: 14-периодная настройка по умолчанию может не резонировать с каждым стилем торговли. Независимо от того, являетесь ли вы дневным трейдером, входящим и выходящим из сделок, или свинг-трейдером, оседлавшим волны, вам, возможно, придется перекалибровать RSI, чтобы он соответствовал вашей стратегии.

Расширение RSI с помощью машинного обучения: техническая одиссея

В сфере трейдинга поиск более совершенного и точного индикатора никогда не заканчивается. С появлением машинного обучения это стремление совершило квантовый скачок. Давайте отправимся в путешествие, чтобы усилить традиционный RSI с помощью машинного обучения.

Проектирование признаков: Создание данных

Взаимодействие функций:

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

Временные особенности:

Функции, основанные на времени, такие как день недели, месяц или квартал, иногда могут отражать сезонные эффекты цен на акции. Например, некоторые акции могут стабильно демонстрировать лучшие результаты в определенные месяцы из-за отраслевых событий или циклических тенденций.

План:

Технический план

Прежде чем вводить наши данные в модель машинного обучения, нам нужно обогатить их, подобно тому, как мы готовим почву перед посевом семян.

  • Скользящие средние: Один из самых фундаментальных инструментов в арсенале трейдера, скользящие средние помогают сглаживать ценовые данные, создавая единую плавную линию, что облегчает определение направления тренда. Мы можем использовать как краткосрочные (например, 7-дневные), так и долгосрочные (например, 21-дневные) скользящие средние, чтобы уловить различную динамику рынка.
  • Показатели волатильности: Волатильность, мера колебания цен, имеет решающее значение при оценке риска. Интегрируя такие метрики, как полосы Боллинджера или средний истинный диапазон (ATR), мы можем оценить волатильность и соответствующим образом скорректировать наши стратегии.
  • Индикаторы объема: Объем может быть предвестником значительного движения рынка. Такие индикаторы, как Volume Rate of Change или On-Balance Volume, могут дать представление о давлении покупателей и продавцов.

Утонченность:

Нормализация данных сродни настройке инструмента перед концертом. Это гарантирует, что все функции имеют одинаковый масштаб, что делает процесс обучения более плавным и эффективным. Можно использовать такие методы, как Min-Max Scaling или нормализация Z-оценки.

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

Выбор модели: выбираем нашего чемпиона

Претенденты:

Мир машинного обучения полон моделей, каждая из которых обладает своими уникальными сильными сторонами. Для прогнозирования временных рядов выделяются несколько:

  • LSTM (долговременная кратковременная память): LSTM — это разновидность рекуррентной нейронной сети (RNN), предназначенная для распознавания закономерностей в течение временных интервалов. Его способность запоминать долгосрочные зависимости делает его сильным кандидатом для прогнозирования цен на акции.
  • ARIMA (Авторегрессионная интегрированная скользящая средняя): ARIMA сочетает в себе авторегрессию, дифференциацию и скользящие средние в целостной модели. Он особенно хорош для захвата линейных зависимостей в данных.
  • Пророк: Разработанный Facebook, Prophet предназначен для прогнозирования «нелинейного роста» с ежедневными наблюдениями, которые демонстрируют несколько сезонных закономерностей. Его гибкость и прочность делают его достойным соперником.

LSTM: Распутывание слоев

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

Для нашего улучшенного RSI:

  • Входной слой: Это будет учитывать наши функции, которые включают RSI, скользящие средние, меры волатильности, индикаторы объема и любые другие инженерные функции.
  • Скрытые слои LSTM: Несколько слоев LSTM могут быть объединены друг с другом для более сложных представлений. Например, использование двух слоев LSTM может помочь модели зафиксировать как краткосрочные, так и долгосрочные зависимости в данных.
  • Плотный слой: После слоев LSTM можно добавить плотный слой для интерпретации объектов и прогнозирования. Этот слой будет использовать функцию активации, подходящую для нашего типа прогнозирования, например ‘sigmoid’ для задач бинарной классификации.

Реализация LSTM для расширенного RSI:import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout
from keras.regularizers import L1L2
from keras.optimizers import Adam
from sklearn.preprocessing import MinMaxScaler
from hyperopt import fmin, tpe, hp, STATUS_OK, Trials

scaler = MinMaxScaler()
data = scaler.fit_transform(df[[‘RSI’, ‘moving_avg’, ‘volatility’, ‘volume’]].values)

train_size = int(len(data) * 0.8)
train, test = data[0:train_size, :], data[train_size:len(data), :]

def create_dataset(dataset, look_back=1):
X, Y = [], []
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back), :]
X.append(a)
Y.append(dataset[i + look_back, 0])
return np.array(X), np.array(Y)

look_back = 3
X_train, y_train = create_dataset(train, look_back)
X_test, y_test = create_dataset(test, look_back)

# LSTM model
model = Sequential()
model.add(LSTM(50, input_shape=(X_train.shape[1], X_train.shape[2]), return_sequences=True, kernel_regularizer=L1L2(l1=0.01, l2=0.01)))
model.add(Dropout(0.2))
model.add(LSTM(50, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(50))
model.add(Dense(1, activation=’sigmoid’))
model.compile(optimizer=Adam(), loss=’mean_squared_error’)

model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test), verbose=1, shuffle=False)

Настройка гиперпараметров:

Оптимизация LSTM-модели требует тонкой настройки нескольких гиперпараметров:

  • Количество эпох: От этого зависит, сколько раз алгоритм обучения будет работать со всем обучающим набором данных.
  • Размер партии: Это относится к количеству обучающих примеров, используемых в одной итерации.
  • Отсева: Чтобы предотвратить переобучение, к слоям LSTM можно добавить дропаут. При этом случайным образом устанавливается доля входных единиц измерения равной 0 при каждом обновлении во время обучения.
  • Скорость обучения: Этот гиперпараметр определяет, насколько сильно изменяется модель в ответ на предполагаемую ошибку при каждом обновлении весов модели.

Настройка гиперпараметров с помощью байесовской оптимизации:from hyperopt import fmin, tpe, hp, STATUS_OK, Trials

def objective(params):
model = Sequential()
model.add(LSTM(int(params[‘units’]), input_shape=(X_train.shape[1], X_train.shape[2]), return_sequences=True, kernel_regularizer=L1L2(l1=params[‘l1’], l2=params[‘l2’])))
model.add(Dropout(params[‘dropout’]))
model.add(LSTM(int(params[‘units’]), return_sequences=True))
model.add(Dropout(params[‘dropout’]))
model.add(LSTM(int(params[‘units’])))
model.add(Dense(1, activation=’sigmoid’))
model.compile(optimizer=Adam(learning_rate=params[‘learning_rate’]), loss=’mean_squared_error’)

history = model.fit(X_train, y_train, epochs=int(params[‘epochs’]), batch_size=int(params[‘batch_size’]), validation_data=(X_test, y_test), verbose=0, shuffle=False)
val_loss = history.history[‘val_loss’][-1]
return {‘loss’: val_loss, ‘status’: STATUS_OK}

space = {
‘units’: hp.quniform(‘units’, 30, 70, 5),
‘dropout’: hp.uniform(‘dropout’, 0.1, 0.5),
‘l1’: hp.loguniform(‘l1’, -5, 2),
‘l2’: hp.loguniform(‘l2’, -5, 2),
‘learning_rate’: hp.loguniform(‘learning_rate’, -7, -3),
‘epochs’: hp.quniform(‘epochs’, 10, 100, 5),
‘batch_size’: hp.quniform(‘batch_size’, 10, 100, 5)
}

best = fmin(fn=objective, space=space, algo=tpe.suggest, max_evals=50, trials=Trials())
print(best)

Методы регуляризации:

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

ARIMA (AutoRegressive Integrated Moving Average): Учет линейной динамики

Концептуальный обзор:

ARIMA сочетает в себе три основных компонента:

  1. Авторегрессия (AR): При этом фиксируется связь между наблюдением и несколькими запаздывающими наблюдениями (предыдущими временными шагами).
  2. Интегрированный (I): Это включает в себя дифференциацию наблюдений, чтобы сделать временной ряд стационарным.
  3. Скользящая средняя (MA): Он фиксирует связь между наблюдением и остаточной ошибкой из модели скользящего среднего, применяемой к запаздывающим наблюдениям.

Расширенная реализация:

Во-первых, убедитесь, что у вас есть необходимые библиотеки:import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
from matplotlib import pyplot as plt

Определите параметры ARIMA (p,d,q) с помощью графиков и статистических тестов:from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

plot_acf(data[‘value’])
plot_pacf(data[‘value’])
plt.show()

Подходит для модели ARIMA:model = ARIMA(data[‘value’], order=(p,d,q))
model_fit = model.fit(disp=0)

Прогнозирование и визуализация:forecast = model_fit.forecast(steps=10) # forecast next 10 points
plt.plot(data[‘value’])
plt.plot(range(len(data), len(data)+10), forecast)
plt.show()

Настройка гиперпараметров ARIMA:

Для ARIMA основными гиперпараметрами являются параметры порядка: pd и q.

  1. : Количество наблюдений с запаздыванием, включенных в модель (порядок запаздывания).
  2. d: Количество различий в исходных наблюдениях (степень различения).
  3. Вопрос: Размер окна скользящей средней (порядок скользящей средней).

Реализация:

Использование подхода к поиску по сетке:import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error

data = yf.download(tickers=»NFLX», period=»1d», interval=»5m»)

train = data[‘value’][:-10]
test = data[‘value’][-10:]

best_score, best_cfg = float(«inf»), None

# Grid Search
for p in range(5):
for d in range(2):
for q in range(5):
order = (p,d,q)
try:
model = ARIMA(train, order=order)
model_fit = model.fit(disp=0)
predictions = model_fit.forecast(steps=10)[0]
error = mean_squared_error(test, predictions)
if error < best_score:
best_score, best_cfg = error, order
except:
continue

print(‘Best ARIMA%s MSE=%.3f’ % (best_cfg, best_score))

Использование байесовской оптимизации:

Байесовская оптимизация — это вероятностный метод оптимизации, основанный на модели. Для ARIMA мы будем использовать библиотеку hyperopt для выполнения байесовской оптимизации.from hyperopt import fmin, tpe, hp, Trials, STATUS_OK
from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error

data = yf.download(tickers=»NFLX», period=»1d», interval=»5m»)

train = data[‘value’][:-10]
test = data[‘value’][-10:]

def objective(params):
p, d, q = int(params[‘p’]), int(params[‘d’]), int(params[‘q’])
model = ARIMA(train, order=(p, d, q))
model_fit = model.fit(disp=0)
predictions = model_fit.forecast(steps=10)[0]
mse = mean_squared_error(test, predictions)
return {‘loss’: mse, ‘status’: STATUS_OK}

space = {
‘p’: hp.quniform(‘p’, 0, 5, 1),
‘d’: hp.quniform(‘d’, 0, 2, 1),
‘q’: hp.quniform(‘q’, 0, 5, 1)
}

best = fmin(fn=objective, space=space, algo=tpe.suggest, max_evals=50, trials=Trials())
print(best)

Пророк: Прогнозирование с учетом нескольких сезонностей

Концептуальный обзор:

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

Расширенная реализация:

Во-первых, установите и импортируйте необходимые библиотеки:!pip install fbprophet
import pandas as pd
from fbprophet import Prophet

Подготовьте данные. Для Prophet требуется DataFrame с двумя столбцами: ds (дата) и y (значение).data = data.rename(columns={‘date_column_name’: ‘ds’, ‘value_column_name’: ‘y’})

Инициализация и подгонка модели:model = Prophet(daily_seasonality=True)
model.fit(data)

Прогноз на будущее:future = model.make_future_dataframe(periods=365) # forecast for the next year
forecast = model.predict(future)

Визуализируйте прогноз:fig = model.plot(forecast)

Для получения дополнительной информации можно построить график компонентов прогноза:fig2 = model.plot_components(forecast)

Настройка гиперпараметров Prophet:

Для Prophet некоторые из гиперпараметров включают:

  1. changepoint_prior_scale: Гибкость автоматического определения точки изменения.
  2. seasonality_prior_scale: Сила модели сезонности.
  3. holidays_prior_scale: Гибкость праздничных эффектов.

Реализация:

Использование подхода к поиску по сетке:from fbprophet import Prophet
from sklearn.metrics import mean_squared_error

data = yf.download(tickers=»NFLX», period=»1d», interval=»5m»)

train = data.iloc[:-10]
test = data.iloc[-10:]

param_grid = {
‘changepoint_prior_scale’: [0.001, 0.01, 0.1, 0.5],
‘seasonality_prior_scale’: [0.01, 0.1, 1.0, 10.0],
}

best_params = {}
lowest_mse = float(‘inf’)

# Grid Search
for changepoint_prior_scale in param_grid[‘changepoint_prior_scale’]:
for seasonality_prior_scale in param_grid[‘seasonality_prior_scale’]:

model = Prophet(daily_seasonality=True,
changepoint_prior_scale=changepoint_prior_scale,
seasonality_prior_scale=seasonality_prior_scale)
model.fit(train)

future = model.make_future_dataframe(periods=10)
forecast = model.predict(future)

predicted = forecast[‘yhat’][-10:]
mse = mean_squared_error(test[‘y’], predicted)

if mse < lowest_mse:
best_params = {‘changepoint_prior_scale’: changepoint_prior_scale,
‘seasonality_prior_scale’: seasonality_prior_scale}
lowest_mse = mse

print(best_params)

Использование случайного поиска:

Случайный поиск — это простой, но эффективный метод настройки гиперпараметров. Вместо того, чтобы исчерпывающе перебирать все возможные комбинации, он случайным образом выбирает из пространства гиперпараметров.from fbprophet import Prophet
from sklearn.metrics import mean_squared_error
import random

data = yf.download(tickers=»NFLX», period=»1d», interval=»5m»)

train = data.iloc[:-10]
test = data.iloc[-10:]

param_grid = {
‘changepoint_prior_scale’: [0.001, 0.01, 0.1, 0.5],
‘seasonality_prior_scale’: [0.01, 0.1, 1.0, 10.0],
}

best_params = {}
lowest_mse = float(‘inf’)

# Random Search
for _ in range(50): # 50 iterations
changepoint_prior_scale = random.choice(param_grid[‘changepoint_prior_scale’])
seasonality_prior_scale = random.choice(param_grid[‘seasonality_prior_scale’])

model = Prophet(daily_seasonality=True,
changepoint_prior_scale=changepoint_prior_scale,
seasonality_prior_scale=seasonality_prior_scale)
model.fit(train)

future = model.make_future_dataframe(periods=10)
forecast = model.predict(future)

predicted = forecast[‘yhat’][-10:]
mse = mean_squared_error(test[‘y’], predicted)

if mse < lowest_mse:
best_params = {‘changepoint_prior_scale’: changepoint_prior_scale,
‘seasonality_prior_scale’: seasonality_prior_scale}
lowest_mse = mse

print(best_params)

Решение:

Для нашего улучшенного RSI давайте опираемся на LSTM. Почему? Финансовые рынки — это сложные звери, на которых часто влияют долгосрочные факторы, которые могут показаться несущественными в краткосрочной перспективе. Способность LSTM запоминать эти долгосрочные зависимости и его опыт работы с большими наборами данных с последовательной информацией делают его лучшим выбором. Более того, его архитектура нейронной сети может фиксировать сложные закономерности и взаимосвязи в данных, потенциально предлагая более тонкое прогнозирование.

Генерация сигналов с использованием улучшенной модели RSI (с акцентом на модель LSTM):

После того, как наша LSTM-модель (или любая другая модель) обучена на наборе данных, ее можно использовать для прогнозирования будущих значений RSI. Эти прогнозируемые значения могут быть преобразованы в торговые сигналы.

  1. Генерация прогнозируемого RSI:

Используя обученную LSTM-модель, мы можем прогнозировать значения RSI для нашего тестового набора данных или любых новых входящих данных.# Predicting RSI values
predicted_RSI = model.predict(X_test)
predicted_RSI = scaler.inverse_transform(predicted_RSI)

2. Генерация сигнала:

Основная идея, лежащая в основе RSI, заключается в том, что он измеряет относительную силу или слабость акции или актива на основе цен ее закрытия за определенный период. Как правило, значения RSI выше 70 указывают на состояние перекупленности (сигнал на продажу), а значения ниже 30 указывают на состояние перепроданности (сигнал на покупку).

Для повышенного RSI:# Generating signals from predicted RSI
buy_signal = (predicted_RSI < 30)
sell_signal = (predicted_RSI > 70)

3. Сравнение с традиционным RSI:

Чтобы визуализировать разницу между традиционным RSI и улучшенным RSI, мы можем нанести их на график.import matplotlib.pyplot as plt

plt.figure(figsize=(14,7))

# Plotting traditional RSI
plt.plot(data.index, data[‘Traditional_RSI’], label=’Traditional RSI’, color=’blue’)
plt.axhline(y=70, color=’red’, linestyle=’-‘)
plt.axhline(y=30, color=’green’, linestyle=’-‘)

# Plotting enhanced RSI
plt.plot(data.index[-len(predicted_RSI):], predicted_RSI, label=’Enhanced RSI’, color=’orange’, linestyle=’dashed’)
plt.title(‘Traditional RSI vs Enhanced RSI’)
plt.xlabel(‘Date’)
plt.ylabel(‘RSI Value’)
plt.legend(loc=’best’)
plt.show()

На графике традиционный RSI показан синим цветом, а расширенный RSI — оранжевым. Пороги перекупленности (70) и перепроданности (30) отображаются в виде красной и зеленой линий соответственно. Улучшенный RSI, основанный на большем количестве функций и более сложной модели, может показывать различные пики и впадины по сравнению с традиционным RSI. Это может привести к разным сигналам на покупку и продажу.

Тестирование на истории и метрики производительности

Тестирование на истории:

Тестирование на истории — это процесс тестирования торговой стратегии с использованием исторических данных, чтобы увидеть, как бы она работала. Важно убедиться, что стратегия надежна и потенциально может быть прибыльной в реальной торговле.

Настройка среды тестирования на истории:

Прежде чем мы сможем протестировать нашу стратегию, нам нужно настроить среду тестирования на истории. Обычно это включает в себя загрузку исторических данных о ценах, установку начального капитала и определение правил торговли на основе наших сигналов.import pandas as pd

initial_capital = 100000 # Starting with R100,000
data[‘Position’] = None # To track our position (long/short/flat)
data[‘Strategy_Returns’] = 0.0

Определение правил торговли:

Основываясь на сигналах RSI, мы можем определить свои торговые правила. Для простоты предположим, что мы открываем длинную позицию, когда RSI ниже 30, и короткую, когда он выше 70.# Traditional RSI rules
data.loc[data[‘Traditional_RSI’] < 30, ‘Position’] = 1 # Go long
data.loc[data[‘Traditional_RSI’] > 70, ‘Position’] = -1 # Go short

# Enhanced RSI rules (using predicted RSI)
data.loc[data[‘Predicted_RSI’] < 30, ‘Position’] = 1
data.loc[data[‘Predicted_RSI’] > 70, ‘Position’] = -1

# Calculate strategy returns
data[‘Strategy_Returns’] = data[‘Close’].pct_change() * data[‘Position’].shift(1)

Показатели производительности:

После того, как мы получим результаты нашей стратегии, мы можем рассчитать различные показатели производительности для оценки нашей стратегии.

  • Коэффициент Шарпа: Измеряет доходность стратегии с поправкой на риск. Более высокий коэффициент Шарпа указывает на лучшее соотношение риска и доходности.

risk_free_rate = 0.02 # With a 2% annual risk-free rate
sharpe_ratio = (data[‘Strategy_Returns’].mean() — risk_free_rate) / data[‘Strategy_Returns’].std()

  • Максимальная просадка: Измеряет наибольшее снижение стоимости портфеля от пика до минимума.

cumulative_returns = (1 + data[‘Strategy_Returns’]).cumprod()
running_max = cumulative_returns.cummax()
drawdown = (cumulative_returns / running_max) — 1
max_drawdown = drawdown.min()

  • Годовая доходность: Предоставляет коэффициент геометрической прогрессии, который дает норму доходности за год.

total_days = len(data)
annualized_return = (cumulative_returns[-1])**(252/total_days) — 1

Сравнение:

Рассчитав эти показатели как для традиционной стратегии RSI, так и для расширенной стратегии RSI, мы можем сравнить их эффективность. Для визуализации различий в метриках между двумя стратегиями можно использовать таблицу или диаграмму.

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

Практическое применение и рекомендации:

Возможные подводные камни:

  1. Переобучение: Одна из самых распространенных ошибок в машинном обучении — переобучение происходит, когда модель слишком близко адаптирована к обучающим данным, что приводит к низкой производительности на невидимых данных. Это особенно проблематично в трейдинге, где способность модели к обобщению имеет решающее значение.

Решение: Методы регуляризации, перекрестная проверка и более простые модели могут помочь смягчить переобучение.from keras.regularizers import l1, l2
model.add(Dense(64, activation=’relu’, kernel_regularizer=l2(0.01)))

2. Предвзятость прогнозирования: Это происходит, когда модель непреднамеренно использует будущие данные в своих прогнозах, которые были бы недоступны в реальном торговом сценарии.

Решение: Убедитесь, что обучающие данные для любой заданной точки не включают будущие данные. В этом может помочь разделение временных рядов для перекрестной проверки.from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)

3. Транзакционные издержки: При тестировании на истории легко упустить из виду транзакционные издержки, которые могут существенно повлиять на прибыльность стратегии.

Решение: Включите транзакционные издержки в инфраструктуру тестирования на истории. Вычтите фиксированную стоимость или процент за каждую сделку.transaction_cost = 0.001 # 0.1% of the trade amount
df[‘Strategy_Returns’] -= transaction_cost * df[‘Position’].diff().abs()

Совершенствование стратегии:

  1. Ансамблевые методы: Объединение прогнозов из нескольких моделей может привести к более надежным и точным прогнозам. Можно использовать такие методы, как упаковывание, усиление или укладка.

from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
ensemble_model = GradientBoostingRegressor(n_estimators=100)

2. Включение альтернативных данных: традиционные данные о ценах и объемах могут быть дополнены альтернативными источниками данных, такими как настроения в новостях, болтовня в социальных сетях или даже спутниковые снимки для более целостных прогнозов.

3. Проектирование признаков: постоянное уточнение и расширение набора элементов, используемых в модели. Учитывайте такие особенности, как ценовые модели, межрыночные отношения или макроэкономические показатели.

Расширение RSI с помощью машинного обучения — это не просто техническое обновление; Это смена парадигмы. Интегрируя расширенные функции и используя сложные модели, мы не просто настраиваем RSI; Мы изобретаем его заново. По мере того, как мы будем двигаться дальше, важно помнить, что, хотя машинное обучение предлагает мощные инструменты, искусство торговли заключается в разумном применении этих инструментов.

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

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

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

Источник

Источник

Источник

Источник

Источник