Tuesday 1 August 2017

Php Code Exponential Moving Average


Quero calcular o valor EMA (Exponential Moving Average) em PHP. Ive tentou com o seguinte código, mas seu me dando 500 erro. PHP: Função de cálculo de EMA Trader-e-mail Tentei com muito tempo pesquisando, mas não recebendo nenhuma ajuda sobre isso em PHP. Então, eu não tenho idéia o que precisa ser feito para calcular o valor EMA. Edit-1: Instalado extensões Ive instalado todas as extensões necessárias, Agora estou recebendo a saída. Mas não parece dar saída adequada. Acho que a função PHP para calcular EMA não está funcionando corretamente. Qualquer ajuda neste seria muito apreciada. Estou tentando recuperar o último EMA de um grande conjunto de dados (15000 valores). Trata-se de 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 para que ele não é computado 10000 vezes Mantenha apenas o mais recente EMA computado, e não manter todos eles em um uso de matriz para () em vez de foreach () a matriz de dados não tem chaves Seu um array básico 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 (), isso raspou apenas 10ms executando 1.000.000 valores Use extensão PHPTrader. Isso retorna uma matriz contendo todos os EMAs em vez de apenas o mais recente, e sua escrita mais lenta e executando o mesmo algoritmo em C e executá-lo mais de 2.000.000 valores leva apenas 13ms Então, obviamente, usando um compilado, linguagem de nível inferior parece ajudar P Onde Devo ir a partir daqui O código será executado em última instância no Ubuntu, de modo que a linguagem devo escolher Will PHP ser capaz de chamar e passar um argumento tão grande para o script pediu Jul 11 ​​14 at 19:21 Claramente implementação com uma extensão dá-lhe um Significativo. Além disso, o cálculo pode ser melhorado como ele próprio e esse ganho você pode adicionar em qualquer idioma que você escolher. É fácil ver que lastEMA pode ser calculado da seguinte forma: Isto pode ser reescrito da seguinte forma para tirar o loop o máximo possível: Para explicar a extração do k acho que na formulação anterior é como se todos os Os dados brutos originais são multiplicados por k praticamente você pode multiplicar o resultado final. Observe que, reescrita desta maneira, você tem 2 operações dentro do loop em vez de 3 (para ser preciso dentro do loop, há também i incremento, i comparação com classificaç~ao sizeata e lastEMA), desta forma você pode esperar obter um valor adicional Speedup no intervalo entre os 16 e 33. Além disso, há outras melhorias que podem ser consideradas, pelo menos em algumas circunstâncias: Considere apenas os últimos valores Os primeiros valores são multiplicados várias vezes por k1m 1 - k para que o seu contributo pode ser pouco ou mesmo ir Sob a precisão de ponto flutuante (ou o erro aceitável). Essa idéia é particularmente útil se você pode fazer a suposição de que os dados mais antigos são da mesma ordem de magnitude do mais recente, porque se você considerar apenas os últimos n valores o erro que você faz é err EMAofdiscardeddata (1-k) n. Portanto, se a ordem de magnitude é amplamente a mesma, podemos dizer que o erro relativo feito é relerr err / lastEMA EMAofdiscardeddata (1-k) n / lastEMA que é quase igual a simplesmente (1-k) n. Sob a suposição de que lastEMA é quase igual a EMAofdiscardeddata: Vamos dizer que você pode aceitar um erro relativo relerr você pode considerar com segurança apenas os últimos n valores onde (1 - k) n lt relerr. Significa que você pode pré-calcular (antes do loop) n log (relerr) / log (1-k) e calcular tudo somente considerando os últimos n valores. Se o conjunto de dados é muito grande isso pode dar uma aceleração sensata. Considere que para números de ponto flutuante de 64 bits você tem uma precisão relativa (relacionada à mantissa) 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 no cálculo de mais de n log (1.1e-16) / log (1-k) valores. Para dar um exemplo se intervalo 2000, em seguida, n log (1.1e-16) / log (1-2 / 2001) 36746. Acho que é interessante saber que cálculos extras iria perder dentro dos arredondamentos é inútil é melhor não Faz. Agora um exemplo para o caso em que você pode aceitar um erro relativo maior do que a precisão de ponto flutuante relerr 1ppm 1e-6 0.00001 6 dígitos decimais significativos que você tem n log (1.1e-16) / log (1-2 / 2001) 13815 Eu acho É um número muito pouco em comparação com o seu número de amostras passado, então em que casos a aceleração poderia ser evidente (Im assumindo que o intervalo de 2000 é significativo ou elevado para a sua aplicação, mas thi eu não posso saber). Apenas outros poucos números, porque eu não sei quais são suas figuras típicas: relerr 1e-3 intervalo 2000 n 6907 relerr 1e-3 intervalo 200 n 691 relerr 1e-3 intervalo 20 n 69 relerr 1e-6 intervalo 2000 n 13815 relerr 1e - 6 gama 200 n 1381 relerr 1e-6 intervalo 20 n 138 Se a suposição lastEMA quase igual a EMAofdiscardeddata não pode ser tomada as coisas são menos fáceis, mas desde que a vantagem cam ser significativo pode ser significativo para continuar: temos de re-considerar o (1-k) / log (1-k) (registro de log (relerr) (lastEMA / EMAofdiscardeddata)) / log (1-k), a central completa: relerr EMAofdiscardeddata (1-k) n / lastEMA para n log (relerr lastEMA / EMAofdiscardeddata) Um caso é quando sabemos a priori que, por exemplo, EMAofdiscardeddata / lastEMA lt M (por exemplo, M 1000 ou M 1e6), nesse caso n lt (log) é um cálculo de lastEMA / EMAofdiscardeddata (sem realmente calcular lastEMA ou EMAofdiscardeddata) (Relerr / M)) / log (1-k) se você não pode dar qualquer número M você tem que encontrar uma boa idéia para superestimar EMAofdiscardeddata / lastEMA uma maneira rápida poderia ser tomar M max (dados) / min ) Paralelização O cálculo pode ser reescrito de uma forma em que é uma simples adição de termos independentes: Portanto, se o linguagem de implementação suporta paralelização o conjunto de dados pode ser dividido em 4 (ou 8 ou n. Basicamente o número de núcleos de CPU disponíveis) e pode ser computada a soma de termos em cada pedaço em paralelo somando os resultados individuais no final. Eu não vou em detalhes com isso, uma vez que esta resposta já é terrivelmente longa e eu acho que o conceito já está expresso. Obrigado por este I39m usando isso em dados do mercado de ações, de modo que o fato de que os dados mais antigos estão na mesma ordem de magnitude como os dados mais recentes depende do período de tempo utilizado. 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 5 minutos (16 horas). Vou experimentar com diferentes cenários em dados reais e simulados. Em dados novos, com um range lt 200, eu uso um conjunto de dados de 1000 elementos. Mas eu também fazer alguns testes de volta 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 Jul 16 14 at 15:11 Construir sua própria extensão definitivamente melhora o desempenho. Heres um bom tutorial do site Zend. Alguns números de desempenho: Hardware: Ubuntu 14.04, PHP 5.5.9, 1-core Intel CPU3.3Ghz, 128MB RAM (é um VPS). Antes (somente PHP, 16.000 valores). 500ms C Extensão, 16.000 valores. Extensão de 0,3 ms C (100 000 valores). Extensão 3.7ms C (500.000 valores). 28.0ms Mas Im memória limitada neste momento, usando 70MB. Eu fixarei isso e atualizarei os números em conformidade. Média móvel exponencial (EMA) A fórmula EMA clássica é: Ao contrário da média móvel simples. Onde o peso de todas as barras anteriores é igual, a Média Móvel Exponencial torna a barra mais recente mais importante. O peso de cada barra mais antiga diminui exponencialmente. Abaixo está um gráfico de peso para N 10 (1 é o preço atual, 2 o anterior e assim por diante): A fórmula de peso é onde i é uma distância para a barra mais recente. 0 significa o mais recente, 1 a barra anterior e assim por diante. Primeiro valor A fórmula faz referência ao valor anterior e não existe um acordo padrão qual é o primeiro (mais antigo) valor. Implementação diferente de EMA usa: O primeiro preço (MT4, Marketscope) ou A Média Móvel Simples dos primeiros preços N (Stockcharts). Uso em lugar de média móvel simples A média móvel exponencial pode ser usado exatamente como média móvel simples. Especialmente na situação em que a inércia da Média Móvel Simples não pode ser ignorada. Basta comparar EMA (10) e MVA (10) aplicados nos mesmos preços: Limitações A Média Móvel Exponencial baseia-se em todos os seus valores anteriores, portanto, o resultado do indicador para uma determinada barra depende da quantidade de dados históricos considerados. Assim, na situação em que mais dados históricos são carregados, o valor do indicador pode diferir do calculado anteriormente. Como um primeiro passo para ir além dos modelos de média, modelos de caminhada aleatória e modelos de tendência linear, padrões e tendências não sazonais podem ser extrapolados usando um modelo de média móvel ou suavização. A suposição básica por trás dos modelos de média e suavização é que a série temporal é localmente estacionária com uma média lentamente variável. Assim, tomamos uma média móvel (local) para estimar o valor atual da média e então usamos isso como a previsão para o futuro próximo. Isto pode ser considerado como um compromisso entre o modelo médio e o modelo aleatório-andar-sem-deriva. A mesma estratégia pode ser usada para estimar e extrapolar uma tendência local. Uma média móvel é muitas vezes chamado de uma versão quotsmoothedquot da série original, porque a média de curto prazo tem o efeito de suavizar os solavancos na série original. Ajustando o grau de suavização (a largura da média móvel), podemos esperar encontrar algum tipo de equilíbrio ótimo entre o desempenho dos modelos de caminhada média e aleatória. O tipo mais simples de modelo de média é o. Média Móvel Simples (igualmente ponderada): A previsão para o valor de Y no tempo t1 que é feita no tempo t é igual à média simples das observações m mais recentes: (Aqui e em outro lugar usarei o símbolo 8220Y-hat8221 para ficar Para uma previsão da série temporal Y feita o mais cedo possível antes de um determinado modelo). Esta média é centrada no período t (m1) / 2, o que implica que a estimativa da média local tende a ficar para trás Valor real da média local em cerca de (m1) / 2 períodos. Dessa forma, dizemos que a idade média dos dados na média móvel simples é (m1) / 2 relativa ao período para o qual a previsão é calculada: é a quantidade de tempo em que as previsões tenderão a ficar para trás dos pontos de inflexão na dados. Por exemplo, se você estiver calculando a média dos últimos 5 valores, as previsões serão cerca de 3 períodos atrasados ​​em responder a pontos de viragem. Observe que se m1, o modelo de média móvel simples (SMA) é equivalente ao modelo de caminhada aleatória (sem crescimento). Se m é muito grande (comparável ao comprimento do período de estimação), o modelo SMA é equivalente ao modelo médio. Como com qualquer parâmetro de um modelo de previsão, é costume ajustar o valor de k para obter o melhor quotfitquot aos dados, isto é, os erros de previsão mais pequenos em média. Aqui está um exemplo de uma série que parece apresentar flutuações aleatórias em torno de uma média de variação lenta. Primeiro, vamos tentar ajustá-lo com um modelo de caminhada aleatória, o que equivale a uma média móvel simples de um termo: O modelo de caminhada aleatória responde muito rapidamente às mudanças na série, mas ao fazê-lo ele escolhe grande parte do quotnoise no Dados (as flutuações aleatórias), bem como o quotsignalquot (a média local). Se, em vez disso, tentarmos uma média móvel simples de 5 termos, obtemos um conjunto de previsões mais suaves: A média móvel simples de 5 períodos produz erros significativamente menores do que o modelo de caminhada aleatória neste caso. A idade média dos dados nessa previsão é de 3 ((51) / 2), de modo que ela tende a ficar atrás de pontos de viragem em cerca de três períodos. (Por exemplo, uma desaceleração parece ter ocorrido no período 21, mas as previsões não virar até vários períodos mais tarde.) Observe que as previsões de longo prazo do modelo SMA são uma linha reta horizontal, assim como na caminhada aleatória modelo. Assim, o modelo SMA assume que não há tendência nos dados. No entanto, enquanto as previsões do modelo de caminhada aleatória são simplesmente iguais ao último valor observado, as previsões do modelo SMA são iguais a uma média ponderada de valores recentes. Os limites de confiança calculados pela Statgraphics para as previsões de longo prazo da média móvel simples não se alargam à medida que o horizonte de previsão aumenta. Isto obviamente não é correto Infelizmente, não existe uma teoria estatística subjacente que nos diga como os intervalos de confiança devem se alargar para este modelo. No entanto, não é muito difícil calcular estimativas empíricas dos limites de confiança para as previsões de longo prazo. Por exemplo, você poderia configurar uma planilha na qual o modelo SMA seria usado para prever 2 passos à frente, 3 passos à frente, etc. dentro da amostra de dados históricos. Você poderia então calcular os desvios padrão da amostra dos erros em cada horizonte de previsão e, em seguida, construir intervalos de confiança para previsões de longo prazo adicionando e subtraindo múltiplos do desvio padrão apropriado. Se tentarmos uma média móvel simples de 9 termos, obtemos previsões ainda mais suaves e mais um efeito retardado: A idade média é agora de 5 períodos ((91) / 2). Se tomarmos uma média móvel de 19 períodos, a idade média aumenta para 10: Observe que, na verdade, as previsões estão agora atrasadas por pontos de inflexão em cerca de 10 períodos. Qual a quantidade de suavização é melhor para esta série Aqui está uma tabela que compara suas estatísticas de erro, incluindo também uma média de 3-termo: Modelo C, a média móvel de 5-termo, rende o menor valor de RMSE por uma pequena margem sobre o 3 E médias de 9-termo, e suas outras estatísticas são quase idênticas. Assim, entre os modelos com estatísticas de erro muito semelhantes, podemos escolher se preferiríamos um pouco mais de resposta ou um pouco mais de suavidade nas previsões. O modelo de média móvel simples descrito acima tem a propriedade indesejável de tratar as últimas k observações igualmente e completamente ignora todas as observações anteriores. (Voltar ao início da página.) Marrons Simples Exponencial Suavização (exponencialmente ponderada média móvel) Intuitivamente, os dados passados ​​devem ser descontados de forma mais gradual - por exemplo, a observação mais recente deve ter um pouco mais de peso que a segunda mais recente, ea segunda mais recente deve ter um pouco mais de peso que a 3ª mais recente, e em breve. O modelo de suavização exponencial simples (SES) realiza isso. Vamos 945 denotar uma constante quotsmoothingquot (um número entre 0 e 1). Uma maneira de escrever o modelo é definir uma série L que represente o nível atual (isto é, o valor médio local) da série, conforme estimado a partir dos dados até o presente. O valor de L no tempo t é calculado recursivamente a partir de seu próprio valor anterior como este: Assim, o valor suavizado atual é uma interpolação entre o valor suavizado anterior e a observação atual, onde 945 controla a proximidade do valor interpolado para o mais recente observação. A previsão para o próximo período é simplesmente o valor suavizado atual: Equivalentemente, podemos expressar a próxima previsão diretamente em termos de previsões anteriores e observações anteriores, em qualquer uma das seguintes versões equivalentes. Na primeira versão, a previsão é uma interpolação entre previsão anterior e observação anterior: Na segunda versão, a próxima previsão é obtida ajustando a previsão anterior na direção do erro anterior por uma fração 945. é o erro feito em Tempo t. Na terceira versão, a previsão é uma média móvel exponencialmente ponderada (ou seja, descontada) com o fator de desconto 1- 945: A versão de interpolação da fórmula de previsão é a mais simples de usar se você estiver implementando o modelo em uma planilha: Célula única e contém referências de células que apontam para a previsão anterior, a observação anterior ea célula onde o valor de 945 é armazenado. Observe que, se 945 1, o modelo SES é equivalente a um modelo de caminhada aleatória (sem crescimento). Se 945 0, o modelo SES é equivalente ao modelo médio, assumindo que o primeiro valor suavizado é definido igual à média. A idade média dos dados na previsão de suavização exponencial simples é de 1/945 em relação ao período para o qual a previsão é calculada. (Isso não é suposto ser óbvio, mas pode ser facilmente demonstrado através da avaliação de uma série infinita.) Portanto, a previsão média móvel simples tende a ficar para trás de pontos de viragem em cerca de 1/945 períodos. Por exemplo, quando 945 0,5 o atraso é 2 períodos quando 945 0,2 o atraso é de 5 períodos quando 945 0,1 o atraso é de 10 períodos, e assim por diante. Para uma dada idade média (isto é, a quantidade de atraso), a previsão de suavização exponencial simples (SES) é um pouco superior à previsão de média móvel simples (SMA) porque coloca relativamente mais peso na observação mais recente - i. e. É ligeiramente mais quotresponsivequot às mudanças que ocorrem no passado recente. Por exemplo, um modelo SMA com 9 termos e um modelo SES com 945 0,2 têm uma idade média de 5 para os dados nas suas previsões, mas o modelo SES coloca mais peso nos últimos 3 valores do que o modelo SMA e no modelo SMA. Outra vantagem importante do modelo SES sobre o modelo SMA é que o modelo SES usa um parâmetro de suavização que é continuamente variável, de modo que pode ser facilmente otimizado Utilizando um algoritmo quotsolverquot para minimizar o erro quadrático médio. O valor óptimo de 945 no modelo SES para esta série revela-se 0.2961, como mostrado aqui: A idade média dos dados nesta previsão é de 1 / 0.2961 3.4 períodos, que é semelhante ao de um 6-termo simples de movimento média. As previsões a longo prazo do modelo SES são uma linha reta horizontal. Como no modelo SMA eo modelo de caminhada aleatória sem crescimento. No entanto, note que os intervalos de confiança calculados por Statgraphics agora divergem de uma forma razoavelmente aparente, e que eles são substancialmente mais estreitos do que os intervalos de confiança para o modelo de caminhada aleatória. O modelo SES assume que a série é um tanto mais previsível do que o modelo de caminhada aleatória. Um modelo SES é realmente um caso especial de um modelo ARIMA. De modo que a teoria estatística dos modelos ARIMA fornece uma base sólida para o cálculo de intervalos de confiança para o modelo SES. Em particular, um modelo SES é um modelo ARIMA com uma diferença não sazonal, um termo MA (1) e nenhum termo constante. Também conhecido como um modelo quimétrico ARIMA (0,1,1) sem constantequot. O coeficiente MA (1) no modelo ARIMA corresponde à quantidade 1-945 no modelo SES. Por exemplo, se você ajustar um modelo ARIMA (0,1,1) sem constante à série aqui analisada, o coeficiente MA estimado (1) resulta ser 0,7029, que é quase exatamente um menos 0,2961. É possível adicionar a hipótese de uma tendência linear constante não-zero para um modelo SES. Para isso, basta especificar um modelo ARIMA com uma diferença não sazonal e um termo MA (1) com uma constante, ou seja, um modelo ARIMA (0,1,1) com constante. As previsões a longo prazo terão então uma tendência que é igual à tendência média observada ao longo de todo o período de estimação. Não é possível fazer isso em conjunto com o ajuste sazonal, porque as opções de ajuste sazonal são desativadas quando o tipo de modelo é definido como ARIMA. No entanto, você pode adicionar uma tendência exponencial de longo prazo constante a um modelo de suavização exponencial simples (com ou sem ajuste sazonal) usando a opção de ajuste de inflação no procedimento de Previsão. A taxa adequada de inflação (crescimento percentual) por período pode ser estimada como o coeficiente de declive num modelo de tendência linear ajustado aos dados em conjunção com uma transformação de logaritmo natural, ou pode basear-se noutras informações independentes relativas às perspectivas de crescimento a longo prazo . (Retornar ao início da página.) Browns Linear (ie double) Suavização exponencial Os modelos SMA e SES assumem que não há tendência de qualquer tipo nos dados (o que geralmente é OK ou pelo menos não muito ruim para 1- Antecipadamente quando os dados são relativamente ruidosos) e podem ser modificados para incorporar uma tendência linear constante como mostrado acima. O que acontece com as tendências a curto prazo Se uma série exibe uma taxa variável de crescimento ou um padrão cíclico que se destaca claramente contra o ruído, e se houver uma necessidade de prever mais de um período à frente, a estimativa de uma tendência local também pode ser um problema. O modelo de suavização exponencial simples pode ser generalizado para obter um modelo de suavização exponencial linear (LES) que calcula estimativas locais de nível e tendência. O modelo de tendência de variação de tempo mais simples é o modelo de alisamento exponencial linear de Browns, que usa duas séries suavizadas diferentes que são centradas em diferentes pontos no tempo. A fórmula de previsão é baseada em uma extrapolação de uma linha através dos dois centros. (Uma versão mais sofisticada deste modelo, Holt8217s, é discutida abaixo). A forma algébrica do modelo de suavização exponencial linear de Brown8217s, como a do modelo de suavização exponencial simples, pode ser expressa em um número de formas diferentes mas equivalentes. A forma quotstandard deste modelo é usualmente expressa da seguinte maneira: Seja S a série de suavização simples obtida pela aplicação de suavização exponencial simples à série Y. Ou seja, o valor de S no período t é dado por: (Lembre-se que, sob simples Exponencial, esta seria a previsão para Y no período t1.) Então deixe Squot denotar a série duplamente-alisada obtida aplicando a suavização exponencial simples (usando o mesmo 945) à série S: Finalmente, a previsão para Y tk. Para qualquer kgt1, é dada por: Isto produz e 1 0 (isto é, enganar um pouco e deixar a primeira previsão igual à primeira observação real) e e 2 Y 2 8211 Y 1. Após o que as previsões são geradas usando a equação acima. Isto produz os mesmos valores ajustados que a fórmula baseada em S e S se estes últimos foram iniciados utilizando S 1 S 1 Y 1. Esta versão do modelo é usada na próxima página que ilustra uma combinação de suavização exponencial com ajuste sazonal. Holt8217s Linear Exponential Smoothing Brown8217s O modelo LES calcula estimativas locais de nível e tendência ao suavizar os dados recentes, mas o fato de que ele faz isso com um único parâmetro de suavização coloca uma restrição nos padrões de dados que é capaz de ajustar: o nível ea tendência Não são permitidos variar em taxas independentes. Holt8217s modelo LES aborda esta questão, incluindo duas constantes de alisamento, um para o nível e um para a tendência. Em qualquer momento t, como no modelo Brown8217s, existe uma estimativa L t do nível local e uma estimativa T t da tendência local. Aqui eles são calculados recursivamente a partir do valor de Y observado no tempo t e as estimativas anteriores do nível e tendência por duas equações que aplicam alisamento exponencial para eles separadamente. Se o nível estimado ea tendência no tempo t-1 são L t82091 e T t-1. Respectivamente, então a previsão para Y tshy que teria sido feita no tempo t-1 é igual a L t-1 T t-1. Quando o valor real é observado, a estimativa atualizada do nível é computada recursivamente pela interpolação entre Y tshy e sua previsão, L t-1 T t-1, usando pesos de 945 e 1-945. A mudança no nível estimado, Nomeadamente L t 8209 L t82091. Pode ser interpretado como uma medida ruidosa da tendência no tempo t. A estimativa actualizada da tendência é então calculada recursivamente pela interpolação entre L t 8209 L t82091 e a estimativa anterior da tendência, T t-1. Usando pesos de 946 e 1-946: A interpretação da constante de alisamento de tendência 946 é análoga à da constante de alisamento de nível 945. Modelos com valores pequenos de 946 assumem que a tendência muda apenas muito lentamente ao longo do tempo, enquanto modelos com Maior 946 supor que está mudando mais rapidamente. Um modelo com um 946 grande acredita que o futuro distante é muito incerto, porque os erros na tendência-estimativa tornam-se completamente importantes ao prever mais de um período adiante. As constantes de suavização 945 e 946 podem ser estimadas da maneira usual, minimizando o erro quadrático médio das previsões de 1 passo à frente. Quando isso é feito em Statgraphics, as estimativas se tornam 945 0,3048 e 946 0,008. O valor muito pequeno de 946 significa que o modelo assume muito pouca mudança na tendência de um período para o outro, então basicamente este modelo está tentando estimar uma tendência de longo prazo. Por analogia com a noção de idade média dos dados que é usada na estimativa do nível local da série, a idade média dos dados que é usada na estimativa da tendência local é proporcional a 1/946, embora não exatamente igual a isto. Neste caso, isto é 1 / 0.006 125. Este número é muito preciso, na medida em que a precisão da estimativa de 946 é realmente de 3 casas decimais, mas é da mesma ordem geral de magnitude que o tamanho da amostra de 100 , Assim que este modelo está calculando a média sobre bastante muita história em estimar a tendência. O gráfico de previsão abaixo mostra que o modelo LES estima uma tendência local ligeiramente maior no final da série do que a tendência constante estimada no modelo SEStrend. Além disso, o valor estimado de 945 é quase idêntico ao obtido pelo ajuste do modelo SES com ou sem tendência, de modo que este é quase o mesmo modelo. Agora, eles parecem previsões razoáveis ​​para um modelo que é suposto estar estimando uma tendência local Se você 8220eyeball8221 esse enredo, parece que a tendência local virou para baixo no final da série O que aconteceu Os parâmetros deste modelo Foram calculados minimizando o erro quadrático das previsões de um passo à frente, e não as previsões a mais longo prazo, caso em que a tendência não faz muita diferença. Se tudo o que você está olhando são 1-passo-frente erros, você não está vendo a imagem maior de tendências sobre (digamos) 10 ou 20 períodos. A fim de obter este modelo mais em sintonia com a nossa extrapolação do globo ocular dos dados, podemos ajustar manualmente a tendência de suavização constante para que ele usa uma linha de base mais curto para a estimativa de tendência. Por exemplo, se escolhemos definir 946 0,1, então a idade média dos dados usados ​​na estimativa da tendência local é de 10 períodos, o que significa que estamos fazendo uma média da tendência ao longo dos últimos 20 períodos aproximadamente. Here8217s o que o lote de previsão parece se ajustarmos 946 0.1 mantendo 945 0.3. Isso parece intuitivamente razoável para esta série, embora seja provavelmente perigoso para extrapolar esta tendência mais de 10 períodos no futuro. E sobre as estatísticas de erro Aqui está uma comparação de modelos para os dois modelos mostrados acima, bem como três modelos SES. O valor ótimo de 945 para o modelo SES é de aproximadamente 0,3, mas resultados semelhantes (com ligeiramente mais ou menos responsividade, respectivamente) são obtidos com 0,5 e 0,2. (A) Holts linear exp. Alisamento com alfa 0,3048 e beta 0,008 (B) Holts linear exp. Alisamento com alfa 0,3 e beta 0,1 (C) Alisamento exponencial simples com alfa 0,5 (D) Alisamento exponencial simples com alfa 0,3 (E) Alisamento exponencial simples com alfa 0,2 Suas estatísticas são quase idênticas, então realmente não podemos fazer a escolha com base De erros de previsão de 1 passo à frente dentro da amostra de dados. Temos de recorrer a outras considerações. Se acreditarmos firmemente que faz sentido basear a estimativa de tendência atual sobre o que aconteceu nos últimos 20 períodos, podemos fazer um caso para o modelo LES com 945 0,3 e 946 0,1. Se quisermos ser agnósticos quanto à existência de uma tendência local, então um dos modelos SES pode ser mais fácil de explicar e também fornecerá mais previsões de médio-caminho para os próximos 5 ou 10 períodos. Evidências empíricas sugerem que, se os dados já tiverem sido ajustados (se necessário) para a inflação, então pode ser imprudente extrapolar os resultados lineares de curto prazo Muito para o futuro. As tendências evidentes hoje podem afrouxar no futuro devido às causas variadas tais como a obsolescência do produto, a competição aumentada, e os abrandamentos cíclicos ou as ascensões em uma indústria. Por esta razão, a suavização exponencial simples geralmente desempenha melhor fora da amostra do que poderia ser esperado, apesar da sua extrapolação de tendência horizontal quotnaivequot. Modificações de tendência amortecida do modelo de suavização exponencial linear também são freqüentemente usadas na prática para introduzir uma nota de conservadorismo em suas projeções de tendência. O modelo LES com tendência a amortecimento pode ser implementado como um caso especial de um modelo ARIMA, em particular, um modelo ARIMA (1,1,2). É possível calcular intervalos de confiança em torno de previsões de longo prazo produzidas por modelos exponenciais de suavização, considerando-os como casos especiais de modelos ARIMA. A largura dos intervalos de confiança depende de (i) o erro RMS do modelo, (ii) o tipo de suavização (simples ou linear) (iii) o valor (S) da (s) constante (s) de suavização e (iv) o número de períodos que você está prevendo. Em geral, os intervalos se espalham mais rapidamente à medida que o 945 se torna maior no modelo SES e eles se espalham muito mais rápido quando se usa linear ao invés de alisamento simples. Este tópico é discutido mais adiante na seção de modelos ARIMA das notas. (Retornar ao início da página) Funções Matemáticas abs Valor absoluto acos Arco coseno acosh Coseno hiperbólico inverso asin Arc sine asinh Seno hiperbólico inverso atan2 Arco tangente de duas variáveis ​​atan Arco tangente atanh Inversa tangente hiperbólica baseconvert Converte um número entre bases arbitrárias Bindec Binário para decimal ceil Frações arredondadas para cima cos Coseno cosh Cosseno hiperbólico decbin Decimal para binário dechex Decimal para hexadecimal decoct Decimal para octal deg2rad Converte o número em graus para o equivalente em radianos Calcula o expoente de e expm1 Retorna exp (número) Calculado de uma forma que é preciso mesmo quando o valor do número é próximo ao piso zero Frações redondas para baixo fmod Retorna o ponto flutuante restante (módulo) da divisão dos argumentos getrandmax Mostra o maior valor aleatório possível hexdec Hexadecimal para decimal hypot Calcule o comprimento Da hipotenusa de um triângulo de ângulo reto intdiv Divisão de inteiros isfinida Descobre se um valor é um número finito legal isinfinite Verifica se um valor é infinito isnan Descobre se um valor não é um número lcgvalue Gerador congruencial linear combinado log10 Base-10 logaritmo log1p Retorna Log (1 número), calculado de uma forma que é preciso, mesmo quando o valor de número está perto de zero log Logaritmo natural max Encontre o valor mais alto min Encontre o menor valor mtgetrandmax Mostrar maior valor aleatório possível mtrand Gerar um melhor valor aleatório mtsrand Seed the better Gerador de números aleatórios octdec Octal para decimal pi Obter valor de pi pow Expressão exponencial rad2deg Converte o número de radianos para o número equivalente em graus rand Gerar uma rodada inteira aleatória Arredonda um float sin Sine sinh Seno hiperbólico sqrt Raiz quadrada srand Seed gerador de números aleatórios tan Tangente tangente tangente hiperbólica User Contributed Notes 49 notas Eu estava procurando uma função truncada. Não encontrando um, eu escrevi o meu próprio. Uma vez que trata de tudo como um número, imagino que é mais rápido do que a alternativa de usar funções de seqüência de caracteres. HTH. Função ltphp truncar (dígitos numéricos 0) // fornecer o número real eo número de // dígitos à direita do decimal que você deseja manter. Shift pow (10 dígitos) return ((floor (num shift)) / shift) gt Para todos vocês escrevendo calculadoras de hipotecas lá fora: pagamento de função (abril nv pv fv 0.0.2) / Calcula o pagamento mensal Rouned ao centavo mais próximo apr a taxa de porcentagem anual do empréstimo. N número de pagamentos mensais (360 para um empréstimo de 30 anos) pv valor presente ou principal do empréstimo fv valor futuro do empréstimo prec a precisão que você deseja arredondado para / / Nenhuma garantia é expressa ou implícita. (Pv (1 - alfa) / alfa / (1 - pow (alfa)), prec) Retornar (retval) Eu não poderia resistir a fazer uma versão mais simples da função ordinal: ltphp função ordinal (num) num (int) num dígito substr (num. Caso de ruptura 2. caso de ruptura de ord nd 3. ord rd break break return num. Ord gt Um poderia substituir o typecast com para obter um resultado vazio em vez de 0 em caso num está vazio também. Eu precisava para aproximar uma integral, porque eu não era capaz de calculá-lo, então eu escrevi esta função. Ele aproxima uma integral com a regra dos Simpsons compostos. Mais informações sobre a regra dos Simpsons: en. wikipedia. org/wiki/Simpson27srule função simpsonf (x) // retorna f (x) para a aproximação integral com compósito Simpsons regra return (pow ((1 pow (x. (- 4))) , 0.5)) função simpsons (ab n) // aproxima integralab f (x) dx com compósito Simpsons regra com n intervalos // n tem que ser um número par // f (x) é definido na função simpsonf (x) if (N 2) 0 () () () () () () () () () () Se você é um aviador e precisa calcular os ângulos de correcção de vento e velocidade do solo (por exemplo, durante o planeamento do voo) isto pode ser muito útil. Windcorrection rad2deg (asin ((velocidade do vento (sin (deg2rad (tt - (winddirection-180))))) Você provavelmente pode escrever essas linhas mais bonitas, mas eles trabalham enquanto joogats uma função de linha é curto, é provavelmente melhor calcular fatorial iterativamente em vez de recursivamente. Mantenha na mente se você quiser fatoriais grandes, necessidade do youll de usar algum tipo do integer da precisão arbitrária ou talvez das funções de BCMath. Em seguida, novamente, a menos que você está tentando fazer grandes números (170 é o mais alto que você pode fazer que não retorna o infinito), você provavelmente não vai notar qualquer diferença de tempo. Ltphp function fatorial (in) // 0 1 1 out 1 // Somente se for gt 2 para (i 2 i lt in i) out i Método para converter um número decimal arbitrário em sua forma de fração mais reduzida (então uma string é Retornou, este método provavelmente seria usado para fins de formatação de saída.) Havia outros métodos semelhantes a este na página, mas nenhum fez exatamente o que eu queria. Talvez não seja o código mais elegante, mas faz o trabalho. Espero que isso ajude alguém. Uma forma iterativa do algoritmo de Euclides é usada para encontrar o GCD. Ltphp função decimal decimal (decimal) decimal (string) decimal numérico den numérico 1 dec falso // encontre a forma fracionária menos reduzida do número para (i 0. ix strlen (decimal) i lt ix i) // construa o denominador à medida que mudamos o decimal Para a direita se (dec) den 10 // encontrar a casa decimal / construir o numerador if (decimal.) Dec true else num. Decimal Num (int) num // número inteiro, basta devolvê-lo se (den 1) retornar num num2 num den2 den rem 1 // Euclides Algoritmo (para localizar o gcd) enquanto (num2 den2) rem num2 den2 num2 den2 den2 rem if (Den2 den) rem den2 // agora retem o gcd do numerador e denominador de nossa fração return (num / rem). /. (Den / rem) gt Exemplos: echo dec2frac (10) echo dec2frac (.5) echo dec2frac (5.25) echo dec2frac (.333333333) Por favor, note que mais curto nem sempre é melhor. Na minha opinião, uma maneira mais clara de codificar isso é, incluindo uma verificação de valores negativos ou não-inteiros. Para calcular a faculdade de um inteiro positivo, uma maneira iterativa (que pode ser mais difícil de entender) é geralmente um pouco mais rápida, mas eu estou usando apenas para valores pequenos, então não é realmente importante para mim: // Calcule o Faculdade de uma função int-value positiva iFaculty (aiFac) if (aiFac gt 0) retorna aiFac this - gt iFaculty (aiFac-1) elseif (aiFac 0) return 1 else retorna 0 // Argumento errado gt Ive também escreveu outra função para Calcular o coeficiente binomial de 2 valores, eu não encontrá-lo em qualquer lugar ainda assim eu espero que possa ajudar alguém (funciona bem com o acima indicado faculty-função e pronto para ser usado dentro de suas próprias classes) // calcula o coeficiente binomial n sobre K de 2 valores int positivos // para a função n gt k iBinCoeff (aiN. AiK) // o coeficiente binomial é definido como n / (nk) k retornar este - gt iFaculdade (aiN) / (este - gt iFaculdade (aiN - AiK) this - gt iFaculty (aiK)) Ocasionalmente, um usuário deve inserir um número em um formulário. Esta função converte frações em decimais e deixa decimais intactos. Claro, você pode querer rodar a saída final, mas isso não está incluído aqui. Q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q Wb strrev (strstr (wa)) inteiro true // este é um número inteiro // agora verifique a parte da fração se (strstr (q. /)) Se (todo verdadeiro) q strstr (q.) B strreplace (/. Strstr (q. /)) // este é o divisor // isolar o numerador c strrev (q) d strstr (c. /) E strrev (d) um strreplace (/. Numerador if (todo verdadeiro) aa (wb b) // novo numerador é número inteiro multiplicado pelo denominador mais numerador original qa / b // este é agora o seu retorno decimal q mais retorna q // não é uma fração, basta retornar o decimal gt Se você precisa lidar com coordenadas polares para somereason você precisará converter para e de x, y para entrada e saída na maioria das situações: aqui estão algumas funções para converter cartesiano para polar e polar para cartesiano lt // retorna matriz de R, theta no intervalo de 0-2pi (em radianos) função rect2polar (x, y) se (isnumeric (x) ampampisnumeric (y)) rsqrt (pow (x, 2) ) If (ygt0) thetapi () / 2 else theta3pi () / 2 else if (xlt0) thetaatan (y / x) pi () else se (ylt0) thetaatan (y / x) 2pi ) Polararray (rgtr, thetagttheta) retorno polar else return false // r deve ser em radianos, retorna matriz de x, y função polar2rect (r, theta) if (isnumeric (r) ampampisnumeric (theta)) xrcos (theta) yrsin Theta) rectarray (xgtx, ygty) else retorna false gt Aqui estão uma função nPr e uma função nPc (tinha que definir NaN - não sei, como fazer isso da maneira correta) ltphp define (NaN. (N - r) rn (n - r)) nRr (n, r) retornar N para n ) Retorno (n - i) / (i 1) retorno retorno função nPr (n. R) se (r gt n) retorno NaN se (r) retorno n (nPr (n - 1.r - 1) Gt Tims correção da função ordens Evans causa outro problema, ele não funciona mais para o número acima de 100. (Por exemplo, retorna 111st em vez de 111th). Aqui está uma versão modificada que deve funcionar para todos os números. Cardinal (cardinal) cardinal (cardinal) cardinal (int) cardinal dígito substr (cardinal - 1. 1) if (cardinal lt 100) cardeal. Th switch (dígito) caso 1: retorno cardinal. Caso 2: retorno cardinal. Nd caso 3: retorno cardinal. Rd padrão: return cardinal. Gt Função que simula o operador de soma. (En. wikipedia. org/wiki/Sum). Tenha cuidado com a expressão porque pode causar uma nota de furo de segurança as aspas simples para não analisar o. Ltphp param string expr expressão a ser avaliada (por exemplo (2x) 21) param string var dummy variável (por exemplo, x) param integer start param integer fim param integer step função soma expr strreplace (.expr) var strreplace (.var) start (int) start end (int) final step (int) step sum 0 para (i start i lt end ii etapa) expr strreplace (.var. i.expr) eval Resultado. Expr. Return resultado resultado eval (eval) if (resultado FALSE) return SYNTAX ERROR. Expr sum return (int) sum gt Para as pessoas interessadas em Equações Diferenciais, Ive fez uma função que receber uma string como: x2x3 e colocá-lo em 2x3x2 witch é o diferencial da equação anterior. No código há uma coisa faltando: a seqüência de caracteres é muitas vezes outOfBound (Desindexação de cadeia não inicializada: 6 pol.) Se a configuração de erro é definida um pouco demasiado alto. Eu só não sei como corrigir isso. Então existe o código para equação diferencial com (e -) somente: lt função differentiel (equa) equa strtolower (equa) echo Equação de depart:.equa. ltbrgt final Eu sei que isto não é ótimo, mas eu fiz isso rápido :) If Vocês têm algum comentário, apenas e-mail. Eu também quero fazer esta função em C para adicionar phpCore talvez em breve. Patoff Heres ainda outro maior denominador comum (gcd) função, um reeeeally um pequeno. Função gcd (n, m) se (m) returnnreturn gcd (m, nm) Funciona por recursão. Não realmente certo sobre a sua velocidade, mas é realmente pequeno Isso não vai funcionar em números de ponto flutuante com precisão embora. Se você quiser um ponto flutuante um, você precisa ter pelo menos PHP 4, eo código seria função gcd (n, m) se (m) returnnreturn gcd (m, fmod (n, m)) para aqueles que procuram um Função de verificação de cartão de crédito eu escrevi um algoritmo de fórmula LUHN simples: numOfDigits 0 - strlen (ccNumber) i - 1 enquanto (i gt numOfDigits) se ((i 2) 0) double 2 (substr (ccNumber. i.1)) total substr (Double 0. 1) if (strlen (double gt 1)) total substr (double 1. 1) else total substr (ccNumber i.1) ​​i - Para adicionar ao que Cornelius tinha, eu escrevi uma função Que irá tomar uma matriz de números e retornar o menor comum múltiplo deles: function lcmarr (items) // Input: Uma matriz de números // Output: A LCM dos números while (2 lt count (items)) arraypush (L), lcm (arrayshift (itens), arrayshift (itens)) return reset (itens) // Seu Código abaixo com s adicionado para vars função gcd (n, m) nabs (n) mabs Retorna 1 // evita a recursividade infinita se (nm e ngt1) retorno n retorno mltngcd (nm, n): função gcd (n, mn) lcm (n, m) retorno m (n / gcd Função ordinal, a linha: ltphp tens substr (cardinal. - 2. 1) gt deve ser substituído por: ltphp dezenas redondas (cardinal / 10) gt ou similar. Pelo menos no PHP 4.3.10, substr (1, -2, 1) retorna 1 - assim Evans função dá 1 º, bem como 11 º. Isso é contrário à documentação, mas é observado nos comentários na página do manual substr. Um pouco mais complexo, mas muito mais preciso cardinalgtordinal função (a um abaixo doesnt conta para 11, 12 e 13, que não siga as regras habituais): função cardinal (cardinal) cardinal (int) cardinal dígito substr (cardinal. 1) diz substr (cardinal - 2. 1) se (dezenas 1) retorno cardinal. Th switch (dígito) caso 1: retorno cardinal. Caso 2: retorno cardinal. Nd caso 3: retorno cardinal. Rd padrão: return cardinal. A razão pela qual o operador AND (amp) bit a bit trabalha para determinar se um número é ímpar ou mesmo é porque os números ímpares expressos em binário sempre têm o bit 1 da direita (20) e os números pares têm sempre o bit 20 0. Assim, se você Um 1 amp número, ele retornará zero se o número é par (desde xxxxxxx0 o número par no binário e 00000001 o 1) não compartilhar quaisquer bits, e retornará 1 se o número é ímpar (xxxxxx1 e 000001). Uma maneira inteligente de fazer as coisas, mas num 2 iria funcionar tão bem eu acho :). Graças ao Chronial no cyberpunkuniverse. de, eu fui capaz de criar a função binompdf (n, p, k). Ltphp função nCr (nk) se (k gt n) retorno NaN se ((n - k) lt k) retorno nCr (n - k)) retorno 1 para (i 0 i lt ki) - i) / (i 1) retornar função de retorno binompdf (np k) retorno nCr (nk) pow (p. K) pow ((1 - p), (n - k) Lidando com tabelas, uma função múltipla menos comum às vezes é útil para abusar tablespan e os gostos. Então aqui vai (você pode escolher remover a primeira parte da função gcd se a chamada de função estiver bem comportada): ltphp função gcd (n m) // maior divisor comum n abs (n) m abs (m) if (N 0 e m 0) retornam 1 // evitam recursão infinita se (nm e n gt 1) retornam n retornam m lt n. Gcd (n - m. N): gcd (n - m - n) função lcm (n m) // menor retorno múltiplo comum m (n / gcd (nm)) gt Isso pode ou não ser algo para Considere adicionar à biblioteca de funções matemáticas.

No comments:

Post a Comment