Monday, 18 December 2017

Python forex back test


Python Algorithmic Trading Library PyAlgoTrade é uma Biblioteca de Negociação Algorítmica Python com foco em backtesting e suporte para troca de papel e negociação ao vivo. Digamos que você tenha uma idéia de uma estratégia de negociação e que 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 de Mercado, Limite, Parada e StopLimit. Suporta arquivos do Yahoo Finance, 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, isto é, usando um ou mais computadores para testar uma estratégia. PyAlgoTrade é livre, de código aberto e está licenciado sob a Licença Apache, Versão 2.0.Event-Driven Backtesting com Python - Parte I Nós passamos os últimos meses no QuantStart backtesting várias estratégias comerciais usando Python e pandas. A natureza vectorizada dos pandas garante que determinadas operações em grandes conjuntos de dados sejam extremamente rápidas. No entanto, as formas de backtester vectorizado que temos estudado até à data sofrem de algumas desvantagens na forma como a execução do comércio é 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 orientado a eventos Antes de aprofundarmos 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 software orientado a eventos e fornecem um exemplo simples 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 é tratado executando todo o conjunto de cálculos dentro de um loop infinito conhecido como loop de eventos ou loop de jogo. Em cada tick do loop de jogo 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 um pressionamento de tecla ou um clique do mouse, alguma ação subseqüente é tomada, que terminará o loop ou gerará alguns eventos adicionais. O processo continuará então. Aqui está um exemplo de pseudo-código: o código está continuamente a verificar se há novos eventos e, em seguida, executar ações com base nesses eventos. Em particular, permite a ilusão de resposta em tempo real manipulação porque o código está continuamente sendo looped e eventos 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. Bias de Lookahead - Com um backtester conduzido por evento não há tendência de lookahead como recibo de dados de mercado é tratado como um evento que deve ser atendido. Assim, é possível gotejar um backtestter movido a eventos com dados de mercado, replicando como um sistema de gerenciamento de pedidos e carteira 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 de implementar e testar. Há mais partes móveis levando a uma maior chance de introduzir bugs. Para mitigar esta metodologia de teste de software apropriada, como desenvolvimento test-driven pode ser empregado. Em segundo lugar, eles são mais lentos para serem executados em comparação com um sistema vectorizado. As operações vetoriais ótimas não podem ser utilizadas quando se realizam cálculos matemáticos. Discutiremos formas de superar essas limitações em artigos posteriores. Visão Geral Para aplicar uma abordagem orientada a eventos para um sistema de backtesting é necessário definir nossos componentes (ou objetos) que lidarão com tarefas específicas: Evento - O Evento é a unidade de classe fundamental do sistema de 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 da subclasse de eventos que são gerados pelo restante do software. DataHandler - O DataHandler é uma classe base abstrata (ABC) que apresenta uma interface para manipulação de dados de mercado históricos ou ao vivo. Isto proporciona uma flexibilidade significativa, uma vez que os módulos da Estratégia e da Carteira podem, assim, 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 de mercado e gerar SignalEvents correspondentes, que são utilizados pelo objeto Portfolio. Um SignalEvent contém um símbolo 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. Também realiza a gestão de risco em toda a carteira, incluindo a exposição do setor eo dimensionamento da 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 - O 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 descrevem o que realmente foi transacionado, incluindo taxas, comissão e deslizamento (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 de negociação. Existe uma margem significativa para a expansão, particularmente no que diz respeito ao uso do portfólio. Além disso, os diferentes modelos de custo de transação também podem ser capturados em sua própria hierarquia de classes. Nesta fase, introduz uma complexidade desnecessária nessa série de artigos para que não discutamos mais adiante. 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 a negociação ao vivo, esta é a frequência na qual os novos dados do mercado são entrevistados. Para backtesting estratégias isso não é estritamente necessário uma vez que o backtester usa os dados de mercado fornecidos no formulário de gotejamento-feed (veja a linha bars. updatebars ()). O loop interno realmente lida com os eventos do objeto Fila de eventos. Eventos específicos são delegados para o respectivo componente e, posteriormente, novos eventos são adicionados à fila. Quando a fila de eventos está vazia, o loop de pulsação continua: Este é o esboço básico de como é projetado um backtestter baseado em eventos. No próximo artigo discutiremos a hierarquia de classes Event. Apenas iniciando o comércio quantitativo

No comments:

Post a Comment