суббота, 25 марта 2017 г.

Трейдинг на базе индикатора RSI с использованием машинного обучения

Индекс относительной силы, или RSI - это один из самых распространенных индикаторов технического анализа. Он используется для выявления условий перепроданности или перекупленности. Традиционно трейдеры считают, что состояние перекупленности характеризуется значениями RSI более 70, а перепроданности - менее 30. Однако чем подтверждаются эти значения? Почему 70 и почему 30?
Кроме того, как специфика различных рынков влияет на величину сигналов RSI, которую мы должны отслеживать?

В этой статье мы будем использовать Support Vector Machine (SVM), мощный алгоритм машинного обучения, для того, чтобы определить, на какие значения RSI нам нужно будет ориентироваться, учитывая общую тенденцию на рынке.

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


Support Vector Machine

Support Vector Machine - это один из самых популярных и мощных алгоритмов машинного обучения, способный работать с нелинейными паттернами. SVM находит линию, называемую разделяющей (decision boundary) или гиперплоскость (“hyperplane”) в случае пространств большой размерности, которая наилучшим образом делит наши данные на два класса (в нашем случае это "бычьи" или "медвежьи" бары). Мощь SVM в том, что вы можете с помощью набора специальных математических функций, известных как ядра классификатора, перевести ваши линейно неразделимые данные в данные более высокой размерности, которые будут линейно разделимы.

rsi2.png

Затем SVM строит линию в многомерном пространстве (гиперплоскость), которая максимизирует дистанцию между двумя классами. При вводе в SVM новой точки данных алгоритм рассчитывает, по какую сторону от линии должна находиться эта точка.

Другим преимуществом SVM является сравнительно небольшое количество параметров, которое необходимо выбрать перед его использованием. Во-первых, вы должны выбрать ядро, или отображение - функцию, используемую для транслирования ваших данных в пространство с большей размерностью. Популярной является радиально-базисные функция, в нашем случае она хорошо подойдет. Далее, вам необходимо выбрать параметр gamma, который определяет, насколько сильно один обучающий пример влияет на разделяющую кривую. Малые его значения говорят о большом влиянии на расположение кривой, а высокие означают, что каждая точка оказывает на него незначительное влияние. Хорошим эмпирическим правилом является выбор этого параметра на единицу большим количества входных параметров вашей модели.
И наконец, необходимо выбрать параметр регуляризации C, который представляет собой компромисс между ошибочными экземплярами в вашей обучающей выборке и простотой формы разделяющей кривой.
Низкие значения C способствуют получению более плавной разделяющей кривой и уменьшает переобучение, в то время как большие значения C приводят к попыткам правильной классификации каждой точки данных в обучающей выборке, что может привести к переобучению. Мы хотим избежать переобучения, поэтому пока выберем значение 1.

Теперь мы понимаем основы работы  Support Vector Machine и выбора параметров, поэтому давайте посмотрим, как мы можем использовать этот алгоритм при торговле с RSI.

Трейдинг с RSI

Индекс относительной силы, или RSI, сравнивает средний размер движений вверх со средним размером движений вниз и нормирует его в диапазоне от 0 до 100. Простая логика говорит нам, что при сильном движении цены актива вверх он становится перекупленным или переоцененным, и скорее всего его цена будет снижаться. Перекупленность характеризуется значениями RSI более 70, а противоположная ситуация - перепроданность, при RSI менее 30.

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

Мы можем взять тысячи точек и попытаться найти такие зависимости самостоятельно, или мы можем использовать Support Vector Machine - алгоритм, созданный для нахождения нелинейных паттернов, чтобы он сделал работу за нас.

Давайте посмотрим, какие паттерны мы сможем найти в 3-периодном RSI и определим тренд, сравнивая цену открытия с 50-периодным простым скользящим средним (SMA), используя 4-часовой график AUD/USD.

Построение модели

Давайте построим нашу модель с помощью R, проанализируем паттерны, которые она найдет и протестируем их применимость в рамках реальной торговой стратегии.

#Мощный пакет для трейдинга
install.packages(“quantmod”)
library(quantmod)

#библиотека, включающая SVM
install.packages(“e1071”)
library(e1071)

#инструменты для визуализации данных
install.packages(“ggplot2”)
library(ggplot2)


Создаем набор данных и строим нашу модель:

> Data<-read.csv("USDCAD.csv")

Наш 4-часовой график для валютной пары Australian Dollar/US Dollar датируется 01/01/2010. Вы можете скачать его здесь.

# Рассчитываем 3-периодный RSI для цен открытия
> RSI3<-RSI(Op(Data),n=3)

#Наше измерение тренда: разница между ценой открытия и 50-периодным простым скользящим средним
> SMA50<-SMA(Op(Data),n=50)
> Trend<-Op(Data)-SMA50

#Переменная, которую пытаемся предсказать; направление следующего бара
> Price<-Cl(Data)-Op(Data)
> Class<-ifelse(Price>0,"UP","DOWN")

