Wednesday 16 August 2017

Evento Driven Forex Trading


O QSForex é uma plataforma de negociação em tempo real e backtesting dirigida a eventos de código aberto para uso nos mercados cambiais (forex), atualmente em um estado alfa. Ele foi criado como parte da série Forex Trading Diary no QuantStart para fornecer à comunidade de negociação sistemática um motor de negociação robusto que permite a implementação e o teste diretos da estratégia forex. O software é fornecido sob uma licença MIT permissiva (veja abaixo). Open-Source - QSForex foi lançado sob uma Licença MIT de código aberto extremamente permissiva, que permite o uso total em aplicações comerciais e de pesquisa, sem restrições, mas sem garantia de qualquer tipo. Grátis - QSForex é completamente gratuito e não custa nada para baixar ou usar. Colaboração - Como a QSForex é de código aberto, muitos desenvolvedores colaboram para melhorar o software. Novos recursos são adicionados com freqüência. Todos os erros são rapidamente determinados e corrigidos. Desenvolvimento de Software - QSForex está escrito na linguagem de programação Python para suporte direto à plataforma cruzada. QSForex contém um conjunto de testes de unidade para a maioria do seu código de cálculo e novos testes são constantemente adicionados para novos recursos. Arquitetura dirigida a eventos - O QSForex é completamente conduzido por eventos tanto para backtesting quanto para negociação ao vivo, o que leva a uma transição direta de estratégias de uma fase de pesquisa / teste para uma implementação de negociação ao vivo. Custos de transação - Os custos de spread são incluídos por padrão para todas as estratégias anteriores. Backtesting - QSForex possui backtesting de vários dias multi-currency multi-day intraday. Negociação - O QSForex atualmente oferece suporte à negociação intradía ao vivo usando a OANDA Brokerage API em um portfólio de pares. Métricas de desempenho - O QSForex atualmente suporta medição básica de desempenho e visualização de equidade através das bibliotecas de visualização Matplotlib e Seaborn. Instalação e uso 1) Visite oanda / e configure uma conta para obter as credenciais de autenticação da API, que você precisará realizar uma negociação ao vivo. Eu explico como realizar isso neste artigo: quantstart / articles / Forex-Trading-Diary-1-Automated-Forex-Trading-with-the-OANDA-API. 2) Clone este repositório git em um local adequado em sua máquina usando o seguinte comando em seu terminal: git clone github / mhallsmoore / qsforex. git. Alternativa, você pode baixar o arquivo zip do ramo mestre atual no github / mhallsmoore / qsforex / archive / master. zip. 3) Crie um conjunto de variáveis ​​de ambiente para todas as configurações encontradas no arquivo settings. py no diretório raiz do aplicativo. Alternativamente, você pode codificar suas configurações específicas substituindo as chamadas os. environ. get (.) Por cada configuração: 4) Crie um ambiente virtual (virtualenv) para o código QSForex e use pip para instalar os requisitos. Por exemplo, em um sistema baseado em Unix (Mac ou Linux), você pode criar esse diretório da seguinte maneira, digitando os seguintes comandos no terminal: Isso criará um novo ambiente virtual para instalar os pacotes. Supondo que você baixou o repositório QSForex git em um diretório de exemplo, como / projects / qsforex / (mude este diretório abaixo para onde você instalou QSForex), então, para instalar os pacotes, você precisará executar os seguintes comandos: isso levará alguns Tempo como NumPy, SciPy, Pandas, Scikit-Learn e Matplotlib devem ser compilados. Existem muitos pacotes necessários para que isso funcione, por isso, dê uma olhada nestes dois artigos para obter mais informações: você também precisará criar um link simbólico do seu diretório de pacotes do site para seu diretório de instalação QSForex para poder ligar Importe qsforex dentro do código. Para fazer isso, você precisará de um comando semelhante ao seguinte: Certifique-se de alterar / projects / qsforex para o diretório de instalação e /venv/qsforex/lib/python2.7/site-packages/ para o diretório de pacotes do site virtualenv. Agora você poderá executar os comandos subseqüentes corretamente. 5) Nesta fase, se você simplesmente deseja realizar práticas ou negociação ao vivo, então você pode executar python trading / trading. py. Que usará a estratégia de negociação padrão do TestStrategy. Isso simplesmente compra ou vende um par de moedas a cada 5%. É puramente para testes - não use isso em um ambiente de negociação ao vivo Se você deseja criar uma estratégia mais útil, basta criar uma nova classe com um nome descritivo, por exemplo, MeanReversionMultiPairStrategy e garantir que ele tenha um método calculatesignals. Você precisará passar nesta classe a lista de pares, bem como a fila de eventos, como em trading / trading. py. Por favor, veja a estratégia / strategy. py para obter detalhes. 6) Para realizar qualquer backtesting, é necessário gerar dados forex simulados ou baixar dados históricos do tick. Se você deseja simplesmente testar o software, a maneira mais rápida de gerar um exemplo de backtest é gerar alguns dados simulados. O formato de dados atual usado pelo QSForex é o mesmo que o fornecido pelo DukasCopy Historical Data Feed em dukascopy / swiss / english / marketwatch / historical /. Para gerar alguns dados históricos, certifique-se de que a configuração CSVDATADIR em settings. py seja configurada para um diretório onde você deseja que os dados históricos vivam. Você então precisa gerar geratesimulatedpair. py. Que está sob o diretório / script. Ele espera um único argumento de linha de comando, que neste caso é o par de moedas no formato BBBQQQ. Por exemplo: Nesta etapa, o script é codificado para criar dados de um único mês para janeiro de 2014. Ou seja, você verá arquivos individuais, do formato BBBQQQYYYYMMDD. csv (por exemplo, GBPUSD20140112.csv) aparecem em seu CSVDATADIR para todos os dias úteis em Naquele mês. Se você deseja alterar o mês / ano da saída de dados, basta modificar o arquivo e re-executar. 7) Agora que os dados históricos foram gerados, é possível realizar um backtest. O arquivo backtest em si é armazenado em backtest / backtest. py. Mas isso só contém a classe Backtest. Para executar um backtest, você precisa instanciar esta classe e fornecer os módulos necessários. A melhor maneira de ver como isso é feito é olhar para o exemplo de Implementação de Crossover em Movimento Médio no arquivo de exemplos / mac. py e usá-lo como um modelo. Isso faz uso do MovingAverageCrossStrategy que é encontrado em strategy / strategy. py. Este padrão é a negociação de GBP / USD e EUR / USD para demonstrar uso de par de moedas múltiplas. Ele usa dados encontrados no CSVDATADIR. Para executar o exemplo backtest, simplesmente execute o seguinte: Isso levará algum tempo. No meu sistema de desktop Ubuntu em casa, com os dados históricos gerados via generatesimulatedpair. py. Demora cerca de 5-10 minutos para correr. Uma grande parte deste cálculo ocorre no final do backtest real, quando o drawdown está sendo calculado, então lembre-se de que o código não foi desligado. Por favor, deixe-o até a conclusão. 8) Se você deseja visualizar o desempenho do backtest, você pode simplesmente usar output. py para ver uma curva de patrimônio, retornos de período (ou seja, tick-to-tick returns) e uma curva de redução: E é isso. Nesta fase você está pronto Para começar a criar seus próprios backtests, modificando ou anexando estratégias em strategy / strategy. py e usando dados reais baixados da DukasCopy (dukascopy / swiss / english / marketwatch / historical /). Se você tiver dúvidas sobre a instalação, então fique à vontade para me enviar um e-mail no mikequantstart. Se você tiver algum erro ou outras questões que você acha que podem ser devido à base de código especificamente, sinta-se livre para abrir um problema do Github aqui: github / mhallsmoore / qsforex / issues Copyright (c) 2015 Michael Halls-Moore A permissão é concedida, gratuitamente De carga para qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o Software), para lidar no Software sem restrições, incluindo, sem limitação, os direitos de uso, cópia, modificação, mesclagem, publicação, distribuição, sublicença e / Ou vender cópias do Software e permitir que pessoas a quem o Software seja fornecido, sujeito às seguintes condições: O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as cópias ou porções substanciais do Software. O SOFTWARE É FORNECIDO COMO É, SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, APTIDÃO PARA UM FIM ESPECÍFICO E NÃO INFRACÇÃO. EM NENHUMA CIRCUNSTÂNCIA, OS AUTORES OU TITULARES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM AÇÃO DE CONTRATO, DELITO OU DE OUTRA FORMA, DECORRENTE, DESTE OU RELACIONADO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO PROGRAMAS. Disclaimer de Negociação de Forex A troca de câmbio em margem possui um alto nível de risco e pode não ser adequada para todos os investidores. O desempenho passado não é indicativo de resultados futuros. O alto grau de alavancagem pode funcionar contra você, bem como para você. Antes de decidir investir em divisas, você deve considerar cuidadosamente seus objetivos de investimento, nível de experiência e apetite de risco. Existe a possibilidade de que você possa sustentar a perda de algum ou todo seu investimento inicial e, portanto, você não deve investir dinheiro que não pode perder. Você deve estar ciente de todos os riscos associados à negociação cambial e procurar o aconselhamento de um consultor financeiro independente se tiver dúvidas. Event-Driven Backtesting com Python - Parte I Nós passamos os últimos dois meses no QuantStart backtesting várias estratégias de negociação Utilizando 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 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, 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 a verificar se há novos eventos e, em seguida, executar ações com base nesses eventos. Em particular, permite a ilusão de tratamento de resposta em tempo real porque o código está sendo continuamente 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. 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. 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 Estratégia e 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 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 uma margem significativa para a expansão, particularmente no que diz respeito ao uso do portfólio. Além disso, os diferentes modelos de custos de transação também podem ser abstraídos 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 estratégias de backtesting, isso não é estritamente necessário, pois o backtester usa os dados de mercado fornecidos no formulário de gotejamento (consulte a barra de barras). O loop interno realmente lida com os eventos do objeto Fila de eventos. Eventos específicos são delegados ao respectivo componente e subseqüentemente 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, discutiremos a hierarquia das classes de eventos.

No comments:

Post a Comment