Estou tentando calcular a média móvel de um sinal. O valor do sinal (um duplo) é atualizado em horários aleatórios. Estou procurando uma maneira eficiente de calcular sua média ponderada no tempo ao longo de uma janela de tempo, em tempo real. Eu poderia fazê-lo sozinho, mas é mais desafiante do que eu pensava. A maioria dos recursos que encontrei através da internet calculam a média móvel do sinal periódico, mas as atualizações das minas em tempo aleatório. Alguém conhece bons recursos para isso. O truque é o seguinte: você obtém atualizações em horários aleatórios através de atualização vazia (tempo int, valor flutuante). No entanto, você também precisa acompanhar quando uma atualização cai na janela de tempo, de modo que você configure um alarme chamado no momento N, que remove a atualização anterior de ser novamente considerado novamente na computação. Se isso acontecer em tempo real, você pode solicitar o sistema operacional para fazer uma chamada para um método void dropoffoldestupdate (int time) para ser chamado no tempo N Se esta é uma simulação, você não pode obter ajuda do sistema operacional e você precisa Faça-o manualmente. Em uma simulação, você chamaria métodos com o tempo fornecido como um argumento (que não se correlaciona com o tempo real). No entanto, uma suposição razoável é que as chamadas são garantidas de tal forma que os argumentos de tempo estão aumentando. Neste caso, você precisa manter uma lista ordenada de valores de hora do alarme e, para cada atualização e leitura, você verifica se o argumento de tempo é maior que o cabeçalho da lista de alarmes. Embora seja maior, você faz o processamento relacionado ao alarme (abandone a atualização mais antiga), remova a cabeça e verifique novamente até que todos os alarmes anteriores ao tempo fornecido sejam processados. Em seguida, faça a chamada de atualização. Tenho até agora assumido que é óbvio o que você faria para a computação real, mas vou elaborar apenas no caso. Eu suponho que você tenha um método flutuante lido (int time) que você usa para ler os valores. O objetivo é tornar este chamado tão eficiente quanto possível. Então você não calcula a média móvel sempre que o método de leitura é chamado. Em vez disso, você precomputa o valor a partir da última atualização ou o último alarme, e ajuste esse valor por algumas operações de ponto flutuante para explicar a passagem do tempo desde a última atualização. (I. E. Um número constante de operações, exceto para talvez processar uma lista de alarmes empilhados). Esperemos que isso seja claro - este deve ser um algoritmo bastante simples e bastante eficiente. Otimização adicional. Um dos problemas restantes é se um grande número de atualizações acontecerem dentro da janela de tempo, então há muito tempo para o qual não há leituras nem atualizações e, em seguida, uma leitura ou atualização vem junto. Nesse caso, o algoritmo acima será ineficiente ao atualizar de forma incremental o valor de cada uma das atualizações que está caindo. Isso não é necessário, porque nós só nos preocupamos com a última atualização além da janela de tempo, então, se houver uma maneira de descartar todas as atualizações mais antigas, isso ajudaria. Para fazer isso, podemos modificar o algoritmo para fazer uma pesquisa binária de atualizações para encontrar a atualização mais recente antes da janela de tempo. Se houver relativamente poucas atualizações que precisam ser descartadas, pode-se incrementar o valor para cada atualização descartada. Mas se houver muitas atualizações que precisam ser descartadas, pode-se recalcular o valor a partir do zero depois de deixar as atualizações antigas. Apêndice em Computação Incremental: Devo esclarecer o que quero dizer pela computação incremental acima na frase ajustar esse valor por um par de operações de ponto flutuante para explicar a passagem do tempo desde a última atualização. Computação inicial não incremental: então iterar sobre os atuais relevantes em ordem crescente de tempo: tempo de exibição de motionaverage (sum tempo de atraso). Agora, se exatamente uma atualização cai fora da janela, mas nenhuma nova atualização chegou, ajuste a soma como: (note que é priorupdate, que tem seu timestamp modificado para iniciar o início da última janela). E se exatamente uma atualização entrar na janela, mas nenhuma nova atualização cai, ajuste a soma como: Como deve ser óbvio, este é um esboço áspero, mas espero que mostre como você pode manter a média de que é O (1) operações por atualização Em uma base amortizada. Mas observe uma otimização adicional no parágrafo anterior. Observe também as questões de estabilidade aludidas em uma resposta mais antiga, o que significa que os erros de ponto flutuante podem se acumulam em um grande número dessas operações incrementais, de modo que existe uma divergência com o resultado da computação total que é significativa para o aplicativo. Se uma aproximação é OK e há um tempo mínimo entre amostras, você pode tentar super-amostragem. Tenha uma matriz que represente intervalos de tempo uniformemente espaçados que sejam menores do que o mínimo, e em cada período de tempo armazene a última amostra que foi recebida. Quanto menor o intervalo, mais próxima será a média para o valor verdadeiro. O período não deve ser superior a metade do mínimo ou há uma chance de perder uma amostra. Respondeu 15 de dezembro às 18:12 respondido 15 de dezembro às 22:38 Obrigado pela resposta. Uma melhoria que seria necessária para que o quotcachequot fosse o valor da média total, de modo que não estivemos todos os dias. Além disso, pode ser um ponto menor, mas não seria mais eficiente usar um deque ou uma lista para armazenar o valor, já que assumimos que a atualização virá na ordem correta. A inserção seria mais rápida do que no mapa. Ndash Arthur 16 de dezembro 11 às 8:55 Sim, você pode armazenar em cache o valor da soma. Submeta os valores das amostras que você apaga, adicione os valores das amostras que você inseriu. Além disso, sim, um dequeltpairltSample, Dategtgt pode ser mais eficiente. Eu escolhi o mapa para a legibilidade e a facilidade de invocar o mapa :: upperbound. Como sempre, escreva o código correto primeiro, depois faça o perfil e mude as mudanças incrementais. Ndash Rob Dec 16 11 at 15:00 Nota: Aparentemente, esta não é a maneira de abordar isso. Deixando-o aqui para referência sobre o que está errado com essa abordagem. Verifique os comentários. ATUALIZADO - com base no comentário Olis. Não tenho certeza sobre a instabilidade de que ele está falando. Use um mapa ordenado de tempos de chegada contra valores. Após a chegada de um valor, adicione a hora de chegada ao mapa ordenado juntamente com seu valor e atualize a média móvel. Advertindo isso é pseudo-código: aí. Não totalmente elaborado, mas você consegue a ideia. Coisas a serem observadas. Como eu disse, o acima é pseudo-código. Você precisará escolher um mapa apropriado. Não remova os pares conforme você itera, pois você invalidará o iterador e terá que começar de novo. Veja o comentário Olis abaixo também. Respondeu 15 de dezembro às 12:22 Isso não funciona: ele não leva em consideração a proporção do comprimento de janela de cada valor para. Além disso, essa abordagem de adicionar e depois subtrair é apenas estável para tipos inteiros, não flutuadores. Ndash Oliver Charlesworth 15 de dezembro às 12:29 OliCharlesworth - desculpe, perdi alguns pontos-chave na descrição (dupla e ponderada no tempo). Vou atualizar. Obrigado. Ndash Dennis 15 de dezembro 11 às 12:33 A ponderação do tempo é mais um problema. Mas isso não é o que eu estou falando. Eu estava me referindo ao fato de que quando um novo valor primeiro entra na janela de tempo, sua contribuição para a média é mínima. Sua contribuição continua a aumentar até um novo valor entrar. Ndash Oliver Charlesworth 15 de dezembro às 12: 35 Atualmente estou desenvolvendo um sistema LCD gráfico para exibir temperaturas, fluxos, voltagens, energia e energia em um sistema de bomba de calor. O uso de um LCD gráfico significa que metade do meu SRAM e 75 do meu flash foram usados por um buffer de tela e strings. Atualmente, exibo números de minmaxaverage para energia. À meia-noite, quando o valor diário é reiniciado, o sistema verifica se o consumo do dia está acima ou abaixo do mínimo ou mínimo anterior e armazena o valor. A média é calculada dividindo o consumo cumulativo de energia pelo número de dias. Gostaria de exibir a média diária na última semana e mês (4 semanas por simplicidade), ou seja, uma média móvel. Atualmente, isso envolve a manutenção de uma série de valores nos últimos 28 dias e o cálculo de uma média em toda a matriz para mensais e últimos 7 dias por semana. Inicialmente eu estava fazendo isso usando uma série de flutuadores (como a energia está na forma 12.12kWh), mas isso foi usando 28 4 bytes 112 bytes (5.4 de SRAM). Eu não me importo de ter apenas um único ponto decimal de resolução, então mudei para usar uint16t e multiplicando a figura por 100. Isso significa que 12.12 é representado como 1212, e eu dividir por 100 para exibição. O tamanho da matriz agora é de até 56 bytes (muito melhor). Não há uma maneira trivial de reduzir a figura para um uint8t que eu possa ver. Eu poderia tolerar a perda de uma casa decimal (12.1kWh em vez de 12.12kWh), mas o consumo é freqüentemente maior do que 25.5kWh (255 sendo o valor mais alto representado por um inteiro não assinado de 8 bits). O consumo nunca foi inferior a 10.0kWh ou acima de 35.0kWh, então, eu poderia subtrair 10 das figuras armazenadas, mas eu sei que um dia superaremos esses limites. Então testei o código para empacotar valores de 9 bits em uma matriz. Isso dá uma faixa de 0-51.2kWh e usa 32 bytes no total. No entanto, aceder a uma matriz como esta é bastante lento, especialmente quando você precisa iterar sobre todos os valores para calcular uma média. Então, minha pergunta é: existe uma maneira mais eficiente de calcular uma média móvel com três janelas - vida, 28 dias e 7 dias. Eficiência significa menor em termos de uso SRAM, mas sem a penalidade de um código enorme. Posso evitar armazenar todos os valores solicitados Mar 7 14 às 8:32 Eu pensei e você está certo. Então, isso faz com que minha resposta seja incorreta. Estou investindo mais tempo e paciência nisso. Talvez algo fora da caixa. Eu vou deixar você saber se eu encontrar alguma coisa. Fazemos algo assim muito no meu local de trabalho. Deixe-me perguntar ao redor. Desculpe pela confusão. Ndash Aditya Somani Mar 8 14 às 17:15 existe uma maneira mais eficiente de calcular uma média móvel com. 28 dias e 7 dias. Precisando lembrar 27 dias de história. Você pode ficar perto o suficiente para armazenar 11 valores em vez de 28 valores, talvez algo como: Em outras palavras, ao invés de armazenar todos os detalhes de todos os dias nos últimos 27 dias, (a) armazene 7 ou mais valores de informações diárias detalhadas para o passado 7 ou mais dias, e também (b) armazenar 4 ou mais valores resumidos de informações totais ou médias para cada uma das últimas 4 ou mais semanas. Básico de Negociação Algorítica: Conceitos e Exemplos Um algoritmo é um conjunto específico de instruções claramente definidas Para realizar uma tarefa ou processo. A negociação algorítmica (negociação automatizada, negociação em caixa preta ou simplesmente algo-trading) é o processo de usar computadores programados para seguir um conjunto definido de instruções para colocar um comércio para gerar lucros a uma velocidade e freqüência impossíveis para um Comerciante humano. Os conjuntos definidos de regras são baseados em tempo, preço, quantidade ou qualquer modelo matemático. Além das oportunidades de lucro para o comerciante, o algo-trading torna os mercados mais líquidos e torna a negociação mais sistemática descartando impactos emocionais humanos nas atividades comerciais. Suponha que um comerciante siga esses critérios de comércio simples: Compre 50 ações de uma ação quando sua média móvel de 50 dias exceda a média móvel de 200 dias. Vende ações da ação quando sua média móvel de 50 dias está abaixo da média móvel de 200 dias Usando este conjunto de duas instruções simples, é fácil escrever um programa de computador que monitorará automaticamente o preço das ações (e os indicadores de média móvel) e colocará as ordens de compra e venda quando as condições definidas forem atendidas. O comerciante não precisa mais manter um relógio para preços e gráficos ao vivo, ou colocar as ordens manualmente. O sistema de comércio algorítmico automaticamente faz isso para ele, identificando corretamente a oportunidade comercial. (Para obter mais informações sobre as médias móveis, consulte: Médias móveis simples, faça as Tendências se destacarem.) A Algo-trading oferece os seguintes benefícios: Negociações executadas com os melhores preços. Posicionamento de pedidos comerciais instantâneo e preciso (com altas chances de execução nos níveis desejados) Cronometrado corretamente e instantaneamente, para evitar mudanças de preços significativas Custos de transação reduzidos (veja o exemplo de falta de implementação abaixo) Verificações automatizadas simultâneas em múltiplas condições de mercado Redução do risco de erros manuais na colocação dos negócios Backtest o algoritmo, com base nos dados históricos e em tempo real disponíveis Reduzida Possibilidade de erros cometidos por comerciantes humanos com base em fatores emocionais e psicológicos. A maior parte do dia-a-dia é a negociação de alta freqüência (HFT), que tenta capitalizar a colocação de um grande número de pedidos em velocidades muito rápidas em múltiplos mercados e decisões múltiplas Parâmetros, com base em instruções pré-programadas. (Para mais informações sobre negociação de alta frequência, consulte: Estratégias e Segredos de Empresas de Negociação de Alta Frequência (HFT)) A Algo-trading é utilizada em muitas formas de atividades de negociação e investimento, incluindo: investidores de médio a longo prazo ou empresas de compra (fundos de pensão , Fundos de investimento, companhias de seguros) que compram em ações em grandes quantidades, mas não querem influenciar os preços das ações com investimentos discretos e em grande volume. Os comerciantes de curto prazo e os participantes do lado da venda (fabricantes de mercado, especuladores e arbitragistas) também se beneficiam da execução automatizada do comércio, auxiliando algo-trading na criação de liquidez suficiente para os vendedores no mercado. Os comerciantes sistemáticos (seguidores de tendências, comerciantes de pares, hedge funds, etc.) acham muito mais eficiente programar suas regras de negociação e permitir que o programa seja comercializado automaticamente. O comércio algorítmico proporciona uma abordagem mais sistemática ao comércio ativo do que os métodos baseados em intuição ou instinto de comerciantes humanos. Estratégias de negociação algorítmica Qualquer estratégia para negociação algorítmica exige uma oportunidade identificada que seja rentável em termos de melhoria de ganhos ou redução de custos. As seguintes são estratégias de negociação comuns usadas em algo-trading: as estratégias de negociação algorítmicas mais comuns seguem as tendências nas médias móveis. Fugas de canal. Movimentos de níveis de preços e indicadores técnicos relacionados. Estas são as estratégias mais fáceis e simples de implementar através de negociação algorítmica porque essas estratégias não envolvem fazer previsões ou previsões de preços. As negociações são iniciadas com base na ocorrência de tendências desejáveis. Que são fáceis e direitas de implementar através de algoritmos sem entrar na complexidade da análise preditiva. O exemplo acima mencionado de média móvel de 50 e 200 dias é uma tendência popular seguindo a estratégia. (Para mais informações sobre as estratégias de negociação de tendências, veja: Estratégias simples para capitalizar as tendências.) Comprar uma ação dupla cotada a um preço mais baixo em um mercado e simultaneamente vendê-lo a um preço mais alto em outro mercado oferece o diferencial de preço como lucro livre de risco Ou arbitragem. A mesma operação pode ser replicada para ações versus instrumentos de futuros, pois os diferenciais de preços existem de tempos em tempos. Implementar um algoritmo para identificar esses diferenciais de preços e colocar as ordens permite oportunidades lucrativas de forma eficiente. Os fundos do índice definiram períodos de reequilíbrio para que suas participações fossem compatíveis com seus respectivos índices de referência. Isso cria oportunidades rentáveis para comerciantes algorítmicos, que capitalizam os negócios esperados que oferecem lucros de 20 a 80 pontos base, dependendo do número de ações no fundo do índice, apenas antes do reequilíbrio do fundo do índice. Essas negociações são iniciadas através de sistemas de negociação algorítmica para execução atempada e melhores preços. Muitos modelos matemáticos comprovados, como a estratégia de negociação neutra dota, que permitem a negociação em combinação de opções e sua segurança subjacente. Onde os negócios são colocados para compensar deltas positivos e negativos para que o portfólio delta seja mantido em zero. A estratégia de reversão média baseia-se na idéia de que os preços altos e baixos de um bem são um fenômeno temporário que retorna periodicamente ao seu valor médio. Identificar e definir uma faixa de preço e implementar algoritmos com base em isso permite que os negócios sejam colocados automaticamente quando o preço do recurso entra e sai do seu alcance definido. A estratégia de preços médios ponderados por volume quebra uma grande ordem e libera dinamicamente determinados pedaços menores da ordem para o mercado usando perfis de volume histórico específicos de estoque. O objetivo é executar a ordem próxima ao preço médio ponderado por volume (VWAP), beneficiando assim o preço médio. A estratégia de preço médio ponderado no tempo quebra uma grande ordem e libera dinamicamente determinados pedaços menores da ordem para o mercado usando intervalos de tempo uniformemente divididos entre uma hora de início e fim. O objetivo é executar a ordem perto do preço médio entre os horários de início e término, minimizando assim o impacto no mercado. Até que a ordem comercial seja totalmente preenchida, esse algoritmo continua enviando ordens parciais, de acordo com o índice de participação definido e de acordo com o volume negociado nos mercados. A estratégia de etapas relacionadas envia ordens a uma porcentagem definida pelo usuário de volumes do mercado e aumenta ou diminui essa taxa de participação quando o preço da ação atinge os níveis definidos pelo usuário. A estratégia de falta de implementação visa minimizar o custo de execução de uma ordem através da negociação do mercado em tempo real, economizando assim o custo da ordem e beneficiando do custo de oportunidade da execução atrasada. A estratégia aumentará a taxa de participação direcionada quando o preço das ações se mover de forma favorável e diminuí-lo quando o preço das ações se mover de forma adversa. Existem algumas classes especiais de algoritmos que tentam identificar acontecimentos do outro lado. Esses algoritmos de sniffing, usados, por exemplo, por um fabricante de mercado de venda têm a inteligência interna para identificar a existência de qualquer algoritmo no lado da compra de uma grande ordem. Essa detecção através de algoritmos ajudará o fabricante de mercado a identificar grandes oportunidades de ordem e permitir que ele se beneficie ao preencher as ordens a um preço mais elevado. Isso às vezes é identificado como front-running de alta tecnologia. (Para obter mais informações sobre negociação de alta freqüência e práticas fraudulentas, consulte: Se você comprar ações on-line, você está envolvido em HFTs.) Requisitos técnicos para negociação algorítmica Implementar o algoritmo usando um programa de computador é a última parte, batida com backtesting. O desafio é transformar a estratégia identificada em um processo informatizado integrado que tenha acesso a uma conta de negociação para fazer pedidos. São necessários os seguintes conhecimentos: conhecimento de programação de computador para programar a estratégia de negociação necessária, programadores contratados ou software de negociação pré-fabricado. Conectividade de rede e acesso a plataformas de negociação para colocar os pedidos. Acesso a feeds de dados de mercado que serão monitorados pelo algoritmo para oportunidades de colocação Ordens A capacidade e a infra-estrutura para testar o sistema uma vez construído, antes de entrar em operação em mercados reais Dados históricos disponíveis para backtesting, dependendo da complexidade das regras implementadas no algoritmo. Aqui está um exemplo abrangente: o Royal Dutch Shell (RDS) está listado em Amsterdã Stock Exchange (AEX) e London Stock Exchange (LSE). Vamos criar um algoritmo para identificar oportunidades de arbitragem. Aqui estão algumas observações interessantes: as negociações da AEX em euros, enquanto a LSE é negociada em libras esterlinas. Por causa da diferença horária de uma hora, a AEX abre uma hora antes da LSE, seguido de ambas as trocas comerciais simultaneamente durante as próximas horas e depois da negociação somente na LSE durante A última hora com o fechamento da AEX Podemos explorar a possibilidade de negociação de arbitragem nas ações do Royal Dutch Shell listadas nesses dois mercados em duas moedas diferentes. Um programa de computador que pode ler os preços atuais do mercado. Os preços dos feeds da LSE e AEX A forex para Taxa de câmbio GBP-EUR Capacidade de colocação de pedidos que pode rotear a ordem para a troca correta. Capacidade de teste de back-up em feeds de preços históricos. O programa de computador deve executar o seguinte: Leia o preço de entrada do estoque RDS de ambas as bolsas Usando as taxas de câmbio disponíveis . Converte o preço de uma moeda para outra. Se houver uma discrepância de preços suficientemente grande (descontando os custos de corretagem), levando a uma oportunidade rentável, então coloque o pedido de compra em troca de preços mais baixos e venda em câmbio com preços mais altos Se as ordens forem executadas como Desejado, o lucro da arbitragem seguirá Simples e Fácil No entanto, a prática de negociação algorítmica não é tão simples de manter e executar. Lembre-se, se você pode colocar um comércio gerado por algo, os outros participantes do mercado podem também. Conseqüentemente, os preços flutuam em milissegundos e até mesmo em microssegundos. No exemplo acima, o que acontece se o seu comércio de compras for executado, mas vender o comércio não, à medida que os preços de venda mudam quando o seu pedido atingir o mercado Você vai acabar sentado com uma posição aberta. Tornando sua estratégia de arbitragem inútil. Existem riscos e desafios adicionais: por exemplo, riscos de falha do sistema, erros de conectividade de rede, atrasos de tempo entre ordens comerciais e execução e, o mais importante, algoritmos imperfeitos. O algoritmo mais complexo, o backtesting mais rigoroso é necessário antes de ser posto em ação. A análise quantitativa de um algoritmo de desempenho desempenha um papel importante e deve ser examinada criticamente. É emocionante ir pela automação auxiliada por computadores com a noção de ganhar dinheiro sem esforço. Mas é preciso certificar-se de que o sistema está completamente testado e os limites exigidos são definidos. Os comerciantes analíticos devem considerar aprender programação e construir sistemas por conta própria, ter confiança em implementar as estratégias certas de forma infalível. O uso cauteloso e o teste minucioso de algo-trading podem criar oportunidades rentáveis.
Comments
Post a Comment