Thursday 30 August 2018

Bollinger bands c #


Abaixo você pode ver meu método C para calcular Bandas Bollinger para cada ponto (média móvel, banda ascendente, banda descendente). Como você pode ver, esse método usa 2 para loops para calcular o desvio padrão móvel usando a média móvel. Ele costumava conter um loop adicional para calcular a média móvel nos últimos n períodos. Este eu poderia remover adicionando o novo valor de ponto a totalaverage no início do loop e removendo o valor do ponto i-n no final do loop. Minha pergunta agora é basicamente: Posso remover o loop interno restante de uma maneira similar que eu consegui com a média móvel perguntada em 31 de janeiro de 13 às 21:45 A resposta é sim, você pode. Em meados dos anos 80, desenvolvi apenas um algoritmo desse tipo (provavelmente não original) no FORTRAN para uma aplicação de monitoramento e controle de processo. Infelizmente, isso aconteceu há mais de 25 anos e não me lembro das fórmulas exatas, mas a técnica foi uma extensão da média móvel, com cálculos de segunda ordem em vez de apenas linear. Depois de olhar para o seu código, penso que posso descobrir como eu fiz isso naquela época. Observe como seu loop interno está fazendo uma Soma de Quadrados: da mesma forma que sua média deve ter originalmente uma Soma de Valores. As únicas duas diferenças são a ordem (seu poder 2 em vez de 1) e que você está subtraindo a média Cada valor antes de você marcar. Agora, isso pode parecer inseparável, mas na verdade eles podem ser separados: agora o primeiro termo é apenas uma Soma de Quadrados, você lida com a mesma maneira que você faz a soma de Valores para a média. O último termo (k2n) é apenas a média ao quadrado do período. Como você divide o resultado pelo período de qualquer maneira, você pode simplesmente adicionar o novo quadrado médio sem o loop extra. Finalmente, no segundo termo (SUM (-2vi) k), desde SUM (vi) total kn, você pode alterá-lo para este: ou apenas -2k2n. Que é -2 vezes o quadrado médio, uma vez que o período (n) é dividido novamente. Então, a fórmula combinada final é: (certifique-se de verificar a validade disso, já que eu estou derrubando o topo da minha cabeça) E incorporar em seu código deve ser algo como isto: O problema com as abordagens que calculam a soma dos quadrados É isso e o quadrado de somas pode ser bastante grande, e o cálculo de sua diferença pode apresentar um erro muito grande. Então vamos pensar em algo melhor. Por que isso é necessário, veja o artigo de Wikipedia sobre Algoritmos para variância computacional e John Cook na explicação teórica para resultados numéricos) Em primeiro lugar, em vez de calcular o stddev, vamos nos concentrar na variância. Uma vez que temos a variância, stddev é apenas a raiz quadrada da variância. Suponha que os dados estejam em uma matriz chamada x rolando uma janela de tamanho n por um pode ser considerado como removendo o valor de x0 e adicionando o valor de xn. Permite denotar as médias de x0..xn-1 e x1..xn por e, respectivamente. A diferença entre as variâncias de x0..xn-1 e x1..xn é, depois de cancelar alguns termos e aplicar (ab) (ab) (ab): Portanto, a variância é perturbada por algo que não requer que você mantenha a Soma dos quadrados, que é melhor para a precisão numérica. Você pode calcular a média e a variância uma vez no início com um algoritmo apropriado (método Welfords). Depois disso, toda vez que você precisa substituir um valor na janela x0 por outro xn, você atualiza a média e a variância como esta: Obrigado por isso. Eu usei isso como base de uma implementação em C para o CLR. Descobri que, na prática, você pode atualizar de forma que newVar seja um número negativo muito pequeno, e o sqrt falhar. Introduzi um if para limitar o valor a zero para este caso. Não é idéia, mas estável. Isso ocorreu quando cada valor na minha janela tinha o mesmo valor (usei um tamanho de janela de 20 e o valor em questão era 0,5, caso alguém pretendesse tentar reproduzir isso). Ndash Drew Noakes 26 de julho 13 às 15:25 Ive Usou common-math (e contribuiu para essa biblioteca) para algo muito parecido com isso. Sua fonte aberta, portar para C deve ser fácil como torta comprada na loja (você tentou fazer uma torta do zero). Confira: commons. apache. orgmathapi-3.1.1index. html. Eles têm uma classe StandardDeviation. Vá para a cidade respondeu Jan 31 13 às 21:48 Você já esqueci Desculpe, eu não tinha a resposta que você estava procurando. Eu definitivamente não queria sugerir portar toda a biblioteca. Apenas o código mínimo necessário, que deveria ser algumas centenas de linhas ou assim. Tenho em atenção que não tenho ideia do que as restrições de direitos autorais legais que o apache tem nesse código, então você deve verificar isso. No caso de você persegui-lo, aqui está o link. De modo que o Variance FastMath ndash Jason Jan 31 13 às 22:36 A informação mais importante já foi dada acima --- mas talvez isso ainda seja de interesse geral. Uma pequena biblioteca Java para calcular média móvel e desvio padrão está disponível aqui: githubtools4jmeanvar A implementação é baseada em uma variante do método Welfords mencionado acima. Métodos para remover e substituir valores foram derivados que podem ser usados ​​para mover o valor windows. Bollinger Bands são indicadores que são plotados em níveis de desvio padrão acima e abaixo de uma média móvel simples. Como o desvio padrão é uma medida de volatilidade, um grande desvio padrão indica um mercado volátil, e um desvio padrão menor indica um mercado mais calmo. Bandas Bollinger são uma boa maneira de comparar a volatilidade com os níveis de preços relativos, ao longo de um período de tempo. Recomendamos que você leia usando fórmulas financeiras antes de prosseguir. O uso de fórmulas financeiras fornece uma explicação detalhada sobre como usar fórmulas e também explica as várias opções disponíveis para você ao aplicar uma fórmula.

No comments:

Post a Comment