Thursday 6 July 2017

Quantstart Oanda Forex


Forex Trading Diário 1 - Automated Forex Trading com a API OANDA Eu já mencionei no QuantStart: 2014 artigo Review que eu estaria gastando alguns de 2015 escrito sobre forex trading automatizado. Dado que eu próprio geralmente realizar pesquisas em mercados de ações e futuros, eu pensei que seria divertido (e educacional) para escrever sobre minhas experiências de entrar no mercado de forex no estilo de um diário. Cada entrada do diário tentará construir em todos aqueles antes, mas também deve ser relativamente auto-suficiente. Nesta primeira entrada do diário Ill ser descrevendo como configurar uma nova conta corretora prática com OANDA, bem como a forma de criar um motor de negociação multiprojetos básicos orientada a eventos que pode executar automaticamente comércios em uma prática e viver definição. No ano passado, passamos muito tempo olhando para o backtestter evento-driven. Principalmente para ações e ETFs. O que eu apresento abaixo é voltado para forex e pode ser usado para negociação de papel ou negociação ao vivo. Tenho escrito todas as instruções a seguir para Ubuntu 14.04, mas eles devem facilmente traduzir para Windows ou Mac OS X, usando uma distribuição Python como Anaconda. A única biblioteca adicional usada para o mecanismo de negociação Python é a biblioteca de solicitações, que é necessária para a comunicação HTTP com a API OANDA. Uma vez que este é o primeiro post diretamente sobre o comércio de câmbio, eo código apresentado abaixo pode ser diretamente adaptado a um ambiente de negociação ao vivo, gostaria de apresentar as seguintes isenções: Isenção de responsabilidade: Troca de câmbio sobre margem transporta 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 trabalhar 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 pelo risco. A possibilidade existe que você poderia sustentar uma perda de alguns ou todos do seu investimento inicial e, portanto, você não deve investir o dinheiro que você não pode dar ao luxo de perder. Você deve estar ciente de todos os riscos associados com negociação de câmbio, e procurar aconselhamento de um consultor financeiro independente, se você tiver quaisquer dúvidas. Este software é fornecido como tal e quaisquer garantias expressas ou implícitas, incluindo, mas não se limitando a, garantias implícitas de comercialização e adequação a um propósito específico, são excluídas. Em nenhum caso os regentes ou contribuintes serão responsáveis ​​por quaisquer danos diretos, indiretos, incidentais, especiais, exemplares ou conseqüentes (incluindo, mas não se limitando a, aquisição de bens ou serviços substitutivos perda de uso, dados ou lucros ou interrupção de negócios ) No entanto causado e em qualquer teoria da responsabilidade, seja no contrato, responsabilidade estrita, ou delito (incluindo negligência ou de outra forma) decorrentes de qualquer fora do uso deste software, mesmo se avisado da possibilidade de tais danos. Configurando uma conta com OANDA A primeira pergunta que vem à mente é Por que escolher OANDA. Basta colocar, depois de um pouco de Googling em torno de forex corretores que tinham APIs, vi que a OANDA tinha recentemente lançado um adequado REST API que poderia ser facilmente comunicada com a partir de praticamente qualquer idioma de uma forma extremamente simples. Depois de ler a documentação da API do desenvolvedor. Eu decidi dar-lhes uma tentativa, pelo menos com uma conta de prática. Para ser claro - Eu não tenho nenhuma relação anterior ou existente com a OANDA e estou apenas fornecendo esta recomendação com base na minha experiência limitada brincando com sua prática API e alguns breves uso (para download de dados de mercado), enquanto empregado em um fundo anteriormente. Se alguém se deparar com qualquer outro corretores forex que também têm uma API similarmente moderna, então Id ser feliz para dar-lhes um olhar também. Antes de utilizar a API é necessário se inscrever para uma conta de prática. Para fazer isso, vá para o link de inscrição. Você verá a seguinte tela: Você poderá então fazer login com suas credenciais de login. Certifique-se de selecionar a guia fxTradePractice na tela de login: uma vez que você precisa fazer uma anotação do seu ID da conta. Ele está listado abaixo do cabeçalho de Meus Fundos pretos ao lado da Primária. O meu é um número de 7 dígitos. Além disso, você também precisará gerar um token API pessoal. Para fazer isso, clique em Gerenciar o Acesso à API abaixo da guia Outras Ações, no canto inferior esquerdo: Neste estágio, você será capaz de gerar um token da API. Você precisará da chave para usar mais tarde, portanto, certifique-se de anotá-la também. Agora você vai querer lançar o aplicativo FXTrade Practice, que nos permitirá ver as ordens executadas e nossa perda de papel (lucro) em lucro. Se você estiver executando um sistema Ubuntu você precisará instalar uma versão ligeiramente diferente do Java. Em particular, a versão Oracle do Java 8. Se você não fizer isso, então o simulador de prática não vai carregar a partir do navegador. Eu executei esses comandos no meu sistema: Você agora será capaz de lançar o ambiente de negociação de prática. Retorne ao painel do OANDA e clique no link Verde destacado Lançamento FXTrade Practice. Ele exibirá um diálogo Java perguntando se você deseja executá-lo. Clique em Executar e a ferramenta fxTrade Practice será carregada. Mine faltou a um gráfico de vela de 15 minutos de EUR / USD com o Painel de Cotações à esquerda: Neste ponto, estamos prontos para começar a projetar e codificar nosso sistema automatizado de negociação forex contra a API OANDA. Visão geral da arquitetura de negociação Se você tem acompanhado a série de backtester orientada a eventos para ações e ETFs que criei no ano passado, você estará ciente de como esse sistema de negociação orientado a eventos funciona. Para aqueles de vocês que são novos para o software de eventos. Eu sugeriria fortemente a leitura através do artigo a fim ganhar alguma introspecção em como trabalham. Em essência, todo o programa é executado em um loop infinte while que só termina quando o sistema de negociação é desligado. O mecanismo de comunicação central do programa é dado através de uma fila que contém eventos. A fila é constantemente consultada para verificar novos eventos. Uma vez que um evento foi retirado do topo da fila ele deve ser manipulado por um componente apropriado do programa. Assim, um feed de dados de mercado pode criar TickEvent s que são colocados na fila quando um novo preço de mercado chega. Um objeto de estratégia de geração de sinal pode criar OrderEvent s que devem ser enviados para uma corretora. A utilidade de tal sistema é dada pelo fato de que não importa qual ordem ou tipos de eventos são colocados na fila, pois eles sempre serão tratados corretamente pelo componente certo dentro do programa. Além disso, diferentes partes do programa podem ser executadas em threads separados. O que significa que nunca há qualquer espera por qualquer componente específico antes de processar qualquer outro. Isso é extremamente útil em situações de negociação algorítmica em que manipuladores de alimentação de dados de mercado e geradores de sinal de estratégia têm características de desempenho muito diferentes. O loop de negociação principal é dado pelo seguinte pseudo-código Python: Como dissemos acima, o código é executado em um loop infinito. Em primeiro lugar, a fila é consultada para recuperar um novo evento. Se a fila estiver vazia, então o loop simplesmente reinicia após um período de sono curto conhecido como batimento cardíaco. Se um evento é encontrado, seu tipo é avaliado e, em seguida, o módulo relevante (a estratégia ou o manipulador de execução) é chamado para lidar com o evento e possivelmente gerar novos que voltam para a fila. Os componentes básicos que vamos criar para o nosso sistema de negociação incluem o seguinte: Streaming Price Handler - Isto manterá uma conexão de longa duração aberta para servidores OANDAs e enviar dados tick (ou seja, bid / ask) através da conexão para todos os instrumentos que estavam interessados In. Estratégia Gerador de Sinal - Isso levará uma seqüência de eventos de carrapatos e usá-los para gerar ordens de negociação que serão executadas pelo manipulador de execução. Execution Handler - Toma um conjunto de eventos de ordem e os executa cegamente com OANDA. Eventos - Esses objetos constituem as mensagens que são passadas ao redor na fila de eventos. Exigimos apenas dois para esta implementação, nomeadamente o TickEvent eo OrderEvent. Ponto de entrada principal - O ponto de entrada principal também inclui o loop de comércio que pesquisa continuamente a fila de mensagens e envia mensagens para o componente correto. Isso geralmente é conhecido como o loop de eventos ou manipulador de eventos. Vamos agora discutir a implementação do código em detalhes. Na parte inferior do artigo é a lista completa de todos os arquivos de código-fonte. Se você colocá-los no mesmo diretório e executar python trading. py você começará a gerar ordens, assumindo que você tenha preenchido o seu ID de conta e token de autenticação da OANDA. Implantação do Python É má prática para armazenar senhas ou chaves de autenticação dentro de um codebase como você nunca pode prever quem será eventualmente permitido acesso a um projeto. Em um sistema de produção, armazenamos essas credenciais como variáveis ​​de ambiente com o sistema e, em seguida, consultamos esses envvars cada vez que o código é redistribuído. Isso garante que as senhas e os tokens de autenticação nunca sejam armazenados em um sistema de controle de versão. No entanto, como estamos unicamente interessados ​​em construir um sistema de negociação de brinquedos e não estamos preocupados com detalhes de produção neste artigo, em vez disso, separarão esses tokens de autenticação em um arquivo de configurações. No seguinte arquivo de configuração do settings. py, temos um dicionário chamado ENVIRONMENTS que armazena os pontos de extremidade da API para a API de fluxo de preços da OANDA ea API de negociação. Cada subdicionário contém três pontos de extremidade separados da API: real. Prática e sandbox. A API do sandbox é puramente para testar o código e para verificar se não há erros ou erros. Ele não tem as garantias de disponibilidade das APIs reais ou práticas. A API prática, em essência, fornece a capacidade de comércio de papel. Ou seja, fornece todos os recursos da API real em uma conta de prática simulada. A API real é apenas isso - é a negociação ao vivo Se você usar esse ponto de extremidade em seu código, ele será negociado contra o saldo da sua conta real. SER EXTREMAMENTE CUIDADOSO IMPORTANTE: Ao negociar contra a API prática lembre-se que um custo de transação importante, que de impacto de mercado. Não é considerado. Uma vez que nenhum comércio está sendo realmente colocado no ambiente, este custo deve ser contabilizado de outra forma em outro lugar usando um modelo de impacto de mercado se você deseja avaliar realisticamente o desempenho. A seguir, estamos usando a conta de prática como dada pela configuração DOMAIN. Precisamos de dois dicionários separados para os domínios, um para cada componente de streaming e trading API. Finalmente temos o ACCESSTOKEN e ACCOUNTID. Ive preenchido os dois abaixo com IDs fictícios assim que você precisará utilizar o seu próprio, que pode ser acessado a partir da página conta OANDA: O próximo passo é definir os eventos que a fila irá usar para ajudar a todos os componentes individuais comunicar. Precisamos de dois: TickEvent e OrderEvent. O primeiro armazena informações sobre dados de mercado de instrumentos, tais como o (melhor) lance / pedido eo tempo de negociação. O segundo é usado para transmitir ordens para o manipulador de execução e, portanto, contém o instrumento, o número de unidades para o comércio, o tipo de ordem (mercado ou limite) eo lado (ou seja, comprar e vender). Para o nosso código de eventos à prova de futuro, vamos criar uma classe base chamada Evento e todos os eventos herdarão isso. O código é fornecido abaixo em events. py: A próxima classe que vamos criar irá lidar com a estratégia de negociação. Nesta demo vamos criar uma estratégia um pouco absurda que simplesmente recebe todos os carrapatos do mercado e em cada tick 5 tick aleatoriamente compra ou vende 10.000 unidades de EUR / USD. Claramente esta é uma estratégia ridícula No entanto, é fantástico para fins de testes, porque é fácil de codificar e entender. Em entradas do diário futuro, estaremos substituindo isso por algo significativamente mais emocionante que (esperamos) gire lucro. O arquivo strategy. py pode ser encontrado abaixo. Permite trabalhar através dele e ver o que está acontecendo. Em primeiro lugar, importamos a biblioteca aleatória eo objeto OrderEvent de events. py. Precisamos da lib aleatória para selecionar uma ordem de compra ou venda aleatória. Precisamos de OrderEvent, pois é assim que o objeto de estratégia enviará ordens para a fila de eventos, que será mais tarde executada pelo manipulador de execução. A classe TestRandomStrategy simplesmente toma o instrumento (neste caso EUR / USD), o número de unidades ea fila de eventos como um conjunto de parâmetros. Em seguida, cria um contador de carrapatos que é usado para dizer quantas ocorrências TickEvent ele viu. A maior parte do trabalho ocorre no método calculatesignals, que simplesmente leva um evento, determina se ele é um TickEvent (caso contrário, ignore) e incrementa o contador de carrapatos. Em seguida, verifica para ver se a contagem é divisível por 5 e, em seguida, aleatoriamente compra ou vende, com uma ordem de mercado, o número especificado de unidades. Sua certamente não é a maior estratégia de negociação de mundos, mas será mais do que adequado para nossos propósitos de teste de API de corretagem OANDA O próximo componente é o manipulador de execução. Esta classe é encarregada de atuar em instâncias OrderEvent e fazer pedidos para o corretor (neste caso OANDA) de forma estúpida. Ou seja, não há nenhuma gestão de risco ou sobreposição de construção de potfolio. O manipulador de execução irá simplesmente executar qualquer ordem que tenha sido dada. Devemos passar todas as informações de autenticação para a classe Execution, incluindo o domínio (practice, real ou sandbox), o token de acesso e o ID da conta. Em seguida, criamos uma conexão segura com httplib. Um dos Pythons construídos em bibliotecas. A maior parte do trabalho ocorre em executeorder. O método requer um evento como um parâmetro. Em seguida, constrói dois dicionários - os cabeçalhos e os parâmetros. Esses dicionários serão então codificados corretamente (parcialmente por urllib, outra biblioteca Python) para serem enviados como uma solicitação HTTP POST para a API OANDAs. Passamos os parâmetros de cabeçalho Content-Type e Authorization, que incluem nossas informações de autenticação. Além disso, codificamos os parâmetros, que incluem o instrumento (EUR / USD), unidades, tipo de ordem e lado (compra / venda). Finalmente, fazemos o pedido e salvamos a resposta: O componente mais complexo do sistema de negociação é o objeto StreamingForexPrices, que lida com as atualizações de preço de mercado da OANDA. Existem dois métodos: connecttostream e streamtoqueue. O primeiro método usa a biblioteca de solicitações Python para se conectar a um soquete de transmissão com os cabeçalhos e parâmetros apropriados. Os parâmetros incluem a ID da conta ea lista de instrumentos necessários que devem ser ouvidas para actualizações (neste caso, é apenas EUR / USD). Observe a seguinte linha: Isso indica que a conexão deve ser transmitida e, portanto, mantida aberta de forma longa. O segundo método, streamtoqueue. Na verdade tenta se conectar ao fluxo. Se a resposta não for bem sucedida (ou seja, o código de resposta não é HTTP 200), então simplesmente retornar e sair. Se for bem-sucedido, tentaremos carregar o pacote JSON retornado em um dicionário Python. Finalmente, convertemos o dicionário Python com o instrumento, bid / ask e timestamp em um TickEvent que é enviado para a fila de eventos: Agora temos todos os principais componentes no lugar. O passo final é encerrar tudo o que temos escrito até agora em um programa principal. O objetivo deste arquivo, conhecido como trading. py. É criar dois segmentos separados. Um dos quais executa o manipulador de preços eo outro que executa o manipulador de negociação. Por que precisamos de dois threads separados Simplificando, estamos executando duas partes separadas de código, os quais estão continuamente em execução. Se fôssemos criar um programa não-threaded, então o soquete streaming usado para as atualizações de preços jamais seria liberado de volta para o caminho do código principal e, portanto, nunca seria realmente realizar qualquer negociação. Da mesma forma, se executássemos o loop comercial (veja abaixo), nunca retornaríamos o caminho do fluxo para o soquete de streaming de preços. Portanto, precisamos de vários segmentos, um para cada componente, para que eles possam ser realizados de forma independente. Ambos se comunicarão entre si através da fila de eventos. Vamos examinar isso um pouco mais. Criamos dois segmentos separados com as seguintes linhas: Passamos o nome da função ou método para o argumento de palavra-chave de destino e passamos um iterável (como uma lista ou tupla) para o argumento de palavras-chave args, que passa esses argumentos para o método real /função. Finalmente nós começamos ambos os segmentos com as seguintes linhas: Assim, somos capazes de executar dois, efetivamente infinito loop, segmentos de código de forma independente, que ambos se comunicam através da fila de eventos. Observe que a biblioteca de threading Python não produz um verdadeiro multi-core multithreaded ambiente devido à implementação CPython do Python eo Global Interpreter Lock (GIL). Se você gostaria de ler mais sobre multithreading em Python, por favor, dê uma olhada neste artigo. Vamos examinar o resto do código em detalhes. Em primeiro lugar, importamos todas as bibliotecas necessárias, incluindo Fila. Threading e tempo. Importamos então todos os arquivos de código acima. Eu pessoalmente prefiro capitalizar quaisquer configurações, que é um hábito que eu peguei de trabalhar com o Django Depois que definimos a função de comércio, que foi explicado em Python-pseudocódigo acima. Um loop while infinito é executado (enquanto True:) que continuamente sondagens da fila de eventos e só ignora o loop se for encontrado vazio. Se um evento é encontrado, então é um TickEvent ou um OrderEvent e, em seguida, o componente apropriado é chamado para executá-lo. Neste caso, é um manipulador de estratégia ou de execução. O loop, em seguida, simplesmente dorme para segundos de pulsação (neste caso, 0,5 segundos) e continua. Finalmente, definimos o ponto de entrada principal do código na função principal. É bem comentado abaixo, mas vou resumir aqui. Em essência, instanciamos a fila de eventos e definimos os instrumentos / unidades. Em seguida, criamos a classe StreamingForexPrices streaming de preços e, em seguida, subseqüentemente o manipulador execução Execution. Ambos recebem os detalhes de autenticação necessários fornecidos pela OANDA ao criar uma conta. Em seguida, criamos a instância TestRandomStrategy. Finalmente, definimos os dois threads e, em seguida, iniciá-los: Para executar o código, você simplesmente precisa colocar todos os arquivos no mesmo diretório e chamar o seguinte no terminal: Note que para parar o código nesta fase, Processo Python. Via Ctrl-Z ou equivalente Ive não adicionou um thread adicional para lidar com a procura do sys. exit () que seria necessário para parar o código com segurança. Uma maneira potencial de parar o código em uma máquina Ubuntu / Linux é digitar: E então passar a saída deste (um número de processo) para o seguinte: Onde PROCESSID deve ser substituído pela saída de pgrep. Note que isto NÃO é uma prática particularmente boa Em artigos posteriores nós estaremos criando um mecanismo mais sofisticado de parar / iniciar que faz uso da supervisão de processo de Ubuntus para ter o sistema de negociação funcionando 24/7. A saída após 30 segundos ou assim, dependendo da hora do dia em relação ao horário de negociação principal para EUR / USD, para o código acima, é dada abaixo: As cinco primeiras linhas mostram os dados de carrapato JSON retornados de OANDA com bid / ask Preços. Posteriormente, você pode ver a saída de ordem de execução, bem como a resposta JSON retornado de OANDA confirmando a abertura de um comércio de compra de 10.000 unidades de EUR / USD eo preço que foi alcançado em. Isso continuará a ser executado indefinidamente até você matar o programa com um comando Ctrl-Z ou similar. O que vem em seguida Em artigos posteriores, vamos realizar algumas melhorias muito necessárias, incluindo: Estratégias reais - Estratégias de Forex adequadas que geram sinais lucrativos. Infraestrutura de produção - Implementação de servidor remoto e sistema de comércio monitorado 24/7, com capacidade de parar / iniciar. Portfólio e gestão de risco - Portfólio e sobreposições de risco para todas as ordens sugeridas a partir da estratégia. Múltiplas Estratégias - Construindo um portfólio de estratégias que se integram à superposição de gerenciamento de risco Como acontece com o backtestter de ações, também precisamos criar um módulo de backtesting forex. Isso nos permitirá realizar pesquisas rápidas e facilitar a implantação de estratégias. Código Completo settings. py (lembre-se de alterar ACCOUNTID e ACCESSTOKEN): QSForex é um open-source test-driven backtesting e plataforma de negociação ao vivo para uso nos mercados de câmbio (forex), atualmente em um estado alfa. Ele foi criado como parte da série Forex Trading Diary em QuantStart para fornecer a comunidade comercial sistemática com um mecanismo de negociação robusto que permite a implementação direta de estratégia forex e testes. O software é fornecido sob uma licença MIT permissiva (veja abaixo). Open-Source - O QSForex foi lançado sob uma Licença de MIT de código aberto extremamente permissiva, que permite o uso completo em pesquisas e aplicações comerciais, sem restrições, mas sem garantia de qualquer tipo. Free - QSForex é totalmente gratuito e não custa nada para download ou uso. 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 - QSForex é escrito na linguagem de programação Python para suporte cruzado direto. 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 - QSForex é completamente 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 testadas. Backtesting - O QSForex apresenta backtesting de par multi-moeda de vários dias. Trading - A QSForex atualmente oferece suporte a negociação intraday ao vivo usando a OANDA Brokerage API 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, que você precisará para realizar a negociação ao vivo. Eu explico como realizar isso neste artigo: Quantstart / artigos / Forex-Trading-Diary-1-Automated-Forex-Trading-com-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 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, digitando os seguintes comandos no terminal: Isso criará um novo ambiente virtual para instalar os pacotes em. Supondo que você baixou o repositório gist QSForex para 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: Tempo como NumPy, SciPy, Pandas, Scikit-Learn e Matplotlib devem ser compilados. Há muitos pacotes necessários para que isso funcione, por favor, dê uma olhada nesses 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 o diretório de instalação do QSForex para poder chamar 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ática ou negociação ao vivo, então você pode executar python trading / trade. py. Que utilizará a estratégia de negociação padrão do TestStrategy. Isso simplesmente compra ou vende um par de moedas a cada 5 tick. É puramente para testes - não usá-lo 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, p. MeanReversionMultiPairStrategy e verifique se ele tem um método calculatesignals. Você precisará passar esta classe a lista de pares, bem como a fila de eventos, como em trading / trading. py. Consulte estratégia / estratégia. py para obter detalhes. 6) A fim de realizar qualquer backtesting é necessário para gerar dados forex simulados ou download histórico tiquetaquear dados. Se você quiser simplesmente tentar o software para fora, a maneira mais rápida de gerar um exemplo 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 definida para um diretório no qual você deseja que os dados históricos sejam transmitidos. Em seguida, você precisa executar generatesimulatedpair. py. Que está sob o diretório scripts /. Ele espera um único argumento de linha de comando, que neste caso é o par de moedas no formato BBBQQQ. Por exemplo: Neste estágio, o script é codificado para criar um único mês de dados para janeiro de 2014. Ou seja, você verá arquivos individuais, do formato BBBQQQYYYYMMDD. csv (por exemplo, GBPUSD20140112.csv) aparecem no seu CSVDATADIR para todos os dias úteis em Esse mês. Se você deseja alterar o mês / ano da saída de dados, basta modificar o arquivo e voltar a executar. 7) Agora que os dados históricos foram gerados, é possível realizar um backtest. O próprio arquivo backtest é armazenado em backtest / backtest. py. Mas isso só contém a classe Backtest. Para realmente executar um backtest você precisa instanciar essa classe e fornecer os módulos necessários. A melhor maneira de ver como isso é feito é observar a implementação do Crossover de Moving Average no arquivo examples / mac. py e usá-lo como um modelo. Isso faz uso do MovingAverageCrossStrategy que é encontrado em strategy / strategy. py. Isso padrão para negociação tanto GBP / USD e EUR / USD para demonstrar o uso de par de moedas múltiplas. Ele usa os dados encontrados no CSVDATADIR. Para executar o exemplo backtest, basta executar o seguinte: Isso levará algum tempo. No meu sistema de desktop Ubuntu em casa, com os dados históricos gerados via generatesimulatedpair. py. Leva cerca de 5-10 minutos para ser executado. Uma grande parte deste cálculo ocorre no final do backtest real, quando o levantamento está sendo calculado, por favor, lembre-se que o código não desligou Por favor, deixe-o até a conclusão. 8) Se você quiser ver o desempenho do backtest você pode simplesmente usar output. py para ver uma curva de equidade, retornos de período (ou seja, retornos de tick-to-tick) e uma curva de redução: E thats it 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 do DukasCopy (dukascopy / swiss / english / marketwatch / historical /). Se você tiver alguma dúvida sobre a instalação, então sinta-se livre para me enviar um e-mail no mikequantstart. Se você tiver quaisquer bugs ou outros problemas que você acha que podem ser devido à codebase especificamente, sinta-se livre para abrir uma questão Github aqui: github / mhallsmoore / qsforex / issues Copyright (c) 2015 Michael Halls-Moore A qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o Software), para negociar o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, modificar, fundir, publicar, distribuir, sublicenciar e / Ou vender cópias do Software e permitir que as pessoas a quem o Software é fornecido o façam, sujeito à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 TAL COMO É, SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM FIM ESPECÍFICO E NÃO-INFRAÇÃ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 UMA ACÇÃO DE CONTRATO, DANO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, EM RELAÇÃO AO SOFTWARE OU AO USO OU OUTROS NEGÓCIOS NA PROGRAMAS. Negação de Negociação de Forex Trocando o câmbio na margem carrega um nível elevado do risco, e não pode ser apropriado para todos os investors. O desempenho passado não é indicativo de resultados futuros. O alto grau de alavancagem pode trabalhar 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 pelo risco. A possibilidade existe que você poderia sustentar uma perda de alguns ou todos do seu investimento inicial e, portanto, você não deve investir o dinheiro que você não pode dar ao luxo de perder. Você deve estar ciente de todos os riscos associados com negociação de câmbio, e procurar aconselhamento de um conselheiro financeiro independente, se você tiver qualquer dúvida. QSForex é um open-source backtesting evento-driven e plataforma de negociação ao vivo para uso no câmbio ), Atualmente em um estado alfa. Ele foi criado como parte da série Forex Trading Diary em QuantStart para fornecer a comunidade comercial sistemática com um mecanismo de negociação robusto que permite a implementação direta de estratégia forex e testes. O software é fornecido sob uma licença MIT permissiva (veja abaixo). Open-Source - O QSForex foi lançado sob uma Licença de MIT de código aberto extremamente permissiva, que permite o uso completo em pesquisas e aplicações comerciais, sem restrições, mas sem garantia de qualquer tipo. Free - QSForex é totalmente gratuito e não custa nada para download ou uso. 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 - QSForex é escrito na linguagem de programação Python para suporte cruzado direto. 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 - QSForex é completamente 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 testadas. Backtesting - O QSForex apresenta backtesting de par multi-moeda de vários dias. Trading - A QSForex atualmente oferece suporte a negociação intraday ao vivo usando a OANDA Brokerage API 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, que você precisará para realizar a negociação ao vivo. Eu explico como realizar isso neste artigo: Quantstart / artigos / Forex-Trading-Diary-1-Automated-Forex-Trading-com-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 principal 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, digitando os seguintes comandos no terminal: Isso criará um novo ambiente virtual para instalar os pacotes em. Assuming you downloaded the QSForex git repository into an example directory such as /projects/qsforex/ (change this directory below to wherever you installed QSForex), then in order to install the packages you will need to run the following commands: This will take some time as NumPy, SciPy, Pandas, Scikit-Learn and Matplotlib must be compiled. There are many packages required for this to work, so please take a look at these two articles for more information: You will also need to create a symbolic link from your site-packages directory to your QSForex installation directory in order to be able to call import qsforex within the code. To do this you will need a command similar to the following: Make sure to change /projects/qsforex to your installation directory and /venv/qsforex/lib/python2.7/site-packages/ to your virtualenv site packages directory. You will now be able to run the subsequent commands correctly. 5) At this stage, if you simply wish to carry out practice or live trading then you can run python trading/trading. py. which will use the default TestStrategy trading strategy. This simply buys or sells a currency pair every 5th tick. It is purely for testing - do not use it in a live trading environment If you wish to create a more useful strategy, then simply create a new class with a descriptive name, e. g. MeanReversionMultiPairStrategy and ensure it has a calculatesignals method. You will need to pass this class the pairs list as well as the events queue, as in trading/trading. py . Please look at strategy/strategy. py for details. 6) In order to carry out any backtesting it is necessary to generate simulated forex data or download historic tick data. If you wish to simply try the software out, the quickest way to generate an example backtest is to generate some simulated data. The current data format used by QSForex is the same as that provided by the DukasCopy Historical Data Feed at dukascopy/swiss/english/marketwatch/historical/ . To generate some historical data, make sure that the CSVDATADIR setting in settings. py is to set to a directory where you want the historical data to live. You then need to run generatesimulatedpair. py. which is under the scripts/ directory. It expects a single command line argument, which in this case is the currency pair in BBBQQQ format. For example: At this stage the script is hardcoded to create a single months data for January 2014. That is, you will see individual files, of the format BBBQQQYYYYMMDD. csv (e. g. GBPUSD20140112.csv ) appear in your CSVDATADIR for all business days in that month. If you wish to change the month/year of the data output, simply modify the file and re-run. 7) Now that the historical data has been generated it is possible to carry out a backtest. The backtest file itself is stored in backtest/backtest. py. but this only contains the Backtest class. To actually execute a backtest you need to instantiate this class and provide it with the necessary modules. The best way to see how this is done is to look at the example Moving Average Crossover implementation in the examples/mac. py file and use this as a template. This makes use of the MovingAverageCrossStrategy which is found in strategy/strategy. py. This defaults to trading both GBP/USD and EUR/USD to demonstrate multiple currency pair usage. It uses data found in CSVDATADIR . To execute the example backtest, simply run the following: This will take some time. On my Ubuntu desktop system at home, with the historical data generated via generatesimulatedpair. py. it takes around 5-10 mins to run. A large part of this calculation occurs at the end of the actual backtest, when the drawdown is being calculated, so please remember that the code has not hung up Please leave it until completion. 8) If you wish to view the performance of the backtest you can simply use output. py to view an equity curve, period returns (i. e. tick-to-tick returns) and a drawdown curve: And thats it At this stage you are ready to begin creating your own backtests by modifying or appending strategies in strategy/strategy. py and using real data downloaded from DukasCopy (dukascopy/swiss/english/marketwatch/historical/ ). If you have any questions about the installation then please feel free to email me at mikequantstart . If you have any bugs or other issues that you think may be due to the codebase specifically, feel free to open a Github issue here: github/mhallsmoore/qsforex/issues Copyright (c) 2015 Michael Halls-Moore Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Forex Trading Disclaimer Trading foreign exchange on margin carries a high level of risk, and may not be suitable for all investors. O desempenho passado não é indicativo de resultados futuros. O alto grau de alavancagem pode trabalhar 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 pelo risco. A possibilidade existe que você poderia sustentar uma perda de alguns ou todos do seu investimento inicial e, portanto, você não deve investir o dinheiro que você não pode dar ao luxo de perder. Você deve estar ciente de todos os riscos associados com negociação de câmbio, e procurar aconselhamento de um consultor financeiro independente, se você tiver quaisquer dúvidas.

No comments:

Post a Comment