Moving average c code sample
Eu sei que isso é possível com o aumento como por: Mas eu realmente gostaria de evitar o uso de impulso. Eu pesquisei e não encontrei nenhum exemplo adequado ou legível. Basicamente, quero rastrear a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os números mais recentes de 1000 como uma amostra de dados. Qual é a maneira mais fácil de conseguir isso? Eu experimentei usar uma matriz circular, média móvel exponencial e uma média móvel mais simples e descobri que os resultados da matriz circular se adequavam melhor às minhas necessidades. perguntou 12 de junho de 12 às 4:38 Se as suas necessidades são simples, você pode tentar usar uma média móvel exponencial. Simplificando, você cria uma variável de acumulador e, à medida que seu código examina cada amostra, o código atualiza o acumulador com o novo valor. Você escolhe um alfa constante que esteja entre 0 e 1 e calcula isso: você só precisa encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmmm, eu não tenho certeza se isso é adequado para você, agora que eu coloquei aqui. O problema é que 1000 é uma janela muito longa para uma média móvel exponencial Não tenho certeza se existe um alpha que possa distribuir a média nos últimos 1000 números, sem underflow no cálculo do ponto flutuante. Mas se você quisesse uma média menor, como 30 números ou mais, essa é uma maneira muito fácil e rápida de fazer isso. respondeu 12 de junho às 12:44 1 em seu post. A média móvel exponencial pode permitir que o alfa seja variável. Então, isso permite que ele seja usado para calcular as médias da base de tempo (por exemplo, bytes por segundo). Se o tempo desde a última atualização do acumulador for maior que 1 segundo, você deixa o alpha ser 1.0. Caso contrário, você pode deixar o alpha ser (usecs desde a última atualização / 1000000). Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como uma amostra de dados. Observe que o abaixo atualiza o total como elementos adicionados / substituídos, evitando o deslocamento O (N) caro para calcular a soma - necessária para a média - sob demanda. Total é feito um parâmetro diferente de T para suportar, e. usando um longo longo ao totalizar 1000 long s, um int para char s, ou um double para total float s. Isso é um pouco defeituoso, pois as amostras podem passar do INTMAX - se você se importar, pode usar um sinal longo sem assinatura. ou use um membro extra de dados de bool para registrar quando o contêiner é preenchido pela primeira vez enquanto circula números em torno do array (melhor que renomeie algo inócuo como pos). Resposta: 12 de junho, às 5:19, assume-se que o operador "qvoid" (amostra T) é, na verdade, o operador "co-vi" ("amostra T"). ndash oPless Jun 8 14 às 11:52 oPless ahhh. bem manchado. na verdade eu quis dizer que seria void operator () (amostra T), mas é claro que você poderia usar qualquer notação que você gostasse. Vai consertar, obrigado. ndash Tony D Jun 8 14 às 14: 27Eu quero desenvolver cálculo para o preço médio das ações em movimento. Mas cálculos muito complexos foram planejados mais tarde. Meu primeiro passo para saber como calcular a média móvel com eficiência. Eu preciso saber como pegar a entrada e retornar a saída eficientemente. considerado entrada Data e Preço. saída consumada Data, Preço e Média Móvel. Se eu tiver 500 registros e eu quiser calcular a média móvel por 5 dias, qual é a maneira eficiente em vez de ir e voltar na matriz de Data e Preço novamente, por favor indique qual é a melhor maneira de receber entrada (ArrayList, Table, array etc) e retornar a saída. Nota: MA de hoje de 5 dias será média dos últimos 5 dias, incluindo o preço de hoje. Ontem MA será média dos últimos 5 dias de ontem. Eu quero manter os dias para ser flexível em vez de 5 poderia ser 9, 14, 20 etc Quinta-feira, 10 de abril de 2008 15:21 Se você precisar de cálculo simples sem o seu esforço do que você pode usar TA-Lib. Mas se você quiser que seu cálculo seja mais eficiente que o TA-Lib, então você pode criar seu próprio indicador técnico. O TA-Lib é ótimo, mas o problema é que essa biblioteca tem apenas métodos estáticos. Isso significa que quando você precisar calcular valores de matriz SMA com base em 500 barras de preço, enviará a matriz inteira de barras e retornará a matriz de valores SMA. Mas se você receber o novo valor 501-st, deverá enviar novamente toda a matriz e o TA-Lib novamente calculará e retornará a matriz de valores da SMA. Agora imagine que você precisa desse indicador no feed de preço real, e para cada mudança de preço você precisa de um novo valor de indicador. Se você tiver um indicador não é um grande problema, mas se você tiver indicadores centenas trabalhando, pode ser um problema de desempenho. Eu estava em tal situação e comecei a desenvolver indicadores em tempo real que são eficientes e fazem cálculos adicionais para a nova barra de preço ou apenas para a barra de preço modificada. Infelizmente eu nunca precisei de um indicador de SMA para meus sistemas de negociação, mas eu tenho tal para EMA, WMA, AD e outros. Um desses indicadores AD é publicado no meu blog e você pode ver de lá qual é a estrutura básica da minha classe de indicadores em tempo real. Espero que você precise de pequenas alterações para implementar o indicador SMA, porque é um dos mais simples. A lógica é simples. Para calcular o SMA, tudo o que você precisa são os últimos valores de preço. Assim, a instância de classe terá cobrança de preços, que armazenará manter apenas o último n número de preços, como SMA é definido (no seu caso 5). Então, quando você tiver uma nova barra, você removerá a mais antiga, adicionará uma nova e criará um cálculo. Quinta-feira, 10 de abril de 2008 16:04 Todas respostas Existe uma biblioteca chamada TA-Lib que faz tudo isso para você e é open source. Tem cerca de 50 indicadores, eu acho. Usamos em ambiente de produção e é muito eficiente e real. Você pode usá-lo em C, Java, C, etc. Se precisar de cálculos simples sem o seu esforço, você pode usar o TA-Lib. Mas se você quiser que seu cálculo seja mais eficiente que o TA-Lib, então você pode criar seu próprio indicador técnico. O TA-Lib é ótimo, mas o problema é que essa biblioteca tem apenas métodos estáticos. Isso significa que quando você precisar calcular valores de matriz SMA com base em 500 barras de preço, enviará a matriz inteira de barras e retornará a matriz de valores SMA. Mas se você receber o novo valor 501-st, deverá enviar novamente toda a matriz e o TA-Lib novamente calculará e retornará a matriz de valores da SMA. Agora imagine que você precisa desse indicador no feed de preço real, e para cada mudança de preço você precisa de um novo valor de indicador. Se você tiver um indicador não é um grande problema, mas se você tiver indicadores centenas trabalhando, pode ser um problema de desempenho. Eu estava em tal situação e comecei a desenvolver indicadores em tempo real que são eficientes e fazem cálculos adicionais para a nova barra de preço ou apenas para a barra de preço modificada. Infelizmente eu nunca precisei de um indicador de SMA para meus sistemas de negociação, mas eu tenho tal para EMA, WMA, AD e outros. Um desses indicadores AD é publicado no meu blog e você pode ver de lá qual é a estrutura básica da minha classe de indicadores em tempo real. Espero que você precise de pequenas alterações para implementar o indicador SMA, porque é um dos mais simples. A lógica é simples. Para calcular o SMA, tudo o que você precisa são os últimos valores de preço. Assim, a instância de classe terá cobrança de preços, que armazenará manter apenas o último n número de preços, como SMA é definido (no seu caso 5). Então, quando você tiver uma nova barra, você removerá a mais antiga, adicionará uma nova e criará um cálculo. Quinta-feira, 10 de abril de 2008 16:04 Eu calcularia a média móvel no banco de dados por meio de um procedimento armazenado ou em um cubo. Você já olhou para o Analysis Services, ele tem a capacidade de calcular médias móveis. Quinta-feira, 10 de abril de 2008 16:05 Sim. TA-LIB é bom, mas pode não ser adequado para mim. Quando eu adicionar um novo valor ou um valor atualizado para o histórico de registros, farei o cálculo em uma função separada somente para essa nova cotação e armazenarei no banco de dados. Estou planejando atualizar a cotação a cada hora. Eu preciso fazer cerca de 25 a 30 indicadores técnicos para 2200 ações. Quinta-feira, 10 de abril de 2008 17h51 O tempo de execução de uma chamada TA-Lib em uma matriz de 10.000 elementos leva cerca de 15 milissegundos (em um Intel Core Duo 2.13 Ghz). Esta é a média de todas as funções. Entre os mais rápidos, o SMA leva menos de 2,5 milissegundos. O mais lento, HTTRENDMODE, leva 450 milissegundos. Com menos elementos, é mais rápido. O SMA leva cerca de 0,22 milissegundos para 1000 elementos de entrada. O ganho de velocidade é quase linear (a sobrecarga de realizar a chamada de função é insignificante). No contexto da sua aplicação, é improvável que o TA-Lib seja o seu gargalo para o desempenho de velocidade. Além disso, geralmente não recomendo essa solução de última hora. Leia abaixo para detalhes. Primeiro, uma correção para a declaração de Boban. Todas as funções no TA-Lib também podem calcular um único último valor usando um mínimo de elementos "nlot". Você pode ter uma matriz de tamanho 10000, ter dados inicializados apenas para os primeiros 500 elementos, adicionar um elemento e chamar TA-Lib para calcular o SMA somente para o novo elemento. TA-Lib irá olhar para trás não mais do que o necessário (se SMA de 5, então TA-Lib irá calcular um único SMA usando os últimos 5 valores). Isso é possível com o parâmetro startIdx e endIdx. Você pode especificar um intervalo a ser calculado ou um único valor. Neste cenário você faria o startIdx endIdx 500 para calcular o 501º elemento. Por que essa última solução não é potencialmente perigosa para alguns? Independentemente de selecionar a solução de Boban ou TA-Lib, considerar que usar um pequeno número finito de dados passados não funcionará bem com a maioria das funções de TA. Com o SMA, é óbvio que você só precisa de um elemento n para calcular uma média sobre um elemento n. Não é tão simples com o EMA (e muitas outras funções do TA). O algoritmo geralmente depende do valor anterior para calcular o novo valor. A função é recursiva. Isso significa que todos os valores do passado influenciam os valores futuros. Se você decidir "limitar" seu algoritmo a usar apenas uma pequena quantidade do valor n passado, você não obterá o mesmo resultado de alguém que calcule um grande número de valores anteriores. A solução é um compromisso entre velocidade e precisão. Eu freqüentemente discuto isso no contexto do TA-Lib (eu o chamo de "período marcante" na documentação e no fórum). Para simplificar, minha recomendação geral é: se você não puder fazer a diferença entre um algoritmo com uma resposta de impulso finita (FIR) de um algoritmo com uma resposta de impulso infinita (IIR), será mais seguro calcular todos os dados que tiver acessível. O TA-Lib especifica no código quais de suas funções têm um período instável (IIR). Editado por mfortier sexta-feira, 15 de agosto de 2008 4:25 Correct english sentence Sexta-feira, 15 de agosto de 2008 4:20 Média / Média móvel simples Médias / Média móvel simples Você é encorajado a resolver esta tarefa de acordo com a descrição da tarefa, usando qualquer linguagem que você pode conhecer. Computando a média móvel simples de uma série de números. Crie uma função / classe / instância com estado que receba um ponto e retorne uma rotina que tenha um número como argumento e retorne uma média móvel simples de seus argumentos até o momento. Uma média móvel simples é um método para calcular uma média de um fluxo de números calculando apenas os últimos 160 números 160 do fluxo, 160 em que 160 160 é conhecido como o período. Ele pode ser implementado chamando uma rotina de inicialização com 160 P 160 como argumento, 160 I (P), 160 que deve retornar uma rotina que, quando chamada com membros individuais e sucessivos de um fluxo de números, calcula a média de para), os últimos 160 P 160 deles, vamos chamar isso de 160 SMA (). A palavra 160 com estado 160 na descrição da tarefa refere-se à necessidade de 160 SMA () 160 lembrar certas informações entre chamadas a ele: 160 O período, 160 P 160 Um contêiner ordenado de pelo menos os últimos 160 P 160 números de cada um suas chamadas individuais. Stateful 160 também significa que sucessivas chamadas para 160 I (), 160 o inicializador, 160 devem retornar rotinas separadas que fazem 160 e 160 compartilham o estado salvo para que possam ser usadas em dois fluxos independentes de dados. O pseudo-código para uma implementação do 160 SMA 160 é: Esta versão usa uma fila persistente para conter os valores p mais recentes. Cada função retornada da média de movimentação de inicialização tem seu estado em um átomo que contém um valor de fila. Essa implementação usa uma lista circular para armazenar os números dentro da janela no início de cada ponteiro de iteração se refere à célula da lista que mantém o valor apenas saindo da janela e sendo substituído pelo valor recém-adicionado. Usando uma edição de fechamento Atualmente, este sma não pode ser nogc porque aloca um fechamento no heap. Algumas análises de escape podem remover a alocação de heap. Usando uma edição Struct Esta versão evita a alocação de heap do fechamento mantendo os dados no quadro de pilha da função principal. Mesma saída: para evitar que as aproximações de ponto flutuante continuem se acumulando e crescendo, o código poderia executar uma soma periódica em toda a matriz de filas circulares. Essa implementação produz dois estados de compartilhamento de objetos (função). É idiomático em E separar a entrada da saída (leitura da escrita) em vez de combiná-las em um único objeto. A estrutura é a mesma que a implementação do Standard DeviationE. O programa elixir abaixo gera uma função anônima com um período embutido p, que é usado como o período da média móvel simples. A função executar lê entrada numérica e passa para a função anônima recém-criada e, em seguida, inspeciona o resultado para STDOUT. A saída é mostrada abaixo, com a média, seguida pela entrada agrupada, formando a base de cada média móvel. Erlang tem encerramentos, mas variáveis imutáveis. Uma solução, então, é usar processos e uma API simples de passagem de mensagens. As linguagens matriciais possuem rotinas para calcular as médias de deslizamento para uma determinada sequência de itens. É menos eficiente fazer um loop como nos comandos a seguir. Continuamente solicita uma entrada I. que é adicionado ao final de uma lista L1. L1 pode ser encontrado pressionando 2ND / 1 e a média pode ser encontrada em List / OPS. Pressione ON para finalizar o programa. Função que retorna uma lista contendo os dados médios do argumento fornecido Programa que retorna um valor simples em cada invocação: lista é a média da lista: p é o período: 5 retorna a lista média: Exemplo 2: Usando o programa movinav2 (i 5) - Inicializando o cálculo da média móvel, e definindo o período de 5 movinav2 (3, x): x - novos dados na lista (valor 3), e o resultado será armazenado na variável x, e exibido movinav2 (4, x) : x - novos dados (valor 4), e o novo resultado será armazenado na variável xe exibido (43) / 2. Descrição da função movinavg: variável r - é o resultado (a lista média) que será retornada a variável i - é a variável de índice, e aponta para o final da sub-lista em que a lista está em média. variável z - uma variável auxiliar A função usa a variável i para determinar quais valores da lista serão considerados no cálculo da média seguinte. Em cada iteração, a variável i aponta para o último valor na lista que será usado no cálculo da média. Portanto, só precisamos descobrir qual será o primeiro valor na lista. Geralmente bem tem que considerar p elementos, então o primeiro elemento será aquele indexado por (i-p1). No entanto, nas primeiras iterações, o cálculo geralmente será negativo, portanto a seguinte equação evitará índices negativos: max (i-p1,1) ou, organizando a equação, max (i-p, 0) 1. Mas o número de elementos nas primeiras iterações também será menor, o valor correto será (end index - begin index 1) ou, organizando a equação, (i - (max (ip, 0) 1) 1), e então , (i-max (ip, 0)). A variável z contém o valor comum (max (ip), 0), portanto, o beginindex será (z1) e o número de elementos será (iz) mid (list, z1, iz) retornará a lista de valores que serão calculados como soma ( .) soma-os soma (.) / (iz) ri os mede e armazena o resultado no lugar apropriado na lista de resultados Usando um fechamento e criando uma função
Комментарии
Отправить комментарий