Tuesday 6 March 2018

Estratégias de negociação de backtesting em python


QuantStart.
Junte-se ao portal de membros privados da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento. Você encontrará um grupo bem informado de mentalistas quant pronto para responder suas perguntas comerciais mais importantes.
Confira meu ebook sobre o comércio de quant, onde eu ensino você como criar estratégias de negociação sistemáticas lucrativas com ferramentas Python, desde o início.
Dê uma olhada no meu novo ebook sobre estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas bayesianas, com Python e R.
Por Michael Halls-Moore em 16 de janeiro de 2014.
Backtesting é o processo de pesquisa de aplicar uma idéia de estratégia de negociação a dados históricos para verificar o desempenho passado. Em particular, um backtester não garante o desempenho futuro da estratégia. No entanto, eles são um componente essencial do processo de pesquisa da estratégia de pipeline, permitindo que as estratégias sejam filtradas antes de serem colocadas em produção.
Neste artigo (e aqueles que o seguem), um sistema básico de backtesting orientado a objetos escrito em Python será delineado. Este sistema precoce será principalmente um "auxiliar de ensino", usado para demonstrar os diferentes componentes de um sistema de backtesting. À medida que avançamos através dos artigos, serão adicionadas funcionalidades mais sofisticadas.
Resumo de Backtesting.
O processo de projetar um sistema de backtesting robusto é extremamente difícil. Simular de forma efetiva todos os componentes que afetam o desempenho de um sistema de negociação algorítmico é um desafio. A fraca precisão de dados, a opacidade do roteamento de pedidos em um corretor, a latência de pedidos e uma miríade de outros fatores conspiram para alterar o desempenho "verdadeiro" de uma estratégia versus a performance de teste anterior.
Ao desenvolver um sistema de backtesting, é tentador querer constantemente "reescrevê-lo do zero", pois mais fatores são considerados cruciais na avaliação do desempenho. Nenhum sistema de backtesting já foi concluído e um julgamento deve ser feito em um ponto durante o desenvolvimento que fatores suficientes foram capturados pelo sistema.
Com estas preocupações em mente, o backtester apresentado aqui será um pouco simplista. À medida que exploramos novos problemas (otimização de portfólio, gerenciamento de riscos, processamento de custos de transações), o backtester se tornará mais robusto.
Tipos de sistemas de teste.
Geralmente, existem dois tipos de sistema de teste de retorno que serão de interesse. O primeiro é baseado em pesquisa, usado principalmente nos estágios iniciais, onde muitas estratégias serão testadas para selecionar aqueles para uma avaliação mais séria. Esses sistemas de análise de backtest são frequentemente escritos em Python, R ou MatLab, pois a velocidade de desenvolvimento é mais importante do que a velocidade de execução nesta fase.
O segundo tipo de sistema backtesting é baseado em eventos. Ou seja, executa o processo backtesting em um loop de execução similar (se não idêntico) ao próprio sistema de execução de negociação. Ele irá modelar de maneira realista os dados do mercado e o processo de execução da ordem, a fim de fornecer uma avaliação mais rigorosa de uma estratégia.
Os últimos sistemas são muitas vezes escritos em uma linguagem de alto desempenho, como C ++ ou Java, onde a velocidade de execução é essencial. Para estratégias de baixa freqüência (embora ainda intradias), Python é mais que suficiente para ser usado neste contexto.
Object-Oriented Research Backtester em Python.
O projeto e a implementação de um ambiente de backtesting baseado em pesquisa orientada a objetos agora serão discutidos. A orientação do objeto foi escolhida como o paradigma do projeto de software pelas seguintes razões:
As interfaces de cada componente podem ser especificadas antecipadamente, enquanto as componentes internas de cada componente podem ser modificadas (ou substituídas) à medida que o projeto progride. Ao especificar as interfaces antecipadas, é possível testar de forma eficaz a forma como cada componente se comporta (via teste unitário). o sistema de novos componentes pode ser construído sobre ou em adição a outros, seja por herança ou composição.
Nesta fase, o backtester foi projetado para facilidade de implementação e um grau razoável de flexibilidade, em detrimento da verdadeira precisão do mercado. Em particular, este backtester só poderá lidar com estratégias que atuem em um único instrumento. Mais tarde, o backtester será modificado para lidar com conjuntos de instrumentos. Para o backtester inicial, são necessários os seguintes componentes:
Estratégia - Uma classe de estratégia recebe um Pandas DataFrame de barras, ou seja, uma lista de pontos de dados Open-High-Low-Volume (OHLCV) em uma determinada freqüência. A Estratégia produzirá uma lista de sinais, que consistem em um carimbo de data / hora e um elemento do conjunto $ \ $ indicando um sinal longo, de espera ou curto, respectivamente. Portfolio - A maioria do trabalho de backtesting ocorrerá na classe Portfolio. Ele receberá um conjunto de sinais (conforme descrito acima) e criará uma série de posições, alocadas contra um componente de caixa. O trabalho do objeto Portfolio é produzir uma curva de patrimônio, incorporar os custos básicos de transação e acompanhar os negócios. Desempenho - O objeto Performance obtém um portfólio e produz um conjunto de estatísticas sobre seu desempenho. Em particular, produzirá características de risco / retorno (Sharpe, Sortino e Informações Ratios), métricas de comércio / lucro e informações de redução.
O que está a faltar?
Como pode ser visto, este backtester não inclui nenhuma referência ao gerenciamento de portfólio / risco, gerenciamento de execução (ou seja, sem pedidos de limite), nem fornecerá modelos sofisticados de custos de transação. Este não é um grande problema nesta fase. Isso nos permite familiarizar-se com o processo de criação de um backtester orientado a objetos e das bibliotecas Pandas / NumPy. Com o tempo, será melhorado.
Implementação.
Vamos agora descrever as implementações para cada objeto.
O objeto Estratégia deve ser bastante genérico nessa etapa, já que tratará as estratégias de previsão, média-reversão, impulso e volatilidade. As estratégias que estão sendo consideradas aqui serão sempre baseadas em séries temporais, ou seja, "preço direcionado". Uma exigência precoce para este backtester é que as classes de Estratégias derivadas aceitarão uma lista de barras (OHLCV) como entrada, em vez de carrapatos (preços de troca por meio do comércio) ou dados do livro de pedidos. Assim, a granularidade mais fina que está sendo considerada aqui será barras de 1 segundo.
A classe Estratégia também produzirá sempre recomendações de sinal. Isso significa que irá aconselhar uma instância do Portfolio no sentido de ir longo / curto ou manter uma posição. Essa flexibilidade nos permitirá criar vários "conselheiros" de estratégia que fornecem um conjunto de sinais, que uma classe de portfólio mais avançada pode aceitar para determinar as posições reais que estão sendo inseridas.
A interface das classes será aplicada utilizando uma metodologia de classe básica abstrata. Uma classe base abstrata é um objeto que não pode ser instanciado e, portanto, somente classes derivadas podem ser criadas. O código Python é dado abaixo em um arquivo chamado backtest. py. A classe Estratégia exige que qualquer subclasse implemente o método generate_signals.
Para evitar que a classe Estratégia seja instanciada diretamente (desde que é resumo!), É necessário usar os objetos ABCMeta e abstractmethod do módulo abc. Nós estabelecemos uma propriedade da classe, chamada __metaclass__ para ser igual a ABCMeta e depois decorar o método generate_signals com o decorador abstractmethod.
Embora a interface acima seja direta, ela se tornará mais complicada quando essa classe for herdada para cada tipo específico de estratégia. Em última análise, o objetivo da classe Estratégia nesta configuração é fornecer uma lista de sinais longos / curtos / de espera para cada instrumento a ser enviado para um portfólio.
A classe Portfolio é onde a maioria da lógica de negociação irá residir. Para este testador de pesquisa, o Portfolio é responsável por determinar o dimensionamento da posição, a análise de risco, o gerenciamento de custos de transações e o gerenciamento de execução (ou seja, o mercado aberto, o mercado de fechamento de pedidos). Em uma etapa posterior, essas tarefas serão divididas em componentes separados. Agora, eles serão incorporados a uma classe.
Esta classe faz um amplo uso de pandas e fornece um ótimo exemplo de onde a biblioteca pode economizar uma grande quantidade de tempo, especialmente no que diz respeito à disputa de dados "boilerplate". Como um lado, o truque principal com pandas e NumPy é evitar iterar sobre qualquer conjunto de dados usando o d para dentro. sintaxe. Isso ocorre porque o NumPy (que está subjacente aos pandas) otimiza o looping por operações vectorizadas. Assim, você verá poucas (se houver!) Iterações diretas ao utilizar pandas.
O objetivo da classe Portfolio é, em última análise, produzir uma seqüência de trades e uma curva patrimonial, que será analisada pela classe Performance. Para conseguir isso, deve ser fornecida uma lista de recomendações de negociação de um objeto Estratégia. Posteriormente, este será um grupo de objetos Estratégia.
A classe Portfolio deve ser informada sobre como o capital deve ser implantado para um determinado conjunto de sinais comerciais, como lidar com os custos de transação e quais formas de pedidos serão utilizadas. O objeto Estratégia está operando em barras de dados e, portanto, pressupostos devem ser feitos em relação aos preços alcançados na execução de um pedido. Como o preço alto / baixo de qualquer barra é desconhecido a priori, só é possível usar os preços abertos e fechados para negociação. Na realidade, é impossível garantir que um pedido seja preenchido em um desses preços particulares ao usar uma ordem de mercado, por isso será, na melhor das hipóteses, uma aproximação.
Além dos pressupostos sobre as encomendas que estão sendo preenchidas, este backtester irá ignorar todos os conceitos de restrições de margem / corretagem e assumirá que é possível passar longo e curto em qualquer instrumento livremente, sem restrições de liquidez. Esta é claramente uma hipótese muito irrealista, mas é uma que pode ser relaxada mais tarde.
A seguinte lista continua backtest. py:
Nesta fase, as classes de base abstrata Estratégia e portfólio foram introduzidas. Agora estamos em condições de gerar algumas implementações concretas derivadas dessas classes, a fim de produzir uma "estratégia de brinquedo" de trabalho.
Começaremos por gerar uma subclasse de Estratégia chamada RandomForecastStrategy, cuja única tarefa é produzir sinais longos / curtos escolhidos aleatoriamente! Embora esta seja claramente uma estratégia de negociação absurda, ela irá atender às nossas necessidades demonstrando a estrutura de backtesting orientada a objetos. Assim, iniciaremos um novo arquivo chamado random_forecast. py, com a listagem do pré provisorio aleatório da seguinte maneira:
Agora que temos um sistema de previsão "concreto", devemos criar uma implementação de um objeto Portfolio. Este objeto englobará a maioria do código de backtesting. Ele é projetado para criar dois DataFrames separados, o primeiro dos quais é um quadro de posições, usado para armazenar a quantidade de cada instrumento mantido em qualquer barra particular. O segundo, o portfólio, realmente contém o preço de mercado de todas as participações para cada barra, bem como uma contagem do caixa, assumindo um capital inicial. Isso, em última instância, fornece uma curva de equidade na qual avaliar o desempenho da estratégia.
O objeto Portfolio, embora extremamente flexível em sua interface, requer escolhas específicas quando se trata de como lidar com custos de transação, pedidos de mercado, etc. Neste exemplo básico, considero que será possível ir com um instrumento longo / curto sem restrições ou margem, compra ou venda diretamente no preço aberto do bar, custos de transação zero (abrangendo deslizamento, taxas e impacto no mercado) e especificaram a quantidade de estoque diretamente para comprar para cada comércio.
Aqui está a continuação da listagem random_forecast. py:
Isso nos dá tudo o que precisamos para gerar uma curva de equidade baseada nesse sistema. O passo final é amarrar tudo junto com uma função __main__:
A saída do programa é a seguinte. O seu será diferente da saída abaixo dependendo do intervalo de datas que você selecionar e da semente aleatória utilizada:
Neste caso, a estratégia perdeu dinheiro, o que não é surpreendente, dada a natureza estocástica do previsor. Os próximos passos são criar um objeto de desempenho que aceita uma instância do Portfolio e fornece uma lista de métricas de desempenho sobre as quais basear uma decisão para filtrar a estratégia ou não.
Também podemos melhorar o objeto da Carteira para ter um tratamento mais realista dos custos de transação (como as comissões de Interactive Brokers e o deslizamento). Também podemos incluir diretamente um mecanismo de previsão em um objeto de Estratégia, o que (espero) produza melhores resultados. Nos artigos a seguir, exploraremos esses conceitos com mais profundidade.
Apenas iniciando o comércio quantitativo?
3 razões para se inscrever para a lista de e-mails QuantStart:
1. Quant Trading Lessons.
Você terá acesso instantâneo a um curso de e-mail gratuito de 10 partes, repleto de sugestões e dicas para ajudá-lo a começar a negociação quantitativa!
2. Todo o conteúdo mais recente.
Todas as semanas, vou enviar-lhe um envoltório de todas as atividades no QuantStart para que você nunca mais perca uma postagem novamente.
Real, dicas de negociação viáveis, sem tonturas.

QuantStart.
Junte-se ao portal de membros privados da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento. Você encontrará um grupo bem informado de mentalistas quant pronto para responder suas perguntas comerciais mais importantes.
Confira meu ebook sobre o comércio de quant, onde eu ensino você como criar estratégias de negociação sistemáticas lucrativas com ferramentas Python, desde o início.
Dê uma olhada no meu novo ebook sobre estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas bayesianas, com Python e R.
Por Frank Smietana em 18 de julho de 2017.
Neste artigo, Frank Smietana, um dos colaboradores experientes do QuantStart, descreve a paisagem do software de backtesting de código aberto da Python e fornece conselhos sobre quais framework de backtesting são adequados para suas próprias necessidades de projeto.
Backtesting é indiscutivelmente a parte mais crítica do processo de produção da Sistemática de Negociação Sistemática (STS), sentado entre o desenvolvimento da estratégia e a implantação (negociação ao vivo). Se uma estratégia é defeituosa, um teste rigoroso provavelmente expõe isso, evitando que uma estratégia de perda seja implantada.
Uma série de capacidades relacionadas se sobrepõem com backtesting, incluindo simulação comercial e negociação ao vivo. O Backtesting usa dados históricos para quantificar o desempenho STS. Os simuladores de negociação levam backtesting um passo adiante, visualizando o desencadeamento de trades e desempenho de preços em uma base bar-a-bar. A negociação simulada / ao vivo implementa um STS testado em tempo real: negociações de sinalização, gerando ordens, roteando ordens para corretores e mantendo as posições à medida que as ordens são executadas.
A maioria dos quadros vai além do backtesting para incluir algumas capacidades de negociação ao vivo. Isso é conveniente se você deseja implantar a partir de sua estrutura de backtesting, que também funciona com o seu fornecedor preferido e fontes de dados. Quantopian / Zipline vai um passo adiante, fornecendo uma solução totalmente integrada de desenvolvimento, backtesting e implantação.
A comunidade Python é bem servida, com pelo menos seis estruturas de backtesting de código aberto disponíveis. No entanto, estão em vários estágios de desenvolvimento e documentação. Se você gosta de trabalhar em uma equipe construindo uma estrutura de backtesting de código aberto, confira seus reembolsos Github.
Antes de avaliar quadros de teste, vale a pena definir os requisitos do seu STS.
Qual classe de ativos você está negociando? Embora a maioria dos frameworks ofereça suporte aos dados da US Equities via YahooFinance, se uma estratégia incorporar derivados, ETFs ou títulos de EM, os dados precisam ser importados ou fornecidos pela estrutura. As coberturas de classe de ativos vão além dos dados. O framework pode lidar com futuros e opções de tamanho finito e gerar negociações de roll-over automaticamente? E quanto aos mercados ilíquidos, quão realista é uma suposição ao executar grandes encomendas?
Qual a frequência e o detalhe dos dados do seu STS? Um sistema de negociação que exige que cada marca ou lance / peça tenha um conjunto muito diferente de problemas de gerenciamento de dados do que um intervalo de 5 minutos ou horário. Os hedge funds e as lojas HFT investiram significativamente na construção de quadros robustos e escaláveis ​​de backtesting para lidar com esse volume e freqüência de dados. Algumas plataformas fornecem um conjunto rico e profundo de dados para várias classes de ativos, como ações da S & P, com resolução de um minuto.
Qual (s) tipo (s) de ordem o seu STS requer? No mínimo, o limite, as paradas e o OCO devem ser suportados pela estrutura.
Nível de suporte e amp; documentação necessária. Os quadros de estágio inicial têm escassa documentação, poucos têm suporte além de placas comunitárias.
Os Componentes de um Quadro de Teste de Backtesting.
Dados e aquisição de STS: os componentes de aquisição consomem o arquivo de script / definição STS e fornecem os dados necessários para testes. Se a estrutura exige que qualquer STS seja recodificado antes do teste posterior, a estrutura deve suportar funções enlatadas para os indicadores técnicos mais populares para acelerar o teste STS. Os usuários determinam o tempo de um período histórico para fazer backtest com base no que o framework fornece, ou o que eles são capazes de importar.
O teste de desempenho aplica a lógica STS à janela de dados históricos solicitada e calcula uma ampla gama de riscos & amp; métricas de desempenho, incluindo redução máxima, taxas Sharpe e Sortino. A maioria dos frameworks suporta um número decente de capacidades de visualização, incluindo curvas de equidade e estatísticas decimais.
A otimização tende a exigir a maior parte dos recursos de computação no processo STS. Se o seu STS precisar de otimização, concentre-se em uma estrutura que suporte processamento escalável distribuído / paralelo.
No contexto de estratégias desenvolvidas usando indicadores técnicos, os desenvolvedores de sistemas tentam encontrar um conjunto ideal de parâmetros para cada indicador. Mais simplesmente, a otimização pode achar que um fluxo de média móvel de 6 e 10 dias STS acumulou mais lucro sobre os dados de teste históricos do que qualquer outra combinação de períodos de tempo entre 1 e 20. Já com este exemplo trivial, 20 * 20 = 400 combinações de parâmetros devem ser calculado & amp; classificado.
No contexto de um portfólio, a otimização procura encontrar a ponderação ideal de cada ativo na carteira, incluindo os instrumentos em curto e alavancado. Em uma base periódica, o portfólio é reequilibrado, resultando na compra e venda de participações da carteira, conforme necessário, para alinhar com os pesos otimizados.
O dimensionamento de posição é um uso adicional da otimização, ajudando os desenvolvedores de sistemas a simular e analisar o impacto da alavancagem e dimensionamento de posição dinâmico no STS e no desempenho do portfólio.
Seis quadros de teste para o Python.
As capacidades padrão das plataformas open source Python backtesting parecem incluir:
Gerenciamento de eventos, flexível e irrestrito Coleta decente de indicadores técnicos pré-definidos Captação de desempenho padrão / visualização / geração de relatórios.
PyAlgoTrade.
PyAlgoTrade é uma estrutura de backtesting mutuamente documentada, juntamente com capacidades de negociação em papel e ao vivo. O suporte a dados inclui Yahoo! Finanças, Google Finance, NinjaTrader e qualquer tipo de série de tempo baseada em CSV, como Quandl. Os tipos de pedidos suportados incluem Market, Limit, Stop e StopLimit.
O PyAlgoTrade suporta a negociação Bitcoin via Bitstamp e o gerenciamento de eventos do Twitter em tempo real.
bt - Backtesting para Python.
bt "visa promover a criação de blocos de lógica de estratégia facilmente testáveis, reutilizáveis ​​e flexíveis para facilitar o rápido desenvolvimento de estratégias comerciais complexas".
O framework é particularmente adequado para testar STS com base em portfólio, com algos para ponderação de ativos e reequilíbrio de portfólio. A modificação de uma estratégia para executar em diferentes freqüências de tempo ou pesos de ativos alternativos envolve um mínimo de ajuste de código. bt é construído em cima do ffn - uma biblioteca de funções financeiras para Python.
Backtrader.
Esta plataforma está excepcionalmente bem documentada, com um blog acompanhante e uma comunidade on-line ativa para postar perguntas e solicitações de recursos. O Backtrader suporta uma série de formatos de dados, incluindo arquivos CSV, Pandas DataFrames, iteradores de incandescência e feeds de dados em tempo real de três corretores. Esses feeds de dados podem ser acessados ​​simultaneamente e podem até representar diferentes cronogramas. Os corretores suportados incluem Oanda para negociação de Forex e negociação de classes de ativos múltiplos através de Interactive Brokers e Visual Chart.
Pysystemtrade.
O desenvolvedor da Pysystemtrade, Rob Carver, tem uma ótima postagem em discussão sobre o porquê ele se propôs a criar mais uma nova estrutura de teste do Python e os argumentos para e contra o desenvolvimento do framework. A estrutura backtesting para pysystemtrade é discutida no livro Rob, "Systematic Trading".
Pysystemtrade lista uma série de recursos de roteiro, incluindo um testador de back-up completo, que inclui técnicas de otimização e calibração e negociação de futuros totalmente automáticos com Interactive Brokers. Os contribuidores da fonte aberta são bem-vindos.
Zipline é um simulador de negociação algorítmica com recursos de papel e negociação ao vivo. Acessível através da interface do navegador IPython baseado no navegador, a Zipline fornece uma alternativa fácil de usar para ferramentas de linha de comando. Suportado e desenvolvido por Quantopian, Zipline pode ser usado como uma estrutura de backtesting autônomo ou como parte de um ambiente completo de desenvolvimento, teste e implantação de STS, de Aosta / Zipline STS. A Zipline fornece 10 anos de dados de estoque históricos históricos de última hora e uma série de opções de importação de dados.
QSTrader é uma estrutura de backtesting com capacidades de negociação ao vivo. O fundador da QuantStart, Michael Halls-Moore, lançou o QSTrader com a intenção de construir uma plataforma robusta e escalável o suficiente para atender às necessidades dos fundos de hedge quantitativos institucionais, bem como aos comerciantes quantos de varejo. O QSTrader atualmente suporta dados de resolução "barra" da OHLCV em várias escalas de tempo, mas permite que dados de marca sejam usados.
Tanto o backtesting como o comércio ao vivo são completamente orientados para eventos, simplificando a transição das estratégias da pesquisa para o teste e, finalmente, a negociação ao vivo. A estratégia básica / código do portfólio geralmente é idêntico em ambas as implementações.
O principal benefício do QSTrader é em sua modularidade, permitindo uma ampla personalização de código para aqueles que possuem requisitos específicos de gerenciamento de risco ou portfólio.
Abraçando o Backtest.
É a natureza humana se concentrar na recompensa de desenvolver um STS (esperançosamente lucrativo), então apressar-se a implantar uma conta financiada (porque esperamos), sem gastar tempo e recursos suficientes para testar completamente a estratégia. Mas backtesting não é apenas um gatekeeper para nos impedir de implementar estratégias erradas e perder capital comercial, também fornece uma série de diagnósticos que podem informar o processo de desenvolvimento STS. Por exemplo, testando um STS idêntico em dois intervalos de tempo diferentes, compreendendo a redução máxima de uma estratégia no contexto de correlações de ativos e criando portfólios mais inteligentes por backtesting de alocações de ativos em várias regiões geográficas.
Em futuras postagens, iremos abordar frameworks de backtesting para ambientes que não sejam Python e o uso de várias técnicas de amostragem como bootstrapping e jackknife para testar modelos de negociação preditivos.
Apenas iniciando o comércio quantitativo?
3 razões para se inscrever para a lista de e-mails QuantStart:
1. Quant Trading Lessons.
Você terá acesso instantâneo a um curso de e-mail gratuito de 10 partes, repleto de sugestões e dicas para ajudá-lo a começar a negociação quantitativa!
2. Todo o conteúdo mais recente.
Todas as semanas, vou enviar-lhe um envoltório de todas as atividades no QuantStart para que você nunca mais perca uma postagem novamente.
Real, dicas de negociação viáveis, sem tonturas.

Jon V.
BigData. Iniciantes. Negociação.
BigData. Iniciantes. Negociação.
Construindo um sistema backtesting em Python: ou como perdi $ 3400 em duas horas.
Construir um sistema de backtest é realmente muito fácil. Fácil de estragar, quero dizer. Embora existam toneladas de excelentes bibliotecas por aí (e as abordaremos em algum momento), eu sempre gosto de fazer isso por conta própria para ajustá-la.
De todos os sistemas backtesting que eu vi, podemos assumir que existem duas categorias:
Hoje, falaremos sobre "loopers".
Os "for-loopers" são o meu tipo favorito de backtesters. Eles são triviais para escrever e super divertidos para expandir, mas eles têm alguns fluxos vitais e, infelizmente, a maioria dos backtesters lá fora é "for-loopers" (ps: Eu preciso encontrar um nome melhor para isso!).
Como funciona o looping? Usando um loop for (como você pode ter adivinhado). É algo assim:
Muito simples, certo? É assim que funciona um sistema de backtesting, que executa uma estratégia de impulso:
Então qual é o problema?
Muito difícil de escalar (horizontalmente) Precisa de muito trabalho para manter sua estratégia de aplicação () trabalhando no backtesting e na produção Você precisa ter tudo na mesma linguagem de programação.
Vamos mergulhar nessas, uma a uma.
Escalabilidade. Eu estava experimentando um par de semanas atrás com um algoritmo de escalada de colina para otimizar uma das minhas estratégias. Ainda está em execução. Depois de duas semanas. E eu construo sistemas robustos para uma vida. Por que ainda está funcionando? Você pode usar multiprocessamento, Disco, produtor / consumidor (usando o ZeroMQ) ou apenas threads para acelerar isso, mas alguns problemas não são "paralisações embaraçosas" (sim, este é um termo real, e não uma das minhas palavras inventadas). A quantidade de trabalho para escalar um backtester como esse (especialmente quando você quer fazer a mesma máquina aprendendo em cima dela) é enorme. Você pode fazê-lo, mas é o caminho errado.
Produção e backtesting em sincronia. As vezes que fui mordido por isso. Posso recordar as trocas perdidas onde eu estava "hm, por que eu entrei nesse comércio?" ou o meu antigo favorito "POR QUE A PARADA DE REALIZAÇÃO FOI APLICADA AGORA?".
Tempo da história: tive uma ideia para otimizar minha estratégia, para executar um backtester para ver o que aconteceria se eu pudesse colocar uma parada posterior depois que o comércio fosse rentável para garantir sempre lucros. Backtesting funcionou como um charme com um aumento de 13% nos ganhos e a produção perdeu todo comércio. Descobri que depois do meu algo perdi US $ 3400 em algumas horas (uma lição muito cara).
Manter a estratégia apply_strategy em sincronia é muito difícil e torna-se quase impossível quando você deseja fazê-lo de forma distribuída. E você não quer ter duas versões de sua estratégia que sejam "quase" idênticas. A menos que você tenha US $ 3400 de sobra.
Usando diferentes idiomas, adoro Python. E Erlang. E Clojure. E J. E C. E R. E Ruby (na verdade eu odeio Ruby). Eu quero poder aproveitar a força de outros idiomas no meu sistema. Quero experimentar estratégias em R onde há bibliotecas muito bem testadas e há uma enorme comunidade por trás disso. Eu quero ter Erlang para escalar meu código e C para crunch dados. Se você quer ser bem sucedido (não apenas na negociação), você precisa usar todos os recursos disponíveis sem prejuízos. Aprendi toneladas de coisas de sair com os desenvolvedores R sobre como você pode delta hedge bonds e visualizá-los ou por que razão Sharpe pode ser uma mentira. Todo idioma tem uma multidão diferente e você quer que muitas pessoas despejam idéias em seu sistema. Se você tentar aplicar a estratégia apply_strategy em idioma diferente, então, boa sorte com (2).
Você está convencido agora? Bem, eu não estou tentando convencê-lo como for-loopers é uma ótima maneira de executar seus testes iniciais. É como eu comecei e, para muitas estratégias, não as envio para o pipeline. Um "melhor" caminho (para que você possa dormir à noite) são os geradores de eventos.
Próximamente, compartilhando e discutindo meu backtester mais simples (mas com maior sucesso)!
Se você tiver mais comentários, clique-me no jonromero ou inscreva-se no boletim informativo.
Legal outro. Este é um tutorial de engenharia sobre como construir uma plataforma algotrading para experimentação e FUN. Qualquer sugestão aqui não é um conselho financeiro. Se você perder qualquer (ou todos) o seu dinheiro porque seguiu quaisquer conselhos de negociação ou implantou este sistema na produção, não pode culpar este blog aleatório (e / ou eu). Aproveite a seu próprio risco.

Forex Mecânico.
Negociação no mercado FX usando estratégias mecânicas de negociação.
Backtesting Trading Systems em Python: não é uma escolha muito boa.
O idioma python é extremamente versátil, fácil de usar e conveniente. Não há discussão sobre a versatilidade deste idioma quando se trata da quantidade de tempo que leva para colocar uma idéia utilizável em código. Deseja carregar um arquivo csv? Deseja realizar um cálculo de indicador? Deseja traçar um conjunto de valores? Todas essas coisas podem ser feitas com apenas algumas linhas de código em python, enquanto certamente levaria páginas inteiras, senão milhares de linhas, para fazer as mesmas coisas em idiomas como C e Fortran. No entanto, o python possui várias fraquezas que tornam uma escolha fraca quando se trata de testar as estratégias de negociação, particularmente quando se trata de testes baseados em eventos. Nesta publicação, abordarei as diferentes coisas que fazem da Python uma má escolha para codificar os mecanismos de teste de back-ups e por que? apesar do tempo de codificação muito maior & # 8211; os benefícios de usar uma linguagem de nível mais baixo, provavelmente, superam os problemas para certos tipos de testes. Para executar o teste abaixo, baixe o código aqui.
Em geral, é importante entender que existem duas maneiras principais de fazer back-testing. O primeiro é o que é chamado de back-testing baseado em vetores e o segundo é chamado de back-testing baseado em eventos. Quando você faz back-tests baseados em vetores, você calcula vetores que representam decisões de negociação e você faz operações vetoriais para extrair o desempenho dessas variáveis. Digamos que você deseja testar uma estratégia de cross-over média móvel do modo vetorial, você primeiro calcula um vetor com todos os valores médios móveis, então você cria um segundo vetor que contém um booleano com a média móvel maior ou menor do que preço, você usa esses valores para calcular um vetor que represente equidade de acordo com onde você possui sinais, etc. O teste baseado em vetor em geral faz tudo ao calcular vetores e esses vetores são usados ​​para gerar os resultados dos testes. É uma maneira matematicamente eficiente de realizar back-testing de certos tipos de sistemas.
Há, no entanto, muitas desvantagens na utilização de testes baseados em vetores (o que deixarei para discutir em uma publicação futura), o que leva muitas pessoas à alternativa, que são testes baseados em eventos. No caso de back-testing baseado em eventos, você envia os dados de negociação disponíveis e você passa o seu algoritmo todas as informações que ele tem disponíveis em cada ponto do tempo. Esta é a maneira de fazer back-testing que mais se aproxima da execução real do mercado porque sua estratégia está apenas fazendo a mesma coisa, está recebendo dados e tomando decisões em cada unidade de tempo quando é necessário. Por este motivo, os testes baseados no evento podem testar todas as estratégias que podem ser negociadas no mercado e os algoritmos codificados para testes baseados em eventos geralmente podem ser usados ​​sem modificações no comércio ao vivo, porque a mecânica é simplesmente a mesma. No caso de back-testing baseado em eventos, você faz uma corrida simulada explícita de sua estratégia através de seus dados como sua estratégia teria feito em negociação ao vivo (ou pelo menos tão perto quanto você pode gerenciar).
Se você quiser codificar um mecanismo de teste de retorno baseado em eventos no Python, você enfrentará alguns problemas sérios devido à natureza de Python & # 8217; s. Você pode ter decidido usar o Python porque a codificação dentro deste idioma é muito fácil, mas em breve você descobrirá que isso vem em um ótimo custo. Se você quiser realizar um exercício de teste de carregamento de dados simples mais baseado em eventos, você provavelmente usará algum código como o mostrado no exemplo acima. Este exemplo carrega dados de um arquivo chamado TEST_60.csv (30 anos, gerado aleatoriamente 1H) e, em seguida, executa um loop simples através de todo o quadro de dados de pandas para calcular o alcance médio de 20 bar em cada barra (algo extremamente simples). Fazer este exercício simples leva cerca de 12-15 segundos para carregar os dados em um banco de dados de pandas & # 8211; principalmente devido à análise da data & # 8211; e depois vários minutos para executar o exercício looping. É extremamente lento percorrer um quadro de dados de pandas porque as bibliotecas como pandas simplesmente não são projetadas para executar esse tipo de tarefa, elas são projetadas para operações baseadas em vetores que são otimizadas nas funções baseadas em C dentro da biblioteca.
Quando você usa bibliotecas como pandas ou numpy, o custo do loop é realmente muito maior do que o custo do looping através de uma lista de python simples, porque essas bibliotecas possuem funções bastante ineficientes para acessar elementos únicos em seus objetos porque este tipo de operação não é para o qual as bibliotecas foram projetadas. Os quadros de dados de pandas e as matrizes numpy não devem ser iterados, eles devem ser usados ​​para executar operações baseadas em vetores (ou seja, o & # 8220; pythonic & # 8221; coisa a fazer). Você pode executar alguns testes e ver o quanto seu tempo muda quando você altera a função usada para acessar os valores dentro do quadro de dados do pandas, se você mudar de ix para iat ou iloc, você notará algumas diferenças importantes nos tempos de execução (veja aqui para mais informações sobre desempenho do método de indexação). Usar uma biblioteca como pandas ou numpy é ótimo em termos da quantidade de tempo de codificação economizado, mas se você estiver fazendo back-testing baseado em eventos, você nunca terá algo rápido o suficiente.
O custo de executar este tipo de looping em python torna o idioma praticamente inútil para qualquer projeto de back-testing de grande escala que exija testes baseados em eventos. O ciclo de barra 1H codificado acima leva vários minutos para executar e não é mesmo fazendo cálculos altamente exigentes, nem sequer rastreia equidade, negocia ou faz qualquer geração de sinal. Isso é tudo porque o looping através de objetos de pandas é tremendamente lento. Claro, poderíamos torná-lo mais rápido se não usássemos pandas por isso ou se usássemos ctypes, mas então você está se movendo para o território de linguagens de baixo nível já. Você está desistindo de algo que é tremendamente amigável para codificar com (pandas) para algo que é mais rápido (ctypes). Se você está disposto a aumentar seu tempo de codificação para ganhar velocidade, então você está melhor simplesmente indo para um idioma de nível inferior. Se você estiver gastando 10 vezes o tempo fazendo o código Python mais rápido, então apenas gaste esse tempo codificando em C, onde você saberá que será o mais rápido possível.
Claro que não estou argumentando que não há lugar para o python no back-testing (depois de tudo, codificamos uma biblioteca de análise de séries temporais de código aberto em python chamado qqpat). Você pode executar testes baseados em vetores simples um pouco rápidos usando este idioma e se você está disposto a desistir das bibliotecas mais fáceis de usar, você provavelmente pode codificar algo muito mais rápido usando ctypes e acelerá-lo ainda mais usando algo como pypy . No entanto, o melhor uso que eu encontrei para o python é realmente usá-lo como um frontend para bibliotecas de back-testing muito mais rápidas codificadas em C / C ++. Em nossa comunidade, usamos o Python para fazer coisas como configurações de carga, gerar gráficos e carregar arquivos csv, enquanto uma biblioteca C muito mais eficiente executa os testes baseados no evento real. Fazendo isso, podemos realizar testes de tempo inteiros de 30 anos nas barras de 1H em questão de segundos enquanto faz isso em Python, usando bibliotecas fáceis de usar, como os pandas, provavelmente tomarão 100 vezes o tempo, se não mais. Não é um mistério, então, por que simplesmente existem programas de teste de back-up baseados em eventos comerciais que usam o Python, não é simplesmente um corte de idioma para este trabalho.
Se você quiser saber mais sobre back-testing e como você também pode codificar e testar estratégias usando nosso framework de programação C / C ++, considere se juntar a Asirikuy, um site repleto de vídeos educacionais, sistemas de negociação, desenvolvimento e um som, honesto e transparente abordagem para negociação automatizada.
3 Responses to & # 8220; Backtesting Trading Systems em Python: não é uma boa escolha e # 8221;
Eu acho que alguns ajustes menores ao seu código resultarão em uma aceleração significativa e, em última instância, tornarão Python um pouco mais aceitável.
1) a impressão é bastante dispendiosa. Se você quiser imprimir os dados contidos no intervalo médio em intervalos específicos, você pode fazê-lo depois de preenchê-lo.
2) Considere pré-atribuir uma matriz NumPy vazia:
& gt; & gt; n_elements = len (intervalo (2, len (main_rates. index)) * 20.
& gt; & gt; average_range [(i-2) * 20 + j] = range_value.
Apenas fazendo isso, chego ao tempo de execução total de 0,033 seg no dual Intel Xeon E5-2620 & # 8217; s. I & # 8217; m em IPython de 64 bits usando NumPy 1.10 e Pandas 0.17.1, para o que vale a pena.
Obrigado por publicar! Realmente boa melhoria, claramente a função de impressão foi apenas para fins ilustrativos (eu só queria que os usuários vejam o que a função estava fazendo), mas bom trabalho na redução do tempo ao pré-alocar a matriz numpy. Claro que existem todos os tipos de coisas que você pode fazer para tornar o código mais rápido em Python & # 8212; Definitivamente, não estou dizendo que não pode ser feito, especialmente em casos específicos como este. No entanto, acredito que ainda existe um ponto válido para obter um desempenho aceitável em Python, você precisa desistir de uma boa parte da amizade de codificação & # 8220; & # 8221; Isso faz com que seja uma linguagem tão atraente para começar. Quando o seu código se torna realmente complexo & # 8211; como se você quisesse aprender a máquina e # 8211; modificações como a que você publicou tornam-se cada vez mais difíceis de conseguir. No final, para chegar a tempos de execução como os de C / C ++, você pode acabar gastando tempo como se estivesse codificando nesses idiomas de nível inferior.
O que você acha? Você acredita que este é o caso? Você acha que sempre há uma otimização acessível que pode fazer com que um código de python atinja um C / C ++ como desempenho sem muito esforço? Alguma dicas de python que você gostaria de compartilhar? Claro que não tenho a última palavra em python, então qualquer oculto é definitivamente bem-vindo! Deixe-me saber e agradeço muito pela sua contribuição,
Eu acho que, de maneira geral, se a operação não é vetorializada, ficando mais perto do metal e # 8217; usando o cython (ou algo parecido) será ótimo e você está vivendo no mundo de C / C ++.
Dito isto, eu tenho resultados ótimos usando o Numba (uma biblioteca de compilação just-in-time que joga muito bem com o NumPy) para acelerar ARMA & # 8217; s e outras computações não vetorizadas. Para mais informações, veja:
Há todos os tipos de customizações e otimizações disponíveis para você, mas simplesmente decorar um loop numérico isolado, por exemplo, com jit parece ser bem executado na maioria dos casos.

Python Algorithmic Trading Library.
PyAlgoTrade é uma Biblioteca de Negociação Algorítmica Python com foco em backtesting e suporte para negociação de papel e negociação ao vivo. Digamos que você tenha uma idéia de uma estratégia de negociação e que você gostaria de avaliá-la com dados históricos e ver como ela se comporta. PyAlgoTrade permite que você faça isso com um esforço mínimo.
Principais características.
Totalmente documentado. Evento conduzido. Suporta pedidos Market, Limit, Stop e StopLimit. Suporta Yahoo! Finanças, Google Finance e NinjaTrader CSV. Suporta qualquer tipo de dados da série temporal no formato CSV, por exemplo, Quandl. Suporte comercial Bitcoin através do Bitstamp. Indicadores técnicos e filtros como SMA, WMA, EMA, RSI, Bandas Bollinger, Expositores Hurst e outros. Métricas de desempenho como a taxa de Sharpe e análise de redução. Manipulação de eventos do Twitter em tempo real. Perfil de eventos. Integração TA-Lib.
Muito fácil de dimensionar horizontalmente, ou seja, usando um ou mais computadores para testar uma estratégia.
PyAlgoTrade é gratuito, de código aberto e está licenciado sob a Licença Apache, Versão 2.0.

Estratégias de negociação de backtesting em python
Recomendamos atualizar para o mais recente Safari, Google Chrome ou Firefox.
Puxe pedidos 0.
Participe do GitHub hoje.
O GitHub é o lar de mais de 20 milhões de desenvolvedores que trabalham juntos para hospedar e rever o código, gerenciar projetos e criar software juntos.
Clone com HTTPS.
Use o Git ou o check-out com o SVN usando o URL da web.
Não use isso. O Yahoo removeu a API original e os métodos alternativos são propensos a falhas devido às falhas introduzidas pelo Yahoo (troca de coluna e outras)
Se não for um problema (isto é, erro), não publique como um problema. Ele será fechado automaticamente.
Aqui, um trecho de um CrossOver médio simples simples. Isso pode ser feito de várias maneiras diferentes. Use os documentos (e exemplos) Luke!
Incluindo um gráfico completo. De uma chance! Isso está incluído nas amostras como sigsmacross / sigsmacross2.py. Ao longo é sigsmacross. py, que pode ser parametrizado a partir da linha de comando.
Live Trading e backtesting plataforma escrita em Python.
Feed de dados ao vivo e negociação com corretores interativos (precisa de IbPy e beneficia muito de uma pira instalada) Gráfico visual (precisa de um garfo de comtypes até que uma solicitação de tração seja integrada na versão e benefícios de pira) Oanda (precisa de oatoterapia) (apenas API REST - v20 não suportou a transmissão em sequência quando implementado) Os feeds de dados de csv / arquivos, fontes on-line ou de pandas e flocos Filtros para dados, como quebrar uma barra diária em pedaços para simular intraday ou trabalhar com Renko tijolos Múltiplos feeds de dados e múltiplas estratégias suportadas Múltiplos períodos de tempo ao mesmo tempo Repetição integrada e repetição passo a passo de teste ou de uma só vez (exceto na avaliação da Estratégia) Bateria de indicadores integrada Suporte do indicador TA-Lib (precisa de python ta-lib / verificar os documentos) Desenvolvimento fácil de indicadores personalizados Analisadores ( por exemplo: TimeReturn, Sharpe Ratio, SQN) e integração pyfolio. Definição flexível de esquemas de comissões. Simulação de corretores integrados com Market, Close, Limit, St Opção, StopLimit, StopTrail, StopTrailLimit * e * Ordens OCO, ordem de suporte, deslizamento, estratégias de preenchimento de volume e ajuste de caixa contínuo para instrumentos futuros. Sizers para estacas automatizadas Modos Cheat-on-Close e Cheat-on-Open Agendadores Calendários comerciais Ploting (requer matplotlib)
Leia a documentação completa em:
Lista de indicadores embutidos (122)
Python 2.7 Python 3.2 / 3.3 / 3.4 / 3.5 / 3.6 Também funciona com pypy e pypy3 (sem traçado - matplotlib não é suportado em pypy)
A compatibilidade é testada durante o desenvolvimento com 2.7 e 3.5.
As outras versões são testadas automaticamente com Travis.
O backtrader é autônomo sem dependências externas (exceto se desejar traçar)
pip instalar backtrader.
pip instalar backtrader [plotting]
Se matplotlib não estiver instalado e você deseja fazer algum planejamento.
A versão mínima matplotlib é 1.4.1.
Um exemplo para IB Data Feeds / Trading:
IbPy não parece estar no PyPi. Ou:
ou (se git não estiver disponível no seu sistema):
Para outras funcionalidades como: Visual Chart, Oanda, TA-Lib, verifique as dependências na documentação.
Coloque o diretório backtrader encontrado nas fontes dentro do seu projeto.
X: Número de versão principal. Deve ficar estável, a menos que algo grande seja alterado como uma revisão para usar numpy Y: Número de versão menor. Para ser alterado após a adição de um novo recurso completo ou (Deus proibe), uma mudança de API incompatível. Z: número de versão de revisão. Para ser alterado para atualizações de documentação, pequenas mudanças, pequenas correções de bugs I: Número de Indicadores já incorporados na plataforma.
Se depois de ver os documentos e algumas amostras (veja o blog também) você sente que essa não é sua xícara de chá, você sempre pode dar uma olhada em plataformas semelhantes de Python:
bt ligeiramente pré-data backtrader e tem uma abordagem completamente diferente, mas é divertido, bt também foi escolhido como abreviatura para backtrader durante as importações e que alguns dos métodos têm a mesma denominação (nomeação óbvia de qualquer forma): executar, traçar.
&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.

No comments:

Post a Comment