Рыночный этикет или правила хорошего тона на минном поле - страница 84

 

Neutron спасибо за присланную диссертацию


Так же спасибо за поднятую тему и конструктив

Мне удалось на данный момент реализовать нечто похожее с использование SSAS (к сожалению, прочитал и эту ветку и диссертацию только сегодня),

возможно к.н. почерпнет полезное из этого:

1. Класстеризем внутредневной диапазон на несколько кластеров по ср. величине Н1-свечи на основании них сутки разбмваюся на временные интервалы (ВИ)

(в основном 2 кластера и 2 ВИ, но на одной йенновой паре получилось 4 кластера и 7 ВИ)

2. Для каждого инструмента и ВИ создаются модели:

- кластеризации предшествующих движений вверх и вниз отдельно по двум вх. параметрам: цена и время

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

- прогностические модели:
-- наивный байес

-- асс. правил

-- правила взаимосвязи

-- НС

-- дерево решений

3. На основании минимального отклонения от экстремума строится зигзаг - получаем кусочно-монотонную ф-ю и, соответственно, паттерны из N отрезков.

4. Обучаем соответствующие модели класстеризации и класстеризуем отрезки

5. Вычисляем прогностический горизонт паттерн как долю от длины паттерны или фикс. длины или до ближайшего кратного большего доли от длины паттерны

6. Вычисляем и класстеризуем «прогноз»

7. Обучаем прогностические модели

В ходе работы советник подгружает данные в MS SQL и периодически выдает запрос на определение точек зигзага и прогнозы. Получив их, проводит анализ величин их поддержки и достоверности правил. На основании сравнения принимает решение.


Преимущества:

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

- в самих моделях возможен выбор различных методов

Недостатки:

- меньшее количество параметров для настройки моделей

- ресурсоемкая работа MSSQL

- отсутствие научного труда в основе (поправим, вкл. выводы упомянутого диссера)


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

очень хочется задать вопрос всем читающим данную ветку

о целесообразности использования для кластеризации отрезков кусочно-монотонной доп. входов таких как объем, маркет-дельта и пр.

Возможно, они могут играть дополнительную, например, фильтрующую роль.


С.Привалову: По сути дела в этой работе (диссере) определяется методика создания паттерн для прогноза.

Имхо, это то, о чем мы говорили – например, при получении прогноза по асс. правилам можно задавать количество N кусков паттерны и запрашивать различное кол-во прогностических шагов вперед и получить их с различными поддержками и достоверностями – т.е. мы получаем модель, которую можно заложить в основу прогноза.

Как ты думаешь, возможно ли/как применить к ним Твою идею использования ф.Кальмана?

Имея модель/-и было бы интересно его пообучать под них.


Так выглядят модели в SSAS, для данного инструмента было выявлено 3 ВИ

Вот здесь http://www.fxexpert.ru/forum/index.php?showtopic=656 есть библиотеки сеток, в том чиле на mql и пр. полезности.

 

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

Вообщем, после обучения такой 20-2-1 сети, у меня получаются такие входные веса двух скрытых нейронов:

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


Вообщем, такая двуслойная сеть ведёт себя так же как и простая однослойная сеть (АР модель). С таким заключением, я зашёл в тупик. Получается что нейронные сети годны только для классификации, т.е. когда выход имеет только два значения: да или нет. Попытка использования сети для предсказания цен приводит к таким же результатам как и АР модель так как выходы нейронов не насыщены и их нелинейная функция активации играет малую роль даже если нормировать входные данные под -1...+1. Пойду попью пивка - может новые мысли появятся (например, подавать +1 и -1 на входы сети?)

 
M1kha1l писал(а) >>

Мне удалось на данный момент реализовать нечто похожее с использование SSAS (к сожалению, прочитал и эту ветку и диссертацию только сегодня),

Вот здесь http://www.fxexpert.ru/forum/index.php?showtopic=656 есть библиотеки сеток, в том чиле на mql и пр. полезности.

Спасибо, M1kha1l, за добрые слова и за то, что решил плделиться накопленными знаниями.

