O QSForex é um backtesting de código aberto orientado a eventos e uma plataforma de negociação ao vivo para uso nos mercados cambiais (forex), atualmente em um estado alfa. Foi criado como parte da série Forex Trading Diary no QuantStart para fornecer à comunidade de negociação sistemática um mecanismo de negociação robusto que permite a implementação e teste diretos da estratégia do Forex. O software é fornecido sob uma licença MIT permissiva (veja abaixo). Open-Source - O 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. Livre - QSForex é totalmente gratuito e não custa nada para baixar ou usar. Colaboração - Como o QSForex é de código aberto, muitos desenvolvedores colaboram para melhorar o software. Novos recursos são adicionados com freqüência. Quaisquer erros são rapidamente determinados e corrigidos. Desenvolvimento de Software - O QSForex é escrito na linguagem de programação Python para suporte direto a várias plataformas. 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 Orientada a Eventos - A QSForex é totalmente orientada a eventos, tanto para backtesting quanto para negociação ao vivo, o que leva à 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 de backtested. Backtesting - QSForex apresenta backtesting de pares multi-dia com resolução de ticks intraday. Negociação - A QSForex atualmente suporta negociação intraday ao vivo usando a API de Brokerage da OANDA em um portfólio de pares. Métricas de desempenho - QSForex atualmente suporta medição de desempenho básico 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, as quais você precisará para realizar negociações ao vivo. Eu explico como realizar isso neste artigo: quantstart / artigos / Forex-Trading-Diário-1-Automatizado-Forex-Trading-com-o-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. Alternativamente, você pode baixar o arquivo zip da ramificação mestre atual em 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. Como alternativa, você pode codificar suas configurações específicas substituindo as chamadas os. environ. get (.) Para cada configuração: 4) Crie um ambiente virtual (virtualenv) para o código QSForex e utilize pip para instalar os requisitos. Por exemplo, em um sistema baseado em Unix (Mac ou Linux) você pode criar um diretório como o seguinte, inserindo os seguintes comandos no terminal: Isso criará um novo ambiente virtual para instalar os pacotes. Supondo que você baixou o repositório git QSForex em um diretório de exemplo como / projects / qsforex / (mude este diretório abaixo para onde quer que você tenha instalado o QSForex), então para instalar os pacotes você precisará executar os seguintes comandos: tempo como NumPy, SciPy, Pandas, Scikit-Learn e Matplotlib devem ser compilados. Há muitos pacotes necessários para que isso funcione, portanto, dê uma olhada nestes dois artigos para obter mais informações: Você também precisará criar um link simbólico do diretório de pacotes do site para o diretório de instalação do QSForex para poder chamar import 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 virtualenv site packages. Agora você poderá executar os comandos subseqüentes corretamente. 5) Nesta fase, se você simplesmente deseja praticar ou viver negociação, 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 ticks. É puramente para testes - não use 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, MeanReversionMultiPairEstratégia e garanta que ele tenha um método calculatesignals. Você precisará passar essa classe à lista de pares, bem como à fila de eventos, como em trading / trading. py. Por favor, olhe para strategy / strategy. py para detalhes. 6) Para realizar qualquer backtesting é necessário gerar dados simulados de forex ou baixar dados históricos de ticks. Se você quiser 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 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 definida como um diretório no qual você deseja que os dados históricos sejam mantidos. Você precisa então executar o generateimulatedpair. py. que está sob o diretório scripts /. Ele espera um único argumento de linha de comando, que nesse caso é o par de moedas no formato BBBQQQ. Por exemplo: nesse estágio, o script é codificado para criar um único mês para janeiro de 2014. Ou seja, você verá arquivos individuais, do formato BBBQQQYYYYMMDD. csv (por exemplo, GBPUSD20140112.csv), exibidos em seu CSVDATADIR em todos os dias úteis em naquele mês. Se você deseja alterar o mês / ano da saída de dados, simplesmente modifique o arquivo e execute novamente. 7) Agora que os dados históricos foram gerados, é possível realizar um backtest. O arquivo de backtest em si é armazenado em backtest / backtest. py. mas isso contém apenas a classe Backtest. Para realmente executar um backtest, você precisa instanciar esta classe e fornecê-la com os módulos necessários. A melhor maneira de ver como isso é feito é examinar o exemplo da implementação do Moving Average Crossover no arquivo examples / mac. py e usá-lo como um modelo. Isso faz uso do MovingAverageCrossStrategy, que é encontrado em strategy / strategy. py. Isso padroniza a negociação de GBP / USD e EUR / USD para demonstrar o uso de múltiplos par de moedas. Utiliza dados encontrados no CSVDATADIR. Para executar o exemplo de backtest, simplesmente execute o seguinte: Isso levará algum tempo. No meu sistema de desktop Ubuntu em casa, com os dados históricos gerados via generateimulatedpair. py. Demora cerca de 5-10 minutos para ser executado. Uma grande parte desse 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 desativado. Por favor, deixe-o até a conclusão. 8) Se você quiser ver o desempenho do backtest, você pode simplesmente usar o output. py para visualizar uma curva de capital, retornos de período (isto é, retornos tick-to-tick) e uma curva de rebaixamento: E é nesse estágio que 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 do DukasCopy (dukascopy / swiss / english / marketwatch / historical /). Se você tiver alguma dúvida sobre a instalação, por favor, sinta-se à vontade para me enviar um e-mail no mikequantstart. Se você tiver algum bug ou outros problemas que você acha que podem estar relacionados à base de código especificamente, sinta-se à vontade para abrir um problema no Github: github / mhallsmoore / qsforex / issues Copyright (c) 2015 Michael Halls-Moore responsável, para qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o Software), para negociar o Software sem restrições, incluindo, sem limitação, os direitos de uso, cópia, modificação, fusão, publicação, distribuição, sublicenciamento e / ou vender cópias do Software e permitir que as pessoas a quem o Software é fornecido o façam, sujeitas às seguintes condições: O aviso de copyright acima e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software. O SOFTWARE É FORNECIDO COMO ESTÁ, SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM NENHUMA CIRCUNSTÂNCIA, OS AUTORES OU PROPRIETÁRIOS DE DIREITOS DE AUTOR PODERÃO SER RESPONSABILIZADOS POR QUAISQUER REIVINDICAÇÕES, DANOS OU OUTRAS RESPONSABILIDADES, QUER EM ACÇÃO DE CONTRATO, DELITO OU DE OUTRA FORMA, DECORRENTES DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO PROGRAMAS. Negociação Forex Aviso Legal Negociar em moeda estrangeira possui um alto nível de risco e pode não ser adequado para todos os investidores. O desempenho passado não é indicativo de resultados futuros. O alto grau de alavancagem pode funcionar contra você e também para você. Antes de decidir investir em moeda estrangeira, você deve considerar cuidadosamente seus objetivos de investimento, nível de experiência e apetite de risco. Existe a possibilidade de você sustentar uma perda de parte ou de todo o seu investimento inicial e, portanto, não deve investir dinheiro que não pode perder. Você deve estar ciente de todos os riscos associados à troca de moeda estrangeira, e procurar aconselhamento de um consultor financeiro independente, se você tiver alguma dúvida. Código Python Trader e compartilhamento de habilidades Sim, eu uso 2 raspberrypi. Baixa estabilidade de alta potência (altos no seu). Raspy Python Oandapy gt Esta configuração é muito versátil Esta configuração é muito versátil e funciona muito bem Seguindo esse tópico, eu acho que começar com o comércio programado em Python. Oanda tem alguns benefícios lá, e eu vejo que você está usando também. Eu acho que seria difícil executar muitas eas no mt4 ao mesmo tempo, o que é mais provável que seja o caminho a seguir. Eu acho que um Pi ou um Mac mini (pelo seu preço eu posso comprar uma dúzia de Pi-s.) Seria ideal para executar tais configurações 24/7. Eu só não confio em windows ou Mt4 para coisas sérias. Quantas instâncias de programas de negociação você pode executar no Pi ao mesmo tempo que Pi corresponde em velocidade aos computadores que usei no início dos anos 2000, portanto, não deve ser muito lento. Felicidades e obrigado pela idéia, kEvent-Driven Backtesting com Python - Parte I Passamos o último par de meses no QuantStart fazendo backtesting de várias estratégias de negociação utilizando Python e pandas. A natureza vetorizada dos pandas garante que certas operações em grandes conjuntos de dados sejam extremamente rápidas. No entanto, as formas de backtester vetorizado que estudamos até agora sofrem de algumas desvantagens na maneira como a execução da negociação é simulada. Nesta série de artigos, vamos discutir uma abordagem mais realista da simulação de estratégia histórica, construindo um ambiente de backtesting baseado em eventos usando o Python. Software Orientado a Eventos Antes de nos aprofundarmos no desenvolvimento de um backtester como esse, precisamos entender o conceito de sistemas orientados a eventos. Os videogames fornecem um caso de uso natural para software orientado a eventos e fornecem um exemplo direto para explorar. Um videogame tem vários componentes que interagem entre si em uma configuração em tempo real em altas taxas de quadros. Isso é feito executando todo o conjunto de cálculos dentro de um loop infinito conhecido como loop de eventos ou loop de jogos. A cada tick do loop de jogo, uma função é chamada para receber o evento mais recente. que terá sido gerado por alguma ação prévia 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 é executada, o 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 verificando novos eventos e, em seguida, realizando ações com base nesses eventos. Em particular, ele permite a ilusão de manipulação de resposta em tempo real, porque o código está continuamente em loop e os eventos são verificados. Como ficará claro, é precisamente disso que precisamos para realizar a simulação de negociação de alta frequência. Por que um backtester orientado a eventos Os sistemas orientados a eventos fornecem muitas vantagens em relação a uma abordagem vetorizada: Reutilização de código - um backtester orientado a eventos, por design, pode ser usado para backtesting histórico e negociação ao vivo com troca mínima de componentes. Isso não é verdade para os backtesters vetorizados, onde todos os dados devem estar disponíveis ao mesmo tempo para realizar análises estatísticas. Lookahead Bias - Com um backtester baseado em eventos, não há viés de antecipação, pois o recebimento de dados de mercado é tratado como um evento que deve ser considerado. Assim, é possível drenar um backtester baseado em eventos com dados de mercado, replicando como um sistema de gerenciamento de pedidos e portfólio se comportaria. Realismo - backtesters orientados a eventos permitem personalização significativa sobre como os pedidos são executados e os custos de transação são incorridos. É fácil lidar com ordens básicas de mercado e de limite, assim como com o mercado aberto (MOO) e com o mercado no fechamento (MOC), já que um manipulador de troca personalizado pode ser construído. Embora os sistemas orientados a eventos tenham muitos benefícios, eles sofrem de duas grandes desvantagens em relação aos sistemas vetoriais 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 erros. Para mitigar esta metodologia adequada de teste de software, como o desenvolvimento orientado a testes, pode ser empregado. Em segundo lugar, eles são mais lentos para executar em comparação com um sistema vetorizado. Operações otimizadas vetorizadas não podem ser utilizadas ao realizar cálculos matemáticos. Vamos discutir maneiras de superar essas limitações em artigos posteriores. Visão geral do Backtester orientado a eventos Para aplicar uma abordagem orientada a eventos a um sistema de backtesting, é necessário definir nossos componentes (ou objetos) que manipularão tarefas específicas: Evento - O Evento é a unidade de classe fundamental do sistema orientado a eventos. Ele contém um tipo (como MARKET, SIGNAL, ORDER ou FILL) que determina como ele será tratado no loop de eventos. Fila de Eventos - A Fila de Eventos é um objeto Fila Python na memória que armazena todos os objetos de subclasse Event que são gerados pelo restante do software. DataHandler - O DataHandler é uma classe base abstrata (ABC) que apresenta uma interface para lidar com dados históricos ou ao vivo no mercado. Isso proporciona uma flexibilidade significativa, pois os módulos de Estratégia e Portfólio podem ser reutilizados entre as duas abordagens. O DataHandler gera um novo MarketEvent a cada pulsação do sistema (veja abaixo). Estratégia - A Estratégia também é um ABC que apresenta uma interface para obter dados de mercado e gerar SignalEvents correspondentes, que são utilizados pelo objeto Portfolio. Um SignalEvent contém um símbolo, uma direção (LONG ou SHORT) e um timestamp. Portfólio - Este é um ABC que lida com o gerenciamento de pedidos associado às posições atuais e subsequentes de uma estratégia. Ele também executa o gerenciamento de riscos em todo o portfólio, incluindo a exposição do setor e o dimensionamento de posições. Em uma implementação mais sofisticada, isso poderia ser delegado a uma classe RiskManagement. O Portfólio pega 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 é pegar OrderEvents da Fila e executá-los, seja por meio de uma abordagem simulada ou uma conexão real com uma corretora de fígado. Quando as ordens são executadas, o manipulador cria FillEvents, que descreve o que foi realmente transacionado, incluindo taxas, comissão e derrapagem (se modelado). O Loop - Todos esses componentes são agrupados em um loop de eventos que manipula corretamente todos os tipos de eventos, roteando-os para o componente apropriado. Este é um modelo básico de um mecanismo de negociação. Existe um espaço significativo para expansão, particularmente no que diz respeito à forma como a Carteira é utilizada. Além disso, os diferentes modelos de custo de transação também podem ser abstraídos em sua própria hierarquia de classes. Nesta fase, introduz desnecessária complexidade dentro desta série de artigos, por isso não vamos discutir mais sobre isso. Em tutoriais posteriores, provavelmente expandiremos o sistema para incluir realismo adicional. Aqui está um trecho de código Python que demonstra como o backtester funciona na prática. Existem dois loops ocorrendo no código. O loop externo é usado para dar ao backtester um heartbeat. Para negociação ao vivo, essa é a frequência com que os novos dados de mercado são pesquisados. Para estratégias de backtesting isso não é estritamente necessário, já que o backtester usa os dados de mercado fornecidos no formato de alimentação por 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, subsequentemente, novos eventos são adicionados à fila. Quando os eventos Queue estão vazios, o loop de heartbeat continua: Este é o esquema básico de como um backtester orientado a eventos é projetado. No próximo artigo, discutiremos a hierarquia de classes de eventos.
No comments:
Post a Comment