Сравнение двух графиков котировок с нелинейными искажениями по оси X - страница 5

 
alsu:Код на mql получится, скорее всего, недлинный))

кажется вот исходник http://www.bytefish.de/blog/dynamic_time_warping

 
Ну да, он коротенький, но это в самом простом варианте, а есть еще несколько усовершенствований касательно скорости алгоритма и учета ограничений...
 
Вот в этой либе реализована поддержка размерности данных до 3-х включительно, плюс метод оценки нижней границы и соответствующий тест пути-кандидата (как я понимаю, это значительно дешевле полного DTW для размерности >1, когда основной метод становится ТЗ-полной задачей и ведет к экспоненциальному времени решения)
 
на Хабрахабре статья про DTW http://habrahabr.ru/blogs/algorithm/135087/, вроде бы все доходчиво написано, но чёт ума не приложу как использовать DTW для OHLC, ктонить может растолковать доходчиво?
 
IgorM:
на Хабрахабре статья про DTW http://habrahabr.ru/blogs/algorithm/135087/, вроде бы все доходчиво написано, но чёт ума не приложу как использовать DTW для OHLC, ктонить может растолковать доходчиво?

А для одной цены уже получилось?
 
Integer:А для одной цены уже получилось?

да нифига не получилось, сам исходник DTW портировать под mql не проблема, как-то так:

//+------------------------------------------------------------------+
// create cost matrix
#define costmaxM 100
#define costmaxN 100
double cost[costmaxM][costmaxN];
int costM,costN; // текущая размерность cost
//+------------------------------------------------------------------+
double dist(double x, double y){
   return(MathSqrt(MathPow((x - y), 2)));
}
//+------------------------------------------------------------------+
int dtw(double &t1[],double &t2[]) {
// возвращаемое значение -1 ошибка
// +1 массив cost[][] заполнен правильно        
                int i,j;
                costM = ArraySize(t1);
                costN = ArraySize(t2);
                if(costM>=costmaxM || costN>=costmaxN)return(-1);

                cost[0][0] = dist(t1[0], t2[0]);
                // calculate first row
                for(i = 1; i < costM; i++)
                        cost[i][0] = cost[i-1][0] + dist(t1[i], t2[0]);
                // calculate first column
                for(j = 1; j < costN; j++)
                        cost[0][j] = cost[0][j-1] + dist(t1[0], t2[j]);
                // fill matrix
                for(i = 1; i < costM; i++)
                        for(j = 1; j < costN; j++)
                                cost[i][j] = MathMin(cost[i-1][j],MathMin(cost[i][j-1], cost[i-1][j-1])) + dist(t1[i],t2[j]);
 
return(1);//            return cost[m-1][n-1];
}
//+------------------------------------------------------------------+
проблема в том, что я не понимаю как использовать это, все что понял, что с помощью DTW можно различные по длительности временные участки (ВР) подгонять под один масштаб для последующего анализа, но как... - не пойму
 
IgorM:

да нифига не получилось, сам исходник DTW портировать под mql не проблема, как-то так:

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


Пробовал его. Тоже не понятно как им пользоваться. На выходе должен быть или путь трансформации или трансформированные данные. Допустим cost[][] это матрица расстояний. Но она дает путь с возвратом (если искать минимальное значение в каждой колонке), не выполняется условие "1. Монотонность – путь никогда не возвращается, то есть: оба индекса, i и j, которые используются в последовательности, никогда не уменьшаются.". Еще путь не доходит до противоположного угла. Вообще не очень понятен смысл всех этих манипуляций с числами при заполнении массива cost[][] - сначала просто считаются расстояния, потом они приплюсовываются.

Если псрото считать растояния между каждым элементов t1 до каждого элемента t2, то вообще зачем так много вычислений, если должно выполняться условие " 1. Монотонность – путь никогда не возвращается, то есть: оба индекса, i и j, которые используются в последовательности, никогда не уменьшаются."?



.

 

DTW совершенно не подходит для обозначенной задачи. DTW используется для распознавания речи (слов) в реал-тайм аудио потоке следующим образом (грубо):

  1. Есть шаблон (слово) - последовательность данных, длинной N.
  2. Есть аудио-поток - последовательность данных, длинной M >> N.
  3. Из аудиопотока выбираются крайние куски данных, разной длины (грубо).
  4. Каждый кусок по DTW сравнивается с шаблоном.
  5. Если максимальное лучшее значение DTW превышает определенный порог, то считается, что было произнесено слово.

Т.е. DTW - это лишь критерий сравнений двух последовательностей разной длины. Не более.

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

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

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

Теория паттернов, как и волны Эллиота с Фибо - это не технарского уровня мышления торговля.

 
hrenfx:

DTW совершенно не подходит для обозначенной задачи...

Давайте вы сначала покажете работающий DTW, потом обсудим к чему он подходит, к чему нет.
 

Кое-что сам придумал, но не знаю, ерунда какая-то.

Желтая линия, это оранжевая натянутая на красную.

Причина обращения: