Saturday 14 October 2017

Movendo média backtesting no Brasil


Médias móveis simples - Backtests de troca Que parâmetros de média movente são os melhores Este local tem um oceano de backtests de média movente que eu conduzi para o DAX, SP500 e também USDEU (Forex). Estes testes foram realizados utilizando diferentes estratégias de sinalização: variantes simples exponencial e cruzada e diferentes índices para um período de 1000 dias de negociação. Em contraste com outros sites, testei todos os valores médios da janela diária de 1 a 1000 dias, para as estratégias de cross-over também em combinação. Esses dados também são unqiue como eu tentei realizar testes realistas, simulando o spread buysell e impostos para Comparação com uma estratégia de referência (buy hold). Um valor de janela de rápida reação parece bom em teoria e com um teste simples. Mas o spread, taxas e impostos vai destruir todo o desempenho na aplicação prática. É por isso que esses testes realistas são tão valiosos. Espero que este site possa ajudá-lo com seus negócios, aproveite-o Testando suas idéias de negociação Uma das coisas mais úteis que você pode fazer na janela de análise é testar sua estratégia de negociação em dados históricos. Isso pode lhe dar uma visão valiosa em pontos fortes e fracos de seu sistema antes de investir dinheiro real. Este recurso único AmiBroker é pode economizar muito dinheiro para você. Escrevendo suas regras de negociação Primeiro você precisa ter regras objetivas (ou mecânicas) para entrar e sair do mercado. Este passo é a base da sua estratégia e você precisa pensar sobre isso sozinho, já que o sistema deve corresponder a sua tolerância ao risco, tamanho de carteira, técnicas de gerenciamento de dinheiro e muitos outros fatores individuais. Depois de ter suas próprias regras para negociação você deve escrevê-los como comprar e vender regras em AmiBroker Formula Lanugage (mais curto e tampa se você quiser testar também negociação curta). Neste capítulo vamos considerar muito básico de média móvel cruzar o sistema. O sistema compraria contratos de ações quando o preço próximo sobe acima da média móvel exponencial de 45 dias e venderá contratos de ações quando o preço próximo cair abaixo da média móvel exponencial de 45 dias. A média móvel exponencial pode ser calculada em AFL usando sua função embutida EMA. Tudo o que você precisa fazer é especificar a matriz de entrada eo período de média, de modo que a média móvel exponencial de 45 dias dos preços de fechamento pode ser obtida pela seguinte declaração: O identificador de fechamento refere-se à matriz incorporada que mantém os preços de fechamento do símbolo atualmente analisado . Para testar se o preço de fechamento cruza acima da média móvel exponencial, usaremos função cruzada interna: buy cross (close, ema (close, 45)) A declaração acima define uma regra de negociação de compra. Dá quot1quot ou quottruequot quando o preço próximo cruza acima do ema (próximo, 45). Então podemos escrever a regra de venda que daria quot1quot quando acontecer a situação oposta - fechar preço cruza abaixo ema (close, 45): vender cross (ema (close, 45), close) Por favor, note que estamos usando a mesma função cross, A ordem inversa dos argumentos. A fórmula completa para negócios longos será parecida com a seguinte: cross (close, ema (close, 45)) cross (ema, close, close) NOTA: Para criar uma nova fórmula, abra o Formula Editor usando o Analysis-gtFormula Editor , Digite a fórmula e escolha Tools-gtSend no menu Análise no editor de fórmulas Para testar novamente o seu sistema, basta clicar no botão Teste de retrocesso na janela Análise automática. Certifique-se de ter digitado a fórmula que contém, pelo menos, comprar e vender regras comerciais (como mostrado acima). Quando a fórmula está correta, a AmiBroker começa a analisar seus símbolos de acordo com suas regras de negociação e gera uma lista de negócios simulados. Todo o processo é muito rápido - você pode testar milhares de símbolos em questão de minutos. A janela de progresso mostrará o tempo de conclusão estimado. Se quiser interromper o processo, basta clicar no botão Cancelar na janela de progresso. Quando o processo estiver concluído, a lista de negócios simulados é mostrada na parte inferior da janela de análise Automática. (O painel Resultados). Você pode examinar quando os sinais de compra e venda ocorreram apenas clicando duas vezes no comércio no painel Resultados. Isso lhe dará sinais brutos ou não filtrados para cada bar quando as condições de compra e venda forem atendidas. Se você quiser ver apenas setas de comércio único (abertura e fechamento do comércio atualmente selecionado), você deve clicar duas vezes na linha enquanto mantém pressionada a tecla SHIFT. Alternativamente, você pode escolher o tipo de exibição selecionando o item apropriado no menu de contexto que aparece quando você clica no painel de resultados com o botão direito do mouse. Além da lista de resultados, você pode obter estatísticas muito detalhadas sobre o desempenho do seu sistema clicando no botão Relatório. Para saber mais sobre as estatísticas do relatório, consulte a descrição da janela do relatório. Alterando suas configurações de teste de volta O motor de teste de volta em AmiBroker usa alguns valores predefinidos para executar sua tarefa, incluindo o tamanho da carteira, periodicidade (dailyweeklymonthly), quantidade de comissão, taxa de juros, perda máxima e metas de lucro alvo, tipo de comércios, campos de preço e assim em. Todas essas configurações podem ser alteradas pelo usuário usando a janela de configurações. Depois de alterar as configurações, lembre-se de executar novamente o teste de volta se desejar que os resultados estejam em sincronia com as configurações. Por exemplo, para testar as barras semanais em vez de diariamente, basta clicar no botão Configurações, selecione Semanalmente na caixa de combinação Periodicidade e clique em OK. Em seguida, execute a análise clicando em Voltar ao teste. Nomes de variáveis ​​reservadas A tabela a seguir mostra os nomes das variáveis ​​reservadas usadas pelo Automatic Analyzer. O significado e exemplos sobre como usá-los são apresentados mais adiante neste capítulo. Permite a quantidade de dólar de controle ou porcentagem de carteira que é investido no comércio (veja explicações abaixo) Análise Automática (novo em 3.9) Até agora nós discutimos bastante simples uso do testador de volta. AmiBroker, no entanto, suporta métodos muito mais sofisticados e conceitos que serão discutidos mais adiante neste capítulo. Observe que o usuário iniciante deve primeiro jogar um pouco com os tópicos mais fáceis descritos acima antes de prosseguir. Assim, quando você estiver pronto, por favor, dê uma olhada nos seguintes recursos recentemente introduzidos do back-tester: a) host AFL script para escritores fórmula avançada b) suporte melhorado para operações curtas c) a maneira de controlar o preço de execução de ordem a partir do Script d) vários tipos de paradas no back tester e) dimensionamento da posição f) tamanho do lote redondo e tamanho do carrapato g) conta de margem h) backtesting futuros AFL scripting host é um tópico avançado que é abordado em um documento separado disponível aqui e eu não vou discutir Documento. Recursos restantes são muito mais fáceis de entender. Nas versões anteriores do AmiBroker, se você quisesse back-testar sistema usando longas e curtas transações, você só poderia simular stop-and-reverse estratégia. Quando a posição longa foi fechada, uma nova posição curta foi aberta immediatelly. Foi porque comprar e vender variáveis ​​reservadas foram utilizados para ambos os tipos de comércios. Agora (com a versão 3.59 ou superior) existem variáveis ​​reservadas separadas para abrir e fechar negócios longos e curtos: buy - quottruequot ou 1 value abre trading long trade - quottruequot ou 1 value fecha trade short curto - quottruequot ou 1 value abre short trade cover - quottruequot ou 1 valor fecha comércio curto Som, a fim de back-test operações de curto você precisa atribuir curto e cobrir variáveis. Se você usar sistema stop-and-reverse (sempre no mercado) simplesmente atribuir vender a curto e comprar para cobrir curto vender cobertura comprar Isto simula o modo pré-3.59 versões trabalhadas. Mas agora AmiBroker permite que você tenha regras de negociação separadas para ir por muito tempo e para ir curto, como mostrado neste exemplo simples: longas negociações entrada e saída regras: comprar cross (cci (), 100) vender cross (100, cci () (Cci (), -100) Observe que neste exemplo se CCI está entre -100 e 100 você está fora do mercado. Controle de preço de mercado AmiBroker agora fornece 4 novas variáveis ​​reservadas para especificar o preço ao qual as ordens de compra, venda, curto e de cobertura são executadas. Esses arrays têm os seguintes nomes: buyprice, sellprice, shortprice e coverprice. A principal aplicação dessas variáveis ​​é controlar o preço do comércio: BuyPrice IIF (dayofweek () 1, HIGH, CLOSE) na segunda-feira comprar em alta, caso contrário, comprar em close Então você pode escrever o seguinte para simular real stop-orders: BuyStop. A fórmula para comprar stop nível SellStop. A fórmula para o nível do batente da venda se em qualquer altura durante o dia os preços se levantam acima do nível do buystop (highgtbuystop) a ordem de compra ocorre (no buystop ou baixo o que for mais elevado) Compre a cruz (alta, BuyStop) se durante o dia os preços caem abaixo do nível do sellprice (Sellstop baixa), certifique-se de preço de compra não inferior a Baixo preço de SellPrice (SellStop, alta) certifique-se Preço de venda não maior do que Alto Observe que AmiBroker predefinições de preço de compra, sellprice, shortprice e coverprice com os valores definidos na janela de configurações de teste do sistema (mostrado abaixo), então você pode, mas não precisa defini-los em sua fórmula. Se você não os define AmiBroker funciona como nas versões antigas. Durante o back-testing, o AmiBroker verificará se os valores que você atribuiu ao buyprice, sellprice, shortprice, coverprice se encaixam no intervalo alto-baixo da determinada barra. Se não, o AmiBroker irá ajustá-lo a um preço alto (se o preço for maior do que alto) ou ao preço baixo (se o preço for menor do que baixo). Como você pode ver na foto acima, novas configurações para As paradas de destino de lucro estão disponíveis na janela de configurações do teste do sistema. As paradas de meta de lucro são executadas quando o preço alto para um determinado dia excede o nível de parada que pode ser dado como uma porcentagem ou um aumento de ponto do preço de compra. Por padrão, as paradas são executadas ao preço que você define como matriz de preço de venda (para negócios longos) ou matriz de preço de cobertura (para negócios curtos). Esse comportamento pode ser alterado usando QuotExit no stopquot recurso. QuotExit at stopquot feature Se você marcar quotExit at stopquot box nas configurações, as paradas serão executadas no nível de parada exata, ou seja, se você definir o objetivo de lucro stop em 10 sua parada eo preço de compra foi 50 stop order será executado em 55, mesmo se Sua matriz de preço de venda contém valor diferente (por exemplo preço de fechamento de 56). Perda máxima pára de trabalhar de forma semelhante - eles são executados quando o preço baixo para um determinado dia cai abaixo do nível de parada que pode ser dada como uma porcentagem ou ponto de aumento a partir do preço de compra Este tipo de parar é usado para proteger os lucros como ele Acompanha o seu comércio de modo que cada vez que um valor de posição atinge um novo máximo, o stop de arrasto é colocado em um nível mais alto. Quando o lucro cai abaixo do nível de parada final, a posição é fechada. Este mecanismo é ilustrado na imagem abaixo (10 stop de arrasto é mostrado): um exemplo de implementação de baixo nível de lucro-alvo parar em AFL: Buy Cross (MACD (), Signal ()) para (i 0 i BarCount i) If (priceatbuy 0 Buy i) priceatbuy BuyPrice i if (priceatbuy gt 0 SellPrice i gt 1.1 priceatbuy) Sell i 1 SellPrice i 1.1 preçoatbuy priceatbuy 0 else Sell i 0 Este é um novo recurso na versão 3.9. Posição de dimensionamento no backtester é implementado por meio de nova variável reservada PositionSize ltsize arraygt Agora você pode controlar o montante em dólar ou percentual de carteira que é investido no número de comércio positivo definir (dólar) montante que é investido no comércio por exemplo: PositionSize 1000 investir 1000 em todos os números negativos de comércio -100 ..- 1 define porcentagem: -100 dá 100 do tamanho atual da carteira, -33 dá 33 do capital disponível, por exemplo: PositionSize -50 sempre investir apenas metade do exemplo atual de dimensionamento dinâmico de ações: PositionSize - 100 RSI () como RSI varia de 0..100 isso resultará em posição dependendo dos valores RSI - gt valores baixos de RSI resultará em maior percentagem investido Se menos de 100 de dinheiro disponível é investido, em seguida, o montante remanescente ganha taxa de juros Como definido nas configurações. Há também uma nova caixa de seleção na janela de configurações AA: quotAllow tamanho da posição shrinkingquot - isso controla como backtester manipula a situação quando o tamanho da posição solicitada (através da variável PositionSize) excede o dinheiro disponível: quando este sinalizador é marcado a posição é inserida com o tamanho shinked para Disponível se não estiver selecionado, a posição não será inserida. Para ver os tamanhos de posição reais, use um novo modo de relatório na janela de configurações AA: quotLista comercial com preços e pos. Sizequot Para o fim, aqui está um exemplo da técnica de dimensionamento de posição baseada em Tharps ATR codificada na AFL: Comprar ltyour comprar fórmula heregt Vender 0 vender apenas por parar TrailStopAmount 2 ATR (20) Capital 100000 IMPORTANTE: Defini-lo também nas Configurações: Inicial A técnica pode ser resumida da seguinte forma: O capital total por símbolo é de 100.000, estabelecemos o nível de risco em 1 do patrimônio líquido total. O valor total do capital por símbolo é de 100.000, e nós definimos o nível de risco em 1 do patrimônio líquido total (RiskTrailStopAmount). Nível de risco é definido da seguinte forma: se uma parada de arrasto em um estoque 50 é, digamos, 45 (o valor de dois ATRs contra a posição), a perda 5 é dividido em 1000 de risco para dar 200 ações para comprar. Assim, o risco de perda é 1000, mas o risco de alocação é de 200 ações x 50share ou 10.000. Então, estamos alocando 10 do capital próprio para a compra, mas apenas arriscando 1000. (Excerto editado da lista de discussão AmiBroker) Tamanho do lote e tamanho do carrapato Vários instrumentos são negociados com vários quottrading unitsquot ou quotblocksquot. Por exemplo, você pode comprar número fracionário de unidades de fundo mútuo, mas você não pode comprar o número fracionário de ações. Às vezes você tem que comprar em 10s ou 100s lotes. AmiBroker agora permite que você especifique o tamanho do bloco no nível global e por símbolo. Você pode definir o tamanho do lote redondo por símbolo na página Symbol-gtInformation (figura 3). O valor de zero significa que o símbolo não tem tamanho de lote redondo especial e usará quotDefault round lot sizequot (configuração global) da página de configurações de Análise automática (figura 1). Se o tamanho padrão também é definido como zero, isso significa que o número fracionário de contratos de ações é permitido. Você também pode controlar o tamanho do lote redondo diretamente de sua fórmula AFL usando RoundLotSize variável reservada, por exemplo: Esta configuração controla o movimento de preço mínimo do símbolo dado. Você pode defini-lo no nível global e por símbolo. Tal como acontece com o tamanho do lote redondo, pode definir o tamanho do carimbo por símbolo na página Symbol-gtInformation (figura 3). O valor de zero instrui o AmiBroker a usar quotdefault tick sizequot definido na página Configurações (figura 1) da janela Automatic Analysis. Se o tamanho padrão do alerta também estiver definido como zero, significa que não há movimento de preço mínimo. Você pode definir e recuperar o tamanho do carrapato também da fórmula AFL usando a variável reservada TickSize, por exemplo: Note que a configuração do tamanho do carrapato afeta somente os comércios encerrados pelas paradas internas e ou ApplyStop (). O backtester assume que os dados de preço seguem os requisitos de tamanho de tick e não altera os arrays de preço fornecidos pelo usuário. Portanto, especificar o tamanho do alerta só faz sentido se você estiver usando as paradas internas para que os pontos de saída sejam gerados em níveis de preços quotallowedquot em vez de calculados. Por exemplo, no Japão - você não pode ter partes fracionárias de ienes para que você deve definir ticksize global para 1, assim built-in pára comércios de saída em níveis inteiros. Configuração da margem da conta define o requisito de margem percentual para toda a conta. O valor padrão da margem da conta é 100. Isso significa que você tem que fornecer 100 fundos para entrar no comércio e esta é a maneira como backtester trabalhou em versões anteriores. Mas agora você pode simular uma conta de margem. Quando você compra na margem você está simplesmente emprestado dinheiro de seu corretor para comprar ações. Com os regulamentos atuais você pode colocar até 50 do preço de compra do estoque que você deseja comprar e emprestar a outra metade de seu corretor. Para simular isso basta digitar 50 no campo Margem da conta (veja a figura 1). Se o seu patrimônio intial é definido como 10000 seu poder de compra será então 20000 e você será capaz de entrar em posições maiores. Observe que essa configuração define a margem para a conta inteira e NÃO está relacionada a negociação de futuros. Em outras palavras, você pode negociar ações na conta de margem. QuotRegistro inverso força a saída para as configurações do Backtester. Quando está ON (a configuração padrão) - backtester funciona como nas versões anteriores e fecha já positon aberto se novo sinal de entrada no sentido inverso é encontrado. Se este interruptor estiver DESLIGADO - mesmo se o sinal inverso ocorrer o backtester mantém o comércio atualmente aberto e não fecha a posição até que o sinal de saída regular (venda ou cobertura) seja gerado. Em outras palavras, quando esta opção é OFF backtester ignora sinais curtos durante longos comércios e ignora Buy sinais durante curtas operações. QuotAver a mesma saída de barra (barra única) opção quot para as Configurações Quando está ON (as configurações padrão) - entrada e saída na mesma barra é permitida (como nas versões anteriores) se estiver OFF - a saída pode acontecer a partir de Apenas a barra seguinte (isto aplica-se a sinais regulares, existe uma definição separada para as saídas geradas pelo ApplyStop). Mudar para OFF permite reproduzir o comportamento do MS backtester que não é capaz de lidar com saídas no mesmo dia. QuotActivate pára imediatamentequot Esta definição resolve o problema de testar sistemas que entram em comércios no mercado aberto. Nas versões anteriores a 4.09, o backtester assumiu que você estava entrando em negociações no mercado próximo, de modo que as paradas embutidas foram ativadas a partir do dia seguinte. O problema foi quando você de fato definido preço aberto como o preço de entrada de comércio - então mesmo dia flutuações de preços não desencadear as paradas. Houve algumas soluções publicadas baseadas no código AFL, mas agora você não precisa usá-los. Simplesmente se você trocar em aberto você deve marcar quotActivate pára imediatamentequot (imagem 1). Você pode perguntar por que não basta verificar o buyprice ou shortprice matriz se é igual ao preço aberto. Infelizmente este não funcionará. Por que simplesmente porque há dias de doji quando o preço aberto iguala o close e então o backtester nunca saberá se o comércio foi entrado no mercado aberto ou próximo. Então nós realmente precisamos de uma configuração separada. QuotUtilizar QuickAFLquotQuickAFL (tm) é um recurso que permite um cálculo AFL mais rápido sob certas condições. Inicialmente (desde 2003) estava disponível apenas para indicadores, a partir da versão 5.14 está disponível na Análise Automática também. Inicialmente, a idéia era permitir redraws mais rápidos de gráfico através do cálculo da fórmula AFL apenas para aquela parte que é visível no gráfico. De forma semelhante, janela de análise automática pode usar subconjunto de cotações disponíveis para calcular AFL, se selecionado 8220range8221 parâmetro é menor do que 8220Todos os quotationsquot. Explicação detalhada sobre como QuickAFL funciona e como controlá-lo, é fornecida neste artigo da Base de Dados de Conhecimento: amibrokerkb20080703quickafl Observe que esta opção funciona não somente no backtester, mas também em otimizações, explorações e scans. Backtesting um Moving Average Crossover em Python com pandas No artigo anterior sobre Investigação Backtesting Ambientes Em Python Com Pandas criamos um ambiente de backtesting baseado em pesquisa orientado a objeto e testá-lo em uma estratégia de previsão aleatória. Neste artigo, faremos uso da maquinaria que introduzimos para realizar pesquisas sobre uma estratégia real, a saber, o Crossover Médio Móvel na AAPL. Estratégia de Crossover Médio em Movimento A técnica de Crossover de Moving Average é uma estratégia de momentum simplista extremamente bem conhecida. É freqüentemente considerado o exemplo Hello World para negociação quantitativa. A estratégia aqui descrita é longa. São criados dois filtros separados de média móvel simples, com períodos de retrocesso variáveis, de uma série temporal específica. Os sinais para comprar o ativo ocorrem quando a média móvel de retrocesso mais curta excede a média móvel de retrocesso mais longa. Se a média mais longa subseqüentemente exceder a média mais curta, o ativo é vendido de volta. A estratégia funciona bem quando uma série de tempo entra em um período de forte tendência e, em seguida, lentamente inverte a tendência. Para este exemplo, eu escolhi a Apple, Inc. (AAPL) como a série de tempo, com um lookback curto de 100 dias e um lookback longo de 400 dias. Este é o exemplo fornecido pela biblioteca de negociação algorítmica do zipline. Assim, se queremos implementar nosso próprio backtester, precisamos garantir que ele corresponda aos resultados em tirolesa, como um meio básico de validação. Implementação Certifique-se de seguir o tutorial anterior aqui. Que descreve como a hierarquia de objeto inicial para o backtester é construída, caso contrário, o código abaixo não funcionará. Para esta implementação em particular, usei as seguintes bibliotecas: A implementação do macross. py requer backtest. py do tutorial anterior. O primeiro passo é importar os módulos e objetos necessários: Como no tutorial anterior, vamos subclassificar a classe base Abstract de Estratégia para produzir MovingAverageCrossStrategy. Que contém todos os detalhes sobre como gerar os sinais quando as médias móveis de AAPL cruzam-se uns aos outros. O objeto requer uma janela curta e uma janela longa sobre a qual operar. Os valores foram ajustados para padrões de 100 dias e 400 dias respectivamente, que são os mesmos parâmetros usados ​​no exemplo principal de tirolesa. As médias móveis são criadas usando a função rollingmean pandas sobre as barrasFechar fechar preço do estoque AAPL. Uma vez construídas as médias móveis individuais, a Série de sinais é gerada ajustando a coluna igual a 1,0 quando a média móvel curta é maior que a média móvel longa, ou 0,0 caso contrário. A partir daí, as ordens de posição podem ser geradas para representar sinais de negociação. O MarketOnClosePortfolio é subclassificado do Portfolio. Que é encontrado em backtest. py. É quase idêntico à implementação descrita no tutorial anterior, com a exceção de que as negociações são agora realizadas em uma base Close-to-Close, ao invés de uma base Open-to-Open. Para obter detalhes sobre como o objeto Portfolio está definido, consulte o tutorial anterior. Ive deixou o código em para a integridade e para manter este tutorial auto-contido: Agora que as classes MovingAverageCrossStrategy e MarketOnClosePortfolio foram definidas, uma função principal será chamado para amarrar toda a funcionalidade em conjunto. Além disso, o desempenho da estratégia será analisado através de um gráfico da curva de equivalência patrimonial. O objeto DataReader do pandas faz o download dos preços OHLCV das ações da AAPL para o período de 1º de janeiro de 1990 a 1º de janeiro de 2002, momento em que os sinais DataFrame são criados para gerar os sinais long-only. Posteriormente, a carteira é gerada com uma base de capital inicial de 100.000 USD e os retornos são calculados na curva de equivalência patrimonial. O passo final é usar matplotlib para traçar um gráfico de dois dígitos de ambos os preços AAPL, sobreposta com as médias móveis e os sinais de buysell, bem como a curva de equidade com os mesmos sinais de buysell. O código de plotagem é obtido (e modificado) a partir do exemplo de implementação da tirolesa. A saída gráfica do código é a seguinte. Eu fiz uso do comando IPython colar para colocar isso diretamente no console IPython enquanto no Ubuntu, de modo que a saída gráfica permaneceu na vista. Os upticks cor-de-rosa representam a compra do estoque, enquanto os downticks negros representam vendê-lo de volta: Como pode ser visto a estratégia perde dinheiro durante o período, com cinco comércios de ida e volta. Isto não é surpreendente dado o comportamento da AAPL ao longo do período, que estava em uma ligeira tendência descendente, seguido por um aumento significativo começando em 1998. O período de retrocesso dos sinais de média móvel é bastante grande e isso afetou o lucro do comércio final , O que de outra forma pode ter feito a estratégia rentável. Em artigos subseqüentes, criaremos um meio mais sofisticado de analisar o desempenho, bem como descrevendo como otimizar os períodos de retorno dos sinais individuais de média móvel. Apenas começando com o comércio quantitativo

No comments:

Post a Comment