#Создаем набор данных и удаляем точки, в которых наши индикаторы еще не определены
> DataSet<-data.frame(RSI3,Trend,Class)
> DataSet<-DataSet[-c(1:49),]

#Разделяем данные на обучающую выборку - 60%, тестовую выборку для тестирования найденных паттернов - 20% и
#проверочную выборку 20% для прогонки нашей стратегии на новых данных.
> Training<-DataSet[1:4528,]
> Test<-DataSet[4529:6038,]
> Val<-DataSet[6039:7548,]

#Строим нашу support vector machine, используя радиально-базисную функцию в качестве ядра, параметр регуляризации (cost), и параметр gamma, равный 1/2.
> SVM<-svm(Class~RSI3+Trend,data=Training, kernel="radial",cost=1,gamma=1/2)

#Запускаем алгоритм еще раз на обучающей выборке для визуализации найденных паттернов
> TrainingPredictions<-predict(SVM,Training,type="class")

#Создаем набор данных с предсказаниями
> TrainingData<-data.frame(Training,TrainingPredictions)

#Теперь посмотрим, какие паттерны мы смогли найти
>ggplot(TrainingData,aes(x=Trend,y=RSI3))+stat_density2d(geom="contour",aes(color=TrainingPredictions))+labs(title="SVM RSI3 and Trend Predictions",x="Open - SMA50",y="RSI3",color="Training Predictions")

rsi3.png

Интересно! Мы можем видеть три различные области, где алгоритм делает шорты, и один диапазон в середине, где он делает только лонги. Посмотрим еще.
Long    
RSI меньше 25 и цена более чем на 20 пипсов ниже SMA 50 (точность 56%, 36 трейдов)
RSI3 от 50 до 75 цена на 5 - 10 пипсов выше SMA 50 (точность 58%, 104 трейда)
Short
RSI менее 25 и цена на  10 - 5 пипсов ниже SMA 50 (точность 54%, 81 трейд)
RSI больше 70 и цена более на 5 пипсов ниже SMA 50 (точность 59%, 37 трейдов)
RSI больше 75 и цена более чем на 15 пипсов выше SMA 50 (точность 59%, 34 трейда)

Сначала область шортов внизу слева. Здесь цена только опустилась ниже 50-периодного SMA и RSI ниже 25, что свидетельствует о прорыве нисходящего тренда.
Однако, если цена движется за пределы диапазона 20 пипсов ниже ниже 50-периодного SMA и RSI остается ниже 25, алгоритм находит сильный сигнал возвращения к среднему и предсказывает восходящий тренд.

Далее, область шортов левой верхней части графика представляет традиционный взгляд на RSI. Здесь мы видим RSI больше 70, в то время как цена более чем на 15 пипсов выше 50-периодного SMA, что указывает на условия "перекупленности", подразумевая открытие коротких позиций.

Область шортов в правой верхней части немного отличается. Когда цена только пересекает снизу 50-периодное SMA и RSI более 70, алгоритм предлагает открывать короткую позицию. Это похоже на первый случай, но вместо традиционных условий "перекупленности" мы ищем сигнал медвежьего прорыва.

И наконец, есть область, где RSI находится между 50 и 75, в то время как цена пересекает вверх 50-периодное SMA, здесь алгоритм находит сильный сигнал к открытию длинных позиций.

Теперь, когда мы нашли базовый набор правил с помощью SVM, давайте посмотрим, как они будут работать на новых данных - нашей тестовой выборке.

> ShortRange1<-which(Test$RSI3 < 25 & Test$Trend > -.010 & Test$Trend < -.005)
> ShortRange2<-which(Test$RSI3 > 70 & Test$Trend < -.005)
> ShortRange3<-which(Test$RSI3 > 75 & Test$Trend > .015)
> LongRange1<-which(Test$RSI3 < 25 & Test$Trend < -.02)
> LongRange2<-which(Test$RSI3 > 50 & Test$RSI3 < 75 & Test$Trend > .005 & Test$Trend < .01)

Давайте посмотрим, как эти паттерны работают на тестовой выборке:

#Наши шорты
> ShortTrades<-Test[c(ShortRange1,ShortRange2,ShortRange3),]
> ShortCorrect<-((length(which(ShortTrades[,3]=="DOWN")))/nrow(ShortTrades))*100

#Наши лонги
> LongTrades<-Test[c(LongRange1,LongRange2), ]
> LongCorrect<-((length(which(LongTrades[,3]=="UP")))/nrow(LongTrades))*100

Вау! точность 58% (85 корректных трейдов из 147) для шортов и 57% (80 корректных трейдов) для лонгов.

Теперь давайте создадим на базе этих правил реальную торговую стратегию со стоп-лоссом и тейк-профитом.

Я добавил довольно плотные стоп-лосс и тейк-профит и поддерживаю отношение риска к прибыли 1:1 вследствие краткосрочности наших прогнозов (только один бар), и чтобы использовать преимущества точности более 50%.

Посмотрим, насколько хорошо это работает:

rsi4 (1).png

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

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

Перевод. Оригинал здесь.

Комментариев нет:

Отправить комментарий