Скачать MetaTrader 5

Поиск набора индикаторов для подачи на входы в нейросеть. Дискуссия. Инструмент оценки результатов.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
iliarr
134
iliarr  

Приветствую всех участников и посетителей форума.


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

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


У меня есть самописный (на java) персептрон с произвольным количеством слоев и нейронов в каждом слое обучаю его генетическим алгоритмом из библиотеки JGAP (http://jgap.sourceforge.net/).

В первом слое количество нейронов равно количеству входов.Во втором слое - произвольно, в 3-м слое - 1 нейрон. Нейросеть выдает торговые сигналы ( Выход нейросети >0.5 - покупка, Выход нейросети<-0,5 - продажа ). сигналы отрабатывает самописный торговый тестер, который по сигналу нейросети разворачивает позицию ( или входит в рынок, если открытых позиций нет). Целевая функция генетического алгоритма - итоговая прибыль. Подобный подход, как мне кажется, позволяет минимизировать все возможные ошибки и максимально приблизить обучение к реальной торговле. Обученную сеть экспортирую в советника MQL4 и проверяю работу на тестере стратегий MT4. Входы для нейросети формирую в индикаторе МТ4 и выгружаю в файл.Индикатор и советник формирует программа и записывает в файлы ( так меньше путаницы и меньше ошибок).

по моим наблюдениям, 4-х слойные сети не дают больше прибыли (обычно меньше) чем 3-х слойные, но дольше обучаются.
я обучал сеть 8-10-1 4 дня на Core2 Quadro 2.3. 10 параллельных потоков с различными начальными популяциями соревнуются между собой "у кого больше прибыль". за 4 дня прошло около 4000 поколений при 200 хромосомах в популяции. Максимальная прибыль была поучена в первые 2000 поколений, дальше, прибыль не увеличивалась. Наибольший прирост прибыли был в первые 100 поколений.

Я посмотрел результаты этой сети в тестере стратегий MT4. Обнаружилось, что сеть почти никогда не достигает порога +-0,5 и торговый сигнал не срабатывает. Причину я не понял т.к. правильность экспорта в MQL4 я проверял ( при одинаковых значениях входов в программе на java и на MQL4, сеть выдает одинаковые значения. может,надо было подать весь входящий поток, а не несколько произвольных значений ). Снизил порог до 0,4 и, вроде, заработало... Дальше, обнаружил, что советник не может в 1 заход развернуть позицию... у меня эксперт срабатывает по закрытию бара и до следующего бара цена успевает уйти. но это тоже не столь важно... На периоде обучения (я учу на с 1-08-09 по 1-10-09) прибыль в MT4 была меньше чем в моем тестере, на проверочном периоде в МТ4 ( с 1-10-09 по 1-11-09), сеть была прибыльной. Я посмотрел в какие моменты происходят убыточные входы и у меня сложилось впечатление что входящие в нейросеть данные несут в себе недостаточно информации...

На вход нейросети подавал: (k=100)

a[0]=(iMA(NULL,0, 13,0,MODE_EMA,PRICE_CLOSE,i)-Close[i])*k;
a[1]=(iMA(NULL,0, 21,0,MODE_EMA,PRICE_CLOSE,i)-Close[i])*k
a[2]=(iMA(NULL,0, 34,0,MODE_EMA,PRICE_CLOSE,i)-Close[i])*k
a[3]=(iMA(NULL,0, 55,0,MODE_EMA,PRICE_CLOSE,i)-Close[i])*k
a[4]=(iMA(NULL,0, 89,0,MODE_EMA,PRICE_CLOSE,i)-Close[i])*k
a[5]=(iMA(NULL,0, 144,0,MODE_EMA,PRICE_CLOSE,i)-Close[i])*k*0.9;
a[6]=(iMA(NULL,0, 233,0,MODE_EMA,PRICE_CLOSE,i)-Close[i])*k*0.8;
a[7]=(iMA(NULL,0, 377,0,MODE_EMA,PRICE_CLOSE,i)-Close[i])*k*0.6;
Как работают индикаторы я себе представляю, но не понимаю их и рынок на столько, чтобы самостоятельно отобрать минимальное количество индикаторов, которые будут отображать состояние рынка...

Я стал искать на форуме и нашел (автора поста из которого я взял идею, к сожалению, не запомнил ):

a[0]=(iMA(NULL,0, 3,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0, 5,0,MODE_EMA,PRICE_CLOSE,i))*200;
a[1]=(iMA(NULL,0, 5,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0, 8,0,MODE_EMA,PRICE_CLOSE,i))*200;
a[2]=(iMA(NULL,0, 8,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0, 13,0,MODE_EMA,PRICE_CLOSE,i))*200;
a[3]=(iMA(NULL,0, 13,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,i))*150;
a[4]=(iMA(NULL,0, 21,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0, 34,0,MODE_EMA,PRICE_CLOSE,i))*150;
a[5]=(iMA(NULL,0, 34,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0, 55,0,MODE_EMA,PRICE_CLOSE,i))*150;
a[6]=(iMA(NULL,0, 55,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0, 89,0,MODE_EMA,PRICE_CLOSE,i))*140;
a[7]=(iMA(NULL,0, 89,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0, 144,0,MODE_EMA,PRICE_CLOSE,i))*130;
a[8]=(iMA(NULL,0, 144,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0, 233,0,MODE_EMA,PRICE_CLOSE,i))*120;
учил в 10 потоков, 200 поколений, размер популяции 200 за период с 1-08-09 по 1-10-09 (результаты выдает мой тестер на java):
сеть 9-10-1 : прибыль 10521
сеть 9-20-1 : прибыль 10434
сеть 9-30-1 : прибыль 10361
сеть 9-50-1 : прибыль 10059
результат хороший, но с предыдущем вариантов, вроде, лучше было... надо будет поставить с пердыдущими входами (результаты прошлых обучений я не сохранил)

добавочные множители нужны для приведения значений в диапазон от -1 до +1


Прочитав написанное, задумался о возможной ошибке в экспорте обученной нейросети в советник.Надо будет еще потестировать...

P.S. Сейчас пишу рекуррентную нейросеть произвольной структуры (как я понимаю, рекуррентная нейросеть учитывает не только значение, но и угол наклона).

Alexey
1365
Alexey  

Проблема близкая к вашей . Подход другой .

Генетик из меня еще хуже чем инженер, но суть примерно понимаю .

Позволите немного вопросов, целевая функция максимизации счета имхо не самый лучший вариант . Если правильно понял,из приведенного примера - вы собираетесь перебирать некоторое множество систем, в вашем случае 9 ну еще на вскидку оптимизия стопов профитов + еще фантазии итого по минимуму на одну систему ( здесь использование индикатора ) набегает по самому минимуму сотни две три возможных вариантов . Не получится такого что перебирая варианты внутри машек скажем CCI или RSI вообще выпадут из виду . Далее имеем волшебный индикатор для текущего момента . Пусть это будет mov(20)-mov(10) > < 0 . Как оценить или хотя бы прикинуть сколько еще продлится благополучная ситуация .

RIP
343
RIP  
iliarr >>:

У меня есть самописный (на java) персептрон с произвольным количеством слоев и нейронов в каждом слое обучаю его генетическим алгоритмом из библиотеки JGAP (http://jgap.sourceforge.net/).

Как вы проводите обучение? Распишите пожалуйста алгоритм обучения.

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

Artem Titarenko
4090
Artem Titarenko  

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

Рекомендую перейти к стандартному решению задач прогнозирования с помощью нс-ей.

iliarr
134
iliarr  
rip >>:

Как вы проводите обучение? Распишите пожалуйста алгоритм обучения.

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

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

ivandurak >>:

Проблема близкая к вашей . Подход другой .

Генетик из меня еще хуже чем инженер, но суть примерно понимаю .

Позволите немного вопросов, целевая функция максимизации счета имхо не самый лучший вариант . Если правильно понял,из приведенного примера - вы собираетесь перебирать некоторое множество систем, в вашем случае 9 ну еще на вскидку оптимизия стопов профитов + еще фантазии итого по минимуму на одну систему ( здесь использование индикатора ) набегает по самому минимуму сотни две три возможных вариантов . Не получится такого что перебирая варианты внутри машек скажем CCI или RSI вообще выпадут из виду . Далее имеем волшебный индикатор для текущего момента . Пусть это будет mov(20)-mov(10) > < 0 . Как оценить или хотя бы прикинуть сколько еще продлится благополучная ситуация .

к сожалению, искать оптимальные индикаторы перебором у меня нет вычислительных ресурсов (сеть 9-10-1 в 10 потоков, 200 поколений, размер популяции 200 за период с 1-08-09 по 1-10-09 учится больше часа, хотя в ней количество весов нейронов (длинна вектора который подбирает генетический алгоритм) = 181 ).

мне нужен набор индикаторов, которые отражают ситуацию на рынке. индикаторы должны быть простые, желательно, стандартные МТ4 (вопрос реализации и возможных ошибках) их там всего 30. нет цели чтобы индикаторы давали информацию куда пойте рынок. надо чтобы они вытаскивали из колебаний цены как можно больше информации.


нравится мне здесь... думаю как и что написать, формулирую, и появляется больше понимания... спасибо форуму и Вам, ivandurak . :)

RIP
343
RIP  
iliarr >>:

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

Вот я как раз об этом же ...


Как вы формируете вектор который потом передаете в JGap, это просто вектор значений W или это кодированные значения W.

Что представляет собой целевая ф-ция. Могу привести пример - если в качестве целевой ф-ции брать ф-цию E[i](t) = D[i](t) - Y[i](t), где Е - ошибка, D - значение ожидаемое на выходе, Y - значение полученное при подачи обучающей выборки X, i - норме нейрона, t - номер эпохи. То НС учиться по одному, если взять E[i](t) = Sign(D[i](t) - Y[i](t))*(D[i](t) - Y[i](t))^2 на ряде задач, результат значительно лучше. Скажем если сформировать ряд отражающий аттракторы классических динамических систем (Лоренца, Хенона, Рёсслера,..), то можно даже натренировать сеть аппроксимировать такие данные, не глубоко но все же.


С рядами сформированными с котировок валют не пробовал :) ибо считаю это дело безрезультатным :)

