Thursday 28 September 2017

Quantstart Forex


Forex Trading Diary 3 - Open Sourcing the Forex Trading System Na entrada de hoje do Forex Trading Diary Eu quero discutir o plano de longo prazo para o sistema de negociação forex. Além disso, quero delinear como usei o tipo de dados decimais Pythons para tornar os cálculos mais precisos. Até o momento, estamos experimentando a API OANDA Rest, para ver como é comparado com a API fornecida pela Interactive Brokers. Nós também vimos como adicionar um elemento básico de replicação de portfólio como o primeiro passo para um sistema de teste de retorno adequado para eventos. Também tive alguns comentários úteis sobre os dois artigos anteriores (1 e 2), o que sugere que muitos de vocês estão interessados ​​em mudar e ampliar o código. Open Sourcing the Forex Trading System Por razões acima descritas, eu decidi abrir a fonte do sistema de negociação forex. O que isso significa Isso significa que todos os códigos atuais e futuros estarão disponíveis de graça, sob uma licença de código aberto MIT liberal, no site de controle de versão do Github no seguinte URL: githubmhallsmooreqsforex. Para aqueles de vocês que usaram o git e o Github antes, você poderá clonar o retomado e começar a modificá-lo para seus próprios fins. O QuantStart Automated Forex Trading System agora é open-source sob uma licença MIT liberal. Você pode encontrar o código mais recente no Github sob o repositório qsforex em githubmhallsmooreqsforex. Para aqueles de vocês que são novos para o controle de versão de origem, você provavelmente quer ler sobre como o git (e o controle de versão em geral) funcionam com o fantástico ebook grátis Pro Git. Vale a pena passar algum tempo aprendendo sobre o controle de origem, pois isso irá poupar-lhe uma grande quantidade de dor de cabeça futura, se você gastar muito tempo programando e atualizando projetos. O início rápido para um sistema Ubuntu é instalar o git: você precisará fazer Um diretório para o projeto qsforex para viver e clonar o projeto do site Github da seguinte maneira: neste momento, você precisará criar um ambiente virtual no qual executar o código: você precisará instalar os requisitos (isto levará Algum tempo): Finalmente, você precisará criar um link simbólico em seu ambiente virtual Python para permitir que você digite importar qsforex no seu código (e executá-lo): conforme mencionei nas entradas anteriores, você precisará criar as variáveis ​​de ambiente necessárias Para suas credenciais de autenticação OANDA. Por favor, veja a entrada do diário 2 para obter instruções sobre como fazer isso. Preste atenção ao README associado ao repo, pois contém instruções de instalação, um aviso legal e uma garantia sobre o uso do código. Uma vez que o software está no modo alfa, essas instruções se tornarão mais diretas à medida que o tempo avança. Em particular, tentarei enrolar o projeto em um pacote Python para que ele possa ser facilmente instalado via pip. Se você tiver alguma dúvida sobre o procedimento de instalação, então não hesite em me enviar um e-mail no mikequantstart. Plano de longo prazo A filosofia do sistema de negociação forex, como no resto do site QuantStart, é tentar imitar o comércio da vida real tanto quanto possível em nosso backtesting. Isso significa incluir os detalhes que muitas vezes são excluídos de mais situações de backtesting orientadas para pesquisa. Latência, interrupções do servidor, automação, monitoramento, custos de transação realistas, todos serão incluídos nos modelos para nos dar uma boa idéia de quão bem uma estratégia é susceptível de realizar. Uma vez que teremos acesso aos dados do tick (timestamps bidask), poderemos incorporar o spread nos custos de transação. Nós também podemos modelar o deslizamento. É menos direto modelar o impacto do mercado, embora isso seja menos preocupante em menores montantes de negociação. Além dos custos de transação, queremos modelar o gerenciamento de portfólio robusto usando sobreposições de risco e dimensionamento de posição. Então, o que está atualmente incluído no sistema de negociação Forex até à data Arquitetura dirigida a eventos - O sistema de negociação forex foi projetado como um sistema baseado em eventos desde o início, pois é assim que um sistema de negociação intradía será implementado em um ambiente ao vivo . Streaming de preços - Temos um objeto básico de transmissão de preços. Isso atualmente administra assinatura apenas para um único par, mas podemos facilmente modificar isso para se inscrever em vários pares de moedas. Geração de Sinal - Podemos incorporar estratégias de negociação (baseadas diretamente nos preços atualizados passados ​​e atuais) usando o objeto Estratégia, que cria objetos SignalEvent. Execução de Ordem - Temos um sistema de execução de ordens ingênuo que envia cjamente ordens do Portfolio para OANDA. Por cegamente, quero dizer que não há gerenciamento de risco ou dimensionamento de posição sendo realizado, nem qualquer execução algorítmica que possa levar a custos de transação reduzidos. Moeda Base do GBP - Para manter as coisas simples, eu só escrevi o sistema para a moeda base do GBP. Este é talvez o aspecto mais importante a modificar dado quantos de vocês terão contas de prática denominadas em USD, EUR, CAD, JPY, AUD e NZD GBPUSD Trading - Escolhi o cabo como o par de moedas para testar os objetos iniciais de Posição e Portfolio com. Manter vários pares de moedas é um importante passo seguinte. Isso envolverá modificação na posição e nos cálculos do portfólio. Manipulação decimal - Qualquer sistema de comércio de produção deve lidar corretamente com cálculos de moeda. Em particular, os valores de moeda não devem ser armazenados como tipos de dados de ponto flutuante, uma vez que os erros de arredondamento serão acumulados. Por favor, veja este fantástico artigo sobre representações de ponto flutuante para mais detalhes. LongShort Trading - Entre as entradas diárias 2 e 3 adicionei a capacidade de reduzir um par de moedas (ao contrário de apenas ser capaz de passar por muito tempo). Crucialmente, isso também é testado por unidade. Manipulação de portfólio local - Na minha opinião, realizar um backtest que infla o desempenho da estratégia devido a pressupostos irrealistas é irritante na melhor das hipóteses e extremamente improdutivo no pior. Apresentar um objeto de portfólio local que replica os cálculos OANDA significa que podemos verificar nossos cálculos internos enquanto realizamos a prática Negociação. O que nos dá maior confiança quando usamos mais tarde esse mesmo objeto de portfólio para fazer backtesting em dados históricos. Testes unitários para PositionPortfolio - Embora não tenha mencionado isso diretamente nas entradas 1 e 2 do diário, eu realmente escrevi alguns testes unitários para os objetos Portfolio e Position. Uma vez que estes são tão cruciais para os cálculos da estratégia, é preciso ter a certeza de que eles funcionam como esperado. Um benefício adicional de tais testes é que eles permitem que o cálculo subjacente seja modificado, de modo que, se todos os testes ainda passam, podemos ter certeza de que o sistema geral continuará a se comportar conforme o esperado. Nesta fase, o Forex Trading System está faltando a seguinte funcionalidade: Slippage Handling - O sistema está gerando uma série de derrapagens devido à natureza de alta freqüência dos dados de ticks fornecidos pela OANDA. Isso significa que o saldo da carteira calculado localmente não reflete o saldo calculado pela OANDA. Até que o ajuste correto do evento e o ajuste do deslizamento sejam realizados, isso significará que um backtest não refletirá corretamente a realidade. Moedas básicas múltiplas - atualmente estamos restritos a GBP. No mínimo, precisamos incluir as principais denominações monetárias - USD, EUR, CAD, AUD, JPY e NZD. Múltiplos pares de moedas - Da mesma forma, precisamos apoiar os principais pares de moedas além do cabo (GBPUSD). Existem dois aspectos para isso. O primeiro é manipular corretamente os cálculos quando nem a base ou a cotação de um par de moedas é igual à moeda da denominação da conta. O segundo aspecto é apoiar posições múltiplas para que possamos negociar um portfólio de pares de moedas. Gerenciamento de riscos - Muitos testes de pesquisa ignoram completamente o gerenciamento de riscos. Infelizmente, isso geralmente é necessário para a brevidade ao descrever as regras de uma estratégia. Na realidade, devemos usar uma sobreposição de risco ao negociar, caso contrário é extremamente provável que sofreremos uma perda substancial em algum estágio. Isso não quer dizer que a gestão de riscos possa evitar isso inteiramente, mas certamente o torna menos provável. Otimização de portfólio - Em um cenário institucional, teremos um mandato de investimento, que ditará um sistema robusto de gerenciamento de portfólio com várias regras de alocação. Em uma configuração de pessoal de varejo, talvez desejemos usar uma abordagem de dimensionamento de posição, como o Critério de Kelly, para maximizar nossa taxa de crescimento de longo prazo. Estratégias robustas - Eu só demonstrei algumas estratégias de brinquedos gerando geração de sinal aleatório até à data. Agora que estamos começando a criar um sistema de negociação forex intraday confiável, devemos começar a realizar algumas estratégias mais interessantes. Futuras entradas no diário se concentrarão em estratégias tiradas de uma mistura de filtros de indicadores técnicos, bem como modelos de séries temporais e técnicas de aprendizado de máquina. Implantação remota - Uma vez que estamos potencialmente interessados ​​em negociar 24 horas (pelo menos durante a semana), exigimos uma configuração mais sofisticada do que executar o backtester em uma máquina local de mesa para uso em casa. É vital que criemos uma implantação de servidor remoto robusto do nosso sistema com redundância e monitoramento adequados. Backtesting Histórico - Construímos o objeto Portfolio para nos permitir realizar backtesting realista. Nesta fase, estamos faltando um sistema histórico de armazenamento de dados de carrapatos. Nos artigos subsequentes, analisaremos a obtenção de dados históricos do carrapato e armazená-lo em um banco de dados apropriado, como o HDF5. Trade Database - Eventualmente, gostaríamos de armazenar nossos negócios ao vivo em nosso próprio banco de dados. Isso nos permitirá realizar nossas próprias análises em dados de negociação ao vivo. Uma boa recomendação para um banco de dados relacional seria PostgreSQL ou MySQL. Monitoramento e alta disponibilidade - Como estamos considerando um sistema intradía de alta freqüência, devemos colocar um monitoramento abrangente e uma redundância de alta disponibilidade no local. Isso significa informar sobre o uso da CPU, uso do disco, IO de rede, latência e verificação de que qualquer script periódico esteja configurado para continuar sendo executado. Além disso, precisamos de uma estratégia de backup e restauração. Pergunte-se quais os planos de backup que você teria no lugar se você tivesse grandes posições abertas, em um mercado volátil e seu servidor de repente morreu. Acredite-me, acontece Integração de vários corretores de FIX - No momento estamos fortemente acoplados ao corretor de OANDA. Como eu disse, isso é simplesmente porque eu encontrei sua API e achei que ela era uma oferta moderna. Há muitos outros corretores por aí, muitos dos quais suportam o protocolo FIX. A adição de uma capacidade FIX aumentaria o número de corretores que poderiam ser usados ​​com o sistema. GUI Controle e Relatórios - Agora o sistema é completamente consolecommand baseado em linha. No mínimo, precisaremos de algum gráfico básico para exibir os resultados do backtest. Um sistema mais sofisticado incorporará estatísticas resumidas de negócios, métricas de desempenho de nível estratégico, bem como o desempenho geral do portfólio. Esta GUI poderia ser implementada usando um sistema de janelas multiplataforma, como Qt ou Tkinter. Também pode ser apresentado usando um front-end baseado na web, utilizando um framework web como o Django. Como pode ser visto, há muita funcionalidade deixada no roteiro. Dito isto, cada nova entrada no diário (e contribuições potenciais da comunidade) moverá o projeto para a frente. Tipos de dados decimais Agora que discutimos o plano a longo prazo, quero apresentar algumas das alterações que fiz no código desde a entrada no diário 2. Em particular, quero descrever como modifiquei o código para lidar com os dados decimais - Digite em vez de usar armazenamento em ponto flutuante. Esta é uma mudança extremamente importante, uma vez que as representações de ponto flutuante são uma fonte substancial de erro a longo prazo nos sistemas de gerenciamento de pedidos e portfólio. O Python suporta nativamente representações decimais a uma precisão arbitrária. A funcionalidade está contida na biblioteca decimal. Em particular, precisamos modificar todo valor que aparece em um cálculo de Posição para um tipo de dados Decimal. Isso inclui as unidades, exposição, pips, lucro e lucro percentual. Isso garante que temos o controle total de como os problemas de arredondamento são tratados quando se trata de representações de moeda que possuem duas casas decimais. Em particular, precisamos escolher o método de arredondamento. O Python suporta alguns tipos diferentes, mas nós iremos com ROUNDHALFDOWN. Que arredonda para o inteiro mais próximo com laços indo em direção a zero. Aqui está um exemplo de como o código é modificado para lidar com tipos de dados decimais de suas representações de ponto flutuante anteriores. O seguinte é uma lista de position. py: Observe que devemos fornecer Decimal com um argumento de string, em vez de um argumento de ponto flutuante. Isso ocorre porque uma string especifica precisamente a precisão do valor, enquanto que um tipo de ponto flutuante não. Note-se também que, quando começarmos a armazenar nossos negócios em um banco de dados relacional (conforme descrito acima no roteiro), precisamos ter certeza de que, mais uma vez, usaremos o tipo de dados correto. O PostgreSQL e o MySQL suportam uma representação decimal. É vital que utilizemos esses tipos de dados quando criamos nosso esquema de banco de dados, caso contrário, nos armaremos em erros de arredondamento que são extremamente difíceis de diagnosticar. Para aqueles que estão interessados ​​em uma discussão mais profunda sobre essas questões, em matemática e ciência da computação, Assunto da Análise Numérica abrange questões de armazenamento em ponto flutuante, entre muitos outros tópicos interessantes. Em entradas de diário subseqüentes, vamos discutir como apliquei testes de unidade para o código e como podemos ampliar o software para mais pares de moedas, modificando os cálculos de posição. Código Python Completo Uma vez que o código fonte completo do projeto agora é de código aberto, sob uma licença MIT. Sempre pode ser descoberto no githubmhallsmooreqsforex. Com a documentação que o acompanha. Se você gostaria de ler as outras entradas da série, siga os links abaixo: QSForex é uma plataforma de negociação de backtesting e de 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 orientada por eventos - O QSForex é completamente orientado para 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 teste de pesquisa 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: quantstartarticlesForex-Trading-Diary-1-Automated-Forex-Trading-with-the-OANDA-API. 2) Clonar este repositório git em um local adequado em sua máquina usando o seguinte comando em seu terminal: git clone githubmhallsmooreqsforex. git. Alternativa, você pode baixar o arquivo zip do ramo mestre atual no githubmhallsmooreqsforexarchivemaster. 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 projectsqsforex (mude este diretório abaixo para onde você instalou QSForex), então, para instalar os pacotes, você precisará executar os seguintes comandos: Isso levará algum 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 projectsqsforex para seu diretório de instalação e venvqsforexlibpython2.7site-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 o python tradingtrading. 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 esta classe a lista de pares, bem como a fila de eventos, como em tradingtrading. py. Por favor, veja estrategicamente 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 no dukascopyswissenglishmarketwatchhistorical. 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á no diretório de scripts. 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 no seu CSVDATADIR para todos os dias úteis em Naquele mês. Se você deseja alterar o mês da saída de dados, simplesmente modifique o arquivo e re-execute. 7) Agora que os dados históricos foram gerados, é possível realizar um backtest. O arquivo backtest em si é armazenado em backtestbacktest. 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 é olhar para o exemplo de Implementação de Crossover em Moving Average no arquivo examplesmac. py e usá-lo como um modelo. Isso faz uso do MovingAverageCrossStrategy que é encontrado em strategystrategy. py. Este padrão é a negociação de GBPUSD e EURUSD para demonstrar o 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 backtests, modificando ou adicionando estratégias em strategystrategy. py e usando dados reais baixados da DukasCopy (dukascopyswissenglishmarketwatchhistorical). 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 outros problemas que você acha que podem ser devido especificamente à base de código, sinta-se livre para abrir uma questão Github aqui: githubmhallsmooreqsforexissues Copyright (c) 2015 Michael Halls-Moore É concedida, gratuitamente, a qualquer pessoa Obter uma cópia deste software e dos arquivos de documentação associados (o Software), para lidar com o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar e vender cópias do Software, E para 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.

No comments:

Post a Comment