Для осмысления твоего поста необходимо определённое время. Вчитываюсь.

gpwr писал(а) >>

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

Великолепная работа, gpwr, у меня даже мысли не возникало глянуть на веса паралельных нейронов!

Давай, посмотрим на процес уменьшения ошибки обучения (красным) и ошибки обобщения (синим) для многослойной НС в процесе обучения:

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

Те данные, которые ты привёл, говорят о преобучении сетки и как следствие - синхронной работе всех её нейронов в скрытом слое. Произошло вырождление многослойной НС до линейного персептрона!

 
Neutron >>:

Спасибо, M1kha1l, за добрые слова и за то, что решил плделиться накопленными знаниями.

Для осмысления твоего поста необходимо определённое время. Вчитываюсь.

Великолепный работа, gpwr, у меня даже мысли не возникало глянуть на веса паралельных нейронов!

Давай, посмотрим на процес уменьшения ошибки обучения (красным) и ошибки обобщения (синим) для многослойной НС в процесе обучения:

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

Те данные, которые ты привёл, говорят о преобучении сетки и как следствие - синхронной работе всех её нейронов в скрытом слое. Произошло вырождление многослойной НС до линейного персептрона!

Моей сети было подано 300 обучающих примеров при количестве весов 45. В литературе существует мнение что при кол-ве обучающих примеров в 5 раз превышающих кол-во весов, сеть с 95% вероятностью будет обобщённой. Т.е. моя сеть должна иметь хорошое обобщение согласно теории, но на самом деле это не так. Поэтому и приводил примеры чтобы подтвердить это. Я так думаю что дело тут в не том чтобы ещё больше взять обучающих примеров. Дело тут в характере задачи, которую я заставляю сеть решить. Если пытаться заставить сеть предсказать размер следующего шага цены, то при обучении она будет стремиться к таким весам, при которых нейроны работают в линейной области функции активации чтобы сохранить пропорциональность между предсказываемом шагом и входными прошлыми шагами. То есть задача сама по себе линейная. При таком положении дел, добавка скрытых нейронов ничего не улучшит. Да и сам скрытый слой становится ненужным. Путём экспериментов с моей сетью, я пришёл к выводу что однослойка работает также хорошо как и двуслойка. По-моему, читая ваши прошлые посты на этой ветке, вы тоже пришли к такому же выводу для EURUSD.

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


 

Я-то хотел отметить, что суть обнаруженного эффекта, возможно, объясняется преобученностью НС из-за избыточного количества обучающих эпох, и должен существовать оптимум по числу обучающих эпох Nopt (см. рис. выше), зависящий от коэффициента скорости обучения. Я не говорил о том, что нужно "...ещё больше взять обучающих примеров. ", это суть проблема оптимальной длины обучающей выборки Рopt=w*w/d. Теория именно это утверждает, а не то, что при "...кол-ве обучающих примеров в 5 раз превышающих кол-во весов..." .

Мы говорим с вами о разных причинах, приводящих к эффекту переобученности сети.

Я согласен с вами, что задача предсказания знака и амплитуды следующего бара носит преимущественно линейный характер и ничего другого тут быть не может. Рынок прост в свой основе как лом и непредсказуем как прогноз погоды. Хотя, чуть позже, я выложу сравнительные результаты по качеству предсказания на часовых барах для однослойной, двуслойной с двумя нейронами в скрытом слое и для двуслойной с 4 нейронами в скрытом слое. Всё это будет представлено, как функции от числа входов d НС. Данные будут усреднены по 50 независимым численным экспериментам.

 

А нет ли способа... впряч в одну телегу коня и трепетную лань? Я имею ввиду МТ4 и MathCad. Чтобы получать текущие котировки сразу в Маткад и там же проводить весь анализ, а в МТ4 передавать сформированный сигнал. Первое, что приходит в голову - через файл, но потребуется чтобы обе проги все время проверяли содержимое двух разных файлов. Это не очень удобно. Может есть еще что-то? Очень жаль, что в MQL нет обработки прерываний. Как же все неудобно сделано! МТ4 этот хренов... Прям хоть бери, да садись за С++.


P.S. Ковыряюсь с данными для сетки.

 

Нет, а реализовать алгоритм анализа весь на MQL в лом? Или что, сложности в чём-то непомерные?

P.S. А я статистику набираю...

 

Да сложности с MQL на каждом повороте возникают. Вот например простейший код(индюк) для разбиения котира на ряд транзакций:

#property indicator_chart_window
#property indicator_buffers 2

#property indicator_color1 Red
#property indicator_color2 MediumBlue

extern int step = 5;
extern int sp = 3;

double Trans[], Kagi[];
int mn,mx,H,Cotir,Up,Dn;
bool set_new=false, SetMax=false, SetMin=false;

//******************************************************************************
int init() 
{ 
SetIndexBuffer(0,Trans);
SetIndexBuffer(1,Kagi);

SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);

SetIndexStyle(0,DRAW_ARROW);
SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(0,119);
SetIndexArrow(1,162);

IndicatorShortName ("Kagi++");
return(0); 
} 
//*******************************************************************************

int start() 
{ 
int reset,MaxBar,MaxBarJ,counted_bars=IndicatorCounted(),mx_j,mn_j;

if (counted_bars<0)return(-1);
if (counted_bars>0) counted_bars--;
int limit=Bars-counted_bars-1; MaxBar=Bars-2; MaxBarJ=MaxBar-30; 
if (limit==Bars-1)limit=Bars-2;

//----+ ОСНОВНОЙ ЦИКЛ ВЫЧИСЛЕНИЯ ИНДИКАТОРА 
for(int i=limit;i>=0;i--)
   {
     Cotir = Open[i]*MathPow(10.0,Digits);
          
     if(!set_new)
      {
        mx = Cotir;
        mn = Cotir;
        H = step*sp;
        set_new = true;
      }               
     if(Cotir - mx > 0)
      {
        mx = Cotir;
        mx_j = i;
      }  

     if(Cotir - mn < 0)
      {
        mn = Cotir;
        mn_j = i;
      }  

     if(!SetMax && Cotir <= mx - H) 
      {
         Trans[i] = Cotir/MathPow(10.0,Digits); 
         mn = Cotir;           
         mn_j = i;
         SetMax = true;
         SetMin = false;
         Kagi[mx_j] = mx/MathPow(10.0,Digits);
      } 
     if(!SetMin && mn + H <= Cotir) 
      {
         Trans[i] = Cotir/MathPow(10.0,Digits); 
         mx = Cotir;       
         mx_j = i;
         SetMax = false;
         SetMin = true;
         Kagi[mn_j] = mn/MathPow(10.0,Digits);
      } 

   }
return(0);  
}


Он работает, но нарисовать результаты его работы линиями в окне чарта - не получиться. Можно только символами выводить(DRAW_ARROW), кроме того(это уже выше моего понимания) если брать для разбивки менее 6 спредов, то он вообще ничего не выводит, хотя массивы формируются правильно. В MQL, как и во сякой доморощенной технологии, встречается масса совершенно неожиданных трудностей(начиная от сравнения даблов и далее..) и "специфических моментов", разумеется не документированных. Ругаюсь, вобщем...

К тому же как проверить сетку в МатКаде - понятно, но как это сделать в MQL - ума не приложу? А вдруг у меня где-то баг?

 
paralocus писал(а) >>

Да сложности с MQL на каждом повороте возникают. Вот например простейший код(индюк) для разбиения котира на ряд транзакций:

см. вложение - рисуй - радуйся

paralocus писал(а) >>

К тому же как проверить сетку в МатКаде - понятно, но как это сделать в MQL - ума не приложу? А вдруг у меня где-то баг?

Почему бы не подумать об использовани НейроШелл или Статистика? Там можно сетки создавать и складывать в библиотеки, а потом из МТ обучать и следить за их параметрами
Файлы:
 

Похоже, я не дождусь сбора статистики на своём РС...

Думаю, придётся отказаться от идеи представлять данные по точности прогноза с шагом 1 по числу входов НС. Например, можно упростить задачу взяв число входо кратным 2...