Нейросеть мультиперцептронная

 

Добрый день всем!

Вот долго пытался "изобрести велосипед", да что-то не очень удачно.

В общем нашёл в инете код достаточно объемной перцептронной неросети. Перевёл её в MQL-4.

Нейронка сама по себе вроде работает. Вот только никак не могу подобрать более-менее нормальные входные данные.

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

Поэтому и выкладываю.


Сеть подразделяется на 12 отдельных самостоятельных типов:

//--------------------------------------------

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

- без скрытых слоев
- с одним скрытым слоем
- с двумя скрытыми слоями
//--------------------------------------------

В качестве функции активации скрытых слоев используется гиперболический тангенс.

диапазон значений выходного слоя имеет вид: (B, +INF) если D>=0, или (-INF, B), если D<0.,

- без скрытых слоев.
- с одним скрытым слоем
- с двумя скрытыми слоями
//--------------------------------------------
В качестве функции активации скрытых слоев используется гиперболический тангенс.
диапазон значений выходного слоя равен [A,B] (используется гиперболический тангенс в сочетании со сдвигом/машстабированием).
- без скрытых слоев.
- с одним скрытым слоем
- с двумя скрытыми слоями
//--------------------------------------------
// Нейронная сеть-классификатор.
- без скрытых слоев.
- с одним скрытым слоем
- с двумя скрытыми слоями

//--------------------------------------------

// Инициализация структуры НС
   switch(Structur){
//--------------------------------------------
// В  качестве  функции активации скрытых слоев  используется  гиперболический  тангенс,  выходной  слой линейный.
      case 0:  { MLPCreate0( NIn,NOut,Network );                Simple=0; break; }   // без скрытых слоев
      case 1:  { MLPCreate1( NIn,NHid,NOut,Network );           Simple=0; break; }   // с одним скрытым слоем
      case 2:  { MLPCreate2(NIn,NHid1,NHid2,NOut,Network);      Simple=0; break; }   // с двумя скрытыми слоями

//--------------------------------------------
// В  качестве  функции активации скрытых слоев  используется  гиперболический  тангенс.
// диапазон значений выходного слоя имеет вид: (B, +INF) если D>=0, или (-INF, B), если D<0.,                                                            
      case 3:  { MLPCreateB0(NIn,NOut,B,D,Network);             Simple=0; break; }   // без скрытых слоев.
      case 4:  { MLPCreateB1(NIn,NHid,NOut,B,D,Network);        Simple=0; break; }   // с одним скрытым слоем
      case 5:  { MLPCreateB2(NIn,NHid1,NHid2,NOut,B,D,Network); Simple=0; break; }   // с двумя скрытыми слоями

//--------------------------------------------
// В  качестве  функции активации скрытых слоев  используется  гиперболический  тангенс.
// диапазон значений выходного слоя равен [A,B] (используется гиперболический тангенс в сочетании со сдвигом/машстабированием).
      case 6:  { MLPCreateR0(NIn,NOut,A,B,Network);             Simple=0; break; }   // без скрытых слоев.
      case 7:  { MLPCreateR1(NIn,NHid,NOut,A,B,Network);        Simple=0; break; }   // с одним скрытым слоем
      case 8:  { MLPCreateR2(NIn,NHid1,NHid2,NOut,A,B,Network); Simple=0; break; }   // с двумя скрытыми слоями

//--------------------------------------------
// Нейронная сеть-классификатор.
      case 9:  { MLPCreateC0(NIn,NOut,Network);                 Simple=0; break; }   // без скрытых слоев.
      case 10: { MLPCreateC1(NIn,NHid,NOut,Network);            Simple=1; break; }   // с одним скрытым слоем
      case 11: { MLPCreateC2(NIn,NHid1,NHid2,NOut,Network);     Simple=1; break; }   // с двумя скрытыми слоями
//--------------------------------------------
      default: Alert("Структура НС не задана");                return(0);
   }


Каждый тип - полностью самостоятельный. Просто нужно из всех перечисленных выбрать один какой-нибудь.

К тому же каждый из типов может быть различной инициализацией - Експотенциальный МЛП или Линейный МЛП

switch(Simple){
      case 0 : MLPTrainNSimple(Network,X,Size,Decay,Restarts,Rep); break;   // Експотенциальный МЛП
      case 1 : MLPTrainSimple(Network,X,Size,Decay,Restarts,Rep);  break;   // Линейный МЛП
      default: return(0);


Т.е. вообще-то различных видов нейронок здесь представлено - 24.


НС обучается на исторических данных - 1000 баров во время инициализации советника. Можно сделать и больше, но только советник начинает очень сильно тормозить.

В процессе работы - через каждые 1000 баров - советник автоматически переобучается.


Для упрощения оптимизации ввёл систему семафоров:

extern int flag1 = 0;    // - флаг семафора № 1 
extern int flag2 = 0;    // - флаг семафора № 2 
extern int flag3 = 0;    // - флаг семафора № 3 
extern int flag4 = 0;    // - флаг семафора № 4 
extern int flag5 = 0;    // - флаг семафора № 5 
extern int flag6 = 0;    // - флаг семафора № 6 
extern int flag7 = 0;    // - флаг семафора № 7 
extern int flag8 = 0;    // - флаг семафора № 8 
extern int flag9 = 0;    // - флаг семафора № 9 
extern int flag10 = 0;    // - флаг семафора № 10 
//--------------------------------------------
bool f1 [16];        // - массив флагов
bool f2 [16];        // - массив флагов
bool f3 [16];        // - массив флагов
bool f4 [16];        // - массив флагов
bool f5 [16];        // - массив флагов
bool f6 [16];        // - массив флагов
bool f7 [16];        // - массив флагов
bool f8 [16];        // - массив флагов
bool f9 [16];        // - массив флагов
bool f10 [16];        // - массив флагов
Идея заключается в том, что меняя цифровой код семафора включаются или запираются отдельные индикаторы.


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

Думаю всё дело во входных данных. Может кто по этому поводу поделится своим видением вопроса?


Файлы:
kedr.rar  41 kb
 

Неужели ещё остались те кто верит нейронкам здесь? Нейронки нуждаются в оптимизации. При достаточном количестве входных данных, оптимизация приведёт к невероятно большой прибыльности. Но при проверке на реале всё сольётся. Сами подумайте. Начимаем разработку эксперта с идеи. Идея показывает посредственные результаты. Начинаем добавлять разные фильтры чтобы уменьшить количество убыточных сделок. Потом начинаем полировать эти фильтры чтобы получить лимон из одного доллара в течении года. Ураааа! Получилось! Ставим на реал, депозит быстренько сливается.

Смотрите на торговлю на форексе как на математическую задачу с определённым количеством входных данных (машки, их периоды, трайлинг стопы, и т.п.) и опредённым количеством выходных данных (прибыльные и убыточные сделки). Можно ли найти такие входные данные чтобы полностью исчезли убыточные сделки? Конечно можно. И попугая можно научить говорить. Вот только оратором он никогда не станет.

 
gpwr писал(а) >>

Неужели ещё остались те кто верит нейронкам здесь?

gpwr, то что вы утверждаете в своём сообщении, есть результат полученный вами в процессе накопления и анализа знаний по данной теме... т.е. другими словами, результат работы вашей биологической Нейронной Системы (мозк). Теперь, задайте себе вопрос: "Верю ли я нейронкам?" и попробуйте на него корректно ответить.

 
gpwr >>:

Неужели ещё остались те кто верит нейронкам здесь?


Вопрос вовсе не в вере, а в умении

Знаете поговорку: плохому танцору и я..ца мешают

 
Neutron писал(а) >>

gpwr, то что вы утверждаете в своём сообщении, есть результат полученный вами в процессе накопления и анализа знаний по данной теме... т.е. другими словами, результат работы вашей биологической Нейронной Системы (мозк). Теперь, задайте себе вопрос: "Верю ли я нейронкам?" и попробуйте на него корректно ответить.

Конечно я верю нейронкам, если мы говорим в общем смысле. Вопрос "нужен ли мозг?" имеет простой ответ - да. Вопрос "способна ли нейронная сеть принести стабильную прибыль на форексе?" совсем другой и не имеет однозначного ответа. Нейронная сеть ни что иное как нелинейная математическая модель поведения цен в прошлом. Любую математическую модель можно подогнать под прошлые цены при достаточном количестве входных данных. Применение такой модели для предсказания будущего основано на предположении что рыночные цены имеют скрытую периодичность и закономерность (random walk vs deterministic behavior). Вы должны согласиться что применение нейронной сети или другой математической модели к рынку подразумевает закономерность и предсказуемость рынка. Я лично не отрицаю возможность предсказывания цен, но не путем накладывания многих ограничений (уменьшением степеней свобод) как в нейронках или линейном предсказании.

Теоретически можно создать прибыльную торговую систему не используя никаких индикаторов. Возьмите произвольный момент времени и спросите "какова вероятность того что цена на данный момент никогда не повториться в будущем?" Если предположить что валютные цены совершенно случайны, то это предположение отвергает бесконечный тренд в одном направлении и сегодняшняя цена должна повториться когда-нибудь. В противном случае у нас на лицо бесконечный тренд и те кто торгует по этому тренду становятся бесконечно богатыми, а те кто против него - бедными (если у них конечно нет мозгов). Теперь, зная что сегодняшняя цена должна повториться в будущем, можно смело торговать в любом направлении. При правильном выборе размера лота, предотвращающего маржин колл, даже первоначально убыточная сделка в конце концов изменит направление и вы можете её закрыть с нулевым убытком когда цена вернётся на тот же уровень. Конечно так прибыль не заработаешь. Поэтому успешная торговая система должна постоянно менять направление сделки если первоначально выбранное направление окажется убыточным. При правильных трейлинг стопах можно ожидать прибыль. Многие эксперты здесь как раз так и торгуют: они выбирают какие-нибудь индикаторы (слава Бога их сотни), колдуют над их параметрами, не подозревая что прибыльность тайминга от этих индикаторов такой же как и у случайного тайминга. Прибыльность эксперта в конце-концов зависит от выбранной системы открытия и зкарытия позиций (т.е. открывай позиции маленькими лотами и добавляй если выбрал правильное направление, а при изменении направлении всё закрывай на трейлинге).

Кстати, кто-нибудь задумывался зачем столько много индикаторов чтобы описать одну и ту же time series? Они же все коррелированы междо собой - MA MACD A/D RSI OBV MFI и т.п. - и никакй новой информации не добавляют если у них один и тот же период.

 

gpwr, мне интересно узнать ваше мнение.

Как вы считаете, можно ли статдостоверно зарабатывать на случайном процессе (допустим, временном ряде построенном путём прибавления случайной величины с нулевым матожиданием к предыдущему значению ВР), если спред=0? Вопрос не праздный, ведь кажется, достаточно тонко и продумано открывать и закрывать позиции чтобы обыграть рынок (например, открывай позиции маленькими лотами и добавляй если выбрал правильное направление)...

 
gpwr >>:

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

и даже практически, вот здесь пример 'Функция MathRand()'

и даже без индикаторов в целом устойчивее

 
Neutron >>:

Как вы считаете, можно ли статдостоверно зарабатывать на случайном процессе (допустим, временном ряде построенном путём прибавления случайной величины с нулевым матожиданием к предыдущему значению ВР), если спред=0? .

и даже если спред не равен 0, то и в этом случае можно зарабатывать на случайном процессе, см. ссылку выше

 

Зачем смотреть ссылку? Ссылка уже не нужна...

Это как с вечным двигателем - заявки не принимаются и не рассматриваются!

 
blend >>:

и даже практически, вот здесь пример 'Функция MathRand()'

и даже без индикаторов в целом устойчивее

в этой ветке много красивых картинок,но там ни слова не говорится о просадке   такого советника 

 
budimir >>:

в этой ветке много красивых картинок,но там ни слова не говорится о просадке   такого советника 

средняя просадка с начальным депо 10000$ на 1000 проходов 24%  или 3000$

скорее всего в оптимизаторе вычисляется относительная просадка

среднее матожидание = 8