Что подать на вход нейросети? Ваши идеи... - страница 50

 
Ivan Butko #:

На примере одного из сетов:

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

Оптимизация - год: 2021-2022, EURUSD H1

Cпасибо з а  ваши исследования и разработки (что делитесь ими)  - очень интересно... перечитывая (сам в теме), возникает желания с ними (НС) продолжить упражнения... :-)

 
Roman Shiredchenko #:

Cпасибо з а  ваши исследования и разработки (что делитесь ими)  - очень интересно... перечитывая (сам в теме), возникает желания с ними (НС) продолжить упражнения... :-)

Благодарю за отзыв. 

У меня ветка простейших НС, состряпанных на коленке, по простым статьям здесь, https://www.mql5.com/ru/articles/497, здесь посложнее https://www.mql5.com/ru/articles/5486, и эту иногда использую https://www.mql5.com/ru/articles/830

Советники, которые модифицирую под идеи – тоже оттуда. 

Несмотря на то, что уверенно-рабочего решения нет, опыты увлекают. 


Нейронные сети - от теории к практике
Нейронные сети - от теории к практике
  • www.mql5.com
В наше время, наверное, каждый трейдер слышал о нейронных сетях и знает, как это круто. В представлении большинства те, которые в них разбираются, это какие-то чуть ли не сверхчеловеки. В этой статье я постараюсь рассказать, как устроена нейросеть, что с ней можно делать и покажу практические примеры её использования.
 
Ivan Butko #:

Что ещё потенциально хорошо - так это интрадей размер сделок: они хотя бы не односвечные, а растягиваются иногда во времени. Кроме того, торгуются сделки в обе стороны, BUY и SELL. А то вечная проблема апроксимации(если правильно использую термин) НС — выбирает какие сделки больше всего зарабатывают - и постраивает веса под них. В итоге - если тренд на оптимизируемом учатске вниз, а треть его участка - вверх, то на форварде или бэке возникают глобальные проседания. 

Думаю это не извечная проблема аппроксимации, а извечная проблема классификации на выходном слое. Хорошо, что в данном случае не проявляется.

 
Andrey Dik #:

Думаю это не извечная проблема аппроксимации, а извечная проблема классификации на выходном слое. Хорошо, что в данном случае не проявляется.

А каков механизм явления?

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

Не все сеты, а именно в топе, которые вроде как самые важные. Запускаешь - а там одни селки. Хотя сеты, которые на дне - торгуют в обе стороны, но плохо. 

 
Ivan Butko #:

А каков механизм явления?

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

Не все сеты, а именно в топе, которые вроде как самые важные. Запускаешь - а там одни селки. Хотя сеты, которые на дне - торгуют в обе стороны, но плохо. 

Механизм тут достаточно прост.

Первый фактор: вижу, что обучение происходит на EURUSD, а на нём sell более прибыльны при прочих равных (неоднократно это замечал на различных ТС).

Второй фактор, более важный: в фитнес -функции не учитывается соотношение количества buy/sell, сигналы "скатываются" в сторону sell как более эффективных и в конечном итоге приводит к полному отсутствию buy (на других символах может быть скатывание в сторону buy).

Т.е., нужно разбираться чему именно обучается NN, и критерием её обучения всегда является фитнес-функция. Логичным шагом будет умножение кастомного критерия на отношение min/max, где min - минимальное количество сделок buy или sell и max - наоборот соответственно.

FF = Fcustom * MathMin (buys, sells) / MathMax (buys, sells);

Теперь видим, что если есть 100% перекос, то такая ФФ будет равна 0, и при прочих равных будет лучшим то значение, где количество направлений в обе стороны одинаково.

Это, конечно, не панацея, но попробовать обязательно стоит.

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

Что бы дополнительно стимулировать обучение в сторону бОльшего количества сделок можно дополнительно поступить так:

if (FF == 0) FF = -DBL_MAX;
 
Лазил на каком-то старом сайте, статье 10-ней давности про нейросети на форексе. 

Там предлагают подавать на вход... угол между Close N свечей назад и текущей ценой. 

Дичь какая-то, но мне нравится!


Пока ещё не пробовал, но обязательно попробую, как разберусь, как этот чертов угол находить




Второй вариант тоже с преподвыподвертом, только что придумал:

Цена может опускаться или подниматься две свечи подряд. Обычно это означает подачу на входы рядом идущие нормированные числа. 

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

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

Дополнительный вход будет отражать ускорение - если оно есть, то больше от 0 до 1, если затухает, то от 0 до -1.
 
Ivan Butko #:
Пока ещё не пробовал, но обязательно попробую, как разберусь, как этот чертов угол находить

Считайте в процентах - от нуля до цены открытия текущего бара - по сути аналог будет.

 
Aleksey Vyazmikin #:

Считайте в процентах - от нуля до цены открытия текущего бара - по сути аналог будет.

Благодарю за ответ, помозгую
 

Единственное на моей памяти переобучение, которое работает. 

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

Бэктест завален (который сзади, вне оптимизации), на других парах и периодах повторить не удалось. Пока. Так что спишем на забавную аномалию EURUSD. 

В то же время и сделки огромные, аж интрадей, спред никак не влияет (Зиг же неповоротливый и неторопливый). Эх, мечта


 

Удалось разобраться, как подать угол на вход


Из преимуществ ничего не скажу, результаты разные у разных терминалов. Как будто зависит от котировок, спредов и комиссий. 

Но определённо лучше приращений цен. 

Отмечу одну особенность: высокие значения угла говорят не о сильном или долгом тренде, а об импульсе - крайне резком, большом и краткосрочном скачке или проваливании цены. В то время, как нормированное окно (другой вид входных данных) даже при крайне остром угле (почти флетовом движении) будет показывать высокие значения, если последняя цена - выше всех остальных. 

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

В общем, есть ещё пища для размышлений насчёт угла. 


    int i = 0;
    double radians, angle, C1, C5, C20, C80;
    
    C1  = iClose(NULL, PERIOD_CURRENT, 1);  
    C5  = iClose(NULL, PERIOD_CURRENT, 5); 
    C20 = iClose(NULL, PERIOD_CURRENT, 20); 
    C80 = iClose(NULL, PERIOD_CURRENT, 80);   
    
    radians = atan(   ((C1 - C5) / _Point) / 5);   // Вычисляем арктангенс высоты к длине основания в радианах
    angle = radians * 180 / M_PI / 90;             // Конвертируем радианы в градусы и преобразуем в диапазон [-1..1]
    inputs[i] = angle;       i++; 
    
    radians = atan(   ((C1 - C20) / _Point) / 20); 
    angle = radians * 180 / M_PI / 90; 
    inputs[i] = angle;       i++; 
    
    radians = atan(   ((C1 - C80) / _Point) / 80); 
    angle = radians * 180 / M_PI / 90; 
    inputs[i] = angle;       i++;  

    //  Print("Угол: ", angle, " градусов");
Причина обращения: