Wednesday, 2 August 2017

Adaptive Moving Average Kalman Filter


FAQs sobre o JMA Qual é a teoria por trás do JMA? Por que o JMA tem um parâmetro PHASE. A JMA prevê uma série de tempo. Os valores de JMA anteriores, já traçados, mudam à medida que novos dados chegam. Posso melhorar outros indicadores usando JMA A JMA tem alguma garantia especial Como a JMA se compara a outros filtros. TÓPICOS GERAIS em JURIK TOOLS Pode as ferramentas plotar muitas curvas em cada um dos muitos gráficos. As ferramentas podem processar qualquer tipo de dados. As ferramentas podem trabalhar em tempo real. São os algoritmos revelados ou caixa preta. As ferramentas Jurik precisam olhar para o futuro de uma série de tempo. As ferramentas produzem valores semelhantes em todas as plataformas (TradeStation, Multicharts.). Do Juriks ferramentas vêm com uma garantia. Quantas senhas de instalação eu recebo. Qual é a Teoria Atrás da JMA. PARTE 1. GAPS DE PREÇOS Os dados de séries temporais de suavização, como os preços de ações diários, a fim de remover ruídos indesejáveis ​​produzirão, inevitavelmente, um gráfico (indicador) que se move mais lentamente do que a série de tempo original. Este quotslownessquot fará com que o enredo a ficar um pouco atrás da série original. Por exemplo, uma média móvel simples de 31 dias atrasará a série de tempo de preço em 15 dias. Atraso é muito indesejável porque um sistema de comércio que usa essa informação terá sua negociação adiada. Os comércios atrasados ​​podem muitas vezes ser mais maus do que nenhuns comércios de todo, porque você pôde comprar ou vender no lado errado do ciclo dos mercados. Conseqüentemente, muitas tentativas foram feitas para minimizar o atraso, cada um com suas próprias falhas. Conquistar o atraso sem fazer suposições simplificadoras (por exemplo, que os dados consistam em ciclos sobrepostos, mudanças diárias de preços com uma distribuição gaussiana, todos os preços são igualmente importantes, etc.) não é uma tarefa trivial. No final, a JMA teve que se basear na mesma tecnologia que os militares usam para rastrear objetos em movimento no ar usando nada mais do que seu radar barulhento. A JMA vê a série de preços como uma imagem ruidosa de um alvo em movimento (o preço subjacente suave) e tenta estimar a localização da meta real (preço suave). A matemática proprietária é modificada para levar em consideração as propriedades especiais de uma série de tempo financeiro. O resultado é uma curva suave de seda que não faz nenhuma suposição sobre os dados que têm nenhuns componentes cíclicos qualquer. Consequentemente JMA pode transformar quoton um dimequot se o mercado (alvo em movimento) decide virar direção ou gap atuown por qualquer quantidade. Nenhuma diferença de preço é muito grande. Depois de vários anos de pesquisa, a Jurik Research determinou que o filtro de redução de ruído perfeito para dados financeiros tem os seguintes requisitos: Deslocamento mínimo entre sinal e preço, caso contrário, os gatilhos comerciais chegam tarde. Sobrecarga mínima, caso contrário, o sinal produz falsos níveis de preços. Mínimo undershoot, caso contrário, o tempo é perdido à espera de convergência após lacunas de preços. Máxima suavidade, exceto no momento em que as diferenças de preço para um novo nível. Quando medido até esses quatro requisitos, todos os filtros populares (exceto JMA) funcionam mal. Aqui está um resumo dos filtros mais populares. Média Móvel Ponderada - não responde às lacunas Média Mínima Exponencial - excesso de ruído ruidoso Médias Móveis Adaptáveis ​​- (não as nossas) tipicamente baseadas em suposições simplificadas sobre atividade de mercado facilmente enganadas Linha de Regressão - não responde a lacunas superação excessiva Filtros FFT - Facilmente distorcida pelo ruído não gaussiano na janela de dados é tipicamente muito pequena para determinar com precisão ciclos verdadeiros. Filtros FIR - tem atraso conhecido como quotgroup delayquot. Nenhuma maneira em torno dele a menos que você quiser cortar alguns cantos. Veja os filtros quotBand-Passquot. Band-Pass filtros - nenhum atraso apenas no centro da banda de frequência tende a oscilar e superar os preços reais. Filtros de Entropia Máxima - facilmente distorcida por ruído não-Gaussiano na janela de dados é tipicamente demasiado pequeno para determinar com precisão ciclos verdadeiros. Filtros polinomiais - não responde às lacunas overshoot excessivo Em contraste, JMA integra a teoria da informação ea filtragem não-linear adaptativa de uma maneira única. Combinando uma avaliação do conteúdo de informação em uma série de tempo com o poder da transformação não-linear adaptativa, o resultado empurra o quotenvelopequotático sobre a filtragem de séries temporais financeiras quase tanto quanto possível. Qualquer mais e casar-se contra o princípio de incerteza Heisenburgs (algo que ninguém tem superado, ou nunca vai). Até onde sabemos, JMA é o melhor. Convidamos qualquer um para nos mostrar o contrário. Para uma análise mais comparativa das falhas de filtros populares, faça o download do nosso relatório quotThe Evolution of Moving Averagesquot do nosso departamento de Relatórios Especiais. Veja nossa comparação com outros filtros populares. Por que o JMA tem um parâmetro PHASE. Há duas maneiras de diminuir o ruído em uma série de tempo usando JMA. Aumentar o parâmetro LENGTH fará JMA mover mais lento e, assim, reduzir o ruído à custa de atraso adicionado. Alternativamente, você pode alterar a quantidade de quotinertiaquot contida no JMA. A inércia é como a massa física, quanto mais você tem, mais difícil é virar a direção. Assim, um filtro com muita inércia exigirá mais tempo para inverter a direção e assim reduzir o ruído à custa de overshooting durante reversões na série de tempo. Todos os filtros de ruído forte têm atraso e overshoot, e JMA não é exceção. No entanto, os parâmetros ajustáveis ​​JMAs PHASE e LENGTH oferecer-lhe uma maneira de selecionar o tradeoff ideal entre atraso e overshoot. Isso lhe dá a oportunidade de ajustar vários indicadores técnicos. Por exemplo, o gráfico (à direita) mostra uma linha JMA rápida cruzando uma linha JMA mais lenta. Para fazer a linha JMA rápida virar quoton um dimequot sempre que o mercado inverte, ele foi definido para não ter inércia. Em contraste, o JMA lento foi configurado para ter grande inércia, retardando assim a sua capacidade de virar durante reversões de mercado. Esta disposição faz com que a linha mais rápida atravesse a linha mais lenta o mais rapidamente possível, produzindo assim baixos sinais de crossover de atraso. Claramente, o controle do usuário de uma inércia de filtros oferece poder considerável sobre filtros que não possuem essa capacidade. A JMA prevê uma série de tempo. Ele não prevê no futuro. JMA reduz o ruído praticamente da mesma forma como uma média móvel exponencial, mas muitas vezes melhor. Os valores de JMA anteriores, já traçados, mudam à medida que novos dados chegam. Não. Para qualquer ponto de um gráfico JMA, apenas dados históricos e atuais são usados ​​na fórmula. Conseqüentemente, à medida que novos dados de preço chegam em intervalos de tempo posteriores, esses valores de JMA já traçados não são afetados e NUNCA mudam. Considere também o caso quando a barra mais recente em um gráfico é atualizada em tempo real à medida que chega cada novo tick. Uma vez que o preço de fechamento da barra mais recente é susceptível de mudar, JMA é reavaliado automaticamente para refletir o novo preço de fechamento. No entanto, os valores históricos de JMA (em todas as barras anteriores) permanecem inalterados e não mudam. Pode-se criar indicadores impressionantes olhando sobre dados históricos quando se analisa os valores passados ​​e futuros em torno de cada ponto de dados a ser processado. No entanto, qualquer fórmula que precise ver valores futuros em uma série de tempo não pode ser aplicada no mundo real negociação. Isso ocorre porque ao calcular o valor de hoje de um indicador, os valores futuros não existem. Todos os indicadores Jurik utilizam apenas dados de séries temporais atuais e anteriores em seus cálculos. Isso permite que todos os indicadores Jurik funcionem em todas as condições em tempo real. Posso melhorar outros indicadores usando JMA Sim. Normalmente, substituímos a maioria dos cálculos de média móvel em indicadores técnicos clássicos com JMA. Isso produz resultados mais suaves e mais oportunos. Por exemplo, simplesmente inserindo JMA no indicador técnico padrão DMI, nós produzimos o indicador DMX, que vem livre com sua ordem de JMA. A JMA tem alguma garantia especial Se você nos mostrar um algoritmo não-proprietário para uma média móvel que, quando codificado para ser executado em qualquer TradeStation, Matlab ou Excel VBA, executa quotbetterquot do que a nossa média móvel em curtos, médios e longos períodos de tempo de Uma caminhada aleatória, bem reembolsar sua licença de usuário adquirido para JMA. O que queremos dizer com quotbetterquot é que ele deve ser, em média, mais suave, sem maior atraso médio do que o nosso, não maior overshoot média e não maior média undershoot do que o nosso. O que entendemos por quadros de médio, médio e longo prazo é que as comparações devem incluir três comprimentos JMA separados: 7 (curto), 35 (médio), 175 (longo). O que queremos dizer com uma caminhada aleatória é uma série de tempo produzida por uma soma cumulativa de 5000 zero-média, Cauchy distribuídos números aleatórios. Esta garantia limitada é válida apenas durante o primeiro mês após ter adquirido uma licença de utilizador da JMA por nós ou por um dos nossos distribuidores mundiais. Como o JMA se compara a outros filtros. O filtro de Kalman é semelhante ao JMA, pois ambos são poderosos algoritmos usados ​​para estimar o comportamento de um sistema dinâmico ruidoso quando tudo o que você tem que trabalhar é medições de dados ruidosos. O filtro de Kalman cria previsões suaves das séries temporais, e este método não é totalmente apropriado para séries de tempo financeiras, pois os mercados são propensos a produzir giros violentos e disparidades de preços, comportamentos não típicos de sistemas dinâmicos operando sem problemas. Conseqüentemente, a suavização do filtro de Kalman freqüentemente fica atrás ou ultrapassa as séries temporais de preços de mercado. Em contraste, a JMA acompanha os preços de mercado de perto e sem problemas, adaptando-se às lacunas e evitando superações indesejadas. Veja o gráfico abaixo para um exemplo. Um filtro descrito em revistas populares é a média móvel Kaufmann. É uma média móvel exponencial cuja velocidade varia de acordo com a eficiência da ação de preço. Em outras palavras, quando a ação de preço está em uma tendência clara com pouco retracement, o filtro de Kaufmann acelera e quando a ação é congesting, o filtro retarda. (Veja a tabela acima) Embora sua natureza adaptativa o ajude a superar algum do lag típico de médias móveis exponenciais, ainda retarda significativamente atrás de JMA. Lag é uma questão fundamental para todos os comerciantes. Lembre-se, cada barra de atraso pode atrasar seus negócios e negar-lhe lucro. Outra média móvel descrita em revistas populares é Chandes VIDYA (Variable Index Dynamic Average). O índice mais usado dentro da VIDYA para governar sua velocidade é a volatilidade dos preços. À medida que a volatilidade de curto prazo aumenta, a média móvel exponencial do VIDYA é projetada para se mover mais rapidamente, e à medida que a volatilidade diminui, o VIDYA desacelera. Na superfície isso faz sentido. Infelizmente, este projeto tem uma falha óbvia. Embora o congestionamento lateral deve ser cuidadosamente suavizado independentemente da sua volatilidade, um período altamente volátil de congestionamento seria acompanhado de perto (não suavizada) pela VIDYA. Conseqüentemente, VIDYA pode falhar em remover ruídos indesejados. Por exemplo, o gráfico compara JMA com VIDYA, ambos definidos para rastrear uma tendência descendente igualmente bem. No entanto, durante o congestionamento que se seguiu, VIDYA não suavizar os picos de preços, enquanto JMA glides com sucesso através da tagarelice. Em outra comparação onde tanto VIDYA e Juriks JMA foram definidos para ter a mesma suavidade, vemos no gráfico que VIDYA fica para trás. Como mencionado anteriormente, o tempo tardio pode facilmente roubar seus lucros em qualquer comércio. Dois outros indicadores populares são T3 e TEMA. Eles são suaves e têm pouco atraso. T3 é o melhor dos dois. No entanto, T3 pode apresentar um sério problema de overshoot, como visto no gráfico abaixo. Dependendo da sua aplicação, você pode não querer um indicador mostrando um nível de preços que o mercado real nunca atingiu, pois isso pode inadvertidamente iniciar negociações indesejadas. Aqui estão dois comentários encontrados postados em fóruns relevantes da Internet: o indicador T3 é muito bom (e eu já cantei seus elogios antes, nesta lista). No entanto, Ive teve a oportunidade de derivar algumas medidas de mercado alternativo e eu suavizá-los. Eles são muito mal comportados às vezes. Ao alisá-los, T3 torna-se instável e overshoots mal, enquanto JMA vails direita através deles. quot - Allan Kaminsky allank xmission quotMy próprio ponto de vista de JMA é consistente com o que outras pessoas têm escrito (eu passei uma boa parte do tempo visualmente comparando JMA para TEMA Eu não pensaria agora de usar TEMA em vez de JMA). Steven Buss sbuss pacbell Um artigo na edição de janeiro de 2000 da TASC descreve uma média móvel projetada na década de 1950 para ter baixa defasagem. Seu inventor, Robert Brown, projetou o quotModified Moving Average (MMA) para reduzir o atraso na estimativa de estoques. Em sua fórmula, a regressão linear estimou o momento atual das curvas, que por sua vez é usado para estimar o atraso vertical. A fórmula, em seguida, subtrai lag estimado da média móvel para obter baixos resultados lag. Esta técnica funciona bem em bem comportado (suavemente transição) gráficos de preços, mas, novamente, assim como a maioria dos outros filtros avançados. O problema é que o mercado real é qualquer coisa mas bem comportado. Uma verdadeira medida de aptidão é o quão bem qualquer filtro funciona em dados financeiros do mundo real, uma propriedade que pode ser medida com a nossa bem estabelecida bateria de testes de referência. Esses testes revelam que MMA overshoots gráficos de preços, como ilustrado abaixo. Em comparação, o usuário pode definir um parâmetro em JMA para ajustar a quantidade de overshoot, mesmo eliminando completamente. A escolha é sua. Lembre-se, a última coisa que você quer é um indicador mostrando um nível de preço que o mercado real nunca atingiu, como isso pode inadvertidamente iniciar negócios não desejados. Com MMA, você não tem escolha e deve colocar-se com overshoot se você gosta ou não. (Veja a tabela abaixo) A edição de julho de 2000 da TASC continha um artigo de John Ehlers descrevendo um quotModified Optimal Elliptical Filterquot (abreviado aqui como quotMEFquot). Este é um excelente exemplo de análise de sinal clássico. O gráfico abaixo compara MEF a JMA cujos parâmetros (JMA length7, phase50) foram ajustados para fazer JMA ser tão semelhante ao MEF quanto possível. A comparação revela estas vantagens ao usar JMA: JMA responde a oscilações de preços extremos mais rapidamente. Consequentemente, quaisquer valores de limiar usados ​​para disparar sinais serão executados mais cedo pela JMA. JMA tem quase nenhum overshoot, permitindo que a linha de sinal para rastrear com mais precisão ação de preço após grande movimento de preços. A JMA desliza através de pequenos movimentos de mercado. Isso permite que você se concentrar na ação de preço real e não atividade de mercado pequeno que não tem nenhuma consequência real. Um método favorito entre engenheiros para suavizar dados de séries temporais é ajustar os pontos de dados com um polinômio (eq, uma spline parabólica ou cúbica). Um projeto eficiente deste tipo é uma classe conhecida como Savitzy-Golay filtros. O gráfico abaixo compara o JMA com um filtro Savitzy-Golay de 3 divisões cúbicas, cujas configurações de parâmetros foram escolhidas para fazer com que o desempenho fique o mais próximo possível do JMA. Observe como suavemente JMA desliza através de regiões de congestionamento de negociação. Em contraste, o filtro S-G é bastante irregulares. Claramente JMA é, mais uma vez, o vencedor. Outra técnica utilizada para reduzir o atraso em um filtro de média móvel é adicionar algum momento (inclinação) do sinal ao filtro. Isto reduz o lag, mas com duas penalidades: mais ruído e mais overshoot nos pontos do pivô do preço. Para compensar o ruído, pode-se empregar um filtro FIR simetricamente ponderado, que é mais suave do que uma média móvel simples, cujos pesos podem ser: 1-2-3-4-3-2-1 e, em seguida, ajustar esses pesos para adicionar algum atraso Reduzindo o ímpeto. A eficácia desta abordagem é mostrada na figura abaixo (linha vermelha). Embora o filtro FIR rastreie o preço de perto, ele ainda fica atrás de JMA, bem como exibir maior superação. Além disso, o filtro FIR tem lisura fixa e precisa ser redesenhado para cada suavidade diferente desejada. Em comparação, o usuário só precisa alterar um parâmetro quotsmoothnessquot de JMA para obter qualquer efeito desejado. Não só a JMA produz melhores gráficos de preços, mas também pode melhorar outros indicadores clássicos. Por exemplo, considere o clássico MACD indicador, que é uma comparação de duas médias móveis. Sua convergência (aproximação) e divergência (afastamento) fornecem sinais de que uma tendência de mercado está mudando de direção. É fundamental que você tenha o menor atraso possível com esses sinais ou seus negócios serão atrasados. Em comparação, um MACD criado com JMA tem significativamente menos atraso do que um MACD usando médias móveis exponenciais. Para ilustrar esta afirmação, a figura abaixo é um gráfico de preços hipotético simplificado para melhorar as questões salientes. Vemos barras de tamanho igual numa tendência ascendente, interrompida por uma súbita diferença descendente. As duas linhas coloridas são médias móveis exponenciais que compõem um MACD. Observe que crossover ocorre muito tempo após a lacuna, fazendo com que uma estratégia de negociação para esperar e comércio tarde, se em tudo. Se você tentou acelerar o tempo deste indicador fazendo as médias móveis mais rápidas, as linhas se tornariam mais barulhentas e irregulares. Isso tende a criar gatilhos falsos e maus negócios. Por outro lado, o gráfico abaixo mostra o JMA azul ajustando-se rapidamente ao novo nível de preços, permitindo crossovers anteriores e designação anterior de uma tendência de alta em andamento. Agora você pode entrar no mercado mais cedo e montar uma parte maior da tendência. Ao contrário da média móvel exponencial, o JMA tem um parâmetro adicional (PHASE) que permite ao usuário ajustar a extensão do overshoot. No gráfico acima, a linha amarela de JMA foi permitida superar mais que o azul. Isso dá crossovers ideal. Uma das características mais difíceis de projetar em um filtro de suavização é uma resposta adaptativa às diferenças de preços sem ultrapassar o novo nível de preço. Isto é especialmente verdadeiro para os projetos de filtro que empregam o próprio impulso dos filtros como forma de reduzir o atraso. O gráfico a seguir compara overshoot por JMA ea média móvel Hull (HMA). Os ajustes dos parâmetros para os dois filtros foram ajustados para que seu desempenho no estado estacionário fosse quase idêntico. Outra questão de design é se o filtro pode ou não manter a mesma suavidade aparente durante inversões como durante tendências. O gráfico abaixo mostra como o JMA mantém uma lisura quase constante ao longo de todo o ciclo, enquanto o HMA oscila em reversões. Isso iria colocar problemas para as estratégias que desencadeiam comércios com base em se o filtro está se movendo para cima ou para baixo. Por último, existe o caso em que os preços despencam e, em seguida, retrocedem numa tendência descendente. Isto é especialmente difícil de rastrear no momento do recuo. Felizmente, os filtros adaptativos têm um tempo muito mais fácil para indicar quando ocorreu uma inversão do que os filtros fixos, como mostrado na tabela abaixo. Claro que existem melhores filtros do que JMA, usado principalmente pelos militares. Mas se você está no negócio de rastrear bons negócios e não aeronaves inimigas, JMA é o melhor filtro de redução de ruído disponível disponível para os dados do mercado financeiro. Nós garantimos it. Motion Analysis e Object Tracking calcOpticalFlowPyrLK Calcula um fluxo óptico para um conjunto de características escassas usando o método Lucas-Kanade iterativo com pirâmides. C: void calcOpticalFlowPyrLK (InputArray prevImg InputArray nextImg InputArray prevPts InputOutputArray nextPts OutputArray status OutputArray Erro Tamanho winSize Tamanho (21,21), int maxLevel 3, TermCriteria critérios TermCriteria (TermCriteria :: COUNTTermCriteria :: EPS, 30, 0,01), int sinalizadores 0, duplo minEigThreshold 1e-4) Python: cv2. CalCOpticalFlowPyrLK (prevImg, nextImg, prevPts, nextPts. Status, err. WinSize, maxLevel, critérios. minEigThreshold) rarr nextPts, status, err C: void cvCalcOpticalFlowPyrLK (const CvArr anterior const CvArr curr. CvArr prevpyr CvArr currpyr. CvPoint2D32f antecedentes CvPoint2D32f currfeatures int conta CvSize winsize int nível char status float trackerror CvTermCriteria critérios int flags) Python: cv. A primeira imagem ou pirâmide de entrada de 8 bits construída por buildOpticalFlowPyramid (), é a primeira imagem de entrada de 8 bits ou uma pirâmide construída por buildOpticalFlowPyramid (). NextImg 8211 segunda imagem de entrada ou pirâmide do mesmo tamanho e do mesmo tipo que prevImg. O vetor 8211 de pontos 2D para o qual o fluxo precisa ser encontrado coordenadas de pontos deve ser números de ponto flutuante de precisão única. NextPts 8211 vetor de saída de pontos 2D (com coordenadas de ponto flutuante de precisão única) contendo as novas posições calculadas de recursos de entrada na segunda imagem quando o flag OPTFLOWUSEINITIALFLOW é passado, o vetor deve ter o mesmo tamanho que na entrada. Status 8211 vetor de status de saída (de caracteres não assinados) cada elemento do vetor é definido como 1 se o fluxo para as características correspondentes foi encontrado, caso contrário, é definido como 0. err 8211 vetor de saída de erros cada elemento do vetor é Definido para um erro para o recurso correspondente, o tipo da medida de erro pode ser definido no parâmetro flags se o fluxo wasn8217t encontrado, então o erro não está definido (use o parâmetro status para encontrar esses casos). WinSize 8211 tamanho da janela de pesquisa em cada nível de pirâmide. MaxLevel 8211 Número de nível de pirâmide máxima baseado em 0 se definido como 0, pirâmides não são usadas (nível único), se definido como 1, dois níveis são usados, e assim por diante se as pirâmides forem passadas para entrada então o algoritmo usará tantos níveis quanto Pirâmides têm, mas não mais do que maxLevel. Critérios 8211 parâmetro, especificando os critérios de terminação do algoritmo de pesquisa iterativa (após o número máximo especificado de iterações criteria. maxCount ou quando a janela de pesquisa se move por menos de criteria. epsilon flags 8211 OPTFLOWUSEINITIALFLOW usa estimativas iniciais, armazenadas em nextPts se o sinalizador OPTFLOWLKGETMINEIGENVALS utiliza valores eigen mínimos como uma medida de erro (ver descrição minEigThreshold) se o sinalizador não estiver definido, então L1 distância entre remendos em torno do original e um ponto deslocado , Dividido pelo número de pixels em uma janela, é usado como uma medida de erro. minEigThreshold 8211 o algoritmo calcula o valor eigen mínimo de uma matriz normal 2x2 de equações de fluxo óptico (esta matriz é chamada matriz de gradiente espacial em Bouguet00), dividida por Número de pixels em uma janela se este valor for menor que minEigThreshold., Em seguida, um recurso correspondente é filtrado para fora e seu fluxo é Não processado, por isso permite remover pontos ruins e obter um impulso de desempenho. A função implementa uma versão iterativa esparsa do fluxo óptico Lucas-Kanade em pirâmides. Veja Bouguet00. A função é paralelizada com a biblioteca TBB. Um exemplo usando o algoritmo de fluxo óptico Lucas-Kanade pode ser encontrado em opencvsourcecodesamplescpplkdemo. cpp (Python) Um exemplo usando o algoritmo de fluxo óptico de Lucas-Kanade pode ser encontrado em opencvsourcecodesamplespython2lktrack. py (Python) Um exemplo usando o rastreador Lucas-Kanade para homography Correspondência pode ser encontrada em opencvsourcecodesamplespython2lkhomography. py buildOpticalFlowPyramid Constrói a pirâmide de imagem que pode ser passada para calcOpticalFlowPyrLK (). C: int buildOpticalFlowPyramid (InputArray img. OutputArrayOfArrays pirâmide. bool withDerivatives true, int pyrBorder BORDERREFLECT101, int derivBorder BORDERCONSTANT, bool tryReuseInputImage true) Python: cv2. BuildOpticalFlowPyramid (img, winSize, maxLevel, pirâmide, comDerivativos, pyrBorder, derivBorder, tryReuseInputImage) rarr retval, pyramid img 8211 imagem de entrada de 8 bits. Pirâmide de saída da pirâmide 8211. WinSize 8211 tamanho da janela do algoritmo de fluxo óptico. Não deve ser menor que o argumento winSize de calcOpticalFlowPyrLK (). É necessário calcular o preenchimento necessário para níveis de pirâmide. MaxLevel 8211 Número de nível de pirâmide máxima baseado em 0. Com os Derivatives 8211 ajustados para gradientes de pré-computação para cada nível de pirâmide. Se a pirâmide é construída sem os gradientes, calcOpticalFlowPyrLK () irá calculá-los internamente. PyrBorder 8211 o modo de borda para camadas de pirâmide. DerivBorder 8211 o modo de borda para gradientes. TryReuseInputImage 8211 colocar ROI de imagem de entrada para a pirâmide, se possível. Você pode passar false para forçar a cópia de dados. Número de níveis na pirâmide construída. Pode ser menor que maxLevel. CalcOpticalFlowFarneback Calcula um fluxo óptico denso usando o algoritmo Gunnar Farneback8217s. C: void calcOpticalFlowFarneback (InputArray anterior InputArray next InputOutputArray Fluxo dobro pirscale int inteiros int int do winsize int interações polyn do dobro polysigma do dobro int sinalizadores C: void cvCalcOpticalFlowFarneback (const CvArr anterior const CvArr seguinte CvArr fluxo Python: cv2, double int, int, int, int, int, int, iterations, int, polyn, double polysigma, int flags) Python: cv2. CalcOpticalFlowFarneback (prev, next, pyrscale, níveis, winsize, iterações, polyn, polysigma, flags. Fluxo) rarr fluxo prev 8211 primeira imagem de entrada de um único canal de 8 bits. Próxima 8211 segunda imagem de entrada do mesmo tamanho e do mesmo tipo que anterior. Fluxo 8211 calculado imagem de fluxo que tem o mesmo tamanho como prev e tipo CV32FC2. Pyrscale 8211 parâmetro, especificando a escala de imagem (lt1) para construir pirâmides para cada imagem pyrscale0.5 significa uma pirâmide clássica, onde cada camada seguinte é duas vezes menor que a anterior. Níveis 8211 número de camadas de pirâmide incluindo os níveis de imagem iniciais1 significa que não são criadas camadas extras e apenas as imagens originais são usadas. Winsize 8211 tamanho da janela de valores maiores aumentam a robustez do algoritmo para o ruído da imagem e dar mais chances para a detecção de movimento rápido, mas render mais campo de movimento desfocado. Número de iterações que o algoritmo faz em cada nível de pirâmide. Polyn 8211 tamanho da vizinhança de pixels usada para encontrar expansão polinomial em cada pixel maiores valores significam que a imagem será aproximada com superfícies mais suaves, rendendo algoritmo mais robusto e campo de movimento mais borrado, tipicamente polyn 5 ou 7. Desvio padrão polysigma 8211 Gaussiano que é usado para alisar derivados usados ​​como base para a expansão polinomial para polyn5. Você pode definir polysigma1.1. Para polyn7. Um bom valor seria polysigma1.5. Sinalizadores de operação 8211 que podem ser uma combinação dos seguintes: OPTFLOWUSEINITIALFLOW usa o fluxo de entrada como uma aproximação de fluxo inicial. OPTFLOWFARNEBACKGAUSSIAN usa o filtro gaussiano em vez de um filtro de caixa do mesmo tamanho para estimativa de fluxo óptico normalmente, esta opção dá z fluxo mais preciso do que com um filtro caixa, ao custo de menor velocidade normalmente, winsize para uma janela gaussiana deve ser definido como Um valor maior para atingir o mesmo nível de robustez. A função encontra um fluxo óptico para cada pixel anterior usando o algoritmo de Farneback2003 para que um exemplo usando o algoritmo de fluxo óptico descrito por Gunnar Farneback possa ser encontrado em opencvsourcecodesamplescppfback. cpp (Python) Um exemplo usando o algoritmo de fluxo óptico descrito por Gunnar Farneback pode ser Encontrado em opencvsourcecodesamplespython2optflow. py estimateRigidTransform Calcula uma transformação afim ótima entre dois conjuntos de pontos 2D. C: Mat estimateRigidTransform (InputArray src. InputArray dst. Bool fullAffine) Python: cv2. EstimationRigidTransform (src, dst, fullAffine) rarr retval src 8211 Primeiro conjunto de pontos de entrada 2D armazenado em std :: vector ou Mat. Ou uma imagem armazenada em Mat. Dst 8211 Segundo conjunto de pontos de entrada 2D do mesmo tamanho e do mesmo tipo de A. ou outra imagem. FullAffine 8211 Se true, a função encontra uma transformação affine ideal sem restrições adicionais (6 graus de liberdade). Caso contrário, a classe de transformações a escolher está limitada a combinações de tradução, rotação e escala uniforme (5 graus de liberdade). A função encontra uma transformada affine ótima Ab (uma matriz de ponto flutuante de 2 x 3) que se aproxima melhor da transformação afim entre: Dois conjuntos de pontos Duas imagens raster. Neste caso, a função primeiro encontra alguns recursos na imagem src e encontra os recursos correspondentes na imagem dst. Depois disso, o problema é reduzido ao primeiro caso. No caso de conjuntos de pontos, o problema é formulado da seguinte forma: você precisa encontrar uma matriz 2x2 A e 2x1 vetor b para que: onde srci e dsti são os i-ésimo pontos em src e dst. Respectivamente. De fato, fastAtan2 () e phase () são usados ​​para que o ângulo calculado seja medido em graus e cobre toda a gama 0..360. Além disso, a máscara é preenchida para indicar pixels onde o ângulo calculado é válido. (Python) Um exemplo sobre como executar uma técnica de modelo de movimento pode ser encontrado em opencvsourcecodesamplespython2motempl. py calcGlobalOrientation Calcula uma orientação de movimento global em uma região selecionada. C: double calcGlobalOrientation (InputArray orientação. Modelo InputArray. Modelo InputArray. Timpo duplo. diversão) Python: cv2. CalcGlobalOrientation (orientação, máscara, mhi, timestamp, duração) rarr retval C: duplo cvCalcGlobalOrientation (const CvArr orientação. Const CvArr máscara. CVArr mhi. Duplo timestamp. Dupla duração) Python: cv. CalcGlobalOrientation (orientação, máscara, mhi, timestamp, duração) rarr float orientação 8211 Imagem de orientação de gradiente de movimento calculada pela função calcMotionGradient (). Máscara 8211 Imagem da máscara. Pode ser uma conjunção de uma máscara de gradiente válida, também calculada por calcMotionGradient (). E a máscara de uma região cuja direção precisa ser calculada. Mhi 8211 Imagem do histórico de movimentos calculada por updateMotionHistory (). Timestamp 8211 Timestamp passado para updateMotionHistory (). Duration 8211 Duração máxima de uma trilha de movimento em milissegundos, passada para updateMotionHistory (). A função calcula uma direção de movimento média na região selecionada e retorna o ângulo entre 0 graus e 360 ​​graus. A direção média é calculada a partir do histograma de orientação ponderada, onde um movimento recente tem um peso maior eo movimento ocorreu no passado tem um peso menor, conforme registrado em mhi. SegmentMotion Divide uma imagem de histórico de movimento em algumas partes correspondentes a movimentos independentes independentes (por exemplo, mão esquerda, mão direita). C: void segmentMotion (InputArray mhi, OutputArray, segmask, vectorltRectgtamp, boundingRects, double timestamp, double segThresh) boundingRects, double timestamp, double segThresh) titlePermalink a esta definição Python: cv2. (Mhi, timestamp, segThresh. Segmask) rarr segmask, boundingRects C: CvSeq cvSegmentMotion (const CvArr mhi. CvArr segmask. CvMemStorage armazenamento. Double timestamp. Double segthresh) Python: cv. SegmentMotion (mhi, segmask, armazenamento, timestamp, segthresh) rarr boundingRects mhi 8211 Imagem história de movimento. Segmask 8211 Imagem onde a máscara encontrada deve ser armazenada, single-channel, 32-bit ponto flutuante. BoundingRects 8211 Vector contendo ROIs de componentes conectados ao movimento. Timestamp 8211 A hora actual em milissegundos ou outras unidades. SegThresh 8211 Limite de segmentação recomendado para ser igual ao intervalo entre o histórico de movimentos 8220steps8221 ou superior. A função encontra todos os segmentos de movimento e marca-os em segmask com valores individuais (1,2.). Também calcula um vetor com ROIs de componentes conectados ao movimento. Depois disso, a direção do movimento para cada componente pode ser calculada com calcGlobalOrientation () usando a máscara extraída do componente específico. Finds an object center, size, and orientation. C: RotatedRect CamShift ( InputArray probImage . Rectamp window . TermCriteria criteria ) Python: cv2. CamShift ( probImage, window, criteria ) rarr retval, window C: int cvCamShift ( const CvArr probimage . CvRect window . CvTermCriteria criteria . CvConnectedComp comp . CvBox2D box NULL ) Python: cv. CamShift ( probimage, window, criteria) - gt (int, comp, box ) Sometimes the background image can be very blurry, as it contain the average background statistics. BackgroundSubtractorMOG class BackgroundSubtractorMOG. public BackgroundSubtractor Gaussian Mixture-based BackgroundForeground Segmentation Algorithm. The class implements the algorithm described in P. KadewTraKuPong and R. Bowden, An improved adaptive background mixture model for real-time tracking with shadow detection . Proc. 2nd European Workshop on Advanced Video-Based Surveillance Systems, 2001: personal. ee. surrey. ac. ukPersonalR. Bowdenpublicationsavbs01avbs01.pdf BackgroundSubtractorMOG::BackgroundSubtractorMOG C: BackgroundSubtractorMOG. BackgroundSubtractorMOG ( ) C: BackgroundSubtractorMOG. BackgroundSubtractorMOG ( int history . int nmixtures . double backgroundRatio . double noiseSigma 0 ) Python: cv2. BackgroundSubtractorMOG ( history, nmixtures, backgroundRatio . noiseSigma ) rarr ltBackgroundSubtractorMOG objectgt history 8211 Length of the history. nmixtures 8211 Number of Gaussian mixtures. backgroundRatio 8211 Background ratio. noiseSigma 8211 Noise strength. Default constructor sets all parameters to default values. BackgroundSubtractorMOG::operator() Updates the background model and returns the foreground mask C: void BackgroundSubtractorMOG. operator() ( InputArray image . OutputArray fgmask . double learningRate 0 ) BackgroundSubtractorMOG2 Gaussian Mixture-based BackgroundForeground Segmentation Algorithm. class BackgroundSubtractorMOG2. public BackgroundSubtractor Here are important members of the class that control the algorithm, which you can set after constructing the class instance: Maximum allowed number of mixture components. Actual number is determined dynamically per pixel. Threshold defining whether the component is significant enough to be included into the background model ( corresponds to TB1-cf from the paperwhich paper). cf0.1 gt TB0.9 is default. For alpha0.001. it means that the mode should exist for approximately 105 frames before it is considered foreground. Threshold for the squared Mahalanobis distance that helps decide when a sample is close to the existing components (corresponds to Tg ). If it is not close to any component, a new component is generated. 3 sigma gt Tg339 is default. A smaller Tg value generates more components. A higher Tg value may result in a small number of components but they can grow too large. Initial variance for the newly generated components. It affects the speed of adaptation. The parameter value is based on your estimate of the typical standard deviation from the images. OpenCV uses 15 as a reasonable value. Parameter used to further control the variance. Parameter used to further control the variance. Complexity reduction parameter. This parameter defines the number of samples needed to accept to prove the component exists. CT0.05 is a default value for all the samples. By setting CT0 you get an algorithm very similar to the standard StaufferampGrimson algorithm. The value for marking shadow pixels in the output foreground mask. Default value is 127. Shadow threshold. The shadow is detected if the pixel is a darker version of the background. Tau is a threshold defining how much darker the shadow can be. Tau 0.5 means that if a pixel is more than twice darker then it is not shadow. See Prati, Mikic, Trivedi, Cucchiarra, Detecting Moving Shadows. . IEEE PAMI,2003. The class implements the Gaussian mixture model background subtraction described in: Z. Zivkovic, Improved adaptive Gausian mixture model for background subtraction . International Conference Pattern Recognition, UK, August, 2004, zoranzPublicationszivkovic2004ICPR. pdf. The code is very fast and performs also shadow detection. Number of Gausssian components is adapted per pixel. Z. Zivkovic, F. van der Heijden, Efficient Adaptive Density Estimapion per Image Pixel for the Task of Background Subtraction . Pattern Recognition Letters, vol. 27, no. 7, pages 773-780, 2006. The algorithm similar to the standard StaufferampGrimson algorithm with additional selection of the number of the Gaussian components based on: Z. Zivkovic, F. van der Heijden, Recursive unsupervised learning of finite mixture models, IEEE Trans. on Pattern Analysis and Machine Intelligence, vol.26, no.5, pages 651-656, 2004. BackgroundSubtractorMOG2::BackgroundSubtractorMOG2 C: BackgroundSubtractorMOG2. BackgroundSubtractorMOG2 ( ) C: BackgroundSubtractorMOG2. BackgroundSubtractorMOG2 ( int history . float varThreshold . bool bShadowDetection true ) history 8211 Length of the history. varThreshold 8211 Threshold on the squared Mahalanobis distance to decide whether it is well described by the background model (see Cthr). This parameter does not affect the background update. A typical value could be 4 sigma, that is, varThreshold4416 (see Tb). bShadowDetection 8211 Parameter defining whether shadow detection should be enabled ( true or false ). BackgroundSubtractorMOG2::operator() Updates the background model and computes the foreground mask C: void BackgroundSubtractorMOG2. operator() ( InputArray image . OutputArray fgmask . double learningRate -1 ) BackgroundSubtractorMOG2::getBackgroundImage Returns background image C: void BackgroundSubtractorMOG2. getBackgroundImage ( OutputArray backgroundImage ) Implementing Pairs Trading Using Kalman Filter This article is the final project submitted by the author as a part of his coursework in Executive Programme in Algorithmic Trading (EPAT) at QuantInsti. Do check our Projects page and have a look at what our students are building. Introduction Some stocks move in tandem because the same market events affect their prices. However, idiosyncratic noise might make them temporarily deviate from the usual pattern and a trader could take advantage of this apparent deviation with the expectation that the stocks will eventually return to their long term relationship. Two stocks with such a relationship form a pair. We have talked about the statistics behind pairs trading in a previous article. This article describes a trading strategy based on such stock pairs. The rest of the article is organized as follows. We will be talking about the basics of trading an individual pair, the overall strategy that chooses which pairs to trade and present some preliminary results. In the end, we will describe possible strategies for improving the results. Let us consider two stocks, x and y, such that alpha and beta are constants and e is white noise. The parameters alpha, beta could be obtained from a linear regression of prices of the two stocks with the resulting spread Let the standard deviation of this spread be sigma . The z-score of this spread is Trading Strategy The trading strategy is that when the z-score is above a threshold . say 2, the spread can be shorted . i. e. sell 1 unit of y and buy beta units of x. we expect that the relationship between x and y will hold in the future and eventually the z-score will come down to zero and even go negative and then the position could be closed. By selling the spread when it is high and closing out the position when it is low, the strategy hopes to be statistically profitable. Conversely, if the z-score is below a lower threshold say -2, the strategy will go long the spread, i. e. buy 1 unit of y and sell beta units of x and when the z score rises to zero or above the position can be closed realizing a profit. There are a couple of issues which make this simple strategy difficult to implement in practice: The constants alpha and beta are not constants in practice and vary over time. They are not market observables and hence have to be estimated with some estimates being more profitable than others. The long term relationship can break down, the spread can move from one equilibrium to another such that the changing gives an open short signal and the spread keeps rising to a new equilibrium such that when the close long signal come the spread is above the entry value resulting in a loss. Both of these facts are unavoidable and the strategy has to account for them. Determining Parameters The parameters can be estimated from the intercept and slope of a linear regression of the prices of y against the prices of x. Note that linear regression is not reversible, i. e. the parameters are not the inverse of regressing x against y. So the pairs (x, y) is not the same as (y, x). While most authors use ordinary least squares regression, some use total least squares since they assume that the prices have some intraday noise as well. However, the main issue with this approach is that we have to pick an arbitrary lookback window. In this paper, we have used Kalman filter which is related to an exponential moving average. This is an adaptive filter which updates itself iteratively and produces alpha, beta, e and sigma simultaneously. We use the python package pykalman which has the EM method that calibrates the covariance matrices over the training period. Another question that comes up is whether to regress prices or returns. The latter strategy requires holding equal dollar amount in both long and short positions, i. e. the portfolio would have to be rebalanced every day increasing transaction cost, slippage, and bidask spread. Hence we have chosen to use prices which is justified in the next subsection. Stability of the Long Term Relationship The stability of the long term relationship is determined by determining if the pairs are co-integrated. Note that even if the pairs are not co-integrated outright, they might be for the proper choice of the leverage ratio. Once the parameters have been estimated as above, the spread time series e is tested for stationarity by the augmented Dickey Fuller (ADF) test. In python, we obtain this from the adfuller function in the statsmodels module. The result gives the t-statistics for different confidence levels. We found that not many pairs were being chosen at the 1 confidence level, so we chose 10 as our threshold. One drawback is that to perform the ADF test we have to choose a lookback period which reintroduces the parameter we avoided using the Kalman filter. Choosing Sectors and Stocks The trading strategy deploys an initial amount of capital. To diversify the investment five sectors will be chosen: financials, biotechnology, automotive etc. A training period will be chosen and the capital allocated to each sector is decided based on a minimum variance portfolio approach. Apart from the initial investment, each sector is traded independently and hence the discussion below is limited to a single sector, namely financials. Within the financial sector, we choose about n 47 names based on large market capitalization. We are looking for stocks with high liquidity, small bidask spread, ability to short the stocks etc. Once the stock universe is defined we can form n (n-1) pairs, since as mentioned above (x, y) is not the same as (y, x). In our financial portfolio, we would like to maintain up to five pairs at any given time. On any day that we want to enter into a position (for example the starting date) we run a screen on all the n (n-1) pairs and select the top pair(s) according to some criteria some of which are discussed next. Choosing Pairs For each pair, the signal is obtained from the Kalman filter and we check if e gt nz sigma, where nz is the z-score threshold to be optimized. This ensures that this pair has an entry point. We perform this test first since this is inexpensive. If the pair has an entry point, then we choose a lookback period and perform the ADF test. The main goal of this procedure is not only to determine the list of pairs which meets the standards but rank them according to some metrics which relates to the expected profitability of the pairs. Once the ranking is done we enter into the positions corresponding to the top pairs until we have a total of five pairs in our portfolio. In the following, we calibrated the Kalman filter over Cal11 and then used the calibrated parameters to trade in Cal12. In the following, we kept only one stock-pair in the portfolio. In the tests shown we kept the maximum allowed drawdown per trade to 9, but allowed a maximum loss of 6 in one strategy and only 1 in the other. As we see from above the performance improves with the tightening of the maximum allowed loss per trade. The Sharpe ratio (assuming zero index) was 0.64 and 0.81 respectively while the total PampL was 9.14 and 14. The thresholds were chosen based on the simulation in the training period. Future Work Develop better screening criterion to identify the pairs with the best potentials. I already have several ideas and this will be ongoing research. Optimize the lookback window and the buysell Z-score thresholds. Gather more detailed statistics in the training period. At present, I am gathering statistics of only the top 5 (based on my selection criteria). However, in future, I should record statistics of all pairs that pass. This will indicate which trades are most profitable. In the training period, I am measuring profitability by the total PampL of the trade, from entry till the exit signal is reached. However, I should also record max profit so that I could determine an earlier exit threshold. Run the simulation for several years, i. e. calibrate one year and then test the next year. This will generate several years worths of out-of-sample tests. Another window to optimize is the length of the training period and how frequently the Kalman filter has to be recalibrated. Expand the methodology to other sectors beyond financials. Explore other filters instead of just Kalman filter. Next Steps If you are a coder or a tech professional looking to start your own automated trading desk. Aprenda o comércio automatizado de palestras vivas interativas por praticantes diários. Executive Programme in Algorithmic Trading (EPAT) covers training modules like Statistics amp Econometrics, Financial Computing amp Technology, and Algorithmic amp Quantitative Trading. Enroll now The work presented in the article has been developed by the author, Mr. Dyutiman Das. The underlying codes which form the basis for this article are not being shared with the readers. For readers who are interested in further readings on implementing pairs trading using Kalman Filter, please find the article below. Posts Relacionados:

No comments:

Post a Comment