Exponencial Móvel Médio Perl
Com vetor de peso quero dizer o vetor com pesos que você tem que multiplicar as observações na janela que desliza sobre seus dados com assim que se você adicionar esses produtos juntos retorna o valor da EMA no lado direito da janela. Para uma média móvel ponderada linear, a fórmula para encontrar o vetor peso é: (1: n) soma (1: n) (no código R). Esta série de comprimento n adiciona até 1. Para n10 será 0.01818182 0.03636364 0.05454545 0.07272727 0.09090909 0.10909091 0.12727273 0.14545455 0.16363636 0.18181818 os números 1 a 10 55, com 55 a soma dos números 1 a 10. Como você calcula o vetor de peso Para uma média móvel exponencial (EMA) de comprimento n se n é o comprimento da janela, então alphalt-2 (n1) e ilt-1: n so EmaWeightVectorlt - ((alfa (1-alfa) (1-i)) ) É isto correto Mesmo que o EMA não é realmente confinado a uma janela com um começo e um fim, shouldnt os pesos somam até 1 apenas como com o Jason de LWMA Agradecimentos, todos os ponteiros de como aproximar o filtro de EMA a toda a precisão desejada Por aproximá-lo com um filtro FIR suficientemente longo There39s um script perl em en. wikipedia. orgwikihellip que fez a imagem do vetor peso EMA, mas eu don39t entendê-lo: se eles definem o número de pesos para 15 por que há 20 vermelho Barras em vez de 15 ndash MisterH Dec 19 12 em 22: 40Investimento do mercado de ações: Movendo avera (SMA, EMA, MACD) Esta é uma página de referência do que eu sei sobre médias móveis no mercado de ações investindo. Isso inclui médias móveis simples. Médias móveis exponenciais. E como usar esses dados para apoiar a compra e venda de ações. Eu também toque em MACD. Em geral, eu acredito em um estilo de Warren Buffett de investir onde você: Pense em comprar um estoque como se você está indo para comprar o negócio inteiro Você basear sua decisão de compra sobre o valor do estoque Quando você fizer isso, Estoque para sempre A teoria é que de vez em quando, um estoque vai cair fora de favor com o mercado de ações, e quando seu preço chega a um determinado ponto baixo, torna-se um valor para comprar. Você pode pensar nesta estratégia como sendo como comprar um carro novo. Se você comprar um carro novo quando seu primeiro introduzido, eo modelo é muito popular, o negociante está indo querer muito dinheiro para ele. Por outro lado, se você esperar e comprar esse modelo 11 meses depois, quando o próximo modelo novo está prestes a sair você será capaz de comprar o mesmo carro por um preço muito mais baixo. Menciono isso porque estou prestes a escrever sobre médias móveis. E as médias móveis não têm nada fazer com um estilo de Warren Buffett de investing. Movendo médias pode ser bom para as pessoas que fazem um monte de negócios, e eles também podem ser usados para identificar teto e preços de chão de ações. Uma idéia importante é que o preço mínimo de um estoque usando uma média móvel pode ser usado para definir uma perda stop em um estoque. Porque eu geralmente seguir o estilo Buffett de investir eu não uso médias móveis como uma ferramenta principal, mas eu gosto de saber como eles funcionam, e eu usá-los como uma forma de apoiar a minha outra investigação. Recentemente eu descobri que eles são bons porque eu posso olhar para um monte de saída de Finviz ou outros sites, e ver que a SMA de 20 dias para um estoque é de 2,8. Isso me diz de relance que o preço das ações está em alta. Porque eu não uso médias móveis muito, esta página isnt completamente completa. Por favor, consulte as páginas da Investopedia às quais me associarei para obter mais informações. Esta é apenas uma página de lembrete para mim. Dado esse fundo, heres o que eu sei sobre médias móveis. Uma média móvel simples (SMA) é uma média aritmética que é calculada adicionando o preço de fechamento do título para um número de E dividindo este total pelo número de períodos de tempo. As médias de curto prazo respondem rapidamente às mudanças no preço do subjacente, enquanto as médias de longo prazo são lentas a reagir. Mais tarde eles continuam: Em outras palavras, este é o preço médio das ações durante um certo período de tempo. Observe que a ponderação igual é dada a cada preço diário. Uma desvantagem de um SMA é que dá igual peso a todos os preços utilizados para calcular o seu valor. Assim, em uma SMA de 20 dias, o preço das ações de 20 dias atrás tem o mesmo peso que o preço de ontem. Para alguns propósitos é mais útil se o preço mais recente tem um peso maior (mais valor), e como resultado as pessoas inventaram EMAs. Uma média móvel exponencial (EMA) é um tipo de média móvel que é semelhante a uma média móvel simples, exceto que mais peso é dado ao mais recente dados. Eles mais tarde adicionar: Este tipo de média móvel reage mais rápido a mudanças de preços recentes do que um SMA. As EMAs de 12 e 26 dias são as médias de curto prazo mais populares e são usadas para criar indicadores como a divergência de convergência média móvel (MACD) eo oscilador de preços percentuais (PPO). EMA vantagens em comparação com SMAs: EMAs reagem mais rápido às mudanças de preços do que SMAs. Voltar ao inícioVantagens das médias móveis (MA) As vantagens gerais dos valores MA são: Eles filtram o ruído das flutuações dos preços das ações. Eles mostram tendências. As SMA de curto prazo (5 a 20 dias) mostram tendências de curto prazo, e as SMAs de longo prazo (20 a 200 dias) mostram tendências de longo prazo. Um aumento MA indica uma tendência de alta (aumento de preços, ou touro). Uma queda MA indica uma tendência de baixa (queda de preço, ou urso). SMAs mais longos podem mostrar suporte para o que o preço mais baixo de um estoque deve teoricamente ser, ou seja, seu piso. Outras ferramentas que mal explicar em breve, incluindo crossovers, tetos e pisos. Voltar para parte superior Desvantagens de usar médias móveis Antes de entrar em como usar médias móveis para comprar e vender ações, é importante saber que eles têm algumas desvantagens: Eles são baseados apenas em dados históricos (tendências). Eles não são realmente preditivos. Eles são apenas bons com tendências fortes que estão indo para cima ou para baixo. Eles não são úteis quando um preço das ações está indo para os lados. Você pode obter falsos positivos, especialmente quando se olha para os prazos mais curtos. Estas declarações fará mais sentido como eu explico como os comerciantes usam médias móveis. Uso: Mostrar tendências As médias móveis podem ser usadas para mostrar tendências. O seu valor a este respeito é que suavizar o ruído quando um estoque é um pouco volátil. Uso: Compra e venda de sinais (crossovers e tendências) Crossover de preço Alguns investidores usam médias móveis para procurar sinais de compra e venda. Na forma mais simples, quando um preço de ações diário se move acima ou abaixo de uma média móvel, isso é chamado de crossover de preço, e pode indicar um sinal de buysell: Quando o preço da ação se move abaixo de uma média móvel, pode indicar um tempo para vender . Quando o preço da ação se move acima de uma média móvel, pode indicar um tempo para comprar. Quando várias médias móveis se cruzam Outro sinal é quando uma média móvel de curto prazo atravessa uma média móvel de longo prazo: Quando o MA mais curto cruza acima do MA mais longo, este é um sinal de compra e é rotulado como uma cruz dourada. Quando o MA mais curto cruza abaixo do MA mais longo, este é um sinal da venda, e é rotulado uma cruz da morte. Três sinais SMA Este exemplo do Yahoo Finance para Volkswagen mostra três sinais SMA, e como seus crossovers podem ser usados para comprar e vender VLKAY. Note que eu costumo usar uma cor vermelha para mostrar o menor intervalo de tempo (sua cor quente), uma cor amarela para o quadro de tempo de médio prazo e uma cor azul para o período de tempo mais longo (seu cool): sinal SMA vs sinal EMA Segundo exemplo mostra o que um SMA-20 parece comparado a um EMA-20 para VLKAY: Como eu mencionei, eu realmente não comprar ações desta forma, então Im não um especialista em que período de tempo é melhor. Por exemplo, pode ser melhor usar um EMA curto (20 dias) contra um SMA mais longo (50 dias). Uma ação é considerada em uma tendência de alta quando (a) o preço atual está acima de uma média móvel, e (b) a média está inclinada para cima. Voltar ao topoUse: Suporte e resistência (tetos e pisos) Esta página da Investopedia fornece estas definições de suporte e resistência em relação às médias móveis: O suporte é estabelecido quando um preço está tendendo para baixo. Existe um ponto em que a pressão de venda diminui e os compradores estão dispostos a intervir. Em outras palavras, um piso é estabelecido. Resistência acontece quando um preço está tendendo para cima. Lá vem um ponto em que a força de compra diminui e os vendedores pisam dentro. Este é um teto. A teoria é que as ações geralmente saltar fora do chão ou teto, mas é importante saber que este isnt sempre o caso. O SMA de 200 dias parece ser comumente usado como teto e piso. Use: Stock screener Nos últimos meses tenho usado médias móveis como um estoque com o site Barchart. Esta imagem mostra como o Barchart mostra o VLKAY agora (24 de abril de 2016): Como você pode ver, o Barchart mostra uma variedade de sinais de estoque em uma página. Pessoalmente, eu não comprar ou vender qualquer coisa, olhando para esta página, mas eu usá-lo como um sinal, ou um screener. Volkswagen está no meu radar porque eles foram encontrados para ser trapaceiros em seus testes de emissões última queda de verão, que tanked suas ações. Então, meus interesses atuais são: Será que o preço das ações voltar Se sim, está voltando agora Estes sinais me dar uma dica em relação a essa segunda pergunta. Moving Average ConvergenceDivergence (MACD) Resumo rápido Eu não uso o MACD com muita freqüência, e não sou um especialista em usá-lo, mas aqui estão algumas notas rápidas: Quando o MACD é positivo, a média de curto prazo está acima da média de longo prazo. Isso indica um ímpeto de preço ascendente (o preço está aumentando). Um valor negativo indica que o momento atual é descendente. Um movimento acima de zero pode indicar uma compra, e um movimento abaixo de zero pode indicar uma venda. MACD também pode ser usado com uma linha de sinal. Mas eu ainda não usei isso. MACD detalhes MACD é mais complicado do que usando médias móveis simples, mas uma vez que você entende, ele ajuda a mostrar tendências betterfaster do que mover médias sozinho. (Eu não sou um especialista MACD ainda, como eu geralmente não fazem comércios baseados nessas teorias eu só usá-los para apoiar a minha outra investigação.) Esta página Investopedia define MACD como este: MACD é um indicador de momentum tendência seguinte que mostra a Relação entre duas médias móveis de preços. O MACD é (normalmente) calculado subtraindo a média móvel exponencial de 26 dias (EMA) da EMA de 12 dias. Esta página Investopedia descreve um pouco melhor: O conceito por trás do MACD é bastante simples. Essencialmente, calcula a diferença entre os instrumentos 26-dia e 12-dia exponencial médias móveis (EMA). Das duas médias móveis que compõem o MACD, a EMA de 12 dias é obviamente a mais rápida, enquanto a de 26 dias é mais lenta. Eles continuam nessa página: No gráfico do MACD, um EMA de nove dias do próprio MACD é plotado também, e atua como um gatilho para as decisões de compra e venda. O MACD gera um sinal bullish quando se move acima de seu próprio EMA de nove dias, e emite um sinal da venda quando se move abaixo de seu EMA de nove dias. Você realmente precisa olhar para gráficos para entender MACD, então eu sugiro olhar para esses dois links. Mais notas do primeiro link: Crossovers - Quando o MACD cai abaixo da linha de sinal, é um sinal de baixa, indicando que pode ser hora de vender. Inversamente, quando o MACD sobe acima da linha do sinal, o indicador dá um sinal bullish, que sugira que o preço do recurso é provável experimentar o momentum ascendente. Muitos comerciantes esperam por uma cruz confirmada acima da linha de sinal antes de entrar em uma posição para evitar ficar ficando falsa ou entrar em uma posição muito cedo, como mostrado pela primeira seta. Divergência - Quando o preço de segurança diverge do MACD. Sinaliza o fim da tendência atual. Aumento dramático - Quando o MACD sobe dramaticamente - ou seja, a menor média móvel puxa longe da média móvel de longo prazo - é um sinal de que a segurança é sobre-comprada e em breve voltará aos níveis normais. A popularidade do MACD é em grande parte devido à sua capacidade de ajudar a detectar rapidamente momentum crescente de curto prazo. Muitos comerciantes irão assistir a uma média móvel de curto prazo para cruzar acima de uma média móvel de longo prazo e usá-lo para sinalizar aumentar o impulso ascendente. Este crossover de alta sugere que o preço foi recentemente a subir a uma taxa mais rápida do que tem no passado, por isso é um sinal de compra técnica comum. Observe como as médias móveis divergem umas das outras na Figura 1 à medida que a força do momento aumenta. O MACD foi projetado para lucrar com essa divergência analisando a diferença entre as duas médias móveis exponenciais. Especificamente, o valor para a média móvel de longo prazo é subtraído da média de curto prazo eo resultado é plotado em um gráfico. (Equação para cada dia EMA12 - EMA26) Um valor MACD positivo, criado quando a média de curto prazo está acima da média de longo prazo, é usado para sinalizar o aumento do momento ascendente. Este valor pode sugerir que os comerciantes podem querer abster-se de tomar posições curtas até que um sinal sugere que é apropriado. Por outro lado, a queda dos valores MACD negativos sugerem que a tendência de baixa está ficando mais forte, e que pode não ser o melhor momento para comprar. Tornou-se padrão traçar uma média móvel separada ao lado do MACD, que é usado para criar um sinal claro de mudança de momento. Vantagens do MACD Os sinais são facilmente interpretados Pode ser incorporado em qualquer estratégia de negociação de curto prazo Ajuda os comerciantes a garantir que a direção a curto prazo está funcionando a seu favor Desvantagens do MACD Falso-positivos, o que essa página Investopedia chama um efeito whipsaw Voltar ao topoA crença de que uma mudança Será fácil de fazer corretamente torna menos provável que a alteração será feita corretamente. Um programador XP escreve um teste de unidade para esclarecer suas intenções antes que ele faça uma mudança. Chamamos a este projeto test-driven (TDD) ou teste primeira programação. Porque um design e implementação do API39s são guiados por seus casos de teste. O programador escreve o teste da maneira como ele quer que a API funcione, e ele implementa a API para atender às expectativas estabelecidas pelo teste. O design orientado a testes nos ajuda a inventar interfaces testáveis e utilizáveis. De muitas maneiras, a testabilidade e a usabilidade são uma no mesmo. Se você não puder escrever um teste para uma API, provavelmente será difícil de usar, e vice-versa. Design orientado por teste dá feedback sobre a usabilidade antes que o tempo é desperdiçado na implementação de uma API desagradável. Como um bônus, o teste documenta como a API funciona, por exemplo. Todas as coisas acima são boas, e poucos argumentariam com eles. Uma preocupação óbvia é que o design orientado por teste pode atrasar o desenvolvimento. Demora algum tempo para escrever testes, mas escrevendo os testes primeiro, você ganha visão sobre a implementação, o que acelera o desenvolvimento. Depurar a implementação também é mais rápido, graças ao feedback imediato e reproduzível que apenas um teste automatizado pode fornecer. Talvez a maior economia de tempo do teste de unidade venha alguns meses ou anos depois que você escrever o teste, quando você precisa estender a API. O teste de unidade não só fornece documentação confiável sobre o funcionamento da API, mas também valida as suposições que foram adotadas no projeto da API. Você pode ter certeza de que uma mudança não quebrou nada se a mudança passar todos os testes de unidade escritos antes dele. As alterações que interferem com as suposições fundamentais da API causam os defeitos mais caros para depurar. Uma suíte de testes de unidade abrangente é provavelmente a defesa mais eficaz contra essas mudanças indesejadas. Este capítulo apresenta um design orientado a testes através da implementação de uma média móvel exponencial (EMA), uma função matemática simples mas útil. Este capítulo também explica como usar os módulos CPAN Test :: More e Test :: Exception. Testes de Unidade Um teste de unidade valida a visão do programador da aplicação. Isso é bastante diferente de um teste de aceitação, que é escrito a partir da perspectiva do cliente e testes de funcionalidade do usuário final, geralmente através da mesma interface que um usuário comum usa. Em contraste, um teste unitário exerce uma API, formalmente conhecida como uma unidade. Geralmente, nós testamos um pacote Perl inteiro com um único teste unitário. Perl tem uma forte tradição de testes de unidade, e praticamente todos os módulos CPAN vem com um ou mais testes unitários. Há também muitos frameworks de teste disponíveis no CPAN. Este capítulo e os subseqüentes usam Test :: More. Um módulo de teste popular e bem documentado.2 Eu também uso Test :: Exception para testar casos de desvio que resultam em chamadas para morrer .3 Teste Primeiro, Por Intenção Desenho testado leva o teste de unidade ao extremo. Antes de escrever o código, você escreve um teste de unidade. Por exemplo, aqui é o primeiro caso de teste para o módulo EMA (média móvel exponencial): Este é o teste mínimo Test :: More. Você diz Teste :: Mais quantos testes esperam, e você importa o módulo com useok como o primeiro caso de teste. O BEGIN garante que os protótipos e funções do módulo estejam disponíveis durante a compilação do resto do teste de unidade. O próximo passo é executar este teste para se certificar de que falha: Nesta fase, você pode estar pensando, Duh Claro, ele falha. Test-driven design envolve lotes de duhs no início. Os passos do bebê são importantes, porque ajudam a colocá-lo na mentalidade de escrever um pequeno teste seguido de apenas código suficiente para satisfazer o teste. Se você tiver experiência em programação de manutenção, talvez já esteja familiarizado com esse procedimento. Programadores de manutenção sabem que precisam de um teste para ter certeza de que sua mudança corrige o que eles acham que está quebrado. Eles escrevem o teste e executá-lo antes de corrigir qualquer coisa para se certificar de que eles entendem uma falha e que sua correção funciona. Desenho testado leva esta prática ao extremo, esclarecendo a sua compreensão de todas as alterações antes de fazê-los. Agora que nós esclarecemos a necessidade de um módulo chamado EMA (duh), nós implementá-lo: E, duh, o teste passa: Yeeha Tempo para comemorar com um cappuccino duplo para que don39t adormecer. Isso é tudo que há para o loop de design test-driven: escrever um teste, vê-lo falhar, satisfazer o teste e vê-lo passar. Por razões de brevidade, o restante dos exemplos deixa de fora os passos de execução do teste e as duhs e yeehas concomitantes. No entanto, é importante lembrar-se de incluir estas etapas simples quando a primeira programação de teste. Se você não se lembrar, seu parceiro de programação provavelmente will.4. Exponential Moving Average Nosso cliente hipotético para este exemplo gostaria de manter uma média corrente de preços de fechamento das ações para seu site. Um EMA é comumente usado para esta finalidade, porque é uma maneira eficiente de computar uma média running. Você pode ver porque se você olhar para a computação básica para um EMA: today39s preço x peso yesterday39s média x (1 - peso) Este algoritmo produz uma média ponderada que favorece o histórico recente. O efeito de um preço sobre a média decai exponencialmente ao longo do tempo. É uma função simples que só precisa manter dois valores: a média de ontem e o peso. A maioria dos outros tipos de médias móveis, requerem mais armazenamento de dados e cálculos mais complexos. O peso, comumente chamado de alfa. É calculado em termos de períodos de tempo uniformes (dias, neste exemplo): 2 (número de dias 1) Para eficiência, alfa normalmente é computado uma vez, e armazenado junto com o valor atual da média. Eu escolhi usar um objeto para armazenar esses dados e um único método para calcular a média. Teste as coisas que podem quebrar Desde o primeiro corte design chamadas para um objeto com estado, precisamos instanciá-lo para usá-lo. O próximo caso testa a criação do objeto: Às vezes me esqueço de retornar a instância (self) para que o teste chame ok para verificar se o novo retorna algum valor diferente de zero. Este caso testa o que eu acho que pode quebrar. Um teste alternativo, mais extenso é: Este caso verifica que o novo retorna uma referência abençoada da classe EMA. Para mim, este teste é desnecessariamente complexo. Se o novo retorna algo, é provavelmente uma instância. É razoável invocar o caso mais simples apenas nesta base. Além disso, haverá outros casos de teste que usarão a instância, e esses testes falharão se o novo doesn39t retornar uma instância da classe EMA. Este ponto é sutil, mas importante, porque o tamanho de uma unidade de teste é importante. Quanto maior e mais lenta a suíte, menos útil será. Um conjunto de testes de unidade lenta significa que os programadores hesitarão antes de executar todos os testes, e haverá mais checkins que quebram os testes unit andor acceptance. Lembre-se, os programadores são preguiçosos e impacientes, e eles não gostam de ser retidos por seu ambiente de programação. Quando você testar apenas o que pode quebrar, o conjunto de testes da unidade permanecerá uma ferramenta de desenvolvimento leve e eficaz. Por favor, note que se você e seu parceiro são novos para o projeto test-driven, é provavelmente melhor errar no lado da cautela e testar muito. Com a experiência, você vai aprender quais testes são redundantes e que são especialmente úteis. Não há fórmulas mágicas aqui. Testar é uma arte que leva tempo para dominar. Satisfaça o teste, Don39t Trick It Voltando ao nosso exemplo, a implementação de novo que satisfaz este caso é: Este é o código mínimo que satisfaz o teste acima. Comprimento doesn39t necessidade de ser armazenado, e nós don39t necessidade de calcular alfa. Chegaremos a eles quando precisarmos. Mas espere, você diz, wouldn39t o seguinte código satisfazer o teste, também Sim, você pode enganar qualquer teste. No entanto, it39s bom para tratar programadores como adultos (mesmo que don39t sempre agem dessa forma). Ninguém vai cuidar de seu ombro para ter certeza de que não está traindo seu próprio teste. A primeira implementação de novo é a quantidade certa de código, eo teste é suficiente para ajudar a orientar essa implementação. O design chama um objeto para manter o estado, e uma criação de objeto é o que precisava ser codificado. Testar casos de base primeiro O que nós temos testado até agora são os casos de base. Ou seja, testes que validam os pressupostos básicos da API. Quando testamos as premissas básicas primeiro, trabalhamos no caminho para a completa complexidade da implementação completa, e também torna o teste mais legível. Teste-primeira concepção funciona melhor quando a implementação cresce juntamente com os casos de teste. Existem dois casos base para a função de cálculo. O primeiro caso base é que o valor inicial da média é apenas o próprio número. Também é o caso de introduzir um valor igual à média, que deve deixar a média inalterada. Estes casos são codificados da seguinte forma: A função is from Test :: More permite-nos comparar valores escalares. Observe a alteração para o caso de teste de instanciação que nos permite usar a instância (ema) para casos subseqüentes. A reutilização de resultados de testes anteriores reduz o teste e facilita sua compreensão. A implementação que satisfaz estes casos é: A inicialização de alfa foi adicionada ao novo. Porque computa necessidades o valor. New inicializa o estado do objeto e computa implementa o algoritmo EMA. Self-gt é inicialmente undef para que o caso possa ser detectado. Mesmo que a implementação pareça concluída, nós não estamos fazendo testes. O código acima pode estar com defeito. Ambos os casos de teste de computação usam o mesmo valor, eo teste passaria mesmo se, por exemplo, o self-gt eo valor fossem alternados acidentalmente. Nós também precisamos testar que a média muda quando dados valores diferentes. O teste, tal como está, é muito estático e não serve como um bom exemplo de como funciona um EMA. Escolha dados auto-evidentes Em um ambiente test-driven, os programadores usam os testes para aprender como a API funciona. Você pode ouvir que os XPers não gostam de documentação. Isso não é verdade. O que preferimos é a auto-validação documentação na forma de testes. Nós tomamos cuidado para escrever testes que são legíveis e demonstram como usar a API. Uma maneira de criar testes legíveis é escolher bons dados de teste. No entanto, temos um pequeno problema bootstrapping: Para escolher bons dados de teste, precisamos de valores válidos a partir dos resultados de uma computação EMA, mas precisamos de uma implementação EMA para nos dar esses valores. Uma solução é calcular manualmente os valores da EMA. Ou, nós poderíamos usar uma outra implementação de EMA para vir acima com os valores. Embora uma dessas opções funcionasse, um programador lendo os casos de teste teria que confiar neles ou recompô-los para verificar se estavam corretos. Sem mencionar que precisamos obter exatamente a precisão certa para nossa plataforma de destino. Use The Algorithm, Luke Uma alternativa melhor é trabalhar para trás através do algoritmo para descobrir alguns dados de teste auto-evidentes.5 Para conseguir isso, tratamos o algoritmo EMA como duas equações, corrigindo alguns valores. Nosso objetivo é ter valores inteiros para os resultados, para evitar problemas de precisão de ponto flutuante. Além disso, valores inteiros tornam mais fácil para o programador seguir o que está acontecendo. Quando olhamos para as equações, vemos que o alfa é o valor mais limitado: a média de hoje, a média de hoje, a média de ontem, a média de ontem (1 - alpha) alfa 2 (comprimento 1). Portanto, faz sentido tentar descobrir um valor de alfa Pode produzir resultados inteiros dados preços inteiros. Começando com o comprimento 1, os valores de alfa diminuem como segue: 1, 23, 12, 25, 13, 27 e 14. Os valores 1, 12 e 25 são bons candidatos, porque podem ser representados exatamente em ponto flutuante binário . 1 é um caso degenerado, a média de um único valor é sempre ela mesma. 12 não é ideal, porque alfa e 1 - alfa são idênticos, o que cria uma simetria na primeira equação: today39s média today39s preço x 0.5 yesterday39s média x 0,5 Queremos pesos assimétricos para que defeitos, como trocar o preço de hoje ea média de ontem, Será detectado. Um comprimento de 4 rendimentos um alfa de 25 (0.4), e faz a equação assimétrica: today39s média today39s preço x 0.4 yesterday39s média x 0.6 Com o alfa fixado em 0.4, nós podemos escolher os preços que fazem today39s média um inteiro. Especificamente, múltiplos de 5 funcionam bem. Eu gosto de preços para subir, então eu escolhi 10 para o preço de hoje e 5 para a média de ontem. (O preço inicial). Isso faz com que a média de hoje seja igual a 7, eo nosso teste se torna: Novamente, eu revisei os casos base para manter o teste curto. Qualquer valor nos casos de base irá funcionar para que possamos também economizar tempo de teste através de reutilização. Nosso teste e implementação estão essencialmente completos. Todos os caminhos através do código são testados, e EMA poderia ser usado na produção se for usado corretamente. Ou seja, a EMA está completa se tudo o que nos importa é o comportamento conforme. A implementação atualmente ignora o que acontece quando novo é dado um valor inválido para o comprimento. Embora a EMA seja uma pequena parte da aplicação, ela pode ter um grande impacto na qualidade. Por exemplo, se for passado um comprimento de -1, Perl lança uma exceção de divisão por zero quando alfa é computado. Para outros valores inválidos para o comprimento. Como -2, o novo aceita silenciosamente o valor errante, e computa fielmente produz valores não sensíveis (médias negativas para preços positivos). Nós simplesmente não podemos ignorar esses casos. Precisamos tomar uma decisão sobre o que fazer quando o comprimento é inválido. Uma abordagem seria assumir lixo-no lixo-out. Se um chamador fornecer -2 de comprimento. Ele é o problema do chamador. No entanto, isso não é o que a função de divisão de Perl faz, e não é o que acontece, digamos, quando você tenta desreferir um escalar que não é uma referência. O intérprete Perl chama morrer. E eu já mencionei no capítulo de Estilo de Codificação que eu prefiro falhar rápido ao invés de esperar até que o programa possa causar algum dano real. Em nosso exemplo, o site do cliente exibiria uma média móvel inválida, e um de seus clientes poderia tomar uma decisão de investimento incorreta com base nessas informações. Isso seria ruim. É melhor para o site retornar uma página de erro do servidor do que exibir informações enganosas e incorretas. Ninguém gosta de falhas de programa ou erros de servidor. No entanto, chamar die é uma maneira eficiente de comunicar limites semânticos (acoplamentos) dentro da aplicação. O programador de interface do usuário, no nosso exemplo, pode não saber que um comprimento EMA39s deve ser um número inteiro positivo. Ele vai descobrir quando a aplicação morre. Ele pode então alterar o design do seu código e da classe EMA para tornar esse limite visível para o usuário final. Falha rápida é um mecanismo de feedback importante. Se encontrarmos um dado inesperado. Ele nos diz que o design do aplicativo precisa ser melhorado. Deviance Testing Para testar uma API que falha rapidamente, precisamos ser capazes de capturar chamadas para morrer e, em seguida, chamar ok para validar a chamada realmente terminou em uma exceção. A função diesok no módulo Test :: Exception faz isso para nós. Uma vez que este é o nosso último grupo de casos de teste neste capítulo, aqui está o teste de unidade inteira com os changeds para os novos casos de desvio destacados: Existem agora 9 casos no teste de unidade. O primeiro caso de desvio valida que o comprimento não pode ser negativo. Já sabemos que -1 morrerá com uma exceção de divisão por zero, então -2 é uma escolha melhor. O caso zero verifica a condição de contorno. O primeiro comprimento válido é 1. Comprimentos devem ser inteiros, e 2.5 ou qualquer outro número de ponto flutuante não é permitido. Comprimento não tem limite superior explícito. O Perl converte automaticamente inteiros em números de ponto flutuante se eles forem muito grandes. O teste já verifica se os números de ponto flutuante não são permitidos, portanto nenhuma verificação de limite superior explícita é necessária. A implementação que satisfaz este teste segue: A única alteração é a adição de uma chamada para morrer com uma cláusula a menos. Essa simples cláusula de falha rápida não complica o código ou desacelera a API e, no entanto, evita erros sutis ao converter uma suposição em uma afirmação. Teste somente a nova API Uma das partes mais difíceis do teste é saber quando parar. Depois de ter sido testado-infectado, você pode querer continuar a adicionar casos para ter certeza de que a API é perfeita. Por exemplo, um caso de teste interessante seria passar um NaN (Not a Number) para calcular. Mas isso não é um teste de EMA. A implementação de ponto flutuante de Perl comporta-se de uma maneira particular com respeito a NaNs6. E Bivio :: Math :: EMA serão conformes a esse comportamento. Testar que os NaNs são manipulados corretamente é um trabalho para a suíte de teste do intérprete Perl. Cada API depende de uma enorme quantidade de código existente. Não há tempo suficiente para testar todas as APIs existentes e sua nova API também. Assim como uma API deve separar preocupações assim deve um teste. Ao testar uma nova API, sua preocupação deve ser que API e não outros. Fundação sólida No XP, fazemos a coisa mais simples que poderia funcionar para que possamos entregar o valor do negócio o mais rápido possível. Mesmo enquanto escrevemos o teste e a implementação, temos certeza de que o código mudará. Quando encontramos um novo requisito de cliente, refatoramos o código, se necessário, para facilitar a função adicional. Este processo iterativo é chamado design contínuo. Que é o tema do próximo capítulo. É como renovar sua casa sempre que suas necessidades mudam. 7 Um sistema ou casa precisa de uma base sólida para apoiar a renovação contínua. Os testes de unidade são a base de um projeto XP. Ao projetar continuamente, garantimos que a casa não caia, executando testes de unidade para validar todas as suposições sobre uma implementação. Nós também crescemos a fundação antes de adicionar novas funções. Nosso conjunto de testes nos dá a confiança necessária para aceitar a mudança. Gestão de Software de Qualidade: Vol. 1 Pensamento de Sistemas. Gerald Weinberg, Dorset House, 1991, p. 236. Parte da distribuição Test-Simple, disponível em search. cpan. orgsearchqueryTest-Simple Eu usei a versão 0.47 para este livro. Apenas um lembrete amigável para programar em pares, especialmente ao tentar algo novo. Graças a Ion Yadigaroglu por me ensinar esta técnica. Em algumas implementações, o uso de NaNs causará um erro em tempo de execução. Em outros, eles farão com que todos os resultados subseqüentes sejam um NaN. Não deixe o pensamento de renovação contínua da casa assustá-lo. Os programadores são muito mais silenciosos e menos confusos do que os trabalhadores da construção civil.
Comments
Post a Comment