ilyaa
656
ilyaa  
С помощью подобной конструкции можно добиться практически вертикальной евити без просадок. Вы будете решать вопрос с переобучением у нейронки?
RIP
343
RIP  
IlyaA >>:
С помощью подобной конструкции можно добиться практически вертикальной евити без просадок. Вы будете решать вопрос с переобучением у нейронки?

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

ilyaa
656
ilyaa  
rip >>:

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


  согласен. он работает с черным ящиком. переобучение весьма вероятно. Уважаемый iliarr можно опубликовать график обучения.
Andrey Dik
12223
Andrey Dik  
iliarr >>:.............

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

Ещё один момент.

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

Ищите способ определения размера SL и TP с помощь NN, и способы сопровождения открытых позиций. Открываться можно и случайным образом.


StatBars писал(а) >>

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

Рекомендую перейти к стандартному решению задач прогнозирования с помощью нс-ей.

ГА всего лишь инструмент оптимизации (отвертка для машины). С минимальными различиями можно использовать его или любой другой алгоритм оптимизации (отвертки).

Ruslan
165
Ruslan  

здравствуйте

всегда интересно было узнать про НС но как только начинаю читать какую нить литературу на эту тему просто голова начинает кипеть и в итоге никак не могу даже понять что же такое НС

не могли бы вы на простом примере (так сказать на пальцах) обьяснить что же это такое

Спасибо

12345678...10
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий