Просматривал свой архив и нашёл задокументированные эксперименты в NeuroShell DayTrader Professional.
Помню даже публиковал их на некоторых форумах (2010 год), но в итоге
там темы настолько "засорились" в итоге, что их там уже довольно сложно
найти. Решил опубликовать их все здесь. Всего будет четыре части.
При построении нейронной сети для торговли мы сталкиваемся с рядом вопросов также, как и тогда, когда мы создаём торговую стратегию без использования нейронных сетей. Так как рынок всё время меняется нам нужно определить, какой период на графике нам взять для тренировки/обучения нейронной сети. Допустим, Вы выбрали высоковолатильный период и вот вопросы, которые должны возникнуть при этом выборе:
При построении нейронной сети для торговли мы сталкиваемся с рядом вопросов также, как и тогда, когда мы создаём торговую стратегию без использования нейронных сетей. Так как рынок всё время меняется нам нужно определить, какой период на графике нам взять для тренировки/обучения нейронной сети. Допустим, Вы выбрали высоковолатильный период и вот вопросы, которые должны возникнуть при этом выборе:
- Насколько высоковолатильный?
- Волатильность высокая эта проявляется, где, в тренде или во флэте?
- Если тренд, то куда вверх или вниз?
- Или вверх и вниз поочерёдно?
- Если флэт, какой размер диапазона в пунктах?
- Какое количество баров должен содержать этот период?
- На каком таймфрейме?
Посмотрим на график с дневными барами за последние полгода.
Весь период на графике это нисходящий
тренд. Но его можно разделить также на несколько участков разных типов.
Во всём этом движении можно увидеть три участка, которые отмечены
зелёным цветом. Именно за счёт этих трёх движений курс валютной пары
EURUSD опустился с уровня ~ 1.5170 до уровня, на котором находится
сейчас, ~ 1.2253. Это три краткосрочных тренда, которые сложились в один
долгосрочный. Два оставшихся типа относятся к боковым движениям, но
имеют небольшое отличие. Отличие это в размере диапазона, размахе, а
точнее в степени волатильности. Участки, которые отмечены красным имеют
размах 300 - 400 пунктов. Участки отмеченные синим цветом имеют размах
400 – 600 пунктов. На зелёных участках цена проходила расстояние от 700
до 1000 пунктов. Для каждого типа поведения рынка нужно построить
отдельную сеть, более подходящую для торговли в выгодном отношении.
Мы
рассмотрим торговлю с небольшим капиталом. Дневной график нам для этого
не подходит. Ошибки прогноза и как следствие потери будут в любом
случае, а на дневном таймфрейме они существеннее, чем на графиках с
пятиминутными барами. График с дневными барами необходим для общего
анализа рынка. Он более нагляден и на нём легче просматриваются участки
разных типов, как на рисунке выше.
Попробуем
построить торговую стратегию на пятиминутных барах. Торговля на этом
таймфрейме может принести даже больший доход, чем на дневном, но и
настроить её намного сложнее. Поэтому воспользуемся нейронными сетями и
генетическим алгоритмом для более быстрого подбора параметров и правил. В
исследовании будем использовать программный продукт компании Ward
Systems Group, Inc. – NeuroShell DayTrader Professional 5.6 beta.
Для
построения первой сети (сетей) выберем ближайший к текущей ситуации
период. Это синий прямоугольник под цифрой 2. Теперь нам нужно
рассмотреть этот участок на пятиминутном таймфрейме. Нужно также
определиться с количеством баров для тренировки сети. Рекомендуемое
количество от 200 до 2000 баров. Если взять неделю (5 дней) для
тренировки/обучения сети, то это будет 1440 пятиминутных баров, что
укладывается в рекомендуемый диапазон.
Вот так этот период выглядит на графике пятиминутного таймфрейма:
При построении сети рекомендуют
нормализовать входные данные. Вот что пишет об этом Уоссермен в своей
книге "Нейрокомпьютерная техника: Теория и практика":
Весьма желательно (хотя и не обязательно) нормализовать входные векторы перед тем, как предъявлять их сети. Это выполняется с помощью деления каждой компоненты входного вектора на длину вектора. Эта длина находится извлечением квадратного корня из суммы квадратов компонент вектора. В алгебраической записи:
Чтобы дойти до желаемого результата, нужно воспользоваться статистикой.
В нашем эксперименте для того, чтобы собрать статистику в итоге сформировались вот такие правила:
Статистика - это наука, обрабатывающая и изучающая количественные показатели чего либо, их соотношения и изменения в неразрывной связи с их качественным содержанием. Из собранной статистики нужно сравнить все результаты и выбрать наилучший.
В нашем эксперименте для того, чтобы собрать статистику в итоге сформировались вот такие правила:
- - В рамках одного эксперимента (в данном случае формула Уоссермена и скользящие средние в качестве компонент) для тренировки сети (сетей) нужно брать одну и ту же выборку. Допустим, это будет 5 дней. Это 1440 баров на пятиминутном таймфрейме. Это количество укладывается в рекомендуемый диапазон (200 - 2000). Мы хотим увидеть, насколько качественно сети будут обладать прогностическим свойством, получив на вход нормализованные данные (разные скользящие средние) на одной и той же выборке. При этом способы подачи этих данных разные. С линковкой и без линковки, фиксированные и обозначенные в определённый диапазон, проведённые через моментум, имея в длине вектора разное количество компонент.
- - Обязательно после тренировочной выборки понаблюдать, как сеть даёт прогноз и какой получается результат. Это делается сразу. Допустим, строим новый чарт и указываем от какого числа вывести данные на график. Например, сегодня 20 число любого месяца. Данные берём с 10 числа. Устанавливаем 5 дней для тренировки, а на остальных данных сеть покажет, какой результат получился бы, если бы мы торговали в реал-тайме.
- - Все настройки в Modify Parameters должны быть идентичны в рамках одного эксперимента.
- - Этот пункт необязательный, но для меня очень важен. Всем предикшенам нужно присвоить порядковый номер, имя и цвет. Имя даём такое, чтобы было понятно, что в сеть подавали на вход. Например, Pred #1 - FW 4 Avg или Pred #2 - FW 4 Avg NOT Links. От всех предикшенов нужно вывести Equity на один график идентичным цветом, именем и номером. Это для того, чтобы полученный результат был максимально понятен при его анализе.
В
качестве компонент использовались разные типы скользящих средних:
Simple Moving Average, JMA (от Чарикара, аналог Косицина), Ska_JMA (от
Клота). В результате после всех тестов наилучшие показатели дал вариант,
в котором использовались JMA. На рисунке показан результат:
Сеть тренировалась на периоде с 18 до 24
мая (24 включительно). Последующие 5 дней, в режиме реал-тайм, её
прогноз принёс доход в размере ~ 500 пунктов. После этого, начиная со
второго июня (отмечено жёлтой линией), рынок вошёл в более узкий
торговый коридор. Сеть стала давать прогноз хуже, так как для неё это
уже был незнакомый вид колебаний, отличающийся от того, что было на
периоде тренировки. Это изменение можно наблюдать падением кривой
капитала в течение двух дней на ~ 200 пунктов. Незнакомый период для
этой сети больше по своим качествам подходит к участкам, которые
отмечены красными прямоугольниками на первом рисунке. Для этих участков
нужно будет построить отдельные сети, которые будут лучше работать в
таких условиях.
Ниже подробно показано то, что подавалось на вход сети, а также настройки критериев для обучения.
Красным цветом выделен числитель. Синим цветом выделен знаменатель.
Momentum(Divide(
JMANSDT(Input; Period; Phase);
SqrRt(Add2(
Add2(
Mul2(JMANSDT(Input; Period; Phase); JMANSDT(Input; Period; Phase));
Mul2(JMANSDT(Input; Period; Phase); JMANSDT(Input; Period; Phase));
Add3(
Mul2(JMANSDT(Input; Period; Phase); JMANSDT(Input; Period; Phase));
Mul2(JMANSDT(Input; Period; Phase); JMANSDT(Input; Period; Phase));
Mul2(JMANSDT(Input; Period; Phase); JMANSDT(Input; Period; Phase)))))); Periods;
JMANSDT(Input; Period; Phase);
SqrRt(Add2(
Add2(
Mul2(JMANSDT(Input; Period; Phase); JMANSDT(Input; Period; Phase));
Mul2(JMANSDT(Input; Period; Phase); JMANSDT(Input; Period; Phase));
Add3(
Mul2(JMANSDT(Input; Period; Phase); JMANSDT(Input; Period; Phase));
Mul2(JMANSDT(Input; Period; Phase); JMANSDT(Input; Period; Phase));
Mul2(JMANSDT(Input; Period; Phase); JMANSDT(Input; Period; Phase)))))); Periods;
Это
реализация формулы Уоссермена, в которой в качестве компонент
фигурирует индикатор JMA. После того, как компоненты были нормализованы,
полученный индикатор был подан в качестве данных для индикатора
Momentum и далее, как один (первый) из пяти входов в нейронную сеть.
Диапазон
значений в длине вектора для каждой компоненты был выбран разный, по
возрастанию. А в качестве числителя в первом входе использовалась первая
из компонент, но в чистом виде. Схема выглядит так:
Числитель.
10-20;
Знаменатель.
10-20;
21-30;
31-40;
41-50;
51-70;
21-30;
31-40;
41-50;
51-70;
Диапазоны
числителя и первой компоненты знаменателя были связаны (залинкованы)
для того, чтобы генетический алгоритм подбирал значения синхронно. То
есть, например, если значение числителя выбирается 5, как наилучшее, то и
значение в первой компоненте знаменателя тоже 5.
Остальные
четыре входа были построены по этой же схеме с аналогичными значениями и
диапазонами для оптимизации. Отличие только в том, что у числителя во
втором входе диапазон значений соответствует диапазону значений второй
компоненты знаменателя. В третьем входе числитель соответствует третьей
компоненте знаменателя. И так далее для всех последующих входов в сети
соответствие сдвигается ниже на компоненту. После оптимизации наилучший
результат дал пятый вход. Для него были выбраны следующие параметры:
Momentum(Divide(
JMANSDT(Close; 64; 0);
SqrRt(Add2(
Add2(
Mul2(JMANSDT(Close; 19; 0); JMANSDT(Close; 19; 0));
Mul2(JMANSDT(Close; 25; 0); JMANSDT(Close; 25; 0));
Add3(
Mul2(JMANSDT(Close; 40; 0); JMANSDT(Close; 40; 0));
Mul2(JMANSDT(Close; 45; 0); JMANSDT(Close; 45; 0));
Mul2(JMANSDT(Close; 64; 0); JMANSDT(Close; 64; 0)))))); 27;
JMANSDT(Close; 64; 0);
SqrRt(Add2(
Add2(
Mul2(JMANSDT(Close; 19; 0); JMANSDT(Close; 19; 0));
Mul2(JMANSDT(Close; 25; 0); JMANSDT(Close; 25; 0));
Add3(
Mul2(JMANSDT(Close; 40; 0); JMANSDT(Close; 40; 0));
Mul2(JMANSDT(Close; 45; 0); JMANSDT(Close; 45; 0));
Mul2(JMANSDT(Close; 64; 0); JMANSDT(Close; 64; 0)))))); 27;
На графике это выглядит так, как показано на рисунке ниже. Кривая сиреневого цвета наш фаворит.
В индикаторе JMA параметр Phase в
оптимизации не участвовал. Изначально он был жёстко фиксирован в ноль.
Теперь, когда все остальные параметры подобраны для этого периода их
можно также, жёстко зафиксировать. А в дальнейшем, для более тонкой
настройки, использовать для оптимизации только параметр Phase.
В
итоге мы построили сеть, которая имеет достаточно хорошее
прогностическое свойство для периода, который обозначен на первом
рисунке, синим прямоугольником под цифрой 2. Возможно, она будет хорошо
работать в синем прямоугольнике под цифрой 1, а также в зелёных
прямоугольниках. Это нам ещё предстоит проверить.
В параметрах сети были выставлены следующие настройки:
Output – Percent Change in Open; 5 bars;
Inputs – Full Optimization;
Positions – Use the trading rules specified below; All 0;
Training – Maximize Net Profit; 10 hidden neurons;
Optimizations – 1 input;
Inputs – Full Optimization;
Positions – Use the trading rules specified below; All 0;
Training – Maximize Net Profit; 10 hidden neurons;
Optimizations – 1 input;
Построенной сети присвоим имя – Momentum; FW 5 JMA.
Построим
ещё две сети для этого же периода, но на этот раз используем другие
индикаторы или их модификации. На рисунке ниже показано, как была
организована структура для оптимизации:
В параметрах сети были указаны следующие настройки:
Output – Percent Change in Open; 3 bars;
Inputs – Full Optimization;
Positions – Use the trading rules specified below; All 0;
Training – Maximize Net Profit; 10 hidden neurons;
Optimizations – 3 input;
Inputs – Full Optimization;
Positions – Use the trading rules specified below; All 0;
Training – Maximize Net Profit; 10 hidden neurons;
Optimizations – 3 input;
В итоге получился вот такой результат:
На рисунке мы видим, что эта сеть
показала приблизительно такой же результат, как первая сеть. Но есть
отличия. Они заключаются в том, что сеть на участке для тренировки
подняла кривую Equity до уровня ~ 1200 пунктов, что в 2 раза больше, чем
у первой сети. После тренировки в режиме реал-тайм сеть принесла в
течение 5 дней ~ 700 пунктов, примерно на 100 пунктов больше, чем
первая сеть за тот период. И так же, как и в случае с первой сетью,
после 5 дней мы видим просадку на участке, когда рынок вошёл в узкий
ценовой коридор, приблизительно 200 пунктов. Также можно отметить, что
последняя сделка во время всплеска повышенной волатильности отбила
практически все потери за последние три дня.
На следующем рисунке видно, какой индикатор проявил себя лучше в этом испытании.
В ходе оптимизации был выбран пятый вход.
Он проявил себя на 98%. И второй вход, который осуществил всего лишь
2-ух процентный вклад для достижения общего результата. Все остальные
входы были проигнорированы оптимизатором. Поэтому для окончательного
завершения построения второй нейронной сети мы оставим два участвующих
входа и зафиксируем их настройки.
Второй построенной сети присвоим имя – Momentum & LTR Slope from JMA.
Теперь
перейдём к созданию третьей сети. Попробуем использовать на этот раз
немного другой способ для настройки сети и оптимизации параметров. В
этом способе будет участвовать метод бумажной торговли (Paper Trading).
Вот, что нужно знать об этом методе прежде, чем его использовать.
Paper trading. Если выбрать обе опции - "Save optimization which performs best on later paper trading" и "Start trading before last chart date",
то это позволит сохранить модель, которая работает лучше всего на
периоде бумажной торговли, но также дает выборку действительно реальных
данных, не участвовавших при оптимизации. Недостаток в том, что у Вас
будет устаревшая модель, по крайней мере, устаревшая на период выборки Out Of Sample
данных. Учитывая то, что рынок часто изменяется, и, подозревая, что
число статистиков, которые разбогатели на рынке, является весьма
небольшим, мы предлагаем, чтобы вы рассмотрели использование возможности
бумажной торговли без тестирования на реальных данных (опция "Start trading before last chart date"). Бумажная торговля сделана для того, чтобы не допустить оверфиттинга, и найти наилучшее решение для работы в будущем.
Приступим.
Для этой сети тоже используем набор других индикаторов, а точнее их
модификаций. Опытным путём подобрался "стек", как показано на следующем
рисунке.
В параметрах сети были указаны следующие настройки:
Output – Percent Change in Open; 3 bars;
Inputs – Parameter Search;
Dates - Save optimization which performs best on later paper trading;
Positions – Use the trading rules specified below; All 0;
Training – Maximize Net Profit; 10 hidden neurons;
Inputs – Parameter Search;
Dates - Save optimization which performs best on later paper trading;
Positions – Use the trading rules specified below; All 0;
Training – Maximize Net Profit; 10 hidden neurons;
В закладке Dates выбираем метод бумажной торговли и устанавливаем 5 дней для тренировки, а в закладке Inputs на этот раз была выбрана опция Parameter Search, так как с помощью этой опции получилось добиться лучшего результата.
Вот, что получилось в итоге:
Сеть тренировалась таким образом, чтобы
достичь наилучшего результата на участке, который отмечен оранжевым
цветом. Именно этот оранжевый участок был выделен для метода бумажной
торговли. В результате мы получаем результат, который приблизительно
равен результатам от предыдущих двух сетей. И так же, когда цена вошла в
узкий ценовой диапазон 2 июня, кривая Equity теряет стабильность в росте и местами даже терпит убытки.
На рисунке ниже показаны настройки, которые выбраны в ходе оптимизации, как наилучшие:
Каждый индикатор внёс свой достаточно
весомый вклад выраженный в процентах. Сохраним эти индикаторы и
зафиксируем настройки так, как выбрал их оптимизатор. Этой сети присвоим
имя – Dance with Volatility.
Теперь
у нас есть три сети, которые хорошо себя проявили на выбранном периоде.
Необходимо проверить, как эти сети с такими же настройками поведут себя
на других участках графика. Предположительно прогноз будет такого же
качества на участке, который отмечен синим прямоугольником под номером 1
и на участках, которые отмечены зелёными прямоугольниками. Попробуем
провести тест уже построенных сетей на синем участке под номером 1 и
сразу же на зелёном участке под номером 3. На этот раз для теста будет
открыта более широкая часть графика. Период будет содержать данные от 24
марта до 18 мая, вплотную к тому участку, на котором мы тренировали три
построенные сети. После того, как данные загружены нужно открыть на них
нашу первую сеть - Momentum; FW 5 JMA. Тест нужно провести на всей области с включенной опцией – No optimization, которая устанавливается на закладке Inputs. Результат показан на следующем рисунке.
Видно, что по крайней мере кривая Equity
не идёт целенаправленно вниз. На затенённых участках наблюдается
довольно стабильный рост Equity, но вся прибыль была поглощена
последующими резкими спадами. В итоге, до третьего затенённого участка
тестируемую область можно охарактеризовать, как устойчиво-нестабильный
период. Начиная с третьего затенённого участка кривая Equity начала
резко расти вверх. Если обратиться к рисунку, который показывает
результаты теста первой сети, который проводился на синем прямоугольнике
под номером 2, то там видно, что кривая Equity продолжила бы свой рост.
Это значит, что сеть "Momentum; FW 5 JMA" именно с
этими параметрами, даёт положительный результат на довольно длинном
отрезке графика. На более же удалённом отрезке, где рынок имел другой
характер поведения, сеть показала нестабильность, но не спад. Эту сеть
можно оставить для тестов на других участках графика.
Если
внимательно изучить уже рассмотренные участки, то видно, что размер
свечей в третьем зелёном прямоугольнике и втором синем прямоугольнике
существенно отличается от размера свечей в первом синем прямоугольнике.
Это говорит о том, что волатильность в первом синем прямоугольнике ниже,
чем в третьем зелёном и втором синем прямоугольниках, и мы неправильно
определили типы рассматриваемых участков. Измерим волатильность
индикатором ATR.
Теперь видно, что после того, как кривая индикатора ATR
с параметром 10 пересекла уровень в 160 пунктов, рынок вошёл в фазу
волатильности и в таком состоянии находится уже больше месяца. Этот
период отмечен серым прямоугольником. Период, который в бежевом
прямоугольнике, можно охарактеризовать, как период низкой волатильности.
Участок, который был до этого в синем прямоугольнике под номером 1,
находится в периоде пониженной волатильности. И именно на этом участке
наша первая сеть "Momentum; FW 5 JMA"не принесла
положительный результат с теми же настройками, которые были отмечены,
как наилучшие после тренировки сети на волатильном участке.
Необходимо
будет провести ещё один эксперимент, в котором нужно взять весь
волатильный участок и на нём натренировать сеть. После этого нужно найти
волатильный участок на старых исторических данных и на них посмотреть
качество тренированной сети. Повышенной волатильностью будем считать,
если кривая индикатора ATR пересечёт уровень 0.0160 (160 пунктов).
К новым экспериментам мы подойдём позже, а пока давайте посмотрим, как поведёт себя сеть "Momentum; FW 5 JMA", если её обучить на данных с низкой волатильностью. В тесте будет использоваться метод Paper Trading.
И на этот раз попробуем использовать большее количество свечей (около
3000), чтобы в отрезке для тренировки был и подъём и спад.
В этом тесте использовались те же диапазоны для оптимизации:
Как видно оптимизация сети не дала
интересного результата на участке с низкой волатильностью. А после того,
как рынок вошёл в фазу высокой волатильности, кривая Equity стабильно начала опускаться вниз.
В этом тесте использовались существенно расширенные диапазоны параметров для оптимизации, чем в предыдущем тесте:
На периоде для тренировки также
нестабильный результат. На периоде реал-тайм убытки, но на этот раз
меньше в 3 раза, чем в предыдущем тесте.
Очевидно, что сеть "Momentum; FW 5 JMA" подходит для торговли в периоды только с высокой волатильностью и не
обладает свойством универсальности (устойчивости). Посмотрим теперь,
какой результат покажет нам вторая наша сеть "Momentum & LTR Slope from JMA". Будем использовать те же методы, что и в предыдущем тесте.
Вот результат без оптимизации параметров:
На рисунке видно, что эта сеть так же,
как и в случае с первой сетью в период с низкой волатильностью не
приносила дохода. Но, можно отметить такие плюсы: нет резких перепадов,
переход в высоковолатильный период осуществился плавно, рост кривой Equity начался ещё до того, как кривая индикатора ATR
пересекла уровень 0.0160. Осталось проверить теперь, насколько
универсальна эта сеть. То есть, будет ли она приносить прибыль после
оптимизации параметров на низковолатильных периодах.
Вот, какой результат получился после оптимизации параметров:
Оптимизация не принесла положительного результата. Сеть "Momentum & LTR Slope from JMA" неспособна обучиться на низковолатильных периодах, чтобы впоследствии
приносить прибыль. Но в периоды высокой волатильности сеть проявляет
себя хорошо.
И наконец, чтобы завершить эксперимент №1, нам осталось посмотреть третью сеть - "Dance with Volatility", на этом же участке графика.
Вот результат без оптимизации:
Так же, как в результатах первой и второй сети по мере того, как волатильность увеличивалась, кривая Equity
тоже росла. 10 мая образовался провал размером 400 пунктов, который в
последующие дни был восстановлен прибыльными сделками. Попробуем
оптимизировать теперь эту сеть.
Вот какой получился результат:
В отличие от двух предыдущих сетей эту
можно будет попробовать протестировать на других участках с низкой
волатильностью, так как она показала наилучший результат.
На этом мы заканчиваем первую часть исследований.
Статьи из этой серии:
Дополнение (Add-ons) Turning Points - Часть 2
Разборки с волатильностью - Часть 3
***
Статьи из этой серии:
Дополнение (Add-ons) Turning Points - Часть 2
Разборки с волатильностью - Часть 3
Комментариев нет :
Отправить комментарий