Eu preciso manter o controle dos últimos 7 dias de trabalho em um loop de leitura de arquivo simples. Está sendo usado para medir a fatigabilidade das listas de trabalho. Agora eu tenho algo que funciona, mas parece bastante detalhado e não tenho certeza se existe um padrão que é mais sucinto. Atualmente, eu tenho uma classe Java com uma matriz estática para armazenar os dados dos últimos x dias, então, enquanto eu leio o arquivo, eu cortei o primeiro elemento e movi os outros 6 (por uma semana inteira) de volta em um. O processamento desta matriz estática é feito em seu próprio método, isto é. Minha pergunta: esta é uma abordagem de design razoável, ou há algo incrivelmente óbvio e simples para fazer essa tarefa? Obrigado pessoal perguntou agosto 30 11 em 14:33 Obrigado um monte: Eu tenho a mensagem: usar um objeto de nível superior e explorar o métodos relevantes ou um buffer circular. Grandes respostas, todas elas. Quando você pensa sobre isso, você sempre precisa ter acesso a toda a matriz para que você possa se livrar dessa primeira entrada - que eu não tinha certeza por conta própria. Eu me senti aliviada por não ter perdido um folheto e estava basicamente em uma faixa razoável, se não eficiente e concisa. Isso é o que eu adoro neste site: respostas relevantes e de alta qualidade de pessoas que conhecem seu sht. ndash Pete855217 Ago 30 11 at 15:05 Por que você inicializa runningTotal para null? Qual é o seu tipo? Onde ele está declarado? Seria bom se você colocasse alguns exemplos de código que se assemelham ao código Java real. Seguindo em frente, minha crítica seria a seguinte: sua função é demais. Uma função, ou método, deve ser coesa. Mais apropriadamente, eles deveriam fazer uma coisa e apenas uma coisa. Pior ainda, o que acontece no seu loop for quando x 5 Você copia runningTotal6 em runningTotal5. mas então você tem duas cópias do mesmo valor na posição 5 e 6. Em seu design, sua função move / embaralha os itens em sua matriz calcula o total de impressões para o erro padrão retorna o total Faz muito. Minha primeira sugestão é não mover as coisas na matriz. Em vez disso, implemente um buffer circular e use-o em vez do array. Isso simplificará seu design. Minha segunda sugestão é dividir as coisas em funções que são coesas: ter uma estrutura de dados (um buffer circular) que permita que você adicione a ela (e elimine a entrada mais antiga sempre que atingir sua capacidade). Interator tem uma função que calcula o total no iterador (você não se importa se você está calculando o total de uma matriz, lista ou circular bufer.) não chamá-lo total. Chame de soma, que é o que você está computando. Isso é o que eu faço :) Isso é ótimo info luis, no entanto lembre-se esta função é uma pequena parte da funcionalidade da classe, e seria um exagero para adicionar muito código para torná-lo perfeito. Você está tecnicamente correto, e eu entendo que meu código é muito mais fácil39, mas, ao mesmo tempo, às vezes é melhor errar do lado do código menor e mais claro do que ir para a perfeição. Dadas as minhas habilidades com Java, até mesmo fazer o pseudocódigo que você descreve compilar me faria gastar muito com isso (), mas obrigado pela descrição clara. ndash Pete855217 Aug 31 11 at 2:23 Hmmm, não é sobre perfeição, mas sobre práticas industriais estabelecidas que conhecemos há 3 décadas. Código limpo é sempre aquele que é particionado. Temos décadas de evidências que indicam que este é o caminho a percorrer no caso geral (em termos de custo-benefício, redução de defeitos, compreensão, etc.). a menos que seja código descartável para um tipo de coisa única. Nunca é caro fazer isso quando se inicia qualquer análise de problema dessa maneira. Codificação 101, quebrar o problema eo código segue, nem exagero nem difícil) Sua tarefa é muito simples ea abordagem que você adotou é certamente bom para o trabalho. No entanto, se você quiser usar um design melhor, deve se livrar de todos os movimentos numéricos. É melhor usar uma fila FIFO e usar métodos push e pop para que o código não reflita nenhum movimento de dados, apenas as duas ações lógicas de novos dados e remova dados com mais de 7 dias. O que é uma média móvel simples é um algoritmo que calcula a média não ponderada das últimas n amostras. O parâmetro n é geralmente chamado de tamanho da janela, porque o algoritmo pode ser considerado como uma janela que desliza sobre os pontos de dados. Usando uma formulação recursiva do algoritmo, o número de operações necessárias por amostra é reduzido para uma adição, uma subtração e uma divisão. Desde que a formulação é independente do tamanho da janela n. a complexidade do tempo de execução é O (1). isto é constante. A fórmula recursiva da média móvel não ponderada é, em que avg é a média móvel e x representa um ponto de dados. Assim, sempre que a janela desliza para a direita, um ponto de dados, a cauda, cai e um ponto de dados, a cabeça, se move. Implementação Uma implementação da média móvel simples deve levar em consideração a seguinte inicialização do algoritmo a janela não está totalmente preenchida com valores, a fórmula recursiva falha. Armazenamento O acesso ao elemento final é necessário, o que, dependendo da implementação, requer o armazenamento de n elementos. Minha implementação usa a fórmula apresentada quando a janela é totalmente preenchida com valores e alterna para a fórmula, que atualiza a média recalculando a soma dos elementos anteriores. Observe que isso pode levar a instabilidades numéricas devido à aritmética de ponto flutuante. No que diz respeito ao consumo de memória, a implementação usa iteradores para rastrear elementos de cabeça e cauda. Isso leva a uma implementação com requisitos de memória constantes, independentemente do tamanho da janela. Aqui está o procedimento de atualização que desliza a janela para a direita. No. NET, a maioria das coleções invalida seus enumeradores quando a coleção subjacente é modificada. A implementação, no entanto, depende de enumeradores válidos. Especialmente em aplicativos baseados em streaming, a coleção subjacente precisa ser modificada quando um novo elemento chegar. Uma maneira de lidar com isso é criar uma coleção de tamanho fixo circular simples de tamanho n1 que nunca invalida seus iteradores e, alternadamente, adicione um elemento e chame Shift. Eu gostaria de poder descobrir como implementar isso, já que a função Test é muito confusa para mim8230 Preciso converter dados para Array, e então executar o SMA sma novo SMA (20, array) para um período de 20 SMA Como eu ligo Função shift () É necessário implementar construtores. (Desculpe pela confusão). Não, você não precisa converter seus dados em uma matriz, contanto que seus dados implementem IEnumerable1 e o tipo enumerado seja duplo. No que diz respeito à sua mensagem privada, você precisa converter o DataRow em algo que seja enumerável de valores duplos. Sua abordagem funciona. Shift, desliza a janela uma posição para a esquerda. Para um conjunto de dados de, digamos, 40 valores e um SMA de 20 períodos, você tem 21 posições nas quais a janela se encaixa (40 8211 20 1). Cada vez que você chama Shift (), a janela é movida para a esquerda por uma posição e Média () retorna o SMA para a posição atual da janela. Ou seja, a média não ponderada de todos os valores dentro da janela. Além disso, minha implementação permite calcular o SMA, mesmo se a janela não estiver totalmente preenchida no início. Então, em essência Espero que isso ajude. Qualquer outra pergunta COPYRIGHT NOTICE Christoph Heindl e cheind. wordpress, 2009-2012. O uso não autorizado e / ou duplicação deste material sem permissão expressa e por escrito deste autor e / ou proprietário do blog é estritamente proibido. Trechos e links podem ser usados, contanto que crédito total e claro seja dado a Christoph Heindl e cheind. wordpress com direção apropriada e específica ao conteúdo original. Posts recentesBásicos de negociação algorítmica: conceitos e exemplos Carregando o player. Um algoritmo é um conjunto específico de instruções claramente definidas destinadas a realizar uma tarefa ou processo. O comércio algorítmico (negociação automatizada, negociação de caixa preta ou simplesmente negociação de algoritmos) é o processo de usar computadores programados para seguir um conjunto definido de instruções para fazer uma negociação, a fim de gerar lucros a uma velocidade e freqüência impossíveis para uma negociação. comerciante humano. Os conjuntos de regras definidos são baseados em tempo, preço, quantidade ou qualquer modelo matemático. Para além das oportunidades de lucro para o comerciante, a negociação de algoritmos torna os mercados mais líquidos e torna o comércio mais sistemático ao excluir os impactos humanos emocionais nas atividades de negociação. Suponha que um comerciante siga estes critérios comerciais simples: Compre 50 ações de uma ação quando sua média móvel de 50 dias ultrapassar a média móvel de 200 dias Venda ações da ação quando sua média móvel de 50 dias ficar 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 monitore automaticamente o preço das ações (e os indicadores de média móvel) e coloque as ordens de compra e venda quando as condições definidas forem atendidas. O comerciante não precisa mais ficar de olho nos preços e gráficos ao vivo, ou colocar os pedidos manualmente. O sistema de negociação algorítmica faz isso automaticamente, identificando corretamente a oportunidade de negociação. (Para obter mais informações sobre médias móveis, consulte: Médias Móveis Simples Faça Tendências se Destacar.) O comércio de algo oferece os seguintes benefícios: Negociações realizadas com os melhores preços possíveis Posicionamento de pedido comercial instantâneo e preciso (com altas chances de execução nos níveis desejados) Cronometrou correta e instantaneamente, para evitar mudanças significativas nos preços Custos de transação reduzidos (veja o exemplo de déficit de implementação abaixo) Verificações automatizadas simultâneas em múltiplas condições de mercado Risco reduzido de erros manuais na colocação das negociações Backtest o algoritmo, baseado em dados históricos e em tempo real Possibilidade de erros cometidos por comerciantes humanos com base em fatores emocionais e psicológicos A maior parte da negociação de algoritmos atuais é a negociação de alta frequê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 múltiplas decisões. 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) A negociação de algo é usada em muitas formas de atividades de negociação e investimento, incluindo: investidores de médio a longo prazo ou empresas compradoras (fundos de pensão). , fundos mútuos, seguradoras) que adquirem ações em grandes quantidades, mas não querem influenciar os preços das ações com investimentos discretos e de grande volume. Comerciantes de curto prazo e participantes do lado da venda (formadores de mercado, especuladores e arbitradores) se beneficiam da execução automatizada do comércio, além disso, o comércio de algo ajuda a criar liquidez suficiente para os vendedores no mercado. Comerciantes sistemáticos (seguidores de tendências, pares de operadores, fundos de hedge etc.) acham muito mais eficiente programar suas regras de negociação e permitir que o programa troque automaticamente. O comércio algorítmico fornece uma abordagem mais sistemática ao comércio ativo do que métodos baseados na intuição ou instinto de um comerciante humano. Estratégias de Negociação Algorítmica Qualquer estratégia para negociação algorítmica requer uma oportunidade identificada que seja lucrativa em termos de ganhos aprimorados ou redução de custos. A seguir estão as estratégias de negociação comuns usadas na negociação de algoritmos: As estratégias de negociação algorítmica mais comuns seguem as tendências das médias móveis. fugas do canal. movimentos do nível de preços e indicadores técnicos relacionados. Essas são as estratégias mais fáceis e simples de implementar por meio do comércio algorítmico, porque essas estratégias não envolvem previsões nem 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 simples 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 obter mais informações sobre estratégias de negociação de tendências, consulte: Estratégias simples para capitalização de tendências.) Comprar uma ação listada dupla a um preço menor em um mercado e simultaneamente vendê-la a um preço maior 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 futuros, já que os diferenciais de preço existem de tempos em tempos. Implementar um algoritmo para identificar esses diferenciais de preço e colocar as ordens permite oportunidades lucrativas de maneira eficiente. Os fundos de índices definiram períodos de reequilíbrio para aproximar seus investimentos aos seus respectivos índices de referência. Isso cria oportunidades lucrativas para os traders algorítmicos, que capitalizam os negócios esperados que oferecem lucros de 20 a 80 pontos básicos, dependendo do número de ações no fundo de índice, imediatamente antes do rebalanceamento do fundo de índice. Tais 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 delta-neutral, que permitem negociar em combinação de opções e sua segurança subjacente. onde as negociações são feitas para compensar os deltas positivos e negativos, de modo que o delta da carteira seja mantido em zero. A estratégia de reversão à média baseia-se na ideia de que os preços altos e baixos de um ativo são um fenômeno temporário que revertem para seu valor médio periodicamente. Identificar e definir uma faixa de preço e implementar um algoritmo com base nisso permite que os negócios sejam colocados automaticamente quando o preço do ativo entra e sai de sua faixa definida. A estratégia de preço médio ponderado por volume divide uma ordem grande e libera pedaços menores da ordem para o mercado, determinados dinamicamente, usando perfis de volume histórico específicos do estoque. O objetivo é executar o pedido próximo ao Preço Médio Ponderado pelo Volume (VWAP), beneficiando, assim, no preço médio. A estratégia de preço médio ponderada pelo tempo quebra uma ordem grande e libera dinamicamente pedaços menores da ordem para o mercado usando intervalos de tempo divididos uniformemente entre um horário de início e de término. O objetivo é executar o pedido próximo ao preço médio entre os horários inicial e final, minimizando o impacto no mercado. Até que a ordem de negociação esteja totalmente preenchida, este algoritmo continua enviando ordens parciais, de acordo com a taxa de participação definida e de acordo com o volume negociado nos mercados. A estratégia de etapas relacionadas envia pedidos em uma porcentagem definida pelo usuário de volumes de mercado e aumenta ou diminui essa taxa de participação quando o preço da ação atinge níveis definidos pelo usuário. A estratégia de déficit de implementação visa minimizar o custo de execução de um pedido negociando o mercado em tempo real, economizando assim no custo do pedido e se beneficiando do custo de oportunidade de execução atrasada. A estratégia aumentará a taxa de participação visada quando o preço das ações se mover favoravelmente e diminuirá quando o preço das ações se mover negativamente. Existem algumas classes especiais de algoritmos que tentam identificar os acontecimentos do outro lado. Esses algoritmos de farejamento, usados, por exemplo, por um criador de mercado do lado da venda, possuem a inteligência incorporada para identificar a existência de quaisquer algoritmos no lado da compra de uma ordem grande. Essa detecção por meio de algoritmos ajudará o criador de mercado a identificar grandes oportunidades de pedidos e possibilitará que ele se beneficie ao preencher os pedidos a um preço mais alto. Às vezes, isso é identificado como front-running de alta tecnologia. (Para mais informações sobre comércio de alta frequê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 A implementação do algoritmo usando um programa de computador é a última parte, com o 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: conhecimento de programação de computadores para programar a estratégia de negociação exigida, programadores contratados ou software de negociação pré-fabricados. Conectividade de rede e acesso a plataformas de negociação para colocação de pedidos Acesso a feeds de dados de mercado que serão monitorados pelo algoritmo para oportunidades de colocação. A capacidade e a infraestrutura para fazer backtest do sistema, uma vez construídas, 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: Royal Dutch Shell (RDS) está listada em Amsterdã Bolsa de Valores de Londres (AEX) e Bolsa de Valores de Londres (LSE). Vamos construir um algoritmo para identificar oportunidades de arbitragem. Aqui estão algumas observações interessantes: AEX negocia em Euros, enquanto LSE negocia em Libras Esterlinas Devido à diferença horária de uma hora, a AEX abre uma hora antes da LSE, seguida pelas duas bolsas negociando simultaneamente pelas próximas horas e depois negociando apenas na LSE durante a última hora como AEX fecha Podemos explorar a possibilidade de negociação de arbitragem sobre as ações da Royal Dutch Shell listadas nesses dois mercados em duas moedas diferentes Um programa de computador que pode ler os preços atuais de mercado Feeds de preço de LSE e AEX A Taxa de câmbio GBP-EUR Capacidade de colocação de pedidos que pode encaminhar a ordem para a troca correta Capacidade de teste retroativo em feeds de preços históricos O programa de computador deve executar o seguinte: Ler o feed de preço recebido do estoque RDS de ambas as trocas Usando as taxas de câmbio disponíveis . converter o preço de uma moeda para outra Se houver uma discrepância de preço grande o suficiente (descontando os custos de corretagem) levando a uma oportunidade lucrativa, coloque a ordem de compra na troca de preço mais baixo e na ordem de venda em câmbio mais caro. 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ê puder colocar uma negociação gerada por algoritmos, os outros participantes do mercado também poderão. Consequentemente, os preços flutuam em milissegundos e até microssegundos. No exemplo acima, o que acontece se o seu negócio de compra é executado, mas o comércio não é vendido, pois os preços de venda mudam no momento em que o seu pedido chega ao mercado. Você acabará se sentando com uma posição aberta. tornando a sua estratégia de arbitragem sem valor. Existem riscos e desafios adicionais: por exemplo, riscos de falha do sistema, erros de conectividade de rede, atrasos entre ordens de negociação e execução e, o mais importante de tudo, algoritmos imperfeitos. Quanto mais complexo for um algoritmo, o backtesting mais rigoroso é necessário antes de ser colocado em ação. A análise quantitativa do desempenho de um algoritmo desempenha um papel importante e deve ser examinada criticamente. É emocionante ir para a automação auxiliado por computadores com a noção de ganhar dinheiro sem esforço. Mas é preciso garantir que o sistema seja completamente testado e que os limites necessários sejam definidos. Comerciantes analíticos devem considerar aprender programação e construir sistemas por conta própria, para ter confiança em implementar as estratégias corretas de maneira infalível. Uso cauteloso e testes completos de negociação de algo podem criar oportunidades lucrativas.
No comments:
Post a Comment