Este artigo continua a série sobre negociação quantitativa, que começou com o Guia para iniciantes e a Identificação de estratégias.
O backtesting algorítmico requer conhecimento de muitas áreas, incluindo psicologia, matemática, estatística, desenvolvimento de software e microstrutura de mercado / câmbio. Eu não poderia esperar cobrir todos esses tópicos em um artigo, então vou dividi-los em duas ou três peças menores. O que vamos discutir nesta seção? Eu vou começar definindo o backtesting e depois vou descrever os fundamentos de como ele é realizado.
Em artigos subsequentes, veremos os detalhes das implementações de estratégias que muitas vezes são mal mencionadas ou ignoradas. Também consideraremos como tornar o processo de backtesting mais realista, incluindo as idiossincrasias de uma bolsa de negociação. Em seguida, discutiremos os custos de transação e como modela-los corretamente em um ambiente de backtest. Terminaremos com uma discussão sobre o desempenho de nossos backtests e, finalmente, forneceremos um exemplo de uma estratégia quântica comum, conhecida como um comércio de pares de inversão de média.
Vamos começar discutindo o que é backtesting e por que devemos realizá-lo em nossa negociação algorítmica.
A negociação algorítmica se distingue de outros tipos de classes de investimento porque podemos fornecer expectativas mais confiáveis sobre o desempenho futuro do desempenho passado, como consequência da abundante disponibilidade de dados.
Em termos simples, o backtesting é realizado expondo seu algoritmo de estratégia particular a um fluxo de dados financeiros históricos, o que leva a um conjunto de sinais de negociação. Cada negociação (que queremos dizer aqui como uma viagem de ida e volta de dois sinais) terá um lucro ou perda associado. O acúmulo desse lucro / perda ao longo da duração do backtest de sua estratégia levará ao lucro e perda totais (também conhecido como
Quais são as principais razões para backtesting de uma estratégia algorítmica?
O backtesting fornece uma série de vantagens para a negociação algorítmica. No entanto, nem sempre é possível testar diretamente uma estratégia. Em geral, à medida que a frequência da estratégia aumenta, torna-se mais difícil modelar corretamente os efeitos da microstrutura do mercado e das bolsas. Isso leva a backtests menos confiáveis e, portanto, uma avaliação mais complicada de uma estratégia escolhida. Este é um problema particular onde o sistema de execução é a chave para o desempenho da estratégia, como nos algoritmos de ultra-alta frequência.
Infelizmente, o backtesting está repleto de preconceitos de todos os tipos.
Há muitos viés que podem afetar o desempenho de uma estratégia backtestada. Infelizmente, esses viés tendem a inflar o desempenho em vez de diminuí-lo. Assim, você deve sempre considerar um backtest como um limite superior idealizado no desempenho real da estratégia. É quase impossível eliminar viés da negociação algorítmica, por isso é nosso trabalho minimizá-los da melhor forma possível, a fim de tomar decisões informadas sobre nossas estratégias algorítmicas.
Há quatro grandes viéses que gostaria de discutir: Viéses de otimização, viéses de prospecção, viéses de sobrevivência e viéses de tolerância psicológica.
Este é provavelmente o mais insidioso de todos os viés de backtest. envolve ajustar ou introduzir parâmetros de negociação adicionais até que o desempenho da estratégia no conjunto de dados de backtest seja muito atraente.
O viés de otimização é difícil de eliminar, pois as estratégias algorítmicas geralmente envolvem muitos parâmetros.
Um método para ajudar a mitigar esse viés é realizar uma análise de sensibilidade. Isso significa variar os parâmetros incrementalmente e traçar uma "superfície" de desempenho. Raciocínio sólido e fundamental para escolhas de parâmetros deve, com todos os outros fatores considerados, levar a uma superfície de parâmetros mais suave. Se você tiver uma superfície de desempenho muito agitada, muitas vezes significa que um parâmetro não está refletindo um fenômeno e é um artefato dos dados do teste. Há uma vasta literatura sobre algoritmos de otimização multidimensional e é uma área de pesquisa altamente ativa.
O viés prospectivo é introduzido em um sistema de backtesting quando os dados futuros são acidentalmente incluídos em um ponto da simulação onde esses dados não estariam realmente disponíveis. Se estivermos executando o backtest cronologicamente e chegarmos ao ponto de tempo N, então o viés prospectivo ocorre se os dados forem incluídos para qualquer ponto N + k, onde k>0.
Tal como acontece com o viés de otimização, deve-se ser extremamente cuidadoso para evitar a sua introdução.
O viés de sobrevivência é um fenômeno particularmente perigoso e pode levar a um desempenho significativamente inflacionado para certos tipos de estratégia.
Como exemplo, considere testar uma estratégia em uma seleção aleatória de ações antes e depois do crash do mercado de 2001. Algumas ações de tecnologia entraram em falência, enquanto outras conseguiram permanecer à tona e até prosperaram. Se tivéssemos restrito essa estratégia apenas a ações que passaram pelo período de retração do mercado, estaríamos introduzindo um viés de sobrevivência porque eles já demonstraram seu sucesso para nós. Na verdade, este é apenas outro caso específico de viés de olhar para o futuro, pois as informações futuras estão sendo incorporadas à análise passada.
Há duas maneiras principais de mitigar o viés de sobrevivência nos seus backtests de estratégia:
Vamos agora considerar certos fenômenos psicológicos que podem influenciar o seu desempenho comercial.
Este fenômeno particular não é frequentemente discutido no contexto da negociação quantitativa. No entanto, é amplamente discutido em relação a métodos de negociação mais discricionários. Ele tem vários nomes, mas decidi chamá-lo de "bias de tolerância psicológica" porque capta a essência do problema. Ao criar backtests em um período de 5 anos ou mais, é fácil olhar para uma curva de ações em tendência ascendente, calcular o retorno anual composto, a taxa de Sharpe e até mesmo as características de retirada e ficar satisfeito com os resultados.
Se os drawdowns históricos de 25% ou mais ocorrem nos backtests, então, com toda a probabilidade, você verá períodos de drawdowns semelhantes na negociação ao vivo. Esses períodos de drawdowns são psicologicamente difíceis de suportar. Eu observei em primeira mão como pode ser um drawdown estendido, em um ambiente institucional, e não é agradável - mesmo que os backtests sugeram que tais períodos ocorrerão. A razão pela qual eu o chamei de
O cenário de software para backtesting de estratégia é vasto. As soluções variam de software sofisticado de nível institucional totalmente integrado até linguagens de programação como C ++, Python e R, onde quase tudo deve ser escrito a partir do zero (ou obter plugins adequados).
Agora que listamos os critérios com os quais precisamos escolher nossa infraestrutura de software, quero passar por alguns dos pacotes mais populares e como eles se comparam:
Nota: Eu só vou incluir software que está disponível para a maioria dos profissionais de varejo e desenvolvedores de software, pois este é o público-alvo do site.
Comparação de software de backtesting
Descrição: WYSIWYG (what-you-see-is-what-you-get) software de planilha. Extremamente difundido na indústria financeira.
Execução: Sim, o Excel pode ser ligado à maioria das corretoras.
Personalização: as macros VBA permitem funcionalidades mais avançadas às custas da implementação oculta.
Complexidade da estratégia: as ferramentas estatísticas mais avançadas são mais difíceis de implementar, assim como as estratégias com muitas centenas de ativos.
Minimização de viés: o viés prospectivo é fácil de detectar através da funcionalidade de destaque de célula (assumindo que não haja VBA).
Velocidade de desenvolvimento: rápida implementação de estratégias básicas.
Velocidade de execução: velocidade de execução lenta - adequada apenas para estratégias de baixa frequência.
Custo: Barato ou gratuito (dependendo da licença).
Alternativas: OpenOffice
Descrição: Ambiente de programação originalmente projetado para matemática computacional, física e engenharia. Muito adequado para operações vetorizadas e aquelas que envolvem álgebra linear numérica. Fornece uma ampla gama de plugins para negociação quântica. Em uso generalizado em fundos de hedge quantitativos.
Execução: Sem capacidade de execução nativa, o MATLAB requer um sistema de execução separado.
Personalização: Uma enorme variedade de plugins comunitários para quase todas as áreas da matemática computacional.
Complexidade da estratégia: muitos métodos estatísticos avançados já disponíveis e bem testados.
Minimização de viés: mais difícil de detectar viés de visão de futuro, requer testes extensos.
Velocidade de desenvolvimento: scripts curtos podem criar backtests sofisticados facilmente.
Velocidade de execução: Supondo um algoritmo vetorizado/paralelizado, o MATLAB é altamente otimizado.
Custo: ~ 1.000 USD por licença.
Alternativas: Octave, SciLab
Descrição: linguagem de alto nível projetada para velocidade de desenvolvimento. Ampla gama de bibliotecas para quase qualquer tarefa programática imaginável. Ganhando aceitação mais ampla na comunidade de fundos de hedge e bancos de investimento. Não tão rápido quanto C / C ++ para velocidade de execução.
Execução: Existem plugins Python para corretores maiores, como Interactive Brokers.
Personalização: Python tem uma comunidade de desenvolvimento muito saudável e é uma linguagem madura.
Complexidade da estratégia: existem muitos plugins para os principais algoritmos, mas não é tão grande uma comunidade quântica como existe para o MATLAB.
Minimização de Bias: Existem os mesmos problemas de minimização de bias que existem para qualquer linguagem de alto nível.
Velocidade de desenvolvimento: A principal vantagem do Python é a velocidade de desenvolvimento, com capacidades de teste robustas.
Velocidade de execução: Não tão rápido quanto o C++, mas os componentes de computação científica são otimizados e o Python pode falar com código nativo C com certos plugins.
Custo: Livre/código aberto
Alternativas: Ruby, Erlang, Haskell
Descrição: Ambiente concebido para métodos estatísticos avançados e análise de séries temporais. Ampla gama de conjuntos de ferramentas estatísticas, econométricas e gráficas nativas. Grande comunidade de desenvolvedores.
Execução: R possui plugins para alguns corretores, em particular Interactive Brokers.
Personalização: o R pode ser personalizado com qualquer pacote, mas os seus pontos fortes encontram-se nos domínios estatístico/econométrico.
Complexidade da estratégia: principalmente útil se executar estratégias econométricas, estatísticas ou de aprendizagem de máquina devido aos plugins disponíveis.
Minimização de viés: nível semelhante de possibilidade de viés para qualquer linguagem de alto nível, como Python ou C ++. Assim, o teste deve ser realizado.
Velocidade de desenvolvimento: R é rápido para escrever estratégias baseadas em métodos estatísticos.
Velocidade de execução: R é mais lento do que o C++, mas permanece relativamente otimizado para operações vetorizadas (como no MATLAB).
Custo: Livre/código aberto
Alternativas: SPSS, Stata
Descrição: Língua madura de alto nível projetada para velocidade de execução. Ampla variedade de finanças quantitativas e bibliotecas numéricas. Mais difícil de depurar e muitas vezes leva mais tempo para implementar do que Python ou MATLAB. Extremamente prevalente tanto no lado de compra quanto de venda.
Execução: A maioria das APIs de corretagem são escritas em C++ e Java.
Personalização: C / C ++ permite acesso direto à memória subjacente, portanto, estratégias de freqüência ultra-alta podem ser implementadas.
Complexidade da estratégia: C++ STL fornece uma ampla gama de algoritmos otimizados.
Bias Minimization: Look-ahead bias pode ser difícil de eliminar, mas não mais difícil do que outras linguagens de alto nível.
Velocidade de desenvolvimento: C++ é bastante verboso em comparação com Python ou MATLAB para o mesmo algoritmo. Mais linhas de código (LOC) muitas vezes levam a uma maior probabilidade de erros.
Velocidade de execução: C/C++ tem uma velocidade de execução extremamente rápida e pode ser bem otimizada para arquiteturas computacionais específicas.
Custo: Vários compiladores: Linux/GCC é gratuito, MS Visual Studio tem licenças diferentes.
Alternativas: C#, Java, Scala
As estratégias HFT e UHFT serão escritas em C/C++ (nestes dias, muitas vezes são realizadas em GPUs e FPGAs), enquanto as estratégias direcionais de baixa frequência são fáceis de implementar no TradeStation, devido à natureza "todo em um" do software / corretagem.
Minha preferência pessoal é para o Python, pois fornece o grau certo de personalização, velocidade de desenvolvimento, capacidade de teste e velocidade de execução para minhas necessidades e estratégias. Se eu precisar de algo mais rápido, posso
Nos próximos artigos sobre backtesting vamos dar uma olhada em algumas questões particulares em torno da implementação de um sistema de backtesting de negociação algorítmica, bem como como como incorporar os efeitos das bolsas de negociação.