Melhores algoritmos forex


8 Tipos de Estratégias Algoritmicas de Forex.


Como prometido, aqui está a próxima parte da minha série em sistemas de negociação forex algorítmica. Certifique-se de verificar a primeira parte sobre o que você precisa saber sobre a Algo FX Trading antes de ler!


Essa abordagem comercial geralmente atrai aqueles que procuram eliminar ou reduzir a interferência emocional humana na tomada de decisões comerciais. Afinal, comprar ou vender sinais podem ser gerados usando um conjunto de instruções programadas e podem ser executados diretamente em sua plataforma de negociação.


"Amazeballs! Aqui está o meu dinheiro! Onde eu assino?"


Segure seus cavalos, jovem padawan! Coloque seu dinheiro suado de volta em sua carteira e gaste um pouco mais de tempo comprando a negociação algorítmica primeiro. Para começar, vamos dar uma olhada nas diferentes classificações desta abordagem comercial.


Estratégias de negociação algorítmica.


Existem oito principais tipos de troca de algo com base nas estratégias utilizadas. Muito esmagadora, hein? Claro que você pode misturar e combinar essas estratégias também, o que produz muitas combinações possíveis.


Uma das estratégias mais simples é simplesmente seguir as tendências do mercado, com ordens de compra ou venda geradas com base em um conjunto de condições cumpridas por indicadores técnicos. Esta estratégia também pode comparar os dados históricos e atuais para prever se as tendências provavelmente continuarão ou reverterão.


Outro tipo básico de estratégia de negociação é o sistema de reversão médio, que opera sob o pressuposto de que os mercados variam 80% do tempo. Caixas pretas que empregam esta estratégia tipicamente calculam um preço médio de ativos usando dados históricos e levam negócios em antecipação ao preço atual retornando ao preço médio.


Já tentou trocar as novidades? Bem, esta estratégia pode fazer isso por você! Um sistema de negociação algorítmica baseado em notícias geralmente é enganchado aos fios de notícias, gerando automaticamente sinais de comércio dependendo de como os dados reais se revelam em comparação com o consenso do mercado ou os dados anteriores.


Como você aprendeu na nossa lição da Escola sobre o sentimento do mercado, o posicionamento comercial e não comercial também pode ser usado para identificar os tops e os fundos do mercado. Estratégias Forex relacionadas com o sentimento do mercado podem envolver o uso do relatório COT ou de um sistema que detecta posições nítidas de curto ou longo prazo. Abordagens mais modernas também são capazes de escanear redes de mídia social para avaliar os viés de moeda.


Agora, é aqui que fica um pouco mais complicado do que o habitual. Fazer uso da arbitragem em negociações algorítmicas significa que o sistema caça por desequilíbrios de preços em diferentes mercados e faz lucro com esses. Uma vez que as diferenças de preços do forex são normalmente em micropips, você precisaria negociar posições realmente grandes para obter lucros consideráveis. A arbitragem triangular, que envolve dois pares de moedas e um cruzamento monetário entre os dois, também é uma estratégia popular nesta classificação.


Como o nome sugere, esse tipo de sistema comercial opera a velocidades rápidas, executando sinais de compra ou venda e negociações de fechamento em questão de milissegundos. Estes tipicamente usam estratégias de arbitragem ou scalping com base em flutuações rápidas de preços e envolvem altos volumes de negociação.


Esta é uma estratégia empregada por grandes instituições financeiras que são muito segredos sobre seus cargos forex. Em vez de colocar uma enorme posição longa ou curta com apenas um corretor, eles dividem seu comércio em posições menores e executá-los sob diferentes corretores. Seu algoritmo pode até permitir que essas ordens comerciais menores sejam colocadas em momentos diferentes para evitar que outros participantes do mercado descobrissem! Desta forma, as instituições financeiras podem executar negócios em condições normais de mercado sem flutuações repentinas de preços. Os comerciantes de varejo que acompanham os volumes de negociação podem ver apenas a "ponta do iceberg" quando se trata desses grandes negócios.


Se você acha que o iceberg é sneaky, então a estratégia furtiva é ainda mais furiosa! Iceberging tem sido uma prática tão comum nos últimos anos que os observadores do mercado hardcore conseguiram invadir essa idéia e chegar a um algoritmo para juntar essas ordens menores e descobrir se um grande jogador de mercado está por trás de tudo isso.


Como você provavelmente adivinhou, é preciso um histórico sólido na análise de mercado financeiro e na programação de computadores para poder projetar algoritmos de negociação tão sofisticados. Analistas quantitativos ou quants são normalmente treinados em C ++, C # ou programação Java antes que eles sejam capazes de criar sistemas de negociação algorítmica.


Não permita que isso o desencoraje! Os primeiros três ou quatro tipos de estratégias de negociação algorítmicas já devem ser muito familiares para você se você estiver negociando por algum tempo ou se você fosse um estudante diligente em nossa Escola de Pipsologia.


Fique atento para a próxima parte desta série, já que eu planejo deixar você entrar nos últimos desenvolvimentos e no futuro da negociação FX algorítmica. Até a próxima semana!


Sucesso e falha vem em pares. Ou você tem um par de ases chamado & # 39; Resolve and Undenied & # 39 ;. ou um par de jokers chamado & # 39; Wishing and Won? & # 39; t-ing & # 39 ;. sua mão para jogar. Doug Firebaugh.


O BabyPips ajuda os comerciantes individuais a aprender como negociar o mercado cambial.


Apresentamos as pessoas ao mundo do comércio de moeda e fornecemos conteúdos educacionais para ajudá-los a aprender a se tornarem comerciantes rentáveis. Nós também somos uma comunidade de comerciantes que se apoiam na nossa jornada de negociação diária.


Meu caminho perigosa para a Algo Trading.


por Bryan Fletcher.


Crescendo, parecia que meu pai sempre estava trabalhando. Quando ele não estava trabalhando, ele estava fazendo mais trabalho e tarefas domésticas. Lembro-me de ter uma reação visceral a ele uma noite como criança. Eu queria mais da vida do que apenas trabalhar o tempo todo.


Eu descobri que os principais gestores de hedge funds estavam fazendo milhões por ano e criando riqueza para seus clientes. Eu acreditei que eu poderia fazê-lo também, de modo que é tudo o que eu queria concentrar-se em começar como jovem adolescente.


Eu poderia imaginar minha vida futura tão claramente. Sendo um rapaz humilde com intenções nobres, eu teria um veleiro de 150 pés, que seria minha base de operações enquanto navegava ao redor do mundo.


Eu comecei a ler tudo o que eu consegui com minhas mãos e, eventualmente, convenci meus pais para me deixar gerenciar os fundos que eles e os meus avós tinham posto de lado para o meu fundo de faculdade no mercado de ações em 1999. Logo antes que os estoques de tecnologia tivessem um dos mais incríveis movimentos que provavelmente vou ver na minha vida.


Quais são as hipóteses? Uma experiência de aprendizagem perfeita para um filho do conhecimento, que achava que ele seria o próximo George Soros.


Eu multipliquei meu investimento inicial várias vezes em uma das minhas primeiras negociações depois de segurá-lo por menos de um ano e depois dobrou isso novamente em alguns meses em outro panfleto. Eu tinha 19 anos e fiz algo como 10X em meus negócios em cerca de um ano.


Quão fácil foi isso ?! Eu estaria jogando ponte com Buffett e Gates em nenhum momento no meu veleiro!


Claro, o sucesso é o pior professor, especialmente para um novato para a especulação. Quando tudo que você compra aumenta, você não pensa muito no gerenciamento de riscos.


Quando eu comecei no ensino médio, eu me considerei um investidor e usei os fundamentos para identificar quais ações achava que iriam alcançar o maior crescimento.


O que eu não considerei e o que os investidores / comerciantes mais fundamentais ainda não têm em seu processo, é o quanto eu estava disposto a perder se eu estivesse errado e o que precisava acontecer para tirar lucros se eu estivesse certo.


Durante a bolha tecnológica, tornou-se óbvio para mim que os fundamentos não eram importantes.


Isso exigiu que eu ajuste minha abordagem, mas eu estava fazendo muito dinheiro para realmente considerar que eu precisava de um sistema de negociação abrangente e consistente.


Em vez disso, eu me concentrei no impulso e no cronograma de minhas entradas e saídas. O gerenciamento de riscos foi uma reflexão tardia. Eu olhei gráficos, lei pesquisas e segui as novidades e usei meu intuito e intuição para me mostrar o que trocar, quanto trocar e quando comprar e vender.


Era tão fácil ganhar dinheiro no caminho, ganhar dinheiro no caminho para baixo seria tão fácil quanto eu pensava.


Onde eu tinha feito a maioria dos meus lucros sentados apertados por meses, comecei a tentar agressivamente chamar o ponto de viragem na bolha de tecnologia usando opções e comecei a tentar ganhar dinheiro em prazos mais curtos tentando recuperar minhas perdas.


Eu não pude parar a estupidez até que eu estivesse sem dinheiro. Enquanto estava acontecendo, eu também não poderia explicar isso. Eu simplesmente continuei me dizendo que minha sorte se volta e eu voltaria para onde eu estava.


Eu continuava ficando cada vez mais agressivo e estúpido em minhas decisões com cada perda, porque certamente meu próximo comércio seria um vencedor depois de tantas perdas seguidas.


A velocidade em que eu esgotou minha conta foi impressionante para dizer o mínimo.


Infelizmente, eu vi mais do que alguns comerciantes repetir a mesma história. O sucesso inicial em alguns negócios leva à excitação e ao excesso de confiança seguido de perdas maciças devido à alavancagem, falta de disciplina e gerenciamento de risco zero.


De volta ao quadro de desenho.


Eu tive que explodir completamente minha primeira conta de negociação antes que eu estivesse pronto para aprender e admitir que não sabia o que eu pensava fazer.


Eu queria saber o que os melhores comerciantes fizeram, então eu comecei a estudar de perto os resultados e os métodos dos principais consultores de negociação de mercadorias. Aprendi que muitos deles eram 100% sistemáticos e isso lhes permitiu fazer back-test e otimizar suas estratégias em dados históricos. Observe que o desempenho passado não é uma indicação de resultados futuros.


Eu tinha ignorado este passo.


A conhecida história de Richard Dennis e William Eckhardt, o experimento de tartarugas foi uma descoberta emocionante para mim, pois me deu provas de que eu precisava acreditar que eu poderia ser bem sucedido também.


Os dois comerciantes bem sucedidos decidiram resolver uma aposta que eles tiveram sobre se as habilidades de negociação bem-sucedida poderiam ser ensinadas dando suas regras de negociação completas aos novatos. À medida que a história se passa, os noviços provaram Richard Dennis, ao colecionar US $ 100 milhões.


O kicker na história é que muitos dos comerciantes de tartarugas novatos não ganharam dinheiro, mesmo que todos tenham recebido exatamente as mesmas regras de negociação. Alguns queriam mudar as regras e outros tinham receios que os levavam a não aderir ao sistema.


Richard Dennis teve uma citação famosa de que ele poderia publicar suas regras de negociação no jornal e que ninguém os seguiria devido a falta de disciplina e consistência quando as coisas derrubassem. Indo mais longe, ele também pensou que praticamente qualquer um poderia apresentar uma lista de regras que seriam 80% tão boas quanto o que eles ensinavam suas tartarugas.


Para codificar ou não codificar.


Depois dos meus atrozes resultados, não estava disposta a trocar novamente até que eu consegui testar de forma completa e correta a estratégia de negociação que eu usaria. Eu sabia que eu precisava da disciplina que um sistema comercial totalmente mecânico me daria para evitar decisões emocionais dispendiosas.


Eu tinha começado a estudar C ++, sem ter antecedentes em codificação, e percebi que precisaria de cerca de 20 anos para criar um mecanismo de teste de back-end.


Por sorte, percebi que construir tudo a partir do zero seria um ponto morto para mim, então eu procurei e encontrei outra solução que outros comerciantes sofisticados falavam alto, um motor de teste de back-testing totalmente desenvolvido e um gerador de pedidos chamado Trading Blox. de muitos produtos excelentes lá fora para pessoas como eu.


A versão que eu tenho permitida para codificação para personalização, mas tinha todas as ferramentas fora da caixa que eu precisava para começar a testar todas as idéias comerciais que eu desenvolvi com minha experiência comercial e pesquisa.


Depois de comprar o software, passei meses testando todo tipo de lógica em mais de 30 anos de dados históricos em dezenas de mercados de futuros globais. Estudei cada detalhe de como os elementos do sistema de negociação funcionavam juntos e passavam por negociações históricas, um a um.


Eu finalmente decidi em uma tendência de longo prazo muito simples seguindo o sistema diversificado em uma ampla cesta de mercados globais em commodities, forex, renda fixa e índices de ações. Em vez de testar minhas teorias com dinheiro real na linha, eu consegui testar a estratégia e testar sensibilidades para diferentes parâmetros e estimativas de deslizamento.


Isso me deu confiança suficiente na minha estratégia para finalmente lançar um pool de commodities porque acreditei que minha estratégia se adaptaria bem em todos os ambientes de mercado. Eu estava convencido de que as tendências de longo prazo nunca desapareceriam e meu trabalho era diversificar e gerenciar riscos.


Inicialmente, eu queria aplicar uma abordagem algorítmica às ações de negociação, especificamente comprando ações em máximos de todos os tempos, mas eu corri em alguns blocos de estradas.


1. O universo de apenas estoques dos EUA para analisar e testar de volta uma estratégia, incluindo aqueles que foram retirados da lista para explicar o viés de sobrevivência, foi de cerca de 25 mil. Em 2006, o único produto comercial que eu poderia achar que me permitiria otimizar parâmetros em um banco de dados tão grande custaria US $ 25.000.


2. Eu acredito firmemente que, quando existe uma vontade, existe uma maneira, então eu não estava pronto para descartar ações ainda. Por sorte, encontrei um excelente papel branco produzido pela Blackstar Funds detalhando suas pesquisas usando o produto comercial exato que eu não poderia pagar.


Em suma, o número de posições necessárias para comprar ações em máximos históricos foi muito maior do que eu imaginava e os retornos da estratégia, embora impressionantes com retornos anualizados de 15,5%, eram menores do que eu imaginava possível com uma estratégia comprando o mais forte estoques. Em alguns anos, cerca de 2.000 ações estão fazendo novos máximos históricos.


A fim de obter retornos mais altos, você precisaria ter um portfólio mais concentrado de ações que ofereçam máximos históricos. O desafio que eu vi foi que não havia como prever a próxima Apple, então, para não perder a próxima Apple, você precisaria ser posicionado em todas as ações que produzam máximos históricos.


Com base no que eu tinha visto de outros gerentes de dinheiro, eu acreditava que eu poderia conseguir retornos mais altos e melhores retornos ajustados ao risco no mercado de futuros devido à alavancagem e diversificação.


Você poderia dizer que escolhi trocar futuros por inadimplência, mas os futuros de negociação não eram sem seus desafios.


Starting Capital & ndash; Muitos contratos de futuros podem mover milhares de dólares em um só dia. Imagine trading 20 & ndash; 60 mercados ao mesmo tempo. Se você vai negociar uma cesta diversificada de mercados, para ser conservador, você está olhando para começar com um capital de risco próximo de $ 1 milhão de dólares.


Eu certamente não tive muita coisa, então minha única opção para avançar seria encontrar investidores e criar um fundo.


Rolling Contracts & ndash; No mercado de futuros, você troca vários meses contratuais que acabarão por expirar. Quando o mês do contrato que você está negociando expirar, você deve rolar sua posição para o próximo mês do contrato, se quiser continuar a carregar sua posição ou evitar a entrega da mercadoria subjacente.


Existem muitas opções diferentes a considerar sobre o que desencadeia usar para rolar seu contrato para o próximo mês.


A maioria dos comerciantes apenas rola para o contrato do mês da frente mais próximo, o próximo contrato para expirar, mas essa pode não ser a melhor abordagem para commodities, como o trigo, por exemplo, onde cada mês do contrato tem diferentes realidades de oferta e demanda devido à temporada de crescimento.


Eu não investigue o spot FX no momento. Nunca tendo trocado isso, eu não conhecia quase nada sobre isso e não consegui encontrar mentores ou peças de pesquisa que acelerassem a minha curva de aprendizado.


Mais importante ainda, o provedor de dados históricos que eu usei na época não forneceu dados FX spot intra-dia de qualquer corretor FX.


Por favor, note que a negociação de Forex e CFDs na margem traz um alto nível de risco e pode não ser adequado para todos os investidores, pois as perdas podem exceder os fundos depositados.


Sabendo o que faço hoje, penso que a opção mais atraente para aspirantes a algo comerciantes para começar é com Spot FX e CFDs para aqueles que não residem nos EUA. Ambos oferecem tamanhos comerciais muito pequenos, que permitem uma gestão de risco conservadora e maiores oportunidades de diversificação para pequenas contas.


Facilidade de diversificação.


Os comerciantes também podem se beneficiar da diversificação disponível de um universo relativamente pequeno de mercados que se opõem ao mercado de ações, onde o mercado dos EUA tem apenas cerca de 25 mil ações para considerar em sua pesquisa.


Trading FX e CFDs também oferece aos comerciantes o benefício adicional de poder ficar sem as dificuldades que você encontraria no mercado de ações. Ser capaz de minimizar sua estratégia adiciona outro elemento de diversificação à sua abordagem.


Para curtir em ações, você deve primeiro emprestar o estoque, se ele estiver disponível, a taxas de juros anualizadas aproximando-se de 100% em algumas ações difíceis de contrair empréstimos. Se o proprietário do estoque que você emprestou para vender curto os chama de volta, você é forçado a cobrir sua posição curta. Determinar isso antes do tempo não é possível.


Com isso em mente, a consideração deve ser dada para onde você vai conseguir benefícios de diversificação dentro da classe de ativos, se esse for o único que você está negociando.


Ray Dalio é o fundador da Bridgewater Associates, o maior fundo de hedge do mundo com US $ 167 bilhões sob gerenciamento.


Em um Bloomberg no t erview, ele discutiu um princípio que ele chama o santo Graal de investir. Parafraseando, ele afirma que, se você tiver 15 ou mais, boas, correntes de retorno não correlacionadas, você pode reduzir seu risco de carteira em 80%. O que significa que você obteria 5 vezes o retorno para a mesma quantidade de risco.


No entanto, se você se diversificar em mil fluxos de retorno com uma correlação de .60, isso reduziria o risco em 15%.


Se você quiser implementar a alavancagem em sua estratégia, você deve pedir fundos emprestados e pagar uma taxa de juros correspondente ao negociar ações. Em FX e Futuros, a margem é tratada como um depósito de boa fé e não exige pagamentos de juros. A alavancagem é uma espada de dois gumes, pois pode aumentar as perdas e os lucros.


Para os comerciantes que utilizam estratégias intra-dia, se negociação de ações, sua negociação pode cair sob a regra do Padrão Day Trader que exige um mínimo de US $ 25.000 em uma conta de margi. Não existe uma regra desse tipo para os comerciantes FX e CFD.


Em última análise, acredito que as carteiras mais bem planejadas terão alocação para o maior número possível de fluxos de capital diversos, o que é melhor alcançado ao participar em tantas classes de ativos quanto possível.


Benefícios da adoção de uma estratégia algorítmica.


Antes de implementar uma abordagem sistemática na minha negociação, eu não tinha um plano formal de gerenciamento de riscos. Pequenas perdas se transformaram em perdas ENORMES porque eu estava colocando meu ego na linha com cada comércio e tive dificuldade em admitir que estava errado.


Minha estratégia algorítmica arriscou uma fração fixa da minha equidade em cada novo comércio. Se eu perdesse esse valor, eu fecharia o comércio e aguardaria o próximo sinal. O logótipo para paradas de trânsito, a tomada de lucro e o gerenciamento do risco de nível de portfólio também foram implementados.


Para cada mercado que eu troquei, usei um múltiplo de volatilidade recente usando o ATR (alcance verdadeiro médio) para dimensionar minhas posições e determinar a colocação de parada inicial.


Posições mais pequenas foram tomadas em mercados com maior volatilidade e paradas mais largas foram utilizadas. Tomar posições menores em mercados voláteis me permitiu equilibrar o risco em todo o meu portfólio com base em volatilidade única de cada mercado.


A colocação de parada mais larga proporcionou à posição uma melhor chance de não ser açoitado em comparação com uma abordagem de usar uma distância de parada fixa em todos os mercados, independentemente da volatilidade.


Abordagens mais sofisticadas podem medir isso todos os dias para manter o risco proporcional à volatilidade contínua de cada mercado. Se você não conseguir isso em cheque, é possível ter um grande negócio vencedor, compondo grande parte do seu risco e anulando quaisquer benefícios de diversificação.


O dimensionamento adequado da posição me permitiu aproveitar a diversificação em vários mercados diferentes.


Quando comecei, tomei posições muito concentradas e experimentei uma grande volatilidade na minha conta e emoções.


Ser capaz de definir, de forma clara, tudo o que você faz no seu sistema de negociação, você pode testar e otimizar seus parâmetros comerciais em seu portfólio. Back-testing pode não prever o futuro, mas pode dar-lhe uma idéia de como suas regras de negociação teriam realizado historicamente antes de colocar qualquer capital em risco.


Eu tenho muitas idéias ótimas que não aguentaram uma vez que eu as testei de volta. É muito mais barato testar uma estratégia desta forma em comparação com a colocação de fundos reais em risco.


Um bom mecanismo de back-testing permite que você examine como seu sistema lida com todos os cenários históricos disponíveis e revisará todas as negociações em um gráfico. Outra característica que eu diria é uma necessidade é a capacidade de fazer back-tests de nível de portfólio em múltiplos instrumentos ao mesmo tempo.


Um sistema devidamente testado pode dar-lhe a confiança necessária para manter o sistema durante as inevitáveis ​​retiradas que você experimentará ao negociar ao vivo. Se deixado apenas o seu julgamento ao negociar, suas emoções podem conduzir sua tomada de decisão com resultados sub-ótimos.


Implementar uma estratégia de negociação algorítmica me deu liberdade no meu dia. Meu sistema de negociação mecânica exigiu cerca de 10 minutos do meu tempo por dia para negociar mais de 60 mercados diferentes.


Basta pensar em quanto tempo seria necessário para revisar manualmente cada gráfico para configurações comerciais se eu não tivesse software para analisar os gráficos e emitir entradas, saídas e calcular meu risco total.


Antes, eu seria colado ao meu computador e tela de TV o dia todo quando os mercados estavam abertos assistindo ação de preço e pesquisando idéias comerciais quando os mercados estavam fechados. Não estava adicionando qualquer valor ao meu negócio e basicamente era como um jogador sentado em uma máquina caça-níqueis durante todo o dia.


Muitos procuram o comércio pela liberdade que podem dar na vida e, em seguida, sentem-se na frente do computador, dia e noite, procurando gráficos e notícias.


Não posso garantir que você seja bem-sucedido, mas acredito que uma abordagem algorítmica oferece às pessoas uma melhor chance de sucesso. Ainda mais importante do que isso, uma abordagem comercial algorítmica pode melhorar a qualidade de sua vida, dando-lhe a liberdade que mais procuram de negociação, em primeiro lugar.


O DailyFX fornece notícias e análises técnicas sobre as tendências que influenciam os mercados monetários globais.


Próximos eventos.


Calendário econômico Forex.


O desempenho passado não é uma indicação de resultados futuros.


DailyFX é o site de notícias e educação do Grupo IG.


Forex Algorithmic Trading: um conto prático para engenheiros.


Como você pode saber, o mercado cambial (Forex, ou FX) é usado para negociação entre pares de moedas. Mas você pode não estar ciente de que é o mercado mais líquido do mundo.


Alguns anos atrás, impulsionados pela minha curiosidade, fiz os primeiros passos no mundo da negociação algorítmica Forex criando uma conta demo e jogando simulações (com dinheiro falso) na plataforma de negociação Meta Trader 4.


Depois de uma semana de "negociação", quase dobrava meu dinheiro. Estimulado pela minha própria negociação algorítmica bem sucedida, cavei e, eventualmente, me inscrevi para vários fóruns de FX. Logo, passava horas lendo sobre sistemas de negociação algorítmica (conjuntos de regras que determinam se você deve comprar ou vender), indicadores personalizados, modos de mercado e muito mais.


Meu primeiro cliente.


Por volta dessa época, por acaso, ouvi dizer que alguém estava tentando encontrar um desenvolvedor de software para automatizar um sistema comercial simples. Isso estava de volta aos dias da faculdade quando eu estava aprendendo sobre programação simultânea em Java (threads, semáforos e todo esse lixo). Eu pensei que este sistema automatizado não poderia ser muito mais complicado do que o meu curso avançado de ciências de dados funcionar, então eu perguntei sobre o trabalho e entrou a bordo.


O cliente queria um software de negociação algorítmica construído com o MQL4, uma linguagem de programação funcional usada pela plataforma Meta Trader 4 para realizar ações relacionadas a estoque.


O papel da plataforma de negociação (Meta Trader 4, neste caso) é fornecer uma conexão com um corretor Forex. O corretor fornece uma plataforma com informações em tempo real sobre o mercado e executa suas ordens de compra / venda. Para leitores que não estão familiarizados com o comércio de Forex, aqui estão as informações fornecidas pelo feed de dados:


Através do Meta Trader 4, você pode acessar todos esses dados com funções internas, acessíveis em vários prazos: a cada minuto (M1), a cada cinco minutos (M5), M15, M30, a cada hora (H1), H4, D1, W1, MN .


O movimento do preço atual é chamado de tiquetaque. Em outras palavras, um tiquetaque é uma alteração no preço de lance ou pedido para um par de moedas. Durante os mercados ativos, pode haver vários carrapatos por segundo. Durante os mercados lentos, pode haver minutos sem um tiquetaque. O tiquetaque é o batimento cardíaco de um robô de mercado de moeda.


Quando você faz um pedido através dessa plataforma, você compra ou vende um determinado volume de uma determinada moeda. Você também define os limites stop-loss e take-profit. O limite de stop-loss é a quantidade máxima de pips (variações de preço) que você pode perder antes de desistir de um comércio. O limite de lucro obtido é a quantidade de pips que você irá acumular a seu favor antes de descontar.


As especificações de negociação algorítmica do cliente eram simples: eles queriam um robô Forex com base em dois indicadores. Para o fundo, os indicadores são muito úteis ao tentar definir um estado de mercado e tomar decisões comerciais, já que eles são baseados em dados passados ​​(por exemplo, valor de preço mais alto nos últimos n dias). Muitos vieram integrados ao Meta Trader 4. No entanto, os indicadores de que meu cliente estava interessado vieram de um sistema de comércio personalizado.


Eles queriam trocar todas as vezes que dois desses indicadores personalizados se cruzassem, e apenas em certo ângulo.


À medida que eu resolvi as mãos, eu aprendi que os programas MQL4 têm a seguinte estrutura:


A função de início é o coração de cada programa MQL4, uma vez que é executado sempre que o mercado se move (ergo, esta função será executada uma vez por marca). Este é o caso, independentemente do prazo que você está usando. Por exemplo, você poderia estar operando no cronograma H1 (uma hora), mas a função inicial executaria muitos milhares de vezes por período de tempo.


Para contornar isso, forcei a função a executar uma vez por unidade de período:


Obtendo os valores dos indicadores:


A lógica de decisão, incluindo a interseção dos indicadores e seus ângulos:


Enviando os pedidos:


Se você estiver interessado, você pode encontrar o código completo e executável no GitHub.


Backtesting.


Uma vez que eu construí meu sistema de negociação algorítmica, eu queria saber: 1) se estava se comportando adequadamente e 2) se a estratégia de negociação Forex fosse usada.


Backtesting (às vezes escrito "back-testing") é o processo de testar um sistema particular (automatizado ou não) sob os eventos do passado. Em outras palavras, você testa seu sistema usando o passado como um proxy para o presente.


MT4 vem com uma ferramenta aceitável para backtesting uma estratégia de negociação Forex (hoje em dia, existem mais ferramentas profissionais que oferecem maior funcionalidade). Para começar, você configura seus prazos e executa seu programa sob uma simulação; A ferramenta irá simular cada tico sabendo que, para cada unidade, ele deve abrir a certo preço, fechar a um determinado preço e alcançar altos e baixos especificados.


Depois de comparar as ações do programa com preços históricos, você terá um bom senso se está ou não executando corretamente.


Do backtesting, eu chequei a taxa de retorno do robô FX para alguns intervalos de tempo aleatórios; Escusado será dizer que sabia que o meu cliente não iria ficar rico com isso - os indicadores que ele havia escolhido, juntamente com a lógica da decisão, não eram lucrativos. Como amostra, aqui estão os resultados da execução do programa na janela M15 para 164 operações:


Observe que nosso equilíbrio (a linha azul) termina abaixo do seu ponto de partida.


Otimização de parâmetros e suas mentiras.


Embora o backtesting me tenha deixado cauteloso com a utilidade desse robô FX, fiquei intrigado quando comecei a brincar com seus parâmetros externos e notei grandes diferenças na relação de retorno geral. Esta ciência particular é conhecida como otimização de parâmetros.


Eu fiz alguns testes difíceis para tentar inferir o significado dos parâmetros externos na Razão de retorno e surgiu algo como isto:


Você pode pensar (como eu fiz) que você deve usar o Parâmetro A. Mas a decisão não é tão direta como pode aparecer. Especificamente, observe a imprevisibilidade do Parâmetro A: para valores de erro pequenos, seu retorno muda drasticamente. Em outras palavras, o Parâmetro A é muito provável que a previsão excessiva de resultados futuros, uma vez que qualquer incerteza, qualquer alteração no total resultará em um desempenho pior.


Mas, de fato, o futuro é incerto! E o retorno do Parâmetro A também é incerto. A melhor escolha, de fato, é confiar na imprevisibilidade. Muitas vezes, um parâmetro com um retorno máximo mais baixo, mas uma previsibilidade superior (menor flutuação) será preferível a um parâmetro com alto retorno, mas uma previsibilidade fraca.


O único que você pode ter certeza é que você não conhece o futuro do mercado, e pensar que você sabe como o mercado vai atuar com base em dados passados ​​é um erro. Por sua vez, você deve reconhecer essa imprevisibilidade em suas previsões Forex.


Isso não significa necessariamente que devemos usar o Parâmetro B, porque mesmo os retornos mais baixos do Parâmetro A funcionam melhor do que o Parâmetro B; Isso é apenas para mostrar que os Parâmetros de Otimização podem resultar em testes que exageram os resultados futuros prováveis, e esse pensamento não é óbvio.


Considerações globais de comércio de algoritmo Forex.


Desde essa primeira experiência de negociação de Forex algorítmica, construí vários sistemas de negociação automatizados para clientes e posso dizer que há espaço para explorar e continuar a análise de Forex a ser feito. Por exemplo, recentemente construí um sistema baseado em encontrar os chamados movimentos de "Big Fish"; isto é, grandes variações de pips em pequenas e minúsculas unidades de tempo. Este é um assunto que me fascina.


Construir o seu próprio sistema de simulação FX é uma excelente opção para aprender mais sobre o comércio de Forex e as possibilidades são infinitas. Por exemplo, você poderia tentar decifrar a distribuição de probabilidade das variações de preços em função da volatilidade em um mercado (EUR / USD, por exemplo), e talvez criar um modelo de simulação de Monte Carlo usando a distribuição por estado de volatilidade, usando qualquer grau de precisão que você deseja. Vou deixar isso como um exercício para o leitor ansioso.


O mundo Forex pode ser esmagador às vezes, mas espero que este artigo tenha dado alguns pontos sobre como começar em sua própria estratégia de negociação Forex.


Leitura adicional.


Hoje em dia, existe um vasto conjunto de ferramentas para construir, testar e melhorar as Automatizações do Sistema de Negociação: Trading Blox para testes, NinjaTrader para negociação, OCaml para programação, para citar alguns.


