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 descrever 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 em ambos os 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 significa isso significa que todos os códigos atuais e futuros estarão disponíveis de graça, sob uma licença liberal de MIT aberto, no site de controle de versão do Github no seguinte URL: githubmhallsmooreqsforex. Para aqueles de vocês que usaram git e Github antes, você poderá clonar o repo 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 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 gratuito Pro Git. Vale a pena passar algum tempo aprendendo sobre o controle de origem, pois isso irá poupar-lhe uma enorme quantidade de dor de cabeça futura se você gastar muito tempo programando e atualizando projetos. O início rápido de 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 a 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 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 intradiário 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 do tiquete passado e atual) usando o objeto Estratégia, que cria objetos do 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 de base GBP - Para manter as coisas simples, eu apenas 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 se acumulam. 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 eu não tenha mencionado isso diretamente nas entradas diárias 1 e 2, eu realmente escrevi alguns testes de unidade 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 conforme o 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 forem aprovados, 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 um grande deslizamento devido à natureza de alta freqüência do tick dados 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 combinada 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. As futuras entradas do diário concentrar-se-ão nas estratégias extraídas de uma mistura de filtros de indicadores técnicos, bem como modelos de séries temporais e técnicas de aprendizagem 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. Histórico de Backtesting - 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 morreu de repente. 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 de longo prazo, eu quero apresentar algumas das mudanças que fiz no código desde a entrada do diário 2. Em particular, quero descrever como eu modifiquei o código para lidar com o Decimal data - Digite em vez de usar o 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 para 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 informática, O assunto da Análise Numérica cobre 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: Apenas Primeiros passos com Trading QuantitativeForex Diário de Negociação 5 - Trocando Múltiplos Pares de Moedas Ontem eu publiquei algumas mudanças importantes no software QSForex. Essas mudanças aumentaram a utilidade do sistema significativamente até o ponto em que está quase pronto para back-test de dados de tiques de vários dias em uma variedade de pares de moedas. As seguintes mudanças foram postadas no Github: modificação adicional tanto para os objetos de Posição quanto para Portfolio, a fim de permitir a negociação de múltiplos pares de moedas e as moedas que não estão denominadas na moeda da conta. Assim, uma conta em GBP pode agora negociar EURUSD, por exemplo. Revisão completa de como a posição e carteira de cálculo abre, fecha, adições e remoções de unidades. O objeto Position realiza agora o levantamento pesado deixando um objeto Portfolio relativamente magro. Adição da primeira estratégia não trivial, ou seja, a bem conhecida estratégia de Crossover de média móvel com um par de médias móveis simples (SMA). Modificação para backtest. py para torná-lo single-threaded e determinista. Apesar do meu otimismo de que uma abordagem multi-threaded wouldnt ser muito prejudicial para a precisão de simulação, achei difícil obter resultados backtesting satisfatória com uma abordagem multi-threaded. Introduziu um script de saída muito básico baseado em Matplotlib para visualizar a curva de equidade do portfólio. A geração da curva de equidade está numa fase inicial e ainda requer muito trabalho. Como mencionei na entrada anterior. Para aqueles de vocês que não estão familiarizados com QSForex e estão vindo para esta série diário forex pela primeira vez, eu sugiro fortemente ter uma leitura das seguintes entradas diário para chegar até a velocidade com o software: Bem como a página Github para QSForex : Suporte a Moedas Múltiplas Um recurso que eu tenho continuamente discutido nessas entradas de diário é a capacidade de suportar vários pares de moedas. Nesta fase, agora modifiquei o software para permitir diferentes denominações de contas, já que anteriormente a GBP era a moeda de código rígido. Também é possível negociar em outros pares de moedas, exceto aqueles que consistem em uma base ou cotação em ienes japoneses (JPY). O último é devido a como carrapato tamanhos são caclulated em JPY moedas. Para conseguir isso, modifiquei como o lucro é calculado quando as unidades são removidas ou a posição é fechada. Aqui está o snippet atual para calcular pips, no arquivo position. py: Se fecharmos a posição para realizar um ganho ou perda, precisamos usar o snippet a seguir para closeposition. Também no arquivo position. py: Em primeiro lugar, obtemos os preços de lances e pedidos tanto para o par de moedas como para o par de moedas. Por exemplo, para uma conta denominada em GBP, onde estamos a negociar EURUSD, devemos obter preços para USDGBP, uma vez que EUR é a moeda base e USD é a cotação. Nesta fase, verificamos se a posição em si é uma posição longa ou curta e, em seguida, calcular o preço apropriado remover e citar remover preço, que são dadas por removeprice e qhclose, respectivamente. Nós então atualizamos os preços atuais e médios dentro da posição e finalmente calculamos o PampL multiplicando os pips, o preço de remoção do quotehome e então o número de unidades estava se fechando. Eliminamos completamente a necessidade de discutir a exposição, que era uma variável redundante. Esta fórmula então corretamente fornece a PampL contra qualquer (não-JPY denominado) par de moedas. Reestruturação da Posição e Manejo da Carteira Além da capacidade de trocar vários pares de moeda, também aperfeiçoei como a Posição e a Carteira compartilham a responsabilidade de abrir e fechar posições, bem como adicionar e subtrair unidades. Em particular, Ive mudou muito do código de manipulação de posição que estava no portfolio. py para position. py. Isso é mais natural, pois a posição deve ser cuidar de si mesmo e não delegá-lo para o portfólio Em particular, o addunits. Removeunits e métodos de closeposition foram criados ou aprimorados: Nos dois últimos você pode ver como a nova fórmula para cálculo de lucro é implementada. Grande parte da funcionalidade da classe Portfolio foi assim reduzida de forma correspondente. Em particular os métodos addnewposition. Addpositionunits. As unidades de posicionamento de remoção e a posição de fechamento foram modificadas para levar em conta o fato de que o trabalho de cálculo está sendo feito no objeto Posição: Essencialmente, todos (além da adição) simplesmente verificam se a posição existe para esse par de moedas e então chamam o método de Posição correspondente , Tendo em conta os lucros, se necessário. Estratégia de Crossover Média em Movimento Nós discutimos a estratégia de Crossover Médio em Movimento antes no QuantStart. No contexto do comércio de acções. É uma estratégia de indicador de cama de teste muito útil porque é fácil replicar os cálculos manualmente (pelo menos em freqüências mais baixas), para verificar se o backtester se comporta como deveria. A idéia básica da estratégia é a seguinte: São criados dois filtros separados de média móvel simples, com períodos de retrocesso variáveis, de uma série temporal específica. Os sinais para comprar o ativo ocorrem quando a média móvel de retrocesso mais curta excede a média móvel de retrocesso mais longa. Se a média mais longa subseqüentemente exceder a média mais curta, o ativo é vendido de volta. A estratégia funciona bem quando uma série de tempo entra em um período de forte tendência e, em seguida, lentamente inverte a tendência. A implementação é simples. Em primeiro lugar, fornecemos um método calcrollingsma que nos permite utilizar de forma mais eficiente o cálculo de SMA do período de tempo anterior para gerar o novo, sem precisar recalcular completamente o SMA em cada etapa. Em segundo lugar, geramos sinais em dois casos. No primeiro caso geramos um sinal se o SMA curto excede o SMA longo e não foram longos o par de moedas. No segundo caso geramos um sinal se o SMA longo exceder o SMA curto e já estamos longos. Eu configurei a janela padrão para ser 500 carrapatos para o SMA curto e 2.000 carrapatos para o SMA longo. Obviamente, em uma configuração de produção esses parâmetros seriam otimizados, mas eles funcionam bem para nossos propósitos de teste. Single-Threaded Backtester Outra alteração importante foi modificar o backtesting componente a ser single-threaded, em vez de multi-threaded. Eu fiz essa mudança porque estava tendo dificuldade em sincronizar os segmentos para executar de uma maneira que ocorreria em um ambiente ao vivo. Ele basicamente significava que os preços de entrada e saída eram muito irreal, muitas vezes ocorrendo (virtual) horas após o tiquetaque real tinha sido recebido. Por isso, eu incorporei a transmissão de objetos do TickEvent para o loop backtesting, como você pode ver no seguinte fragmento de backtest. py: observe a linha ticker. streamnexttick (). Isso é chamado antes de uma pesquisa da fila de eventos e, como tal, sempre garantirá que um novo evento de ticks tenha chegado antes que a fila seja consultada novamente. Em particular, isso significa que um sinal é executado à medida que chegam novos dados de mercado, mesmo que haja algum atraso no processo de pedido devido ao deslizamento. Ive também definir um valor maxiters que controla quanto tempo o backtesting loop continua. Na prática, este terá de ser bastante grande quando se lida com várias moedas ao longo de vários dias, mas Ive configurá-lo para um valor padrão que permite a um único dias dados de um par de moedas. O método streamnexttick da classe manipulador de preço é semelhante ao streamtoqueue, exceto que ele chama o iterador next () método manualmente, em vez de executar o ticking streaming em um loop for: Observe que ele pára após a recepção de uma exceção StopIteration. Isso permite que o código para continuar em vez de falhar na exceção. Matplotlib Output Ive também criou um script de saída Matplotlib muito básico para exibir a curva de equidade. Output. py atualmente vive no diretório backtest do QSForex e é dado abaixo: Observe que há uma nova variável settings. py agora chamada OUTPUTRESULTSDIR. Que deve ser definido em suas configurações. Eu tenho que apontar para um diretório temporário em outro lugar no meu sistema de arquivos como eu não quero acidentalmente adicionar qualquer equity backtest resultados para a base de código A curva de equidade funciona com um valor de equilíbrio adicionado a uma lista de dicionários, com um dicionário correspondente a um Horário. Uma vez que o back-test esteja completo, a lista de dicionários é convertida em um Pandas DataFrame e o método tocsv é usado para produzir equity. csv. Este script de saída, em seguida, lê no arquivo e traça a coluna de saldo do subsequente DataFrame. Você pode ver o snippet para o appendequityrow e os métodos de resultados de resultados da classe Portfolio abaixo: Cada vez que o sinal de execução é chamado, o método anterior é chamado e acrescenta o valor timestampbalance ao membro de equidade. No final do backtest é chamado outputresults que simplesmente converte a lista de dicionários para um DataFrame e, em seguida, saídas para o diretório OUTPUTRESULTSDIR especificado. Infelizmente, esta não é uma forma particularmente adequada de criar uma curva de equidade, uma vez que só ocorre quando um sinal é gerado. Isso significa que não leva em consideração o PampL não realizado. Enquanto isso é como ocorre a negociação real (você havent realmente fez algum dinheiro até que você fechar uma posição) isso significa que a curva de equidade permanecerá completamente plana entre as atualizações de saldo. Pior, o Matplotlib irá padronizar a interpolação linear entre esses pontos, proporcionando assim a falsa impressão do PampL não realizado. A solução para este problema é criar um rastreador PampL não realizado para a classe Position que actualiza correctamente em cada tick. Isso é um pouco mais computacionalmente caro, mas permite uma curva de capital mais útil. Este recurso está planejado para uma data posterior Próximas etapas A próxima grande tarefa para QSForex é permitir backtesting de vários dias. Atualmente, o objeto HistoricCSVPriceHandler apenas carrega um único dia de dados do tiquetaque DukasCopy para qualquer par de moeda especificado. Para permitir testes de vários dias, será necessário carregar e transmitir cada dia de forma sequencial para evitar o preenchimento de RAM com todo o histórico de dados de marca. Isso exigirá uma modificação de como funciona o método streamnexttick. Uma vez que isso seja concluído, isso permitirá long-term backtesting de estratégia em vários pares. Outra tarefa é melhorar o resultado da curva de equidade. Para calcular qualquer das métricas de desempenho usuais (como a Ratio de Sharpe), precisaremos calcular os retornos percentuais em um período de tempo específico. No entanto, isso requer que nós bin os dados de carrapatos em barras, a fim de calcular um retorno para um determinado período de tempo. Esse binning deve ocorrer em uma freqüência de amostragem que é semelhante à freqüência de negociação ou o Índice de Sharpe não será reflexo do verdadeiro risco da estratégia. Este binning não é um exercício trivial porque há lotes das suposições que vão em gerar um preço para cada bin. Uma vez que estas duas tarefas estão completas, e dados suficientes foram adquiridos, estaremos em uma posição para backtest uma ampla gama de tick-data com base em estratégias de forex e produzir curvas de equidade líquida da maioria dos custos de transação. Além disso, será extremamente simples para testar essas estratégias na prática papel-trading conta fornecida pela OANDA. Isso deve permitir que você tome decisões muito melhores sobre se deve executar uma estratégia em comparação com um sistema de backtesting mais orientado para pesquisa. O Simple Getting Started with Quantitative TradingQSForex é 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 em QuantStart para fornecer a comunidade de negociação 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 total em aplicações de pesquisa e comerciais, 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. Quaisquer erros são rapidamente determinados e corrigidos. Desenvolvimento de Software - QSForex é escrito na linguagem de programação Python para suporte direto de 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 a Eventos - QSForex é completamente orientada a eventos, tanto para backtesting e negociação ao vivo, o que leva à transição direta de estratégias de uma fase de researchtesting 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 isto para fora neste artigo: quantstartarticlesForex-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 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 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 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 utilizará 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 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 tradingtrading. py. Consulte strategystrategy. 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 por QSForex é o mesmo que o fornecido pelo DukasCopy Historical Data Feed em 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. Em seguida, você precisa executar generatesimulatedpair. py. Que está sob o 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 2017. Ou seja, você verá arquivos individuais, do formato BBBQQQYYYYMMDD. csv (por exemplo, GBPUSD20170112.csv) aparecem em seu CSVDATADIR para todos os dias úteis em 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 executar um backtest, você precisa instanciar esta classe e fornecer os módulos necessários. A melhor maneira de ver como isso é feito é observar a implementação do Crossover de média móvel 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 uso de par de moedas múltiplas. Ele usa os 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. 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ê 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) 2017 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 as pessoas a quem o Software é fornecido a fazê-lo, 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 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 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 de 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 à negociação cambial e buscar o conselho de um consultor financeiro independente se tiver dúvidas. Sobre o mike Oi, meu nome é Michael Halls-Moore e eu sou o cara do QuantStart. Eu me formei com um MMath em Matemática da Universidade de Warwick, obteve um doutorado do Imperial College London em Fluid Dynamics e estava trabalhando em um fundo de hedge como um desenvolvedor de negociação quantitativa nos últimos anos em Mayfair, Londres. Agora gasto tempo em pesquisa, desenvolvimento, backtesting e implementação de estratégias de negociação algorítmica intradía. Eu realmente sou um cara que uma vez quis obter um emprego como analista quantitativo na cidade de Londres. Como um jovem estudante de pós-graduação, senti que tornar-se um quant foi o próximo passo lógico para fazer uso de minhas habilidades matemáticas em uma carreira excitante e lucrativa. Eu comecei a estudar para ser um quant em outubro de 2006, mas logo percebi que a informação que eu precisava saber era bastante densa e bastante difícil de entender sem muito trabalho. Eu realmente precisava de organização, diagramas e dicas úteis de outros que conheciam melhor. Nada desse tipo realmente existia para a preparação da entrevista de emprego na Internet, então achei que eu fiz isso sozinho. E assim, QuantStart nasceu. Eu organizei minhas anotações, leia todos os livros de matemática e negociação algorítmica, falou com um grupo de pessoas e coloquei toda essa informação on-line para que eu pudesse acessar facilmente minhas anotações de qualquer lugar para me ajudar a entender. Naquela época, não percebi que estava ajudando a começar algo grande. Desde o lançamento da QuantStarts em março de 2018, eu me tornei um desenvolvedor quantitativo para um fundo de hedge londrino e tiveram mais de 500 mil visitantes únicos que o usam para obter ajuda - e mais quentes e comerciantes continuam visitando. Mais uma vez, gostaria de agradecer por usar o QuantStart. A melhor coisa sobre a execução do QuantStart é ouvir suas histórias de quant e sucesso comercial. Estou impulsionado a melhorar o site continuando a adicionar mais informações e fornecendo ao mundo as melhores informações de negociação algorítmica e quantitativas disponíveis, graças às suas amáveis palavras e louvores. É uma grande sensação cada vez que ouve que alguém ganhou seu trabalho ideal de sonhos ou finalmente desenvolveu um modelo de negociação algorítmica rentável por causa desse site. Seus comentários, sugestões e agradecimentos são muito apreciados. Eu acredito que meu trabalho com QuantStart é minha maneira de ajudar a geração mais nova a se tornar empregada nesses tempos econômicos difíceis que passaram. Se eu puder ajudar dezenas de milhares a ganhar um emprego em Wall Street ou City of London, e eles conseguem ter uma carreira quantitativa de sucesso, então eu sinto que estou fazendo uma grande diferença. Se você é novo, novamente estou aqui para ajudá-lo, então, se você tiver alguma dúvida ou comentário (ou sugestão) sobre qualquer coisa, fique à vontade para me contatar a qualquer momento. A melhor maneira de me alcançar é enviar um email para mikequantstart. Boa sorte para todos vocês, Cheers
No comments:
Post a Comment