Bt - Backtesting flexível para Python O que é bt bt é uma estrutura de backtesting flexível para o Python usado para testar estratégias de negociação quantitativas. Backtesting é o processo de testar uma estratégia em um dado conjunto de dados. Essa estrutura permite que você crie facilmente estratégias que combinem e combinem diferentes Algos. Ele 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 objetivo: salvar quants de reinventar a roda e deixá-los concentrar-se na parte importante do trabalho - desenvolvimento da estratégia. Bt é codificado em Python e se junta a um ecossistema vibrante e rico para análise de dados. Existem inúmeras bibliotecas para aprendizagem de máquinas, processamento de sinal e estatísticas e podem ser alavancadas para evitar reinventar a roda - algo que ocorre com demasiada frequência ao usar outras linguagens que não possuem a mesma riqueza de projetos de código aberto de alta qualidade. Bt é construído em cima do ffn - uma biblioteca de funções financeiras para Python. Confira um exemplo rápido Aqui está um gosto rápido de bt: A estratégia simples Backtest Let8217s criam uma estratégia simples. Criaremos uma estratégia mensal reequilibrada e de longa duração, onde colocamos pesos iguais em cada ativo em nosso universo de ativos. Primeiro, vamos baixar alguns dados. Por padrão, bt. get (alias para ffn. get) baixa o Close ajustado do Yahoo Finance. Vamos baixar alguns dados a partir de 1º de janeiro de 2010 para os propósitos desta demonstração. Uma vez que possamos nossos dados, criaremos nossa estratégia. O objeto Estratégia contém a lógica estratégica ao combinar vários Algos. Finalmente, criaremos um Backtest. Qual é a combinação lógica de uma estratégia com um conjunto de dados. Uma vez feito isso, podemos executar o backtest e analisar os resultados. Agora, podemos analisar os resultados do nosso backtest. O objeto Result é um invólucro fino em torno de ffn. GroupStats que adiciona alguns métodos auxiliares. Teste avançado com Python - Parte I. Passamos os últimos meses no QuantStart, testando várias estratégias comerciais usando Python e pandas. A natureza vectorizada dos pandas garante que certas operações em grandes conjuntos de dados sejam extremamente rápidas. No entanto, as formas de backtester vectorizado que estudamos até à data sofrem de algumas desvantagens na forma como a execução comercial é simulada. Nesta série de artigos, vamos discutir uma abordagem mais realista da simulação de estratégia histórica através da construção de um ambiente de backtesting baseado em eventos usando o Python. Software dirigido por eventos Antes de aprofundar o desenvolvimento de um backtester, precisamos entender o conceito de sistemas orientados a eventos. Os jogos de vídeo fornecem um caso de uso natural para o software baseado em eventos e fornecem um exemplo direto para explorar. Um videogame tem vários componentes que interagem uns com os outros em uma configuração em tempo real em altos níveis. Isso é gerenciado executando todo o conjunto de cálculos dentro de um loop infinito conhecido como loop de eventos ou loop de jogo. Em cada marca do jogo-loop, uma função é chamada para receber o evento mais recente. Que terá sido gerado por alguma ação anterior correspondente dentro do jogo. Dependendo da natureza do evento, que pode incluir uma tecla pressionada ou um clique do mouse, são tomadas algumas ações subseqüentes, que irão encerrar o loop ou gerar alguns eventos adicionais. O processo continuará. Aqui está um exemplo de pseudo-código: o código está continuamente procurando por novos eventos e depois executa ações com base nesses eventos. Em particular, permite a ilusão de tratamento de resposta em tempo real porque o código está continuamente sendo roteado e os eventos são verificados. Como ficará claro, isso é precisamente o que precisamos para realizar simulação de negociação de alta freqüência. Porquê um Backtester com Drivers de Eventos Os sistemas direcionados por eventos oferecem muitas vantagens em relação a uma abordagem vetorializada: Reutilização de código - Um teste de backplay baseado em eventos, por design, pode ser usado tanto para teste histórico quanto para negociação ao vivo com a troca mínima de componentes. Isso não é verdade para testadores vectorizados onde todos os dados devem estar disponíveis ao mesmo tempo para realizar análises estatísticas. Lookahead Bias - Com um backtester dirigido por eventos, não existe um viés de lookahead, pois o recebimento de dados de mercado é tratado como um evento que deve ser atuado. Assim, é possível gotejar o feed-backtester baseado em eventos com dados do mercado, replicando como um sistema de gerenciamento de pedidos e de portfólio se comportaria. Realismo - Os backtesters orientados a eventos permitem uma personalização significativa sobre como as ordens são executadas e os custos de transação são incorridos. É direto lidar com pedidos básicos de mercado e limite, bem como mercado-em-aberto (MOO) e mercado-em-fechar (MOC), uma vez que um manipulador de troca personalizado pode ser construído. Embora os sistemas orientados a eventos tenham muitos benefícios, eles sofrem de duas desvantagens principais em relação aos sistemas vectorizados mais simples. Em primeiro lugar, eles são significativamente mais complexos para implementar e testar. Há mais partes móveis levando a uma maior chance de introduzir bugs. Para mitigar esta metodologia adequada de teste de software, como o desenvolvimento orientado por teste, podem ser empregados. Em segundo lugar, eles são mais lentos para serem executados em comparação com um sistema vectorizado. Operações vectorizadas ótimas não podem ser utilizadas ao realizar cálculos matemáticos. Discutiremos formas de superar essas limitações em artigos posteriores. Resumo do Backtester com Drivers de Eventos Para aplicar uma abordagem baseada em eventos para um sistema de teste de retorno, é necessário definir nossos componentes (ou objetos) que irão lidar com tarefas específicas: Evento - O Evento é a unidade de classe fundamental do sistema direcionado a eventos. Contém um tipo (como MERCADO, SINAL, ORDEM ou FULL) que determina como ele será tratado dentro do ciclo do evento. Fila de eventos - A fila de eventos é um objeto de fila Python na memória que armazena todos os objetos de subclasse do evento que são gerados pelo resto do software. DataHandler - O DataHandler é uma classe base abstrata (ABC) que apresenta uma interface para lidar com dados de mercado históricos ou ao vivo. Isso proporciona uma flexibilidade significativa, pois os módulos da Estratégia e do portfólio podem ser reutilizados entre ambas as abordagens. O DataHandler gera um novo MarketEvent em cada batimento cardíaco do sistema (veja abaixo). Estratégia - A Estratégia também é um ABC que apresenta uma interface para tirar dados do mercado e gerar SignalEvents correspondentes, que são, em última instância, utilizados pelo objeto Portfolio. Um SignalEvent contém um símbolo de ticker, uma direção (LONG ou SHORT) e um timestamp. Portfolio - Este é um ABC que lida com o gerenciamento de pedidos associado a posições atuais e posteriores para uma estratégia. Ele também realiza gerenciamento de riscos em todo o portfólio, incluindo exposição do setor e dimensionamento de posição. Em uma implementação mais sofisticada, isso pode ser delegado a uma classe RiskManagement. O Portfolio leva SignalEvents da fila e gera OrderEvents que são adicionados à fila. ExecutionHandler - ExecutionHandler simula uma conexão com uma corretora. O trabalho do manipulador é levar OrderEvents da fila e executá-los, seja através de uma abordagem simulada ou de uma conexão real com uma corretora de fígado. Uma vez que as ordens são executadas, o manipulador cria FillEvents, que descreve o que realmente foi negociado, incluindo taxas, comissão e derrapagem (se modelado). O Loop - Todos esses componentes estão envolvidos em um loop de eventos que lida corretamente com todos os tipos de eventos, encaminhando-os para o componente apropriado. Este é um modelo bastante básico de um mecanismo comercial. Existe um espaço significativo para a expansão, particularmente no que diz respeito à forma como o portfólio é usado. Além disso, os diferentes modelos de custos de transações também podem ser abstraídos em sua própria hierarquia de classes. Nesta fase, introduz uma complexidade desnecessária nesta série de artigos, então não vamos discutir isso ainda mais. Em tutoriais posteriores, provavelmente expandiremos o sistema para incluir realismo adicional. Aqui está um trecho do código Python que demonstra como o backtester funciona na prática. Existem dois loops no código. O loop externo é usado para dar ao backtester um batimento cardíaco. Para negociação ao vivo, esta é a frequência na qual novos dados de mercado são consultados. Para estratégias de backtesting, isso não é estritamente necessário, uma vez que o backtester usa os dados de mercado fornecidos no formulário de gotejamento (veja a linha bars. updatebars ()). O loop interno realmente manipula os eventos do objeto Fila de eventos. Eventos específicos são delegados ao respectivo componente e, posteriormente, novos eventos são adicionados à fila. Quando a fila de eventos está vazia, o loop de heartbeat continua: Este é o esboço básico de como um backtester dirigido por eventos foi projetado. No próximo artigo, vamos discutir a hierarquia da classe de eventos. Um aplicativo para testar estratégias de negociação básicas para o mercado FX, com base em dados históricos. Este código está escrito para o Python 2.7 e não é compatível com o Python 3. Pré-requisitos: Tkinter Para executar o programa, baixe todos os arquivos, mantenha a mesma estrutura de diretório e execute o arquivo inputhandling. py do intérprete do Python. As configurações dos parâmetros são as seguintes: StartEnd Date: as datas que vinculam os dados históricos que serão testados Depósito inicial: o valor da moeda (USD) na conta de corretagem para começar com TimeFrame: a largura de cada barra do histórico Dados que serão testados, esse é o prazo utilizado para cada estratégia. Símbolo: suporte para apenas EURUSD, USDJPY, GBPUSD e USDCHF com dados incluídos. Posição ao comércio: restrinja o backtest para incluir apenas posições longas, posições curtas ou ambas. Critério: a principal estratégia utilizada para simular negócios históricos (Moving Average Crossover e Stochastics included) Alavancagem (margem): o índice de alavancagem máximo permitido Tamanho do lote preferido: um tamanho de lote fixo a ser negociado quando uma posição é aberta. Se a margem livre restrinja o tamanho do lote para ser menor, será ajustado durante o teste. Técnica de Modelagem de Propagação: Spreads Médicos - suponha que os spreads permaneçam constantes ao longo dos dados históricos Técnica de Gerenciamento de Comércio: TPSL - defina um lucro fixo fixo e pare o nível de perda em pips do preço de entrada Preço SL - ajuste a perda de parada para ser uma porcentagem de preço e Atualizar cada barra Uma vez que esses parâmetros são inseridos, o programa executará um back-up rudimentar usando barra por análise de barras para determinar qual será o saldo da conta final. Este programa pode ser ampliado adicionando mais estratégias de negociação. Eles devem implementar a mesma interface que as estratégias de média móvel e estocástica. Você não pode executar essa ação neste momento. Você iniciou sessão 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