Comparação de dois gráficos de cotações com distorções não lineares no eixo X - página 5

 
alsu: O código mql provavelmente não será longo))

aqui parece ser o código fonte http://www.bytefish.de/blog/dynamic_time_warping

 
Bem, sim, é curto, mas isso está na versão mais simples, e há algumas outras melhorias em relação à velocidade do algoritmo e à consideração de restrições...
 
Este implementou suporte para dimensões de dados até 3, inclusive, mais um método de estimativa de limite inferior e teste de percurso do candidato associado (como eu entendo, isto é muito mais barato que DTW completo para dimensões >1, onde o método principal se torna um problema TK-completo e leva a tempos de solução exponenciais)
 
Há um artigo sobre DTW no site Habrahabra http://habrahabr.ru/blogs/algorithm/135087/, parece ser muito claro, mas eu não consigo entender como usar DTW para OHLC, alguém pode me explicar isso?
 
IgorM:
Há um artigo sobre DTW no site Habrahabra http://habrahabr.ru/blogs/algorithm/135087/, parece ser muito claro, mas eu não consigo entender como usar DTW para OHLC, alguém pode me explicar isso?

Isso já é feito por um preço?
 
Integer: Já funcionou por um preço?

Não funcionou, não é um problema portar a fonte DTW para mql, de alguma forma:

//+------------------------------------------------------------------+
// 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];
}
//+------------------------------------------------------------------+
O problema é que eu não entendo como usá-lo, tudo o que entendi é que com DTW você pode encaixar diferentes períodos de tempo (BP) na mesma escala para análise posterior, mas como... - não entendem
 
IgorM:

Não funcionou, a própria fonte DTW é fácil de portar para mql, de alguma forma:

o problema é que eu não entendo como usar isso, tudo o que entendi é que com DTW você pode encaixar diferentes seções de tempo (BPs) na mesma escala para análise posterior, mas como... - não entendo


Experimentei-o. Também não tenho certeza de como utilizá-lo. A saída deve ser ou um caminho de transformação ou dados transformados. Digamos que o custo[][] é uma matriz de distância. Mas dá um caminho com retorno (se buscarmos o valor mínimo em cada coluna), a condição "1. Monotonicidade - o caminho nunca retorna, ou seja: ambos os índices, i e j, que são usados na seqüência, nunca diminuem". Além disso, o caminho não alcança o canto oposto. Em geral, eu realmente não entendo o significado de todas essas manipulações com números ao preencher a matriz de custos[][] - primeiro as distâncias são simplesmente contadas e depois são adicionadas.

Se precisamos contar as distâncias entre cada elemento t1 e cada elemento t2, então por que devemos fazer tantos cálculos, se precisamos cumprir a condição "1. Monotonicidade - o caminho nunca retorna, isto é: ambos os índices i e j usados na seqüência nunca são diminuídos"?



.

 

O DTW é completamente inadequado para a tarefa em questão. DTW é usado para reconhecer a fala (palavras) em um fluxo de áudio em tempo real, como segue (aproximadamente):

  1. Há um padrão (palavra) - uma seqüência de dados, de comprimento N.
  2. Há um fluxo de áudio - uma seqüência de dados, de comprimento M >> N.
  3. Do fluxo de áudio são selecionados os dados mais externos, de diferentes comprimentos (aproximadamente).
  4. Cada pedaço é comparado com um modelo da DTW.
  5. Se o DTW máximo excede um determinado limite, considera-se que uma palavra foi dita.

Portanto, DTW é apenas um critério para comparar duas seqüências de diferentes comprimentos. Nada mais.

Para buscar palavras na história do áudio, a DTW não é nada adequada, pois é muito consumidora de recursos. Por exemplo, descobrir quantas vezes uma palavra foi dita na última hora, usando DTW, é quase impossível.

Uma solução rápida para este problema é usar um algoritmo rápido para calcular o CQ da Pearson. Ao fazer isso, o DTW é convertido cada vez por um ZigZag com parâmetros de entrada diferentes. Tal algoritmo é muito fácil de paralelizar e funcionará quase em tempo real quando implementado usando GPU.

Outra pergunta é: por que precisamos dela? Ninguém resolveu esta tarefa em um nível sério. Mas estou quase certo de que, depois de resolvido, haverá mais um prego no caixão da solidez da teoria dos padrões.

A teoria dos padrões, assim como as ondas Elliott e Fibo não é um nível tecnocrático de pensamento.

 
hrenfx:

A DTW é totalmente desadequada à tarefa em questão.

Vamos primeiro mostrar-lhe uma DTW funcional, depois podemos discutir o que ela se encaixa e o que não se encaixa.
 

Algo que eu mesmo inventei, mas não sei, é um absurdo.

A linha amarela, que é a laranja esticada sobre a vermelha.