торговая стратегия на базе Волновой теории Эллиота - страница 287

 
to olyakish


Доброго всем вечера
Расскажите пожалуйста детили данного алгоритма.

Заранее спасибо


Рассказываю.

К ценовой кривой применяем многократно медианный фильтр. Что это такое? Берем окно нечетного размера (>=3) и пробегаем им по всем значениям исходной кривой. В каждой текущей точке сортируем по значению точки, попавшие в окно. Текущей точке присваиваем среднее (в том смысле, что оно расположено посередине массива) значение из отсортированного массива. К полученному результату снова применяем тот же фильтр. Повторяем это многократно (обычно достаточно 20-30 раз).
Для получения уровней сопротивления ценовую кривую переворачиваем вверх ногами и делаем то же самое. Потом переворачиваем полученный результат обратно.
Вот и все!
...



Маленький вопрос
Допустим взяли историю в 1000 отчетов(баров)
окно 3
получается что для 1000,999 не считаем так как меньше окна, а первый расчет производим только когда встали на 998 отчет (имеем данные с 998,999 и 1000 отчетов)
получается при первом проходе 998 результатов
при втором проходе встаем уже на на 996 отчет уже по сформмированному предыдущим прогоном массиве
в третьем прогоне встаем на 994 ...
и так далее ...
тоесть если прогнали 30 раз то получили массив из 960 значений

Может быть я не правильно Вас понял ?
 
to olyakish


Маленький вопрос
Допустим взяли историю в 1000 отчетов(баров)
окно 3
получается что для 1000,999 не считаем так как меньше окна, а первый расчет производим только когда встали на 998 отчет (имеем данные с 998,999 и 1000 отчетов)
получается при первом проходе 998 результатов
при втором проходе встаем уже на на 996 отчет уже по сформмированному предыдущим прогоном массиве
в третьем прогоне встаем на 994 ...
и так далее ...
тоесть если прогнали 30 раз то получили массив из 960 значений

Может быть я не правильно Вас понял ?



Не совсем так. Технически делается немножко по другому. Прежде чем применить фильтр Вы расширяете исходный массив на половину ширины окна фильтра в обе стороны. Образовавшиеся с краев пустые места в новом массиве заполняете либо константой, т. е. последним значением с краю исходного ряда, либо симметрично крайними значениями исходного ряда. В этом случае после применения фильтра к исходному массиву 1000 точек Вы вновь получите 1000 точек. При следующей фильтрации все повторяется.
Конечно, в этом случае на краях могут возникнуть искажения. Но от этого никуда не деться, так как любой оконный фильтр (да и вообще любой) имеет фазовую задержку в том числе и медианный. В общем, - так устроена природа.
Мы можем делать так, как Вы описали, но тогда мы не дойдем до края исходного массива, или использовать расширение, но тогда крайние значения результата мы не можем считать надежными.
Это плохая новость.
Хорошая же новость заключается в том, что медианный фильтр слабо чувствителен к краевым эффектам в отличие от линейных фильтров. Те несколько примеров, которые я успел у себя посмотреть, показывают, что краевые искажения либо малы, либо, в некоторых случаях, их нет совсем.

PS. Да... Еще сейчас пришла в голову мысль. Фильтр можно применять рекурсивно. Что получиться - не знаю, не пробовал, но считаться будет быстрее.
 
Andre69, я реализовал предложенный Вами алгоритм медианного фильтра. Получается, что уже после третьего прогона, форма сглаженной кривой не меняется. Проверил этот эффект в широком диапазоне размеров окна (до 10000 отсчетов).
Что касается приложений в трейдинге, то для нас верно использование "левого окна", это когда текущей точке присваивается значение из центра окна, расположенного ПОЛНОСТЬЮ слева от текущего значения. Конечно, при этом появляется фазовая задержка (запаздывание), но так устроен мир:-)
 
to Neutron

Andre69, я реализовал предложенный Вами алгоритм медианного фильтра. Получается, что уже после третьего прогона, форма сглаженной кривой не меняется. Проверил этот эффект в широком диапазоне размеров окна (до 10000 отсчетов).
Что касается приложений в трейдинге, то для нас верно использование "левого окна", это когда текущей точке присваивается значение из центра окна, расположенного ПОЛНОСТЬЮ слева от текущего значения. Конечно, при этом появляется фазовая задержка (запаздывание), но так устроен мир:-)


Да... Нестыковочка получается. Начал проверять. Заглянул, наконец, в свой код, который я использую для медианной фильтрации. Его я написал N лет назад (N>5) для одной маленькой програмки вывода графиков. Теперь эту программку я стал использовать как полигон для всяких исследований. Это удобно, а в старые части кода я и не заглядывал. Все работает и ладно... Теперь вот посмотрел... и неожиданно обнаружил, что та функция, которую я считал медианной фильтрацией - делает не совсем то! Дико ивиняюсь за невольную дезинформацию! Склоняю повинную голову.
Почему и зачем я так в свое время сделал - убей Бог не помню.
Классическая медиана - это когда берется центральное значение отсортированного массива. Я же почему-то брал в данном конкретном случае среднее между центральным и предыдущим ему значением. Наверное тогда, давно, это было мне зачем-то нужно. Тоже получился нелинейный фильтр, хотя, конечно, это не медиана в строгом понимании. Когда я вернулся к классическому варианту, получилось все так, как Вы описали. В моем варианте кривая меняется каждый раз при применении фильтра и в конечном итоге стремиться к прямой (после нескольких сотен фильтраций). Чем больше окно фильтра, тем быстрее это происходит.
Чтобы далее не возникало разночтений, привожу кусок кода на С.
Там все просто, надеюсь любой сможет разобраться.
//---------------------------------------------------------------------------
void __fastcall TPlotForm2D_WL::FilterCurveMedian(int Flen)
{
 //количество точек кривой
 int NN=Chart1->Series[IndexUpDown->Position-1]->Count();
 
 //объявляем временные массивы и выделяем память под них
 double* TempArray=new double[NN+(Flen/2)*2];
 double* ResultArray= new double[NN];
 double* XArray=new double[NN];
 double* MedArray=new double[Flen];

 //заполняем массив значений Х точками текущей кривой
 for(int i=0;i<NN;++i)
  XArray[i]=Chart1->Series[IndexUpDown->Position-1]->
                           XValues->Value[i];

 double Start=2*Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[0];
 double End=2*Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[NN-1];

 int k=0;

 //заполняем временный массив значениями Y точками текущей кривой
 for(int i=Flen/2;i>0;--i) //симметричное расширение влево
  TempArray[k++]=Start-Chart1->Series[IndexUpDown->Position-1]->
                                      YValues->Value[i];
 for(int i=0;i<NN;++i)
  TempArray[k++]=Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[i];
 for(int i=NN-1;i>=NN-Flen/2;--i)//симметричное расширение вправо
  TempArray[k++]=End-Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[i];

 //собственно фильтрация
 for(int i=Flen/2;i<NN+Flen/2;++i)
  {
   for(int j=-Flen/2;j<=Flen/2;++j)
    MedArray[j+Flen/2]=TempArray[i+j];
   ::sort(MedArray,MedArray+Flen);
   //Это то, что я написал когда-то. Уже не помню, почему так.
   //Но это работает!!!!!!!!!!
   ResultArray[i-Flen/2]=(MedArray[Flen/2]+MedArray[Flen/2-1])/2;
   //А эта строчка - классический медианный фильтр.
   //И это не работает, так как хотелось бы. ???? Sorry
   //ResultArray[i-Flen/2]=MedArray[Flen/2];
  }


 //дальше вывод и удаление временных массивов
 AddFastLine();

 for(int i=0;i<NN;++i)
  Chart1->Series[Chart1->SeriesCount()-1]->
          AddXY(XArray[i],ResultArray[i],"",clBlue);

 SwitchOnCurve(PlotForm2D_WL->Chart1->SeriesCount()-1);

 delete [] TempArray;
 delete [] ResultArray;
 delete [] XArray;
 delete [] MedArray;

 if(PlotForm2D_WL->Visible)
  PlotForm2D_WL->Visible = false;
 PlotForm2D_WL->Show();

}
//---------------------------------------------------------------------------



Насчет "левого окна" - все так, соласен. Но пока, думаю, это детали.

Еще раз приношу свои извинения.

 
to Северный Ветер
...Но, если Вы серьезно заинтересованы в получении данной научной работы, напишите нам (info@disserr.ru), и мы по возможности доставим запрашиваемую работу из архива...


Может, появились какие новости по этой работе?
 
to Северный Ветер
...Но, если Вы серьезно заинтересованы в получении данной научной работы, напишите нам (info@disserr.ru), и мы по возможности доставим запрашиваемую работу из архива...


Может, появились какие новости по этой работе?

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

Веду тяжелые позиционные бои с MatLab.
Для начала решил просто посмотреть на вейвлет-разложения ряда цены и ряда значений индикатора. Для DWT никаких сюрпризов не обнаружил, все более-менее понятно.
Для CWT разложение индикатора тоже имело достаточно понятную структуру. Однако, ряд цены дал вот такую картинку:


Структура этой картинки вообще говоря существенно отличается от, например, картинки в посте Andre69 28.06.07 20:43 на стр. 141. Хотелось бы понять почему.
С другой стороны она имеет какую-то слишком уж регулярныю структуру. Почему ?
Этот анализ выполнен для ряда в 1024 отсчетов.
Scale settings: Min=1, Step=1, Max=512. Вейвлет DMeyer'а

PS Кстати, упомянутый пост был последним в нескончаемом сериале про вейвлеты. :-)
Хотелось бы узнать по поводу продолжения. Следует ?
 
to Yurixx
Структура этой картинки вообще говоря существенно отличается от, например, картинки в посте Andre69 28.06.07 20:43 на стр. 141. Хотелось бы понять почему.
С другой стороны она имеет какую-то слишком уж регулярныю структуру. Почему ?


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

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


Спасибо, Сергей, за пояснение. Осталось только разобраться как сделать то, о чем ты пишешь.
Разбираясь с Wavelet Toolbox я что-то не нашел там таких возможностей. Может я чего просмотрел или это можно сделать только руками ?
 
Можно свести данный эффект к минимуму, выполнив условие: n/N<<1, где n - размер окна ( в Вашем случае, как я понимаю, n = Max), N - число членов ВР (1024). Полагая 0.01<<1, для имеющегося ряда имеем Мах<10.
В этом случае представленные результаты будут выглядеть корректно.