Skip to main content

Php Code Exponential Moving Average


Estou tentando recuperar o último EMA de um grande conjunto de dados (15000 valores). É um algoritmo com muitos recursos, já que cada valor depende do anterior. Aqui está o meu código: O que eu já fiz: Isolar k por isso não é calculado 10000 vezes. Mantenha apenas o EMA computado mais recente e não mantenha todos eles em uma matriz use para () em vez de foreach () a matriz de dados não possui chaves É uma matriz básica Isso me permitiu reduzir o tempo de execução de 2000ms para cerca de 500ms para 15000 valores O que não funcionou: Use SplFixedArray (), este raspou apenas 10ms executando 1.000.000 de valores Use a extensão PHPTrader. Isso retorna uma matriz contendo todos os EMAs em vez de apenas o mais recente, e é mais lento Escrevendo e executando o mesmo algoritmo em C e executando-o em mais de 2.000.000 de valores leva apenas 13ms. Então, obviamente, usar uma linguagem compilada e de nível inferior parece ajudar P Onde Devo ir daqui. O código será executado no Ubuntu, então qual idioma eu escolher? Será que o PHP pode chamar e passar um argumento tão grande para o roteiro perguntou Jul 11 ​​14 às 19:21 Estabelecer uma implementação clara com uma extensão dá-lhe um Impulso significativo. Além disso, o cálculo pode ser melhorado em si mesmo e esse ganho você pode adicionar em qualquer idioma que você escolher. É fácil ver que lastEMA pode ser calculado da seguinte forma: Isso pode ser reescrito da seguinte forma para tirar o loop o máximo possível: Para explicar a extração do k pense que na formulação anterior é como se todos os Os dados originais originais são multiplicados por k, de modo que praticamente você pode, em vez disso, multiplicar o resultado final. Observe que, reescrito desta maneira, você tem 2 operações dentro do loop ao invés de 3 (para ser preciso dentro do loop, também estou aumentando, eu comparado com a atribuição de tamanho e atribuição de valores de lastema), assim assim você pode esperar obter um adicional Aceleração no intervalo entre os 16 e 33. Além disso, existem outras melhorias que podem ser consideradas, pelo menos, em algumas circunstâncias: Considere somente os últimos valores. Os primeiros valores são multiplicados várias vezes por k1m 1 - k para que sua contribuição possa ser pequena ou mesmo ir Sob a precisão de ponto flutuante (ou o erro aceitável). Essa idéia é particularmente útil se você pode assumir o pressuposto de que os dados mais antigos são da mesma ordem de grandeza que os mais novos, porque se você considerar apenas os últimos valores n o erro que você faz é err EMAofdiscardeddata (1-k) n. Então, se a ordem de grandeza for amplamente igual, podemos dizer que o erro relativo feito é relerr err lastEMA EMAofdiscardeddata (1-k) n lastEMA que é quase igual a (1-k) n. Sob o pressuposto de que lastEMA é quase igual a EMAddiscardeddata: Digamos que você pode aceitar um erro relativamente relativo, você pode considerar com segurança apenas os últimos valores de n onde (1 - k) e lt relerr. Significa que você pode pré-calcular (antes do loop) n log (relerr) log (1-k) e calcular tudo apenas considerando os últimos n valores. Se o conjunto de dados for muito grande, isso pode dar uma velocidade sensível. Considere que para números de ponto flutuante de 64 bits você tem uma precisão relativa (relacionada à mantisa) que é 2-53 (cerca de 1.1e-16 e apenas 2-24 5.96e-8 para números de ponto flutuante de 32 bits) para que você não possa obter Melhor do que este erro relativo, então, basicamente, você nunca deve ter uma vantagem ao calcular mais do que n log (1.1e-16) log (1-k) valores. Para dar um exemplo se o alcance 2000 e n log (1.1e-16) log (1-2 2001) 36746. Eu acho que é interessante saber que os cálculos extras se perderiam dentro dos arredondamentos é inútil é melhor não fazer. Agora um exemplo para o caso em que você pode aceitar um erro relativo maior que a precisão de ponto flutuante relerr 1ppm 1e-6 0.00001 6 dígitos decimais significativos você tem log n log (1.1e-16) (1-2 2001) 13815 Eu acho que é bastante Um pequeno número comparado aos seus últimos números de amostras, então, nesse caso, a aceleração pode ser evidente (Im assumindo que o intervalo 2000 é significativo ou alto para sua aplicação, mas que eu não posso saber). Apenas outros poucos números porque não sei quais são as suas figuras típicas: relerr 1e-3 range 2000 n 6907 relerr 1e-3 range 200 n 691 relerr 1e-3 range 20 n 69 relerr 1e-6 range 2000 n 13815 relerr 1e - 6 intervalo 200 n 1381 relerr 1e-6 range 20 n 138 Se o pressuposto lastEMA quase igual a EMA de dados perdidos não pode ser tomado, as coisas são menos fáceis, mas como a vantagem da câmera é significativa, pode ser significativo continuar: precisamos repensar a Fórmula completa: relerr EMAdediscardeddata (1-k) n lastEMA assim n log (relerr lastEMA EMAdediscardeddata) log (1-k) (registro log (relerr) (lastEMA EMAdediscardeddata)) log (1-k) o ponto central é calcular lastEMA EMAdediscardeddata (sem realmente calcular lastEMA nem EMAdediscardeddata, é claro) um caso é quando sabemos a priori que, por exemplo, EMAdediscardeddata lastema lt M (por exemplo M 1000 ou M 1e6) nesse caso n lt (log (relerr M)) log ( 1-k) se você não pode dar qualquer número M que você precisa encontrar Uma boa idéia para estimar excessivamente EMAddiscardeddata lastema uma maneira rápida poderia ser tomar M max (dados) min (dados) Paralelização O cálculo pode ser reescrito de uma forma onde é uma simples adição de termos independentes: então, se a implementação O idioma suporta a paralelização, o conjunto de dados pode ser dividido em 4 (ou 8 ou n. Basicamente, o número de núcleos da CPU disponíveis) e pode-se calcular a soma dos termos em cada pedaço em paralelo, resumindo os resultados individuais no final. Eu não vou em detalhes com isso, uma vez que esta resposta já é terrivelmente longa e acho que o conceito já está expresso. Obrigado por esse I39m usando isso em dados do mercado de ações, então o fato de que os dados mais antigos estão na mesma ordem de grandeza que os dados mais recentes dependem do período de tempo usado. Suponha um intervalo de 200, haverá uma variação muito maior nos preços em um período de tempo diário (200 dias) do que um período de tempo de 5 minutos (16 horas). Vou experimentar diferentes cenários em dados reais e simulados. Em novos dados, com um intervalo de 200, eu uso um conjunto de dados de 1000 elementos. Mas também faço alguns testes ao longo dos últimos anos, então eu ainda preciso carregar todo o conjunto de dados. Você ajudou para ambas as situações, obrigado ndash Lykegenes 16 de julho 14 às 15:11 Construir sua própria extensão definitivamente melhora o desempenho. Heres um bom tutorial do site Zend. Algumas figuras de desempenho: Hardware: Ubuntu 14.04, PHP 5.5.9, Intel Core3.3Ghz de 1 núcleo, 128MB de RAM (é um VPS). Antes (apenas PHP, 16.000 valores). Extensão de 500 ms C, 16 000 valores. Extensão de 0,3 ms (100 000 valores). Extensão de 6,7 ms (500 000 valores). 28,0 ms Mas memória Im limitada neste ponto, usando 70 MB. Vou consertar isso e atualizar os números de acordo. Eu basicamente tenho uma série de valores como este: a matriz acima é simplificada, estou coletando 1 valor por milissegundo no meu código real e preciso processar a saída em um algoritmo que escrevi para encontrar O pico mais próximo antes de um ponto no tempo. Minha lógica falha porque no meu exemplo acima, 0.36 é o pico real, mas meu algoritmo olhava para trás e veria o último número 0.25 como o pico, pois há uma diminuição para 0,24 antes dele. O objetivo é levar esses valores e aplicar um algoritmo para eles, que os suavizará um pouco para que eu tenha mais valores lineares. (Ie: Id como os meus resultados serem curvy, não jaggedy) Eu fui dito para aplicar um filtro exponencial de média móvel aos meus valores. Como posso fazer isso. É muito difícil para mim ler equações matemáticas, eu ligo muito melhor com o código. Como faço para processar valores na minha matriz, aplicando um cálculo exponencial da média móvel para os fazer sair 8 de fevereiro 12 às 20:27 Para calcular uma média móvel exponencial. Você precisa manter algum estado ao redor e você precisa de um parâmetro de ajuste. Isso exige uma pequena classe (supondo que você esteja usando o Java 5 ou posterior): Instantiate com o parâmetro de decaimento que você deseja (pode ter uma afinação deve estar entre 0 e 1) e depois use a média () para filtrar. Ao ler uma página sobre alguma recorrência matemática, tudo o que você realmente precisa saber ao transformá-lo em código é que os matemáticos gostam de escrever índices em matrizes e seqüências com subíndices. (Contudo, algumas outras notações, o que não ajuda.) No entanto, o EMA é bastante simples, pois você só precisa se lembrar de um valor antigo, não é necessário nenhum arrays de estados complicados. Respondeu 8 de fevereiro às 20:42 TKKocheran: praticamente. Não é bom quando as coisas podem ser simples (Se começar com uma nova seqüência, obtenha uma nova média). Observe que os primeiros termos na seqüência média saltarão em torno de um bit devido a efeitos de limites, mas você obtém aqueles com outras médias móveis também. No entanto, uma boa vantagem é que você pode envolver a lógica média móvel na média e experimentar sem perturbar demais o seu programa. Ndash Donal Fellows 9 de fevereiro às 0:06 Estou tendo dificuldade em entender suas perguntas, mas vou tentar responder de qualquer maneira. 1) Se o seu algoritmo encontrou 0,25 em vez de 0,36, então está errado. É errado porque assume um aumento ou diminuição monotônico (que sempre está subindo ou sempre está descendo). A menos que você tenha TODOS OS seus dados, seus pontos de dados --- como você os apresenta --- são não-lineares. Se você realmente quer encontrar o valor máximo entre dois pontos no tempo, então corte sua matriz de tmin para tmax e encontre o máximo desse subarray. 2) Agora, o conceito de médias móveis é muito simples: imagine que eu tenho a seguinte lista: 1.4, 1.5, 1.4, 1.5, 1.5. Eu posso suavizá-lo tomando a média de dois números: 1.45, 1.45, 1.45, 1.5. Observe que o primeiro número é a média de 1,5 e 1,4 (segundo e primeiro número), a segunda (nova lista) é a média de 1,4 e 1,5 (terceira e segunda lista antiga) a terceira (nova lista) a média de 1,5 e 1,4 (Quarto e terceiro), e assim por diante. Eu poderia ter feito período três ou quatro, ou n. Observe como os dados são muito mais suaves. Uma boa maneira de ver as médias móveis no trabalho é ir para o Google Finance, selecionar um estoque (tente Tesla Motors bastante volátil (TSLA)) e clique em técnicas na parte inferior do gráfico. Selecione a média móvel com um período determinado e uma média móvel exponencial para comparar suas diferenças. A média móvel exponencial é apenas uma outra elaboração deste, mas considera os dados anteriores menos do que os novos dados, é uma maneira de polarizar o alisamento na parte de trás. Leia a entrada da Wikipedia. Então, isso é mais um comentário do que uma resposta, mas a pequena caixa de comentários foi apenas pequena. Boa sorte. Se você estiver tendo problemas com a matemática, você poderia ir com uma média móvel simples em vez de exponencial. Então, a saída que você obtém seria os últimos x termos divididos por x. Pseudocódigo não testado: note que você precisará lidar com as partes de início e fim dos dados, pois claramente você não pode usar os 5 últimos termos quando estiver no seu segundo ponto de dados. Além disso, existem formas mais eficientes de calcular essa média móvel (soma sumária - a mais nova), mas é para obter o conceito do que está acontecendo. Respondeu 8 de fevereiro às 20:41 Sua resposta 2016 Stack Exchange, Inc

Comments

Popular posts from this blog

Sistema Estocástico Oscilador Comercial

Oscilador estocástico O oscilador estocástico é calculado usando a seguinte fórmula: C o preço de fechamento mais recente L14 o menor das 14 sessões de negociação anteriores H14 o preço mais alto negociado durante o mesmo período de 14 dias K a taxa de mercado atual para o par de moedas D 3 - média móvel média de K A teoria geral que serve de base para esse indicador é que, em um mercado tendendo para cima, os preços fecharão perto do alto, e em um mercado tendendo para baixo, os preços fecham perto da baixa. Os sinais de transação são criados quando o K atravessa uma média móvel de três períodos, que é chamado de D. O oscilador estocástico foi desenvolvido no final da década de 1950 por George Lane. Conforme projetado por Lane, o oscilador estocástico apresenta a localização do preço de fechamento de um estoque em relação ao alto e baixo alcance do preço de uma ação durante um período de tempo, geralmente um período de 14 dias. Lane, ao longo de inúmeras entrevistas, disse que o oscil

Opções De Negociação Sem Risco

Tutorial básico de opções Hoje em dia, muitas carteiras de investidores incluem investimentos como fundos de investimento. ações e títulos. Mas a variedade de valores mobiliários que você possui à sua disposição não termina. Outro tipo de segurança, chamada de opção, apresenta um mundo de oportunidades para investidores sofisticados. O poder das opções reside na sua versatilidade. Eles permitem que você adapte ou ajuste sua posição de acordo com qualquer situação que surgir. As opções podem ser tão especulativas quanto conservadoras como você deseja. Isso significa que você pode fazer tudo, desde proteger uma posição de uma queda para apostas abertas sobre o movimento de um mercado ou índice. 13 Essa versatilidade, no entanto, não vem sem seus custos. As opções são títulos complexos e podem ser extremamente arriscadas. É por isso que, ao negociar opções, você verá um aviso legal como o seguinte: 13 As opções envolvem riscos e não são adequadas para todos. A negociação de opções pode se

Opções De Ações Remuneração Executiva

Compensação: Planos de Incentivo: Opções de Ações O direito de comprar ações em um determinado preço em algum momento no futuro. Opções de ações vêm em dois tipos: opções de estoque de incentivo (ISOs) em que o empregado é capaz de diferir a tributação até as ações compradas com a opção são vendidas. A empresa não recebe uma dedução fiscal para este tipo de opção. Opções de ações não qualificadas (NSOs) em que o empregado deve pagar imposto sobre o spread entre o valor da ação e o valor pago pela opção. A empresa pode receber uma dedução fiscal no spread. Como funcionam as opções de ações Uma opção é criada que especifica que o proprietário da opção pode exercer o direito de comprar ações de uma empresa a um determinado preço (o preço do subsídio) por uma determinada data (expiração) no futuro. Normalmente, o preço da opção (o preço da subvenção) é fixado para o preço de mercado da ação no momento em que a opção foi vendida. Se o estoque subjacente aumenta em valor, a opção torna-se ma