Перевод. Оригинал: Random Forest Analysis of the Bollinger Bands
Полосы Боллинджера являются одним из наиболее популярных технических индикаторов, и многие трейдеры используют их как для торговли в диапазоне, так и для поиска прорывов. Однако на какие их особенности стоит обращать внимание, когда вы используете полосы Боллинджера для торговли?
Полосы Боллинджера являются одним из наиболее популярных технических индикаторов, и многие трейдеры используют их как для торговли в диапазоне, так и для поиска прорывов. Однако на какие их особенности стоит обращать внимание, когда вы используете полосы Боллинджера для торговли?
В этой статье мы будем использовать Random Forest, мощный алгоритм машинного обучения, чтобы выяснить, какие аспекты полос Боллинджера наиболее важны для стратегии торговли парой GBP/USD на 4-часовых графиках.
Полосы Боллинджера
Полосы Боллинджера, технический индикатор, разработанный Джоном Боллинджером в начале 1980-х годов, обеспечивают относительную оценку диапазона рынка. Во времена высокой волатильности торговый диапазон, естественно, будет шире, тогда как во времена низкой волатильности диапазон будет уже.
Полосы Боллинджера представляют собой комбинацию из трех линий. Средняя линия представляет собой простое скользящее среднее (обычно для 20 периодов), причем верхняя линия - это 2 стандартных отклонения цены закрытия выше средней линии, а нижняя линия - 2 стандартных отклонения ниже средней линии.
Более высокая волатильность приведет к большим стандартным отклонениям и, следовательно, к более широкому диапазону между верхней и нижней полосами.
При использовании полос Боллинджера в какой-либо систематической стратегии, три разные линии представляют некоторые вопросы и проблемы; а именно, какой единственный фактор вы должны включить? Хотите посмотреть, где текущая цена относительно диапазона? Может быть, вас интересует только верхняя полоса для коротких позиций и нижняя полоса для длинных позиций, или вы хотите посмотреть на общую высоту диапазона?
Существует огромное количество различных значений, на которые вы можете посмотреть, и этот процесс, известный как выбор «признаков» в мире машинного обучения, невероятно важен.
Выбор правильного признака, который содержит большую часть информации, относящейся к вашей стратегии, может оказать огромное влияние на эффективность стратегии.
Вместо того, чтобы оценивать эти признаки самостоятельно, мы можем использовать random forest, мощную технику машинного обучения, чтобы объективно оценить эти признаки.
Random Forests
Random forests - это ансамблевый подход, основанный на принципе, согласно которому группу «слабых учеников» можно объединить в «сильного ученика». Случайные леса начинаются с создания большого количества отдельных деревьев решений.
Деревья решений вводят входные данные в верхней части «дерева» и отправляют его вниз по своим ветвям, где каждое разбиение представляет различные уровни значений индикатора. (чтобы узнать больше о деревьях решений, посмотрите нашу предыдущую статью, в которой мы использовали дерево решений для торговли акциями Bank of America.)
Вот дерево решений, которое мы создали в предыдущем посте:
Отдельные деревья решений воспринимаются как довольно слабые ученики, что означает, что они могут очень легко переобучиться и иметь проблемы с обобщением для новых данных. Объединенные в «леса» с тысячами «деревьев», эти упрощенные алгоритмы могут сформировать очень мощный подход к моделированию.
Успех random forest во многом зависит от способности создавать сильную изменчивость среди отдельных деревьев. Это достигается путем введения степени случайности двумя различными способами:
Bagging
Bagging, сокращение от «bootstrap aggregating», просто означает выборку с заменой. Вместо использования всего доступного набора данных для построения каждого дерева, набор данных выбирается случайным образом, и каждая точка данных становится доступной для повторного выбора. Например, если бы мы выполняли упаковку в обучающий набор, состоящий из чисел от 1 до 10, мы могли бы получить следующий набор данных: 1 3 2 1 5 7 5 5 7 10
Это позволяет нам создавать бесконечное количество наборов данных одинакового размера и полученных из нашего исходного набора данных.
Подмножество индикаторов
Вместо того чтобы использовать каждый доступный индикатор для построения каждого дерева, используется только случайно выбранный набор индикаторов. Например, если бы у нас было 5 различных признаков, которые мы тестировали, в каждом дереве использовались бы только 3.
Из этих двух источников случайности мы создали целый лес разнообразных деревьев. Теперь для каждой точки данных каждое дерево вызывается для классификации, и большинством голосов принимается окончательное решение.
Одним из основных преимуществ случайных лесов является то, что они способны дать очень надежную оценку эффективности каждого показателя. Тысячи деревьев, каждое из которых построено с различным набором обучаемых данных и набором индикаторов, показывают, какие индикаторы были наиболее важны при выборе класса переменной, которую мы пытаемся предсказать, в данном случае - направление движения рынка.
Мы используем это ценное свойство random forest, чтобы выяснить, какие признаки, полученные из полос Боллинджера, мы должны использовать в нашей стратегии.
Создание признаков
Сначала мы должны решить, какие признаки следует извлечь из полос Боллинджера. Это область, где вы можете проявить творческий подход, придумав причудливые вычисления и формулы, но пока мы будем придерживаться 8 основных признаков:
Верхняя полоса - Цена (расстояние между верхней полосой и текущей ценой).
Средняя полоса - Цена (расстояние между средней линией, простой скользящей средней за 20 периодов, и текущей ценой)
Нижняя полоса - Цена (расстояние между нижней полосой и текущей ценой).
%В (измеряет текущую цену относительно верхней и нижней полос):
%B = (текущая цена - нижняя полоса) / (верхняя полоса - нижняя полоса)
Давайте также посмотрим на процентное изменение каждого признака, чтобы добавить временный аспект:
Процентное изменение (верхняя полоса - цена) (процентное изменение за один период расстояния между верхней полосой и текущей ценой).
Процентное изменение (средняя полоса - цена) (процентное изменение за один период расстояния между средней полосой и текущей ценой).
Процентное изменение (нижняя полоса - цена) (процентное изменение за один период расстояния между нижней полосой и текущей ценой).
Процентное изменение (%B) (процентное изменение за один период значения%B)
Теперь, когда у нас есть 8 признаков, давайте создадим наш random forest, чтобы увидеть, какие признаки мы должны использовать в нашей стратегии.
Строим нашу модель
Сначала давайте установим пакеты и импортируем наш набор данных (вы можете скачать данные здесь):
install.packages(‘quantmod’)
#Для расчета полос Болинджера мы будем использовать пакет quantmod
library(quantmod)
#мы будем использовать пакет random forest
install.packages(‘randomForest’)
library(randomForest)
#Формат даты и времени
DateTime=as.POSIXlt(GBPUSD[,1],format="%m/%d/%y %H:%M")
#Соединяем High, Low, Close
HLC=GBPUSD[,3:5]
#Создаем объект timeseries
HLCts=data.frame(HLC,row.names=DateTime)
HLCxts=as.xts(HLCts)
#Рассчитываем bollinger bands
Bollinger=BBands(HLCxts,n=20,SMA,sd=2)
#Строим наши первые три признака
Upper=Bollinger$up - HLCxts$Close
Lower=Bollinger$dn - HLCxts$Close
Middle = Bollinger$mavg - HLCxts$Close
#Мы используем функцию ‘Delt’ из quantmod для расчета процентного изменения
PChangepctB=Delt(Bollinger$pctB,k=1)
PChangeUpper=Delt(Upper,k=1)
PChangeLower=Delt(Lower,k=1)
PChangeMiddle=Delt(Middle,k=1)
#Рассчитываем процентное изменение и результирующий класс, который мы хотим предсказать, движение рынка вверх или вниз
Returns=Delt(HLCxts$Close,k=1); Class<-ifelse eturns="">0,"Up","Down") -ifelse>
#Сдвигаем наш класс на один период назад, так как это то, что мы пытаемся предсказать
ClassShifted=Class[-1]
#Комбинируем все наши признаки
Features=data.frame(Upper, Lower, Middle, Bollinger$pctB, PChangepctB, PChangeUpper, PChangeLower, PChangeMiddle)
FeaturesShifted=Features[-5257,] #Сопоставляем с нашим классом
#Комбинируем два наших набора данных
ModelData=data.frame(FeaturesShifted,ClassShifted)
#Удаляем экземпляры, где мы рассчитываем индикаторы
FinalModelData=ModelData[-c(1:20),]
#Даем имена столбцам
colnames(FinalModelData)=c("pctB","LowerDiff","UpperDiff","MiddleDiff","PChangepctB","PChangeUpper","PChangeLower","PChangeMiddle","Class")
#Устанавливаем начальное случайное значение, чтобы получить воспроизводимые результаты
set.seed(1)
#Для расчета полос Болинджера мы будем использовать пакет quantmod
library(quantmod)
#мы будем использовать пакет random forest
install.packages(‘randomForest’)
library(randomForest)
#Формат даты и времени
DateTime=as.POSIXlt(GBPUSD[,1],format="%m/%d/%y %H:%M")
#Соединяем High, Low, Close
HLC=GBPUSD[,3:5]
#Создаем объект timeseries
HLCts=data.frame(HLC,row.names=DateTime)
HLCxts=as.xts(HLCts)
#Рассчитываем bollinger bands
Bollinger=BBands(HLCxts,n=20,SMA,sd=2)
#Строим наши первые три признака
Upper=Bollinger$up - HLCxts$Close
Lower=Bollinger$dn - HLCxts$Close
Middle = Bollinger$mavg - HLCxts$Close
#Мы используем функцию ‘Delt’ из quantmod для расчета процентного изменения
PChangepctB=Delt(Bollinger$pctB,k=1)
PChangeUpper=Delt(Upper,k=1)
PChangeLower=Delt(Lower,k=1)
PChangeMiddle=Delt(Middle,k=1)
#Рассчитываем процентное изменение и результирующий класс, который мы хотим предсказать, движение рынка вверх или вниз
Returns=Delt(HLCxts$Close,k=1); Class<-ifelse eturns="">0,"Up","Down") -ifelse>
#Сдвигаем наш класс на один период назад, так как это то, что мы пытаемся предсказать
ClassShifted=Class[-1]
#Комбинируем все наши признаки
Features=data.frame(Upper, Lower, Middle, Bollinger$pctB, PChangepctB, PChangeUpper, PChangeLower, PChangeMiddle)
FeaturesShifted=Features[-5257,] #Сопоставляем с нашим классом
#Комбинируем два наших набора данных
ModelData=data.frame(FeaturesShifted,ClassShifted)
#Удаляем экземпляры, где мы рассчитываем индикаторы
FinalModelData=ModelData[-c(1:20),]
#Даем имена столбцам
colnames(FinalModelData)=c("pctB","LowerDiff","UpperDiff","MiddleDiff","PChangepctB","PChangeUpper","PChangeLower","PChangeMiddle","Class")
#Устанавливаем начальное случайное значение, чтобы получить воспроизводимые результаты
set.seed(1)
Прежде чем мы сможем построить наш random forest, нам нужно найти оптимальное количество индикаторов для каждого отдельного дерева. К счастью, пакет random forest, который мы используем, может помочь нам:
#мы оцениваем признаки (столбцы с 1 по 9) используя class (столбец 9), чтобы найти оптимальное количество признаков на дерево.
FeatureNumber = tuneRF(FinalModelData[,-9],FinalModelData[,9],ntreeTry=100, stepFactor=1.5,improve=0.01, trace=TRUE, plot=TRUE, dobest=FALSE)
FeatureNumber = tuneRF(FinalModelData[,-9],FinalModelData[,9],ntreeTry=100, stepFactor=1.5,improve=0.01, trace=TRUE, plot=TRUE, dobest=FALSE)
Мы можем видеть, что дерево с двумя признаками (mtry = 2) имело более низкую частоту появления ошибок out-of-bag (OOB), поэтому мы возьмем это значение для нашего random forest.
RandomForest=randomForest(Class~.,data=FinalModelData,mtry=2,ntree=2000,keep.forest=TRUE,importance=TRUE) <-randomforest data="FinalModelData,mtry=2,ntree=2000,keep.forest=TRUE,importance=TRUE) </font" lass="">-randomforest>
# Мы используем все признаки, чтобы предсказать class, с 2 признаками на дерево, лесом из 2000 деревьев, сохраняя конечный лес, и мы хотим измерить важность каждого признака. Примечание: работа алгоритма может занять пару минут.
Давайте посмотрим, что получается.
«mean decrease accuracy» показывает, насколько хуже работает каждая модель без каждого признака, а «mean decrease Gini» - более сложная математическая функция, которая измеряет, насколько чистым является конец каждой ветви дерева для каждого признака.
Мы сразу видим, что процентное изменение значения %B было наиболее важным фактором, и, в целом, анализ процентного изменения значений был лучше, чем анализ только расстояния между ценой и верхним, нижним и средним значениями линий.
(Из-за двух источников случайности вы можете получить немного разные результаты, но в целом я нашел, что выводы были последовательными.)
Итак, теперь мы знаем, какие признаки, основанные на полосах Боллинджера, мы должны использовать в нашей торговой стратегии.
Заключение
Random forest - очень мощный подход, который обычно превосходит более сложные алгоритмы. Его можно использовать для классификации (прогнозирование категории), регрессии (прогнозирование числового значения) или для выбора признаков (как мы видели здесь).
Выбор признаков или определение того, какие факторы включить в вашу стратегию, является невероятно важной частью построения любой стратегии, и существует множество методов машинного обучения, направленных на решение этой проблемы.
Комментариев нет:
Отправить комментарий