Eu li extensivamente sobre o mundo misterioso que é o mercado de moeda. Aqui estão alguns write-ups que eu recomendo para programadores e leitores entusiasmados:


Compreendendo o básico.


Sobre o que Forex é negociado?


O comércio Forex (ou FX) está comprando e vendendo por meio de pares de moedas (por exemplo, USD vs. EUR) no mercado de câmbio.


Como o Forex ganha dinheiro?


Os corretores de Forex ganham dinheiro através de comissões e taxas. Os comerciantes de Forex ganham (ou perdem) o dinheiro com base em seu tempo: se eles conseguirem vender alto o suficiente em comparação com quando eles compraram, eles podem lucrar.


O que há para testar uma estratégia de negociação?


Backtesting é o processo de testar uma estratégia ou sistema específico usando os eventos do passado.


O que é o comércio algorítmico?


O comércio algorítmico é quando um robô / programa usa um conjunto de regras que dizem quando comprar ou vender.


Fundamentos do comércio algorítmico: conceitos e exemplos.


Um algoritmo é um conjunto específico de instruções claramente definidas destinadas a realizar uma tarefa ou processo.


O comércio algorítmico (negociação automatizada, negociação em caixa preta ou simplesmente algo-trading) é o processo de uso de computadores programados para seguir um conjunto definido de instruções para colocar um comércio para gerar lucros a uma velocidade e freqüência impossíveis para um comerciante humano. Os conjuntos definidos de regras são baseados em tempo, preço, quantidade ou qualquer modelo matemático. Além das oportunidades de lucro para o comerciante, o algo-trading torna os mercados mais líquidos e torna a negociação mais sistemática descartando impactos emocionais humanos nas atividades comerciais. (Para mais, consulte Picking the Right Algorithmic Trading Software.)


Suponha que um comerciante siga esses critérios de comércio simples:


Compre 50 ações de uma ação quando sua média móvel de 50 dias excede a média móvel de 200 dias. Vende ações da ação quando sua média móvel de 50 dias está abaixo da média móvel de 200 dias.


Usando este conjunto de duas instruções simples, é fácil escrever um programa de computador que monitorará automaticamente o preço das ações (e os indicadores de média móvel) e colocará as ordens de compra e venda quando as condições definidas forem atendidas. O comerciante não precisa mais manter um relógio para preços e gráficos ao vivo, ou colocar as ordens manualmente. O sistema de negociação algorítmica automaticamente faz isso para ele, identificando corretamente a oportunidade comercial. (Para mais informações sobre as médias móveis, consulte Médias móveis simples, faça as tendências se destacarem.)


[Se você quiser saber mais sobre as estratégias comprovadas e pontuais que podem eventualmente ser trabalhadas em um sistema de comércio alorítico, confira o Curso de Torneio de Dia de Torneio da Invastopedia Academy. ]


Benefícios da negociação algorítmica.


A Algo-trading oferece os seguintes benefícios:


Negociações executadas com os melhores preços Posicionamento instantâneo e preciso da ordem comercial (com altas chances de execução nos níveis desejados) Negociações cronometradas corretamente e instantaneamente, para evitar mudanças de preços significativas Custos de transação reduzidos (veja o exemplo de falta de implementação abaixo) Verificações automatizadas simultâneas em múltiplos condições de mercado Reduziu o risco de erros manuais na colocação dos negócios Backtest o algoritmo, com base nos dados históricos e em tempo real disponíveis Reduzida a possibilidade de erros por comerciantes humanos com base em fatores emocionais e psicológicos.


A maior parte do dia-a-dia é a negociação de alta freqüência (HFT), que tenta capitalizar a colocação de um grande número de pedidos em velocidades muito rápidas em múltiplos mercados e múltiplos parâmetros de decisão, com base em instruções pré-programadas. (Para obter mais informações sobre o comércio de alta freqüência, consulte Estratégias e Segredos de Empresas de Negociação de Alta Freqüência (HFT).)


O Algo-trading é usado em muitas formas de atividades de comércio e investimento, incluindo:


Investidores de médio a longo prazo ou empresas de compra (fundos de pensão, fundos de investimento, companhias de seguros) que adquirem ações em grandes quantidades, mas não querem influenciar os preços das ações com investimentos discretos e de grande porte. Os comerciantes de curto prazo e os participantes do lado da venda (fabricantes de mercado, especuladores e arbitragentes) se beneficiam da execução comercial automatizada; Além disso, ajudas de algo-trading na criação de liquidez suficiente para os vendedores no mercado. Os comerciantes sistemáticos (seguidores de tendências, comerciantes de pares, hedge funds, etc.) acham muito mais eficiente programar suas regras comerciais e permitir que o programa seja comercializado automaticamente.


O comércio algorítmico proporciona uma abordagem mais sistemática ao comércio ativo do que os métodos baseados na intuição ou instinto do comerciante humano.


Estratégias de negociação algorítmica.


Qualquer estratégia de negociação algorítmica exige uma oportunidade identificada que seja rentável em termos de melhoria de ganhos ou redução de custos. As seguintes são estratégias de negociação comuns usadas em algo-trading:


As estratégias de negociação algorítmicas mais comuns seguem as tendências em médias móveis, fuga de canais, movimentos no nível de preços e indicadores técnicos relacionados. Estas são as estratégias mais fáceis e simples de implementar através de negociação algorítmica porque essas estratégias não envolvem fazer previsões ou previsões de preços. Os negócios são iniciados com base na ocorrência de tendências desejáveis, que são fáceis e direitas de implementar através de algoritmos sem entrar na complexidade da análise preditiva. O exemplo acima mencionado de média móvel de 50 e 200 dias é uma tendência popular seguindo a estratégia. (Para mais informações sobre as estratégias de negociação de tendências, consulte: Estratégias simples para capitalizar as tendências.)


Comprar um estoque cotado duplo a um preço mais baixo em um mercado e simultaneamente vendê-lo a um preço mais alto em outro mercado oferece o diferencial de preço como lucro ou arbitragem sem risco. A mesma operação pode ser replicada para ações versus instrumentos de futuros, pois os diferenciais de preços existem de tempos em tempos. Implementar um algoritmo para identificar esses diferenciais de preços e colocar as ordens permite oportunidades lucrativas de forma eficiente.


Os fundos do índice definiram períodos de reequilíbrio para que suas participações fossem compatíveis com seus respectivos índices de referência. Isso cria oportunidades rentáveis ​​para comerciantes algorítmicos, que capitalizam os negócios esperados que oferecem lucros de 20 a 80 pontos base, dependendo do número de ações no fundo do índice, apenas antes do reequilíbrio do fundo do índice. Essas negociações são iniciadas através de sistemas de negociação algorítmica para execução atempada e melhores preços.


Muitos modelos matemáticos comprovados, como a estratégia de negociação neutra do delta, que permitem a negociação de combinações de opções e sua segurança subjacente, onde os negócios são colocados para compensar deltas positivos e negativos, de modo que o portfólio delta seja mantido em zero.


A estratégia de reversão média baseia-se na ideia de que os preços altos e baixos de um bem são um fenômeno temporário que retorna periodicamente ao seu valor médio. Identificar e definir uma faixa de preço e implementar algoritmos com base em isso permite que os negócios sejam colocados automaticamente quando o preço do recurso entra e sai do seu alcance definido.


A estratégia de preços médios ponderados por volume quebra uma grande ordem e libera pedaços menores determinados dinamicamente da ordem para o mercado usando perfis de volume histórico específicos de estoque. O objetivo é executar a ordem perto do preço médio ponderado do volume (VWAP), beneficiando assim o preço médio.


A estratégia de preço médio ponderado no tempo quebra uma grande ordem e libera dinamicamente determinados pedaços menores da ordem para o mercado usando intervalos de tempo uniformemente divididos entre o início e o fim do tempo. O objetivo é executar a ordem perto do preço médio entre os horários de início e término, minimizando assim o impacto no mercado.


Até que a ordem comercial seja totalmente preenchida, este algoritmo continua enviando ordens parciais, de acordo com o índice de participação definido e de acordo com o volume negociado nos mercados. A "estratégia de etapas" relacionada envia ordens a uma porcentagem definida pelo usuário de volumes de mercado e aumenta ou diminui essa taxa de participação quando o preço da ação atinge os níveis definidos pelo usuário.


A estratégia de falta de implementação visa minimizar o custo de execução de uma ordem através da negociação do mercado em tempo real, economizando assim o custo da ordem e beneficiando do custo de oportunidade da execução atrasada. A estratégia aumentará a taxa de participação direcionada quando o preço das ações se mover de forma favorável e diminuí-lo quando o preço das ações se mover de forma adversa.


Existem algumas classes especiais de algoritmos que tentam identificar "acontecimentos" do outro lado. Esses "algoritmos de sniffing", usados, por exemplo, por um market maker market market têm a inteligência interna para identificar a existência de qualquer algoritmo no lado da compra de uma grande ordem. Essa detecção através de algoritmos ajudará o fabricante de mercado a identificar grandes oportunidades de ordem e permitir que ele se beneficie ao preencher os pedidos a um preço mais alto. Isso às vezes é identificado como front-running de alta tecnologia. (Para obter mais informações sobre negociação de alta freqüência e práticas fraudulentas, consulte: Se você comprar ações on-line, você está envolvido em HFTs.)


Requisitos técnicos para negociação algorítmica.


Implementar o algoritmo usando um programa de computador é a última parte, batida com backtesting. O desafio é transformar a estratégia identificada em um processo informatizado integrado que tenha acesso a uma conta de negociação para fazer pedidos. São necessários os seguintes:


Conhecimento de programação de computador para programar a estratégia de negociação necessária, programadores contratados ou software de negociação pré-fabricado Conectividade de rede e acesso a plataformas de negociação para colocar os pedidos Acesso a feeds de dados de mercado que serão monitorados pelo algoritmo para oportunidades de colocar pedidos A capacidade e infra-estrutura para voltar a testar o sistema uma vez construído, antes de entrar em operação em mercados reais Dados históricos disponíveis para backtesting, dependendo da complexidade das regras implementadas no algoritmo.


Aqui está um exemplo abrangente: o Royal Dutch Shell (RDS) está listado na Amsterdam Stock Exchange (AEX) e London Stock Exchange (LSE). Vamos construir um algoritmo para identificar oportunidades de arbitragem. Aqui estão algumas observações interessantes:


AEX negocia em Euros, enquanto a LSE negocia em libras esterlinas. Devido à diferença horária de uma hora, a AEX abre uma hora antes da LSE, seguido de ambas as trocas comerciais simultaneamente durante as próximas horas e depois de negociar apenas na LSE durante a última hora à medida que o AEX fecha .


Podemos explorar a possibilidade de negociação de arbitragem nas ações da Royal Dutch Shell listadas nesses dois mercados em duas moedas diferentes?


Um programa de computador que pode ler os preços atuais do mercado Os feeds de preços de LSE e AEX A taxa de câmbio para a taxa de câmbio GBP-EUR Capacidade de colocação de pedidos que podem rotear a ordem para a troca correta do recurso Back-testing em feeds históricos de preços.


O programa de computador deve executar o seguinte:


Leia o preço de entrada do estoque RDS de ambas as bolsas Usando as taxas de câmbio disponíveis, converta o preço de uma moeda para outra. Se houver uma discrepância de preço suficientemente grande (descontando os custos de corretagem) levando a uma oportunidade rentável, então coloque a compra ordem em troca de preços mais baixos e ordem de venda em troca de preços mais elevados Se as ordens forem executadas conforme desejado, o lucro de arbitragem seguirá.


Simples e fácil! No entanto, a prática de negociação algorítmica não é simples de manter e executar. Lembre-se, se você pode colocar um comércio gerado por algo, os outros participantes do mercado podem também. Conseqüentemente, os preços flutuam em milissegundos e até mesmo em microssegundos. No exemplo acima, o que acontece se o seu comércio de compras for executado, mas o comércio de vendas não acontece à medida que os preços de venda mudam quando o seu pedido atinge o mercado? Você vai acabar sentado com uma posição aberta, tornando sua estratégia de arbitragem inútil.


Existem riscos e desafios adicionais: por exemplo, riscos de falha do sistema, erros de conectividade de rede, atrasos de tempo entre ordens comerciais e execução e, o mais importante de tudo, algoritmos imperfeitos. O algoritmo mais complexo é o backtesting mais rigoroso antes de ser posto em ação.


The Bottom Line.


A análise quantitativa do desempenho de um algoritmo desempenha um papel importante e deve ser examinada criticamente. É excitante ir pela automação auxiliada por computadores com a noção de ganhar dinheiro sem esforço. Mas é preciso certificar-se de que o sistema está completamente testado e os limites exigidos são definidos. Os comerciantes analíticos devem considerar a aprendizagem de sistemas de programação e construção por conta própria, ter confiança em implementar as estratégias certas de forma infalível. O uso cauteloso eo teste completo de algo-trading podem criar oportunidades rentáveis. (Para mais informações, consulte Como codificar seu próprio robô Algo Trading.)


QuantStart.


Junte-se ao portal de membros privados da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento. Você encontrará um grupo bem informado de mentalistas quant pronto para responder suas perguntas comerciais mais importantes.


Confira meu ebook sobre o comércio de quant, onde eu ensino você como criar estratégias de negociação sistemáticas lucrativas com ferramentas Python, desde o início.


Dê uma olhada no meu novo ebook sobre estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas bayesianas, com Python e R.


Por Michael Halls-Moore em 26 de julho de 2018.


Uma das perguntas mais freqüentes que recebo no QS mailbag é "Qual é a melhor linguagem de programação para negociação algorítmica?". A resposta curta é que não existe um "melhor" idioma. Parâmetros de estratégia, desempenho, modularidade, desenvolvimento, resiliência e custo devem ser considerados. Este artigo descreve os componentes necessários de uma arquitetura de sistema de negociação algorítmica e como as decisões relativas à implementação afetam a escolha do idioma.


Em primeiro lugar, serão considerados os principais componentes de um sistema de negociação algorítmico, como ferramentas de pesquisa, otimizador de portfólio, gerenciador de riscos e motor de execução. Posteriormente, serão examinadas diferentes estratégias de negociação e como elas afetam o design do sistema. Em particular, a freqüência de negociação e o provável volume de negociação serão discutidos.


Uma vez que a estratégia de negociação foi selecionada, é necessário arquitetar todo o sistema. Isso inclui a escolha de hardware, o (s) sistema (s) operacional (is) e a resiliência do sistema contra eventos raros e potencialmente catastróficos. Enquanto a arquitetura está sendo considerada, deve-se ter em conta o desempenho, tanto para as ferramentas de pesquisa quanto para o ambiente de execução ao vivo.


Qual é o sistema de comércio tentando fazer?


Antes de decidir sobre o "melhor" idioma com o qual escrever um sistema de negociação automatizado, é necessário definir os requisitos. O sistema será puramente baseado em execução? O sistema exigirá um módulo de gerenciamento de risco ou construção de portfólio? O sistema exigirá um backtester de alto desempenho? Para a maioria das estratégias, o sistema comercial pode ser dividido em duas categorias: Pesquisa e geração de sinal.


A pesquisa está preocupada com a avaliação de um desempenho de estratégia em relação aos dados históricos. O processo de avaliação de uma estratégia de negociação em relação aos dados anteriores do mercado é conhecido como backtesting. O tamanho dos dados e a complexidade algorítmica terão um grande impacto na intensidade computacional do backtester. A velocidade da CPU e a concorrência são muitas vezes os fatores limitantes na otimização da velocidade de execução da pesquisa.


A geração de sinal está preocupada com a geração de um conjunto de sinais de negociação a partir de um algoritmo e envio de ordens para o mercado, geralmente através de uma corretora. Para determinadas estratégias, é necessário um alto nível de desempenho. As questões de E / S, como a largura de banda da rede e a latência, muitas vezes são fatores limitantes na otimização de sistemas de execução. Assim, a escolha de idiomas para cada componente de todo o seu sistema pode ser bastante diferente.


Tipo, Frequência e Volume de Estratégia.


O tipo de estratégia algorítmica empregada terá um impacto substancial no design do sistema. Será necessário considerar os mercados comercializados, a conectividade com os fornecedores de dados externos, a freqüência e o volume da estratégia, o trade-off entre facilidade de desenvolvimento e otimização de desempenho, bem como qualquer hardware personalizado, incluindo customizado servidores, GPUs ou FPGAs que possam ser necessários.


As opções de tecnologia para uma estratégia de ações de baixa freqüência dos EUA serão muito diferentes das de uma negociação de estratégias de arbitragem estatística de alta freqüência no mercado de futuros. Antes da escolha do idioma, muitos fornecedores de dados devem ser avaliados que pertencem à estratégia em questão.


Será necessário considerar a conectividade com o fornecedor, a estrutura de todas as APIs, a pontualidade dos dados, os requisitos de armazenamento e a resiliência em face de um fornecedor que está offline. Também é aconselhável possuir acesso rápido a vários fornecedores! Vários instrumentos têm todos os seus peculiaridades de armazenamento, exemplos dos quais incluem símbolos de ticker múltiplos para ações e datas de vencimento para futuros (sem mencionar nenhum dado OTC específico). Isso precisa ser incorporado ao design da plataforma.


A frequência da estratégia provavelmente será um dos maiores drivers de como a pilha de tecnologia será definida. Estratégias que empregam dados com mais freqüência do que minuciosamente ou em segundo lugar, exigem uma consideração significativa em relação ao desempenho.


Uma estratégia que excede as barras segundo (isto é, dados de marca) leva a um design orientado a desempenho como o principal requisito. Para estratégias de alta freqüência, uma quantidade substancial de dados do mercado precisará ser armazenada e avaliada. Software como HDF5 ou kdb + é comumente usado para essas funções.


Para processar os extensos volumes de dados necessários para aplicações HFT, um sistema de backtester e execução extensivamente otimizado deve ser usado. C / C ++ (possivelmente com algum montador) é provável para o candidato a linguagem mais forte. As estratégias de ultra-alta freqüência certamente exigirão hardware personalizado, como FPGAs, co-localização de troca e ajuste de interface de rede / kernal.


Sistemas de pesquisa.


Os sistemas de pesquisa geralmente envolvem uma mistura de desenvolvimento interativo e script automatizado. O primeiro geralmente ocorre dentro de um IDE, como Visual Studio, MatLab ou R Studio. O último envolve cálculos numéricos extensos em vários parâmetros e pontos de dados. Isso leva a uma escolha de idioma que fornece um ambiente direto para testar código, mas também fornece desempenho suficiente para avaliar estratégias em várias dimensões de parâmetros.


Os IDE típicos neste espaço incluem Microsoft Visual C ++ / C #, que contém extensos utilitários de depuração, recursos de conclusão de código (via "Intellisense") e visões gerais diretas de toda a pilha do projeto (via o banco de dados ORM, LINQ); MatLab, que é projetado para uma grande variedade de álgebras lineares numéricas e operações vetoriais, mas de uma forma de console interativo; R Studio, que envolve o console de linguagem estatística R em um IDE de pleno direito; Eclipse IDE para Linux Java e C ++; e IDE semi-proprietários, como Enthought Canopy para Python, que incluem bibliotecas de análise de dados, como NumPy, SciPy, scikit-learn e pandas em um único ambiente interativo (console).


Para backtesting numérico, todos os idiomas acima são adequados, embora não seja necessário utilizar uma GUI / IDE, pois o código será executado "em segundo plano". A principal consideração nesta fase é a velocidade de execução. Um idioma compilado (como C ++) geralmente é útil se as dimensões do parâmetro backtest forem grandes. Lembre-se de que é necessário desconfiar de tais sistemas se for esse o caso!


Idiomas interpretados, como Python, muitas vezes fazem uso de bibliotecas de alto desempenho, como NumPy / pandas para a etapa de teste, para manter um grau razoável de competitividade com equivalentes compilados. Em última análise, o idioma escolhido para o backtesting será determinado por necessidades algorítmicas específicas, bem como o intervalo de bibliotecas disponíveis no idioma (mais sobre isso abaixo). No entanto, o idioma utilizado para o backtester e os ambientes de pesquisa podem ser completamente independentes dos usados ​​na construção de portfólio, gerenciamento de riscos e componentes de execução, como será visto.


Construção de carteiras e gerenciamento de riscos.


A construção do portfólio e os componentes de gerenciamento de riscos são muitas vezes ignorados pelos comerciantes algorítmicos de varejo. Isso é quase sempre um erro. Essas ferramentas fornecem o mecanismo pelo qual o capital será preservado. Eles não só tentam aliviar o número de apostas "arriscadas", mas também minimizam o churn dos próprios negócios, reduzindo os custos de transação.


Versões sofisticadas desses componentes podem ter um efeito significativo na qualidade e consistência da lucratividade. É direto criar um estável de estratégias, pois o mecanismo de construção do portfólio e o gerenciador de riscos podem ser facilmente modificados para lidar com múltiplos sistemas. Assim, eles devem ser considerados componentes essenciais no início do projeto de um sistema de comércio algorítmico.


O trabalho do sistema de construção de carteiras é levar um conjunto de trades desejados e produzir o conjunto de negócios reais que minimizam o churn, manter exposições a vários fatores (como setores, classes de ativos, volatilidade, etc.) e otimizar a alocação de capital para vários estratégias em um portfólio.


A construção do portfólio geralmente se reduz a um problema de álgebra linear (como uma fatoração da matriz) e, portanto, o desempenho é altamente dependente da eficácia da implementação de álgebra linear numérica disponível. As bibliotecas comuns incluem uBLAS, LAPACK e NAG para C ++. O MatLab também possui operações de matriz amplamente otimizadas. Python utiliza NumPy / SciPy para tais cálculos. Um portfólio freqüentemente reequilibrado exigirá uma biblioteca de matriz compilada (e bem otimizada!) Para levar a cabo esta etapa, de modo a não engarrafar o sistema de negociação.


O gerenciamento de riscos é outra parte extremamente importante de um sistema de comércio algorítmico. O risco pode vir de várias formas: aumento da volatilidade (embora isso possa ser visto como desejável para certas estratégias!), Aumento de correlações entre classes de ativos, contraparte padrão, interrupções do servidor, eventos de "cisnes negros" e erros não detectados no código comercial, para nomear alguns.


Os componentes de gerenciamento de risco tentam antecipar os efeitos da volatilidade excessiva e a correlação entre as classes de ativos e seus efeitos (s) subsequentes sobre o capital de negociação. Muitas vezes isso se reduz a um conjunto de cálculos estatísticos, como Monte Carlo "testes de estresse". Isso é muito semelhante às necessidades computacionais de um mecanismo de preços de derivativos e, como tal, será vinculado à CPU. Essas simulações são altamente paralelizáveis ​​(veja abaixo) e, até certo ponto, é possível "lançar hardware no problema".


Sistemas de Execução.


O trabalho do sistema de execução é receber sinais de negociação filtrados dos componentes de construção de portfólio e gerenciamento de riscos e enviá-los para uma corretora ou outros meios de acesso ao mercado. Para a maioria das estratégias de negociação algorítmica de varejo, isso envolve uma conexão API ou FIX para uma corretora, como Interactive Brokers. As considerações primárias ao decidir sobre um idioma incluem a qualidade da API, a disponibilidade do idioma para uma API, a freqüência de execução e o deslizamento antecipado.


A "qualidade" da API refere-se ao quão bem documentado é, qual o tipo de desempenho que ele fornece, se ele precisa de um software autônomo para ser acessado ou se um gateway pode ser estabelecido de forma sem cabeça (ou seja, sem GUI). No caso dos Interactive Brokers, a ferramenta Trader WorkStation precisa ser executada em um ambiente GUI para acessar sua API. Uma vez, tive que instalar uma edição do Desktop Ubuntu em um servidor de nuvem da Amazon para acessar os corretores interativos de forma remota, apenas por esse motivo!


A maioria das APIs fornecerá uma interface C ++ e / ou Java. Geralmente, é de responsabilidade da comunidade desenvolver wrappers específicos do idioma para C #, Python, R, Excel e MatLab. Note-se que, com cada plugin adicional utilizado (especialmente os wrappers da API), há possibilidades de insetos no sistema. Sempre testar plugins desse tipo e garantir que eles sejam ativamente mantidos. Um indicador valioso é ver quantas novas atualizações de uma base de código foram feitas nos últimos meses.


A frequência de execução é de extrema importância no algoritmo de execução. Note que centenas de pedidos podem ser enviados a cada minuto e, como tal, o desempenho é crítico. Slippage será incorrido através de um sistema de execução mal executado e isso terá um impacto dramático sobre a rentabilidade.


Os idiomas estaticamente digitados (veja abaixo), como C ++ / Java, geralmente são ótimos para execução, mas há um trade-off em tempo de desenvolvimento, testes e facilidade de manutenção. Idiomas dinamicamente digitados, como Python e Perl, geralmente são geralmente "rápidos o suficiente". Certifique-se sempre de que os componentes foram projetados de forma modular (veja abaixo) para que eles possam ser "trocados" à medida que o sistema se reduz.


Processo de Planejamento e Desenvolvimento Arquitetônico.


Os componentes de um sistema de comércio, seus requisitos de freqüência e volume foram discutidos acima, mas a infraestrutura do sistema ainda não foi coberta. Aqueles que atuam como comerciante de varejo ou que trabalham em um fundo pequeno provavelmente estarão "vestindo muitos chapéus". Será necessário cobrir o modelo alfa, o gerenciamento de riscos e os parâmetros de execução, bem como a implementação final do sistema. Antes de aprofundar linguagens específicas, o design de uma arquitetura de sistema ideal será discutido.


Separação de preocupações.


Uma das decisões mais importantes que devem ser tomadas no início é como "separar as preocupações" de um sistema comercial. No desenvolvimento de software, isso significa essencialmente como dividir os diferentes aspectos do sistema de negociação em componentes modulares separados.


Ao expor as interfaces em cada um dos componentes, é fácil trocar partes do sistema por outras versões que ajudem o desempenho, confiabilidade ou manutenção, sem modificar nenhum código de dependência externo. Esta é a "melhor prática" para esses sistemas. Para estratégias em frequências mais baixas, tais práticas são aconselhadas. Para a negociação de alta freqüência, o livro de regras pode ser ignorado à custa de ajustar o sistema para ainda mais desempenho. Um sistema mais acoplado pode ser desejável.


Criar um mapa de componentes de um sistema de negociação algorítmico vale um artigo em si. No entanto, uma abordagem ótima é garantir que haja componentes separados para as entradas de dados de mercado históricos e em tempo real, armazenamento de dados, API de acesso a dados, backtester, parâmetros de estratégia, construção de portfólio, gerenciamento de riscos e sistemas de execução automatizada.


Por exemplo, se o armazenamento de dados em uso estiver atualmente com desempenho inferior, mesmo em níveis significativos de otimização, ele pode ser trocado com reescrituras mínimas para a ingesta de dados ou API de acesso a dados. Até o ponto em que o backtester e os componentes subsequentes estão em causa, não há diferença.


Outro benefício de componentes separados é que permite que uma variedade de linguagens de programação sejam usadas no sistema geral. Não é necessário restringir a um único idioma se o método de comunicação dos componentes for independente de linguagem. Este será o caso se estiverem se comunicando via TCP / IP, ZeroMQ ou algum outro protocolo independente de linguagem.


Como um exemplo concreto, considere o caso de um sistema de backtesting que está sendo escrito em C ++ para o desempenho do "crunching", enquanto o gerenciador de portfólio e os sistemas de execução são escritos em Python usando SciPy e IBPy.


Considerações sobre o desempenho.


O desempenho é uma consideração significativa para a maioria das estratégias comerciais. Para estratégias de maior freqüência, é o fator mais importante. O "Desempenho" cobre uma ampla gama de problemas, como velocidade de execução algorítmica, latência de rede, largura de banda, E / S de dados, simultaneidade / paralelismo e dimensionamento. Cada uma dessas áreas é coberta individualmente por grandes livros didáticos, portanto este artigo apenas arranhará a superfície de cada tópico. A escolha da arquitetura e da linguagem agora será discutida em termos de seus efeitos sobre o desempenho.


A sabedoria prevalecente, como afirmou Donald Knuth, um dos pais da Ciência da Computação, é que "a otimização prematura é a raiz de todo o mal". Este é quase sempre o caso - exceto quando se forma um algoritmo de negociação de alta freqüência! Para aqueles que estão interessados ​​em estratégias de baixa freqüência, uma abordagem comum é construir um sistema da maneira mais simples possível e apenas otimizar à medida que os estrangulamentos começam a aparecer.


Ferramentas de perfil são usadas para determinar onde surgem os estrangulamentos. Perfis podem ser feitos para todos os fatores listados acima, em um ambiente MS Windows ou Linux. Existem muitas ferramentas de sistema operacional e de idioma disponíveis para isso, bem como utilitários de terceiros. A escolha da linguagem agora será discutida no contexto da performance.


C ++, Java, Python, R e MatLab contêm bibliotecas de alto desempenho (como parte do padrão ou externo) para estrutura básica de dados e trabalho algorítmico. C ++ é fornecido com a Biblioteca de modelos padrão, enquanto o Python contém NumPy / SciPy. Tarefas matemáticas comuns são encontradas nessas bibliotecas e raramente é benéfico escrever uma nova implementação.


Uma exceção é se uma arquitetura de hardware altamente personalizada é necessária e um algoritmo está fazendo uso extensivo de extensões proprietárias (como caches personalizados). No entanto, muitas vezes a "reinvenção da roda" desperdiça o tempo que pode ser melhor gasto no desenvolvimento e otimização de outras partes da infra-estrutura de negociação. O tempo de desenvolvimento é extremamente precioso especialmente no contexto dos únicos desenvolvedores.


A latência é muitas vezes uma questão do sistema de execução, pois as ferramentas de pesquisa geralmente estão localizadas na mesma máquina. Para o primeiro, a latência pode ocorrer em vários pontos ao longo do caminho de execução. Os bancos de dados devem ser consultados (latência de disco / rede), os sinais devem ser gerados (sistema operacional, latência de mensagens do kernal), sinais comerciais enviados (latência NIC) e pedidos processados ​​(latência interna dos sistemas de troca).


Para operações de maior freqüência, é necessário familiarizar-se intimamente com a otimização do kernal, além de otimizar a transmissão da rede. Esta é uma área profunda e está significativamente além do escopo do artigo, mas se um algoritmo UHFT é desejado então esteja ciente da profundidade do conhecimento necessário!


O cache é muito útil no conjunto de ferramentas de um desenvolvedor de negócios quantitativo. O armazenamento em cache refere-se ao conceito de armazenar dados freqüentemente acessados ​​de uma maneira que permita um acesso de alto desempenho, em detrimento do potencial estancamento dos dados. Um caso de uso comum ocorre no desenvolvimento da web ao tirar dados de um banco de dados relacional com respaldo de disco e colocá-lo na memória. Quaisquer pedidos subseqüentes para os dados não precisam "acessar o banco de dados" e, portanto, os ganhos de desempenho podem ser significativos.


Para situações de negociação, o cache pode ser extremamente benéfico. Por exemplo, o estado atual de um portfólio de estratégia pode ser armazenado em um cache até ser reequilibrado, de modo que a lista não precisa ser regenerada em cada ciclo do algoritmo de negociação. Essa regeneração provavelmente será uma alta CPU ou operação de E / S de disco.


No entanto, o armazenamento em cache não está sem os seus próprios problemas. A regeneração de dados de cache de uma só vez, devido à natureza volátil do armazenamento de cache, pode colocar uma demanda significativa na infraestrutura. Outra questão é o empilhamento de cães, onde múltiplas gerações de uma nova cópia de cache são realizadas sob uma carga extremamente alta, o que leva a uma falha em cascata.


A alocação de memória dinâmica é uma operação cara na execução de software. Assim, é imperativo que os aplicativos de maior desempenho comercial sejam conscientes de como a memória está sendo alocada e desalocada durante o fluxo do programa. Novos padrões de linguagem, como Java, C # e Python, todos executam a coleta automática de lixo, que se refere à desalocação da memória alocada dinamicamente quando os objetos ficam fora do escopo.


A coleta de lixo é extremamente útil durante o desenvolvimento, pois reduz erros e ajuda a legibilidade. No entanto, muitas vezes é sub óptimo para certas estratégias de negociação de alta freqüência. A coleta de lixo personalizada é muitas vezes desejada para esses casos. Em Java, por exemplo, ao ajustar a configuração do coletor de lixo e do heap, é possível obter alto desempenho para as estratégias de HFT.


C ++ não fornece um coletor de lixo nativo e, portanto, é necessário lidar com toda a alocação / desalocação de memória como parte da implementação de um objeto. Embora potencialmente propenso a erros (potencialmente levando a ponteiros pendurados), é extremamente útil ter um controle fino de como os objetos aparecem no heap para determinadas aplicações. Ao escolher um idioma, certifique-se de estudar como funciona o coletor de lixo e se ele pode ser modificado para otimizar um caso de uso específico.


Muitas operações em sistemas de negociação algorítmica são favoráveis ​​à paralelização. Isso se refere ao conceito de realização de múltiplas operações programáticas ao mesmo tempo, ou seja, em "paralelo". Os algoritmos denominados "embarassingly paralelos" incluem etapas que podem ser computadas totalmente independentemente de outras etapas. Certas operações estatísticas, como as simulações de Monte Carlo, são um bom exemplo de algoritmos embarazosa paralelos, pois cada sorteio aleatório e subsequente operação do caminho podem ser computados sem o conhecimento de outros caminhos.


Outros algoritmos são apenas parcialmente paralelizados. As simulações de dinâmica de fluidos são um exemplo, onde o domínio da computação pode ser subdividido, mas, em última instância, esses domínios devem se comunicar entre si e, portanto, as operações são parcialmente seqüenciais. Os algoritmos paralisáveis ​​estão sujeitos à Lei de Amdahl, que fornece um limite superior teórico para o aumento de desempenho de um algoritmo paralelizado quando sujeito a processos separados em $ N $ (por exemplo, em um núcleo ou fio de CPU).


A paralelização tornou-se cada vez mais importante como um meio de otimização, uma vez que as velocidades do clock do processador estagnaram, já que os processadores mais novos contêm muitos núcleos com os quais realizar cálculos paralelos. O aumento do hardware de gráficos de consumo (predominantemente para videogames) levou ao desenvolvimento de Unidades de processamento gráfico (GPUs), que contém centenas de "núcleos" para operações altamente concorrentes. Tais GPUs são agora muito acessíveis. Os quadros de alto nível, como o CUDA da Nvidia, levaram a uma adoção generalizada na academia e nas finanças.


Esse hardware de GPU geralmente é apenas adequado para o aspecto de pesquisa de financiamento quantitativo, enquanto que outros equipamentos mais especializados (incluindo matrizes de portas programáveis ​​em campo - FPGAs) são usados ​​para (U) HFT. Atualmente, a maioria dos langauges modernos suporta um grau de concorrência / multithreading. Assim, é direto otimizar um backtester, pois todos os cálculos são geralmente independentes dos outros.


O dimensionamento em engenharia e operações de software refere-se à capacidade do sistema de lidar consistentemente com o aumento de cargas sob a forma de solicitações maiores, maior uso do processador e maior alocação de memória. Na negociação algorítmica, uma estratégia pode escalar se pode aceitar quantidades maiores de capital e ainda produzir retornos consistentes. A pilha de tecnologia de negociação escala se pode suportar maiores volumes de comércio e latência aumentada, sem bloqueio de estrangulamento.


Enquanto os sistemas devem ser projetados para dimensionar, muitas vezes é difícil prever de antemão, onde um gargalo irá ocorrer. O registro, o teste, o perfil e o monitoramento rigorosos ajudarão grandemente em permitir que um sistema seja dimensionado. As próprias línguas são muitas vezes descritas como "inesquecíveis". Isso geralmente é o resultado de uma informação errônea, e não de um fato difícil. É a pilha de tecnologia total que deve ser verificada quanto à escalabilidade, e não ao idioma. Claramente, certas línguas têm maior desempenho do que outras em casos de uso específicos, mas um idioma nunca é "melhor" do que outro em todos os sentidos.


Um meio de gerenciar a escala é separar as preocupações, como afirmado acima. A fim de introduzir ainda a capacidade de lidar com "picos" no sistema (ou seja, uma volatilidade súbita que desencadeia uma série de trades), é útil criar uma "arquitetura de filas de mensagens". Isso simplesmente significa colocar um sistema de fila de mensagens entre os componentes para que as ordens sejam "empilhadas" se um determinado componente não conseguir processar muitos pedidos.


Em vez de pedidos de perda, eles simplesmente são mantidos em uma pilha até que a mensagem seja tratada. Isso é particularmente útil para enviar trocas para um mecanismo de execução. Se o motor está sofrendo em latência intensa, ele irá fazer backup de trades. Uma fila entre o gerador de sinal comercial e a API de execução aliviará essa questão à custa de uma possível destruição comercial. Um bem respeitado corretor de fila de mensagens de código aberto é RabbitMQ.


Hardware e sistemas operacionais.


O hardware que executa sua estratégia pode ter um impacto significativo na rentabilidade do seu algoritmo. Esta não é uma questão restrita aos comerciantes de alta freqüência. Uma má escolha em hardware e sistema operacional pode levar a uma falha na máquina ou reiniciar no momento mais inoportuno. Assim, é necessário considerar onde sua candidatura irá residir. A escolha é geralmente entre uma máquina de mesa pessoal, um servidor remoto, um provedor de "nuvem" ou um servidor co-localizado em troca.


As máquinas de mesa são simples de instalar e administrar, especialmente com sistemas operacionais mais novos e amigáveis, como o Windows 7/8, o Mac OSX eo Ubuntu. Os sistemas de desktop possuem algumas desvantagens significativas, no entanto. O principal é que as versões dos sistemas operacionais projetados para máquinas de mesa provavelmente irão requerer reinicialização / remendo (e muitas vezes no pior dos tempos!). Eles também usam mais recursos computacionais pela virtude de exigir uma interface gráfica do usuário (GUI).


Utilizar hardware em um ambiente doméstico (ou escritório local) pode levar à conectividade com a internet e aos problemas de tempo de atividade. O principal benefício de um sistema de desktop é que a potência computacional significativa pode ser comprada pela fração do custo de um servidor dedicado remoto (ou sistema baseado em nuvem) de velocidade comparável.


Um servidor dedicado ou uma máquina baseada em nuvem, muitas vezes mais caro do que uma opção de desktop, permite uma infra-estrutura de redundância mais significativa, como backups automatizados de dados, a capacidade de garantir de forma mais direta o tempo de atividade e monitoramento remoto. Eles são mais difíceis de administrar, pois exigem a capacidade de usar recursos de logon remoto do sistema operacional.


No Windows, isto é geralmente através do GUI Remote Desktop Protocol (RDP). Em sistemas baseados em Unix, a linha de comando Secure SHell (SSH) é usada. A infraestrutura de servidor baseada em Unix é quase sempre baseada em linha de comando, o que imediatamente faz com que as ferramentas de programação baseadas em GUI (como MatLab ou Excel) sejam inutilizáveis.


Um servidor co-localizado, como a frase é usada nos mercados de capitais, é simplesmente um servidor dedicado que se encontra dentro de uma troca para reduzir a latência do algoritmo de negociação. Isso é absolutamente necessário para certas estratégias de negociação de alta freqüência, que dependem de baixa latência para gerar alfa.


O aspecto final para a escolha do hardware e a escolha da linguagem de programação é a independência da plataforma. Existe a necessidade do código para executar vários sistemas operacionais diferentes? O código foi projetado para ser executado em um tipo específico de arquitetura de processador, como o Intel x86 / x64 ou será possível executar em processadores RISC, como os fabricados pela ARM? Essas questões serão altamente dependentes da frequência e do tipo de estratégia implementada.


Resiliência e Testes.


Uma das melhores maneiras de perder muito dinheiro na negociação algorítmica é criar um sistema sem resiliência. Isso se refere à durabilidade do sistema quando sujeito a eventos raros, como falências de corretagem, volatilidade súbita em excesso, tempo de inatividade em toda a região para um provedor de servidor em nuvem ou a exclusão acidental de um banco de dados de negociação inteiro. Anos de lucro podem ser eliminados em segundos com uma arquitetura mal projetada. É absolutamente essencial considerar questões como debugging, testes, logging, backups, alta disponibilidade e monitoramento como componentes principais do seu sistema.


É provável que, em qualquer aplicativo de negociação quantitativo personalizado razoavelmente complicado, pelo menos 50% do tempo de desenvolvimento serão gastos em depuração, teste e manutenção.


Quase todas as linguagens de programação são enviadas com um depurador associado ou possuem alternativas de terceiros bem respeitadas. Em essência, um depurador permite a execução de um programa com inserção de pontos de interrupção arbitrários no caminho do código, que interrompe temporariamente a execução para investigar o estado do sistema. O principal benefício da depuração é que é possível investigar o comportamento do código antes de um ponto de falha conhecido.


A depuração é um componente essencial na caixa de ferramentas para analisar erros de programação. No entanto, eles são mais amplamente utilizados em linguagens compiladas, como C ++ ou Java, pois linguagens interpretadas, como Python, geralmente são mais fáceis de depurar devido a menos declarações LOC e menos verbosas. Apesar desta tendência, o Python é enviado com o pdb, que é uma ferramenta de depuração sofisticada. O Microsoft Visual C ++ IDE possui amplos utilitários de depuração de GUI, enquanto que para o programador de linha de comando Linux C ++, o depurador gdb existe.


O teste no desenvolvimento de software refere-se ao processo de aplicação de parâmetros e resultados conhecidos a funções, métodos e objetos específicos dentro de uma base de código, para simular o comportamento e avaliar múltiplos caminhos de código, ajudando a garantir que um sistema se comporta como deveria. Um paradigma mais recente é conhecido como Test Driven Development (TDD), onde o código de teste é desenvolvido contra uma interface especificada sem implementação. Antes da conclusão da base de código real, todos os testes falharão. À medida que o código é escrito para "preencher os espaços em branco", os testes eventualmente passarão, em que ponto o desenvolvimento deve cessar.


O TDD requer um design de especificação detalhado e abrangente, bem como um grau de disciplina saudável para realizar com sucesso. Em C ++, o Boost fornece uma estrutura de teste de unidade. Em Java, a biblioteca JUnit existe para cumprir a mesma finalidade. O Python também possui o módulo unittest como parte da biblioteca padrão. Muitas outras línguas possuem estruturas de teste de unidade e muitas vezes existem várias opções.


Em um ambiente de produção, o log sofisticado é absolutamente essencial. Logging refere-se ao processo de saída de mensagens, com vários graus de gravidade, em relação ao comportamento de execução de um sistema em um arquivo ou banco de dados plano. Os logs são uma "primeira linha de ataque" ao procurar o comportamento inesperado do tempo de execução do programa. Infelizmente, as falhas de um sistema de registro tendem a ser descobertas apenas após o fato! Tal como acontece com os backups discutidos abaixo, um sistema de registro deve ser devidamente considerado ANTES de projetar um sistema.


Tanto o Microsoft Windows quanto o Linux possuem uma extensa capacidade de registro do sistema e as linguagens de programação tendem a ser enviadas com bibliotecas de registro padrão que cobrem a maioria dos casos de uso. Muitas vezes, é aconselhável centralizar as informações de registro para analisá-lo em uma data posterior, uma vez que muitas vezes pode levar a idéias sobre como melhorar o desempenho ou a redução de erros, o que quase certamente terá um impacto positivo em seus retornos comerciais.


Embora o registro de um sistema forneça informações sobre o que aconteceu no passado, o monitoramento de um aplicativo fornecerá uma visão do que está acontecendo agora. Todos os aspectos do sistema devem ser considerados para o monitoramento. As métricas do nível do sistema, como o uso do disco, a memória disponível, a largura de banda da rede e o uso da CPU fornecem informações básicas de carga.


Métricas de negociação, como preços / volume anormais, levantamentos rápidos bruscos e exposição à conta para diferentes setores / mercados também devem ser monitorados continuamente. Além disso, deve ser instigado um sistema de limiar que forneça notificação quando certas métricas são violadas, elevando o método de notificação (e-mail, SMS, atendimento automatizado), dependendo da gravidade da métrica.


O monitoramento do sistema geralmente é o domínio do administrador do sistema ou do gerente de operações. No entanto, como um único desenvolvedor comercial, essas métricas devem ser estabelecidas como parte do design maior. Existem muitas soluções para monitoramento: proprietárias, hospedadas e de código aberto, que permitem uma ampla personalização de métricas para um caso de uso particular.


Os backups e a alta disponibilidade devem ser as principais preocupações de um sistema comercial. Considere as seguintes duas questões: 1) Se um banco de dados completo de produção de dados de mercado e histórico de negócios foi excluído (sem backups), como o algoritmo de pesquisa e execução seria afetado? 2) Se o sistema de negociação sofrer uma interrupção por um período prolongado (com posições abertas), como o patrimônio da conta e a rentabilidade contínua serão afetados? As respostas a ambas as perguntas são muitas vezes sóbrias!


It is imperative to put in place a system for backing up data and also for testing the restoration of such data. Many individuals do not test a restore strategy. If recovery from a crash has not been tested in a safe environment, what guarantees exist that restoration will be available at the worst possible moment?


Similarly, high availability needs to be "baked in from the start". Redundant infrastructure (even at additional expense) must always be considered, as the cost of downtime is likely to far outweigh the ongoing maintenance cost of such systems. I won't delve too deeply into this topic as it is a large area, but make sure it is one of the first considerations given to your trading system.


Choosing a Language.


Considerable detail has now been provided on the various factors that arise when developing a custom high-performance algorithmic trading system. The next stage is to discuss how programming languages are generally categorised.


Type Systems.


When choosing a language for a trading stack it is necessary to consider the type system . The languages which are of interest for algorithmic trading are either statically - or dynamically-typed . A statically-typed language performs checks of the types (e. g. integers, floats, custom classes etc) during the compilation process. Such languages include C++ and Java. A dynamically-typed language performs the majority of its type-checking at runtime. Such languages include Python, Perl and JavaScript.


For a highly numerical system such as an algorithmic trading engine, type-checking at compile time can be extremely beneficial, as it can eliminate many bugs that would otherwise lead to numerical errors. However, type-checking doesn't catch everything, and this is where exception handling comes in due to the necessity of having to handle unexpected operations. 'Dynamic' languages (i. e. those that are dynamically-typed) can often lead to run-time errors that would otherwise be caught with a compilation-time type-check. For this reason, the concept of TDD (see above) and unit testing arose which, when carried out correctly, often provides more safety than compile-time checking alone.


Another benefit of statically-typed languages is that the compiler is able to make many optimisations that are otherwise unavailable to the dynamically - typed language, simply because the type (and thus memory requirements) are known at compile-time. In fact, part of the inefficiency of many dynamically-typed languages stems from the fact that certain objects must be type-inspected at run-time and this carries a performance hit. Libraries for dynamic languages, such as NumPy/SciPy alleviate this issue due to enforcing a type within arrays.


Open Source or Proprietary?


One of the biggest choices available to an algorithmic trading developer is whether to use proprietary (commercial) or open source technologies. Existem vantagens e desvantagens para ambas as abordagens. It is necessary to consider how well a language is supported, the activity of the community surrounding a language, ease of installation and maintenance, quality of the documentation and any licensing/maintenance costs.


The Microsoft stack (including Visual C++, Visual C#) and MathWorks' MatLab are two of the larger proprietary choices for developing custom algorithmic trading software. Both tools have had significant "battle testing" in the financial space, with the former making up the predominant software stack for investment banking trading infrastructure and the latter being heavily used for quantitative trading research within investment funds.


Microsoft and MathWorks both provide extensive high quality documentation for their products. Further, the communities surrounding each tool are very large with active web forums for both. The software allows cohesive integration with multiple languages such as C++, C# and VB, as well as easy linkage to other Microsoft products such as the SQL Server database via LINQ. MatLab also has many plugins/libraries (some free, some commercial) for nearly any quantitative research domain.


There are also drawbacks. With either piece of software the costs are not insignificant for a lone trader (although Microsoft does provide entry-level version of Visual Studio for free). Microsoft tools "play well" with each other, but integrate less well with external code. Visual Studio must also be executed on Microsoft Windows, which is arguably far less performant than an equivalent Linux server which is optimally tuned.


MatLab also lacks a few key plugins such as a good wrapper around the Interactive Brokers API, one of the few brokers amenable to high-performance algorithmic trading. The main issue with proprietary products is the lack of availability of the source code. This means that if ultra performance is truly required, both of these tools will be far less attractive.


Open source tools have been industry grade for sometime. Much of the alternative asset space makes extensive use of open-source Linux, MySQL/PostgreSQL, Python, R, C++ and Java in high-performance production roles. However, they are far from restricted to this domain. Python and R, in particular, contain a wealth of extensive numerical libraries for performing nearly any type of data analysis imaginable, often at execution speeds comparable to compiled languages, with certain caveats.


The main benefit of using interpreted languages is the speed of development time. Python and R require far fewer lines of code (LOC) to achieve similar functionality, principally due to the extensive libraries. Além disso, eles geralmente permitem um desenvolvimento baseado em console interativo, reduzindo rapidamente o processo de desenvolvimento iterativo.


Given that time as a developer is extremely valuable, and execution speed often less so (unless in the HFT space), it is worth giving extensive consideration to an open source technology stack. Python and R possess significant development communities and are extremely well supported, due to their popularity. Documentation is excellent and bugs (at least for core libraries) remain scarce.


Open source tools often suffer from a lack of a dedicated commercial support contract and run optimally on systems with less-forgiving user interfaces. A typical Linux server (such as Ubuntu) will often be fully command-line oriented. In addition, Python and R can be slow for certain execution tasks. There are mechanisms for integrating with C++ in order to improve execution speeds, but it requires some experience in multi-language programming.


While proprietary software is not immune from dependency/versioning issues it is far less common to have to deal with incorrect library versions in such environments. Os sistemas operacionais de código aberto, como o Linux, podem ser mais difíceis de administrar.


I will venture my personal opinion here and state that I build all of my trading tools with open source technologies. In particular I use: Ubuntu, MySQL, Python, C++ and R. The maturity, community size, ability to "dig deep" if problems occur and lower total cost ownership (TCO) far outweigh the simplicity of proprietary GUIs and easier installations. Having said that, Microsoft Visual Studio (especially for C++) is a fantastic Integrated Development Environment (IDE) which I would also highly recommend.


Batteries Included?


The header of this section refers to the "out of the box" capabilities of the language - what libraries does it contain and how good are they? This is where mature languages have an advantage over newer variants. C++, Java and Python all now possess extensive libraries for network programming, HTTP, operating system interaction, GUIs, regular expressions (regex), iteration and basic algorithms.


C++ is famed for its Standard Template Library (STL) which contains a wealth of high performance data structures and algorithms "for free". Python is known for being able to communicate with nearly any other type of system/protocol (especially the web), mostly through its own standard library. R has a wealth of statistical and econometric tools built in, while MatLab is extremely optimised for any numerical linear algebra code (which can be found in portfolio optimisation and derivatives pricing, for instance).


Outside of the standard libraries, C++ makes use of the Boost library, which fills in the "missing parts" of the standard library. In fact, many parts of Boost made it into the TR1 standard and subsequently are available in the C++11 spec, including native support for lambda expressions and concurrency.


Python has the high performance NumPy/SciPy/Pandas data analysis library combination, which has gained widespread acceptance for algorithmic trading research. Further, high-performance plugins exist for access to the main relational databases, such as MySQL++ (MySQL/C++), JDBC (Java/MatLab), MySQLdb (MySQL/Python) and psychopg2 (PostgreSQL/Python). Python can even communicate with R via the RPy plugin!


An often overlooked aspect of a trading system while in the initial research and design stage is the connectivity to a broker API. Most APIs natively support C++ and Java, but some also support C# and Python, either directly or with community-provided wrapper code to the C++ APIs. In particular, Interactive Brokers can be connected to via the IBPy plugin. If high-performance is required, brokerages will support the FIX protocol.


Conclusão.


As is now evident, the choice of programming language(s) for an algorithmic trading system is not straightforward and requires deep thought. The main considerations are performance, ease of development, resiliency and testing, separation of concerns, familiarity, maintenance, source code availability, licensing costs and maturity of libraries.


O benefício de uma arquitetura separada é que permite que os idiomas sejam "conectados" para diferentes aspectos de uma pilha de negociação, conforme e quando os requisitos mudarem. A trading system is an evolving tool and it is likely that any language choices will evolve along with it.


Apenas iniciando o comércio quantitativo?


3 razões para se inscrever para a lista de e-mails QuantStart:


1. Quant Trading Lessons.


Você terá acesso instantâneo a um curso de e-mail gratuito de 10 partes, repleto de sugestões e dicas para ajudá-lo a começar a negociação quantitativa!


2. Todo o conteúdo mais recente.


Todas as semanas, vou enviar-lhe um envoltório de todas as atividades no QuantStart para que você nunca mais perca uma postagem novamente.


Real, dicas de negociação viáveis, sem tonturas.

Comments

Popular posts from this blog

Melhor consultor de negociação forex

Opções normais de compra de ações

Opções binárias usando a opção binária