Teste de retorno bem sucedido de estratégias de negociação algorítmicas - Parte I

Autora:Bem-estar, Criado: 2019-03-20 17:00:16, Atualizado:

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.

O que é o Backtesting?

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 P&L ou PnL). Essa é a essência da ideia, embora, claro, o diabo esteja sempre nos detalhes!

Quais são as principais razões para backtesting de uma estratégia algorítmica?

  • Filtração - Se você se lembra do artigo sobre Identificação de Estratégia, nosso objetivo na fase inicial da pesquisa era estabelecer um pipeline de estratégia e, em seguida, filtrar qualquer estratégia que não cumprisse certos critérios.
  • Modelagem - O backtesting permite-nos testar (de forma segura!) novos modelos de certos fenômenos de mercado, tais como custos de transacção, encaminhamento de encomendas, latência, liquidez ou outros problemas de microestrutura de mercado.
  • Otimização - Embora a otimização de estratégias esteja repleta de preconceitos, o backtesting nos permite aumentar o desempenho de uma estratégia modificando a quantidade ou os valores dos parâmetros associados a essa estratégia e recalculando seu desempenho.
  • Verificação - nossas estratégias são frequentemente fornecidas externamente, através de nosso pipeline de estratégia. O backtesting de uma estratégia garante que ela não tenha sido incorrectamente implementada. Embora raramente tenhamos acesso aos sinais gerados por estratégias externas, muitas vezes teremos acesso às métricas de desempenho, como a taxa de Sharpe e as características de drawdown. Assim, podemos compará-las com nossa própria implementação.

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.

Biases que afetam a estratégia backtests

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.

Bias de otimização

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. Parametros neste caso podem ser os critérios de entrada/saída, períodos de retrocesso, períodos de média (ou seja, o parâmetro de suavização da média móvel) ou a frequência de medição de volatilidade. O viés de otimização pode ser minimizado mantendo o número de parâmetros ao mínimo e aumentando a quantidade de pontos de dados no conjunto de treinamento.

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.

Preconceito de olhar para o futuro

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.

  • Bugs técnicos - Arrays/vectores em código muitas vezes têm iteradores ou variáveis de índice. Deslocamentos incorretos desses índices podem levar a um viés de prospecção incorporando dados em N + k para k não zero.
  • Cálculo de parâmetros - Outro exemplo comum de viés prospectivo ocorre ao calcular parâmetros de estratégia ideais, como com regressões lineares entre duas séries temporais.
  • No entanto, como esses valores máximos/mínimos só podem ser calculados no final de um período de tempo, um viés prospectivo é introduzido se esses valores forem usados -durante- o período atual. É sempre necessário atrasar valores altos/baixos em pelo menos um período em qualquer estratégia de negociação que os use.

Tal como acontece com o viés de otimização, deve-se ser extremamente cuidadoso para evitar a sua introdução.

Viés de sobrevivência

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:

  • Dados livres de viés de sobrevivência - No caso de dados de ações, é possível comprar conjuntos de dados que incluem entidades excluídas, embora não sejam baratos e apenas tendam a ser utilizados por empresas institucionais.
  • Usar dados mais recentes - No caso das ações, usar um conjunto de dados mais recente mitiga a possibilidade de que a seleção de ações escolhida seja ponderada para sobreviventes , simplesmente porque há menos probabilidade de exclusão geral das ações em períodos de tempo mais curtos.

Vamos agora considerar certos fenômenos psicológicos que podem influenciar o seu desempenho comercial.

Bias de tolerância psicológica

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 bias é que muitas vezes uma estratégia que seria bem-sucedida é interrompida de negociação durante períodos de drawdowns estendidos e, portanto, levará a um desempenho inferior em comparação com um backtest. Assim, embora a estratégia seja de natureza algorítmica, os fatores psicológicos ainda podem ter uma forte influência na lucratividade. A lição é garantir que, se você ver drawdowns de uma certa porcentagem e duração no background, então você deve esperar que eles ocorram em ambientes de negociação, uma vez que precisará e perseverança para

Pacotes de software para backtesting

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).

  • Habilidade de programação - A escolha do ambiente em grande parte se reduz à sua capacidade de programar software. Eu argumentaria que estar no controle da pilha total terá um efeito maior em seu P&L a longo prazo do que terceirizar o máximo possível para o software do fornecedor. Isso é devido ao risco negativo de ter bugs externos ou idiossincrasias que você não é capaz de corrigir no software do fornecedor, que de outra forma seriam facilmente remediadas se você tivesse mais controle sobre sua pilha de tecnologia. Você também quer um ambiente que alcance o equilíbrio certo entre produtividade, disponibilidade de biblioteca e velocidade de execução. Faço minha própria recomendação abaixo.
  • Capacidade de Execução / Interação do Corretor - Certos softwares de backtesting, como o Tradestation, ligam-se diretamente a uma corretora. Eu não sou um fã desta abordagem, pois reduzir os custos de transação são muitas vezes um grande componente para obter uma taxa de Sharpe mais alta.
  • Personalização - Um ambiente como o MATLAB ou Python lhe dá uma grande flexibilidade ao criar estratégias de algo, pois fornecem bibliotecas fantásticas para quase qualquer operação matemática imaginável, mas também permitem uma ampla personalização quando necessário.
  • Complexidade da estratégia - Certos softwares simplesmente não são feitos para o processamento de números pesados ou complexidade matemática.
  • Minimização de viés - um determinado software ou dados se prestam mais a viés de negociação?
  • Velocidade de Desenvolvimento - Não deve-se ter que passar meses e meses implementando um mecanismo de backtest. A prototipagem deve levar apenas algumas semanas. Certifique-se de que seu software não está impedindo seu progresso em grande medida, apenas para pegar alguns pontos percentuais extras de velocidade de execução. C ++ é o elefante na sala aqui!
  • Velocidade de Execução - Se a sua estratégia é completamente dependente da rapidez de execução (como no HFT/UHFT), então uma linguagem como C ou C++ será necessária.
  • Custo - Muitos dos ambientes de software com os quais você pode programar estratégias de negociação algorítmica são completamente gratuitos e de código aberto.

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

MS Excel

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

MATLAB

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

Python

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

R

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

C++

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 entrar em C++ diretamente de meus programas Python. Um método preferido por muitos comerciantes quant é criar protótipos de suas estratégias no Python e, em seguida, converter as seções de execução mais lentas para C++ de forma iterativa.

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.


Mais.