среда, 23 мая 2018 г.

Desenvolvendo estratégias de negociação algorítmica


Como os Algoritmos de Negociação são Criados.


O comércio quantitativo não é acessível apenas aos comerciantes institucionais; comerciantes de varejo estão se envolvendo também. Embora as habilidades de programação sejam recomendadas para produzir algoritmos, nem sempre elas são necessárias. Programas e serviços estão disponíveis e escrevem o código de programação para uma estratégia baseada nas entradas que você fornece. O código produzido pelo programa / serviço é então conectado à plataforma de negociação e o comércio começa. Mas antes que isso possa ocorrer, os traders algorítmicos que desejam ser passam por várias etapas, decidindo exatamente o que querem realizar com o algoritmo e como.


Prazo e restrições.


Embora um algoritmo bem programado possa ser executado por conta própria, recomenda-se alguma supervisão humana. Portanto, escolha um período de tempo e uma frequência de negociação que você possa monitorar. Se você tem um emprego em tempo integral e seu algoritmo é programado para fazer centenas de transações por dia em um gráfico de um minuto enquanto você está no trabalho, isso pode não ser o ideal. Você pode escolher um período de tempo um pouco mais longo para suas negociações e menos frequência de negociação para poder manter o controle sobre ele.


Lucratividade na fase de testes do algoritmo não significa que ele continuará produzindo esses retornos para sempre. Ocasionalmente, você precisará intervir e alterar o algoritmo de negociação se os resultados revelarem que ele não está mais funcionando bem. Este é também um compromisso de tempo que qualquer pessoa que realize negociações algorítmicas deve aceitar.


Restrições financeiras também são um problema. As comissões acumulam-se muito rapidamente com uma estratégia de negociação de alta frequência, portanto, verifique se você está com a corretora de menor custo disponível e se o potencial de lucro de cada operação garante o pagamento dessas comissões, potencialmente várias vezes ao dia. O capital inicial também é uma consideração. Diferentes mercados e produtos financeiros exigem diferentes quantias de capital. Se as ações de troca do dia, você precisará de pelo menos US $ 25.000 (mais é recomendado), mas negociação forex ou futuros você pode potencialmente começar com menos.


Restrições de mercado são outro problema. Nem todo mercado é adequado para negociação algorítmica. Escolha ações, ETFs, pares de moedas estrangeiras ou futuros com ampla flexibilidade para lidar com as ordens que o algoritmo estará produzindo.


Desenvolva ou aperfeiçoe uma estratégia.


Uma vez que as restrições financeiras e de tempo sejam compreendidas, desenvolva ou afine uma estratégia que possa ser programada. Você pode ter uma estratégia que negocie manualmente, mas é facilmente codificada? Se sua estratégia é altamente subjetiva e não baseada em regras, programar a estratégia pode ser impossível. As estratégias baseadas em regras são as mais fáceis de codificar - estratégias com entradas, stop loss e price targets baseados em dados quantificáveis ​​ou movimentos de preços.


Como as estratégias baseadas em regras são facilmente copiadas e testadas, há muitas opções disponíveis gratuitamente se você não tiver ideias próprias. Quantpedia é um desses recursos, fornecendo documentos acadêmicos e resultados de negociação para vários métodos de negociação quantitativos. As regras descritas podem ser codificadas e, em seguida, testadas quanto à lucratividade em dados passados ​​e atuais. Codificar um algoritmo requer habilidade de programação ou acesso ao software ou alguém que possa codificar para você.


Testando um Algoritmo de Negociação.


O passo mais importante é o teste. Uma vez que uma estratégia de negociação tenha sido codificada, não troque o capital real com ela até que ela tenha sido testada. O teste inclui deixar o algoritmo rodar em dados históricos de preços, mostrando como o algoritmo se comportou ao longo de milhares de negociações. Se a fase de testes históricos é lucrativa, e as estatísticas produzidas são aceitáveis ​​para sua tolerância ao risco - como empate máximo, índice de ganhos, risco de ruína, por exemplo - então avance para testar o algoritmo em condições reais em uma conta de demonstração. Mais uma vez, essa fase deve produzir centenas de negociações para que você possa acessar o desempenho.


Se o algoritmo for lucrativo em dados de preços históricos e negociar uma conta de demonstração ao vivo, use-o com capital real, mas com um olhar atento. As condições ao vivo são diferentes do histórico ou teste de demonstração, porque as ordens do algoritmo realmente afetam o mercado e podem causar derrapagem. Até que seja verificado o algoritmo funciona no mercado real, como fez em testes, mantenha um olhar atento.


Manutenção Contínua.


Enquanto o algoritmo estiver operando dentro dos parâmetros estatísticos estabelecidos durante o teste, deixe o algoritmo sozinho. Algoritmos têm o benefício de negociar sem emoção, mas um comerciante que constantemente mexer com o algoritmo está anulando esse benefício. O algoritmo requer atenção embora. Monitore o desempenho e, se as condições do mercado mudarem tanto que o algoritmo não esteja mais funcionando como deveria, os ajustes poderão ser necessários.


The Bottom Line.


O comércio algorítmico não é um esforço definido e esquecido que o torna rico da noite para o dia. Na verdade, a negociação quantitativa pode ser tanto trabalho quanto negociar manualmente. Se você optar por criar um algoritmo, esteja ciente de como o tempo, as restrições financeiras e de mercado podem afetar sua estratégia e planejar adequadamente. Transforme uma estratégia atual em uma baseada em regras, que pode ser mais facilmente programada, ou selecione um método quantitativo que já tenha sido testado e pesquisado. Em seguida, execute sua própria fase de teste usando dados históricos e atuais. Se isso for feito, execute o algoritmo com dinheiro real sob vigilância. Ajuste se necessário, mas caso contrário, deixe-o fazer o seu trabalho.


Noções básicas de negociação algorítmica: conceitos e exemplos.


O comércio algorítmico (negociação automatizada, negociação de caixa preta ou simplesmente negociação de algoritmos) é o processo de usar computadores programados para seguir um conjunto definido de instruções (um algoritmo) para colocar uma negociação para gerar lucros a uma velocidade e freqüência impossível para um comerciante humano. Os conjuntos de regras definidos são baseados em tempo, preço, quantidade ou qualquer modelo matemático. Além das oportunidades de lucro para o trader, a negociação de algoritmos torna os mercados mais flexíveis e torna a negociação mais sistemática ao excluir o impacto das emoções humanas nas atividades de negociação.


Suponha que um comerciante siga estes critérios comerciais simples:


Compre 50 ações de uma ação quando a média móvel de 50 dias ultrapassar a média móvel de 200 dias. (Uma média móvel é uma média de pontos de dados passados ​​que suaviza as flutuações diárias de preço e, portanto, identifica as tendências.) Venda ações do estoque quando sua média móvel de 50 dias ficar 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 monitore automaticamente o preço das ações (e os indicadores de média móvel) e coloque as ordens de compra e venda quando as condições definidas forem atendidas. O comerciante não precisa mais ficar de olho nos preços e gráficos ativos, ou colocar os pedidos manualmente. O sistema de negociação algorítmica faz isso automaticamente, identificando corretamente a oportunidade de negociação.


Benefícios do comércio algorítmico.


Algo-trading fornece os seguintes benefícios:


operações realizadas com os melhores preços possíveis e imediatas (com altas chances de execução nos níveis desejados) operações cronometradas corretamente e instantaneamente, para evitar mudanças significativas nos preços reduzindo os custos de transação (veja o exemplo de déficit de implementação abaixo) verificações automatizadas simultâneas em múltiplos as condições de mercado reduziram o risco de erros manuais ao colocar os negócios em teste, em dados históricos e em tempo real disponíveis, para ver se é uma estratégia comercial viável, possibilidade reduzida de erros por parte de comerciantes humanos com base em fatores emocionais e psicológicos.


A maior parte da negociação de algoritmos de hoje é a negociação de alta frequência (HFT), que tenta capitalizar a colocação de um grande número de pedidos em velocidades muito rápidas em vários mercados e vários parâmetros de decisão, com base em instruções pré-programadas.


O comércio de algo é usado em muitas formas de atividades de negociação e investimento, incluindo:


Investidores de médio a longo prazo ou empresas compradoras - fundos de pensão, fundos mútuos, seguradoras - usam-no para comprar ações em grandes quantidades quando não desejam influenciar os preços das ações com investimentos discretos e de grande volume. Comerciantes de curto prazo e participantes de sell-side - formadores de mercado (como corretoras), especuladores e arbitradores - se beneficiam da execução automatizada do comércio; Além disso, o comércio de algo ajuda a criar liquidez suficiente para os vendedores no mercado. Comerciantes sistemáticos - seguidores de tendências, hedge funds ou pares de traders (uma estratégia de negociação neutra de mercado que corresponde a uma posição comprada com uma posição vendida em um par de instrumentos altamente correlacionados, como duas ações, fundos negociados em bolsa (ETFs) ou moedas) etc. - Acha muito mais eficiente programar suas regras de negociação e permitir que o programa troque automaticamente.


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


Estratégias de Negociação Algorítmica.


Qualquer estratégia para negociação algorítmica requer uma oportunidade identificada que seja lucrativa em termos de ganhos aprimorados ou redução de custos. A seguir estão as estratégias de negociação comuns usadas no comércio de algo:


As estratégias de negociação algorítmica mais comuns seguem as tendências de médias móveis, desvios de canal, movimentos de níveis de preços e indicadores técnicos relacionados. Essas são as estratégias mais fáceis e simples de implementar por meio do comércio algorítmico, porque essas estratégias não envolvem previsões nem previsões de preços. As negociações são iniciadas com base na ocorrência de tendências desejáveis, que são fáceis e diretas de implementar por meio de algoritmos sem entrar na complexidade da análise preditiva. O exemplo mencionado acima, de usar as médias móveis de 50 e 200 dias, é uma estratégia popular de acompanhamento de tendências.


Comprar uma ação com cotação dupla a um preço menor em um mercado e vendê-la simultaneamente a um preço mais alto em outro mercado oferece o diferencial de preço como lucro ou arbitragem isenta de risco. A mesma operação pode ser replicada para ações versus instrumentos futuros, já que os diferenciais de preço existem de tempos em tempos. A implementação de um algoritmo para identificar esses diferenciais de preço e colocar as ordens permite oportunidades lucrativas de maneira eficiente.


Os fundos de índices definiram períodos de reequilíbrio para aproximar seus investimentos aos seus respectivos índices de referência. Isso cria oportunidades lucrativas para os traders algorítmicos, que capitalizam os negócios esperados que oferecem 20 a 80 pontos-base de lucros, dependendo do número de ações no fundo de índice, pouco antes do rebalanceamento do fundo de índice. Tais negociações são iniciadas através de sistemas de negociação algorítmica para execução atempada e melhores preços.


Modelos matemáticos comprovados, como a estratégia de negociação delta-neutral, permitem negociar com uma combinação de opções e sua segurança subjacente. (A Delta neutra é uma estratégia de carteira que consiste em múltiplas posições com deltas positivos e negativos compensatórios - uma relação que compara a mudança no preço de um ativo, geralmente um título negociável, com a mudança correspondente no preço de seu derivativo - de forma que a delta dos ativos em questão totaliza zero.)


A estratégia de reversão à média baseia-se na ideia de que os preços altos e baixos de um ativo são um fenômeno temporário que revertem para seu valor médio (valor médio) periodicamente. Identificar e definir uma faixa de preço e implementar um algoritmo baseado nele permite que as negociações sejam feitas automaticamente quando o preço do ativo entra e sai de sua faixa definida.


A estratégia de preço médio ponderado por volume divide uma ordem grande e libera pedaços menores da ordem determinada dinamicamente para o mercado, usando perfis de volume histórico específicos do estoque. O objetivo é executar o pedido próximo ao preço médio ponderado por volume (VWAP).


A estratégia de preço médio ponderada pelo tempo quebra uma ordem grande e libera dinamicamente pedaços menores da ordem para o mercado usando intervalos de tempo divididos uniformemente entre um horário de início e de término. O objetivo é executar o pedido próximo ao preço médio entre os horários inicial e final, minimizando o impacto no mercado.


Até que a ordem de negociação esteja totalmente preenchida, este algoritmo continua enviando ordens parciais, de acordo com a taxa de participação definida e de acordo com o volume negociado nos mercados. A “estratégia de etapas” relacionada envia pedidos em 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 níveis definidos pelo usuário.


A estratégia de déficit de implementação visa minimizar o custo de execução de um pedido negociando o mercado em tempo real, economizando assim no custo do pedido e se beneficiando do custo de oportunidade de execução atrasada. A estratégia aumentará a taxa de participação visada quando o preço da ação se mover favoravelmente e diminuirá quando o preço da ação se mover negativamente.


Existem algumas classes especiais de algoritmos que tentam identificar “acontecimentos” do outro lado. Esses "algoritmos de farejamento", usados, por exemplo, por um criador de mercado de vendas, têm a inteligência incorporada para identificar a existência de quaisquer algoritmos no lado da compra de uma grande ordem. Essa detecção por meio de algoritmos ajudará o criador de mercado a identificar grandes oportunidades de pedidos e permitir que eles se beneficiem do preenchimento dos pedidos a um preço mais alto. Às vezes, isso é identificado como front-running de alta tecnologia.


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


A implementação do algoritmo usando um programa de computador é a última parte, acompanhada de backtesting (experimentando o algoritmo em períodos históricos do desempenho passado do mercado de ações para ver se usá-lo seria lucrativo). O desafio é transformar a estratégia identificada em um processo informatizado integrado que tenha acesso a uma conta de negociação para fazer pedidos. Os seguintes são necessários:


conhecimento de programação de computadores para programar a estratégia de negociação necessária, programadores contratados ou conectividade de rede de software de negociação pré-fabricada e acesso a plataformas de negociação para colocar os pedidos em acesso a feeds de dados de mercado que serão monitorados pelo algoritmo quanto a oportunidades de fazer pedidos. infra-estrutura para backtest o sistema, uma vez que é construído - antes de ir viver em mercados reais dados históricos disponíveis para backtesting, dependendo da complexidade das regras implementadas no algoritmo.


Aqui está um exemplo de como funciona a negociação algorítmica: a Royal Dutch Shell (RDS) está listada na Bolsa de Valores de Amsterdã (AEX) e na Bolsa de Valores de Londres (LSE). Começamos construindo 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 britânicas Devido à diferença horária de uma hora, a AEX abre uma hora antes da LSE, seguida pelas duas bolsas negociadas simultaneamente pelas próximas horas e depois negociadas apenas na LSE durante a última hora como AEX fecha.


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


um programa de computador capaz de ler os preços atuais de preços de mercado da LSE e AEX, uma taxa forex (taxa de câmbio) para a capacidade de colocação de pedidos de GBP-EUR que pode encaminhar a ordem para a capacidade correta de backtesting de câmbio em preços históricos.


O programa de computador deve executar o seguinte:


Leia o feed de preço de entrada do estoque RDS de ambas as trocas. 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 grande o suficiente (descontando os custos de corretagem) levando a uma oportunidade lucrativa, então coloque a ordem de compra na troca de preço mais baixo e na ordem de venda na troca de preço mais alto. Se as ordens forem executadas conforme desejado, o lucro da arbitragem se seguirá.


Simples e fácil! No entanto, a prática de negociação algorítmica não é tão simples de manter e executar. Lembre-se, se você puder colocar uma negociação gerada por algoritmos, os outros participantes do mercado também poderão. Consequentemente, os preços flutuam em milissegundos e até microssegundos. No exemplo acima, o que acontece se a transação de compra for executada, mas a negociação de venda não ocorre porque os preços de venda mudam quando o seu pedido chega ao mercado? Você vai acabar sentado com uma posição aberta, fazendo com que sua estratégia de arbitragem seja inútil.


Há riscos e desafios adicionais: por exemplo, riscos de falha do sistema, erros de conectividade de rede, atrasos entre ordens de negociação e execução e, o mais importante de tudo, algoritmos imperfeitos. Quanto mais complexo for um algoritmo, o backtesting mais rigoroso é necessário antes de ser colocado em ação.


The Bottom Line.


É emocionante usar a automação auxiliada por computadores com o objetivo de ganhar dinheiro sem esforço. Mas é preciso garantir que o sistema seja completamente testado e que os limites necessários sejam definidos. Comerciantes analíticos devem considerar a aprendizagem de programação e construção de sistemas por conta própria, para ter confiança em implementar as estratégias certas de uma maneira infalível. Uso cauteloso e testes completos de negociação de algo podem criar oportunidades lucrativas.


7 Essenciais para o Desenvolvimento de uma Estratégia de Negociação Algorítmica.


por Bryan Fletcher.


1. Gerenciamento de Risco.


Ao formular uma estratégia de negociação, lembre-se de quanto você tem em risco em todos os momentos.


Meça e rastreie seu risco total aberto em todos os momentos calculando quanto você perderia se todas as suas posições fossem interrompidas.


Você pode fazer isso medindo e ajustando o risco por posição e seu portfólio geral.


Isso significa que você sabe quanto dinheiro você perderá, em porcentagem do total do seu patrimônio, se todos os seus negócios forem interrompidos.


Vamos ver uma maneira de fazer isso em uma estratégia de exemplo simples.


Vamos dizer que você arrisca 0,5% do seu patrimônio total em cada novo negócio. A estratégia de exemplo usa uma parada móvel com base no menor preço dos últimos X períodos no período Y. É isso.


Em mercados lentos e laterais, a parada se aproximará do preço e o risco será reduzido com o passar do tempo. Em movimentos parabólicos a seu favor, o preço e seu risco aberto se moverão muito mais rápido que seu stop móvel.


Seu risco aberto no negócio pode passar de 0,5% para um número múltiplo maior do que isso. Sem um mecanismo para reduzir ainda mais o risco nesse comércio, você pode experimentar quedas significativas em sua equidade e psique se o negócio rapidamente rastrear todos os seus ganhos. Especialmente quando você tem vários negócios em todos os benefícios do mesmo movimento.


Para os comerciantes de algo, essa descoberta significa que precisamos ter um algoritmo para contabilizar o risco aberto em cada posição e seu risco geral de portfólio.


Como poderíamos fazer isso?


Bem, você poderia adicionar um algoritmo projetado especificamente para essas circunstâncias que poderia mover paradas ou reduzir posições quando o risco exceder um certo limite e depois otimizar esses parâmetros no backtesting.


Risco por negociação = X% do capital total.


Isso irá controlar quanto você arrisca inicialmente em cada negociação.


Risco Máximo de Comércio Individual = X% (Mova Paradas ou Reduza as Posições)


Esse número precisará ser igual ou maior que o número acima.


Risco Máximo da Carteira = Y% (Mova Paradas ou Reduza as Posições)


Se a sua estratégia comercializa muitos instrumentos, esse parâmetro pode manter o risco total da carteira sob controle. Veja um exemplo visual que mostra o risco total da carteira de uma estratégia de exemplo em todo o backtest:


Imagem criada usando o software Trading Blox.


Eu aprendi sobre isso da maneira mais difícil quando eu estava comprando óleo em 2008. Eu usei um indicador de longo prazo como minha saída. Em meus extensos backtests, eu não tinha considerado o controle de risco em lucros abertos, já que movimentos parabólicos como esse não eram típicos.


Minha estratégia era confiável na maioria das vezes em mercados lentos, voláteis, mas em tendência.


Quando eu estava comprando óleo em 2008 a caminho de mais de US $ 140 / bbl, foi emocionante. No entanto, ao mesmo tempo, quanto mais rápido subia, mais me preocupava em ver a que distância estavam minhas paradas. Lembro-me de esperar que se consolidasse para dar um tempo às minhas paradas.


Eu tinha um componente de lucro, mas devido ao grande tamanho do contrato no mercado de futuros, eu estava muito limitado em quanto eu poderia reduzir minha posição. Depois que eu fui parado nessa posição, certifiquei-me de implementar mudanças no meu sistema que mediam e controlam o risco ajustando minhas paradas quando o risco excede um certo nível em posições individuais.


Criado com o Marketscope / Trading Station II.


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


2. Seleção de Mercado, Cronograma e Construção de Portfólio.


O período de tempo (m1, h1, etc.) que você está negociando terá um impacto nos mercados potenciais para consideração em seu sistema de negociação, plataforma de backtesting, recursos baseados em nuvem necessários, API usada e se os serviços de colocation forem necessários.


Sistemas de frequência mais alta baseando triggers ou execução em barras de 1 m ou ticks podem precisar de uma solução baseada em nuvem para permitir o escalonamento da capacidade de computação para backtesting e otimização para obter melhores resultados. Algumas plataformas de negociação algorítmica de terceiros incluem isso como parte de seu pacote.


O poder de computação junto com um mecanismo de backtesting otimizado para tirar vantagem disso economizará muito tempo no processo de desenvolvimento de estratégia para qualquer sistema de negociação.


Aqueles que consideram uma estratégia de alta frequência vão querer considerar um sistema de produção que seja colocado o mais próximo possível dos servidores do seu corretor e integrado via API do FIX para garantir que todas as atualizações de preço sejam recebidas à medida que todas as cotações são empurradas em vez de puxadas. Estação ou API ForexConnect.


Ao obter um preenchimento com o preço desejado ou o que for mais importante, sua pouca lucratividade, garantindo a menor latência em arquitetura, código e localização do servidor, oferecerá a melhor chance de obter a mesma quantidade de clareza no momento exato em que você precisa. isto.


Os parceiros VPS da FXCM oferecem serviços de colocation para qualquer necessidade:


Alguns corretores oferecem comissões com desconto para os traders de alto volume. Se a sua estratégia gerar mais de 50 milhões de volume nocional por mês em volume de negócios ou se você começar com um capital de risco de US $ 150 mil, poderá obter comissões com desconto de 25 a 55% com a conta Active Trader da FXCM, por exemplo.


Entender as características subjacentes da luidez de cada mercado também permite saber o quão escalável é sua estratégia. A liquidez ao preço que você deseja não é um recurso ilimitado e pode variar um pouco dependendo do mercado, da hora do dia e das circunstâncias.


Nosso guia Traits of Successful Traders possui alguns ótimos dados relacionados a isso.


Sistemas de baixa frequência geralmente dão mais margem de erro quando se trata de estimativas de derrapagem. O menor número de negociações totais em backtests significa que a contabilização do skid em execução impacta a lucratividade geral menos do que estratégias de frequência muito mais altas.


Se a sua estratégia utiliza pedidos de parada baseados em um canal de preços ou algum tipo de indicador de atraso para acionar um pedido, a redução da latência provavelmente não terá um impacto tão grande, exceto em determinadas situações específicas da estratégia.


A velocidade não melhora o preenchimento das paradas ou limites que estão nos servidores dos corretores.


Mercados individuais podem ter grandes variações no desempenho. Alguns podem ser ligados por longos períodos, enquanto outros ficam com lágrimas. Por causa disso, um pequeno número de mercados em seu portfólio pode levar a retornos mais voláteis do que um portfólio maior e diversificado de mercados e estratégias.


Depois, há alguns mercados que podem adicionar benefícios de diversificação ao seu portfólio, como USD / ZAR, usando uma estratégia de frequência muito menor, mas podem não ser lucrativos quando se usa prazos curtos, dependendo da sua estratégia.


3. Utilize tipos de pedidos avançados.


Um grande número de operadores apenas utiliza ordens de mercado para entrar e sair de suas operações. Em condições típicas de mercado, a maioria ficará feliz com os preenchimentos que receber. No entanto, em mercados rápidos, onde há muita incerteza, provedores de liquidez tendem a enviar cotações mais amplas para se protegerem e os preços podem se mover muito rapidamente.


Estratégias baseadas em breakout e momentum podem estar sujeitas a derrapagens se as negociações forem acionadas quando os níveis de resistência forem retirados e o fluxo de pedidos for pesado em uma direção. Somente o uso de ordens de parada para entrar em negociações garantirá a execução, mas deixa o risco de deslizamento bem aberto. As ordens de entrada de intervalo podem ser usadas para entrar na negociação dentro de um intervalo aceitável, mas rejeitar ordens em que a derrapagem é considerada inaceitável.


Algumas estratégias podem encontrar escorregamentos nulos ou até escorregamentos positivos se ordens de limite ou de preenchimento ou abatimento forem utilizadas. Um exemplo disso pode ser uma reversão à média de alta frequência ou uma estratégia baseada em eventos. O backtesting pode assumir 100% de execução em cada negociação, mas a realidade pode ser diferente em mercados rápidos.


Conclusão: entenda quais tipos de pedidos estão disponíveis para você e como eles podem ajudá-lo a obter uma execução superior.


Exemplos de tipos de pedidos


Exemplo de Comandos de Negociação.


4. Posição de dimensionamento.


Existem duas maneiras comuns de dimensionar suas posições:


Tamanho de posição com base em lote fixo: negociando o mesmo tamanho de lote, independentemente do par. Dimensionamento da posição com base no risco: o risco é calculado para cada operação com base na colocação de stop loss.


Tamanho de posição de lote fixo.


Essa abordagem é popular entre muitos traders, mas as limitações dessa abordagem podem levar ao excesso de peso dos mercados mais voláteis e à subponderação em mercados menos voláteis. Diferenças nas taxas de câmbio podem levar a diferenças dramáticas no tamanho do comércio nocional.


Dimensionamento da posição baseada em risco.


Muitos dos sistemas automatizados que vejo hoje têm um valor de stop loss fixo em pips para cada posição. Não sou fã dessa abordagem, pois acredito que ela pode levar a uma parada muito próxima em mercados voláteis e muito distante em mercados silenciosos. O risco por comércio também está em todo o mapa com essa abordagem.


O dimensionamento de posição com base no risco considera o risco por negociação, em que o risco é igual ao preço de entrada menos a parada inicial.


Uma abordagem sofisticada levará em consideração os intervalos médios de preços indevidos e recentes de cada mercado para determinar a colocação de parada.


Uma maneira de fazer isso é calcular o intervalo médio real dos últimos X períodos e colocar a parada inicial em um múltiplo desse número longe de sua entrada. Este método irá equilibrar dinamicamente seu risco em cada mercado que você negocia com base na volatilidade de mercado de cada um.


Aqui está o cálculo para o dimensionamento da posição baseada na volatilidade:


((Patrimônio total * Risco por negociação) / (ATR de período X em pips * Compensação de ATR * valor de pip por lote de 1K)) = Tamanho da negociação em lotes de 1K.


Patrimônio total = $ 100K.


Risco por comércio = 1%


X período ATR em pips = 50.


Valor de pip por lote de 1K = $ 0,10.


133.333 = Tamanho do Comércio em lotes de 1K (Arredondar para 133 para submeter o comércio de 133K EUR / USD)


Em mercados voláteis, a faixa média de preços por barra, independentemente do prazo, pode saltar consideravelmente em tempos de incerteza e resultar em mercados muito rápidos e com muito ruído sem rumo, levando muitos operadores a serem sacudidos.


No entanto, se você utilizar o recente ATR (Average True Range) para cada mercado e utilizar um múltiplo disso para determinar seu preço de parada, acredito que você está dando ao comércio uma melhor chance de sucesso filtrando o ruído de curto prazo ( volatilidade).


Por outro lado, minhas trocas comerciais favoritas sempre vêm em mercados tranquilos, com faixas de negociação estreitas. Utilizar o recente ATR para dimensionar suas posições levará a paradas mais apertadas e a tamanhos de posição maiores em mercados com faixas de preço relativas baixas.


Este método também lhe dá o benefício de ter uma abordagem consistente de dimensionamento de posição em cada mercado que você negocia, levando a um portfólio mais equilibrado e diversificado. Se você não considera a volatilidade de cada mercado para o dimensionamento de posições, a volatilidade de uma de suas posições pode ser várias vezes maior do que suas outras negociações.


Não tome minha palavra, faça backtest e estude os resultados de perto. Lembre-se, porém, o backtesting tem suas limitações e o desempenho passado não é indicação de resultados futuros.


A primeira coisa que você precisa é de dados. Eu acho que é importante testar o que você troca e negocia com o que você testa. A natureza descentralizada do mercado de câmbio significa que cada corretor provavelmente terá histórico e spreads de preços históricos diferentes.


A FXCM oferece dados históricos extensivos para todos os instrumentos gratuitamente através da nossa API ForexConnect ou através do nosso aplicativo Historical Data Downloader.


Algumas plataformas de negociação algorítmica de terceiros também oferecerão acesso a dados históricos de FXCM, mas podem não ter nosso conjunto de dados completo. Se você estiver usando um desses e quiser mais dados para fazer backtest, poderá adicionar aos seus arquivos de dados com essas opções.


É uma coisa para ter uma ótima idéia para uma estratégia de negociação e, em seguida, obtê-lo codificado para negociação ao vivo, mas se você apenas pular em negociação ao vivo ou utilizar backtests irreal, você provavelmente vai ter um tempo difícil lidar com seu primeiro rebaixamento.


Se os seus backtests não são realistas ou utilizam as suposições erradas, como assumir a execução perfeita em cada negociação, você pode descobrir que seus resultados ao vivo são muito diferentes dos seus backtests.


Um excelente mecanismo de backtesting pode ajudá-lo a descobrir o que funciona e o que não funciona antes de colocar dinheiro na linha, embora o desempenho passado não seja uma indicação do desempenho futuro.


Você deve ser capaz de explorar diferentes variações de parâmetros e examinar estatísticas de desempenho, ver resultados visuais de desempenho e ver o desempenho comercial por comércio em um gráfico.


As plataformas de backtesting mais sofisticadas terão a capacidade de examinar e otimizar os resultados em vários mercados ao mesmo tempo. Na minha opinião, isso é muito importante na descoberta de estratégias adequadas para muitos mercados diferentes e onde o risco é gerenciado para todo o portfólio de posições.


Se você não otimizar sua estratégia de negociação, as chances são de que você terá uma estratégia que não será tão boa quanto poderia ser. Por outro lado, se você otimizar demais, você pode acabar com uma estratégia que só funciona bem em dados históricos. O importante é encontrar um equilíbrio entre eles.


O maior risco que você terá ao otimizar sua estratégia com o backtesting é o ajuste de curva. Sempre desconfio de sistemas que foram otimizados com muitas variáveis ​​diferentes ou apenas otimizados em um mercado. Dito de outra forma, você quer limitar os graus de liberdade do seu sistema.


Quanto mais parâmetros seu sistema de negociação tiver, mais fácil será otimizar perfeitamente os parâmetros no histórico de preços anteriores com resultados surpreendentes, o que provavelmente é apenas ruído e não um padrão repetitivo.


Backtesting sua estratégia em apenas um mercado pode ter o mesmo efeito. Como você está apenas simulando resultados em um fluxo de preços, será muito fácil ajustar seus parâmetros a dados passados ​​com incríveis resultados de backtested, mas com pouca significância estatística.


Na minha experiência e pesquisa de muitos comerciantes de sistemas bem-sucedidos, muitos usam sistemas muito simples com um pequeno número de parâmetros para evitar esse risco.


Manter sua lógica de estratégia simples também ajudará a reduzir a latência geral ao gerar decisões de negociação. Se o seu sistema tiver que processar 6 pontos de verificação em vez de 10, por exemplo, você aumentará suas estatísticas de execução se estiver negociando uma estratégia muito ativa.


7. Tolerância ao Risco.


Toda pessoa tem um conjunto de circunstâncias e disposições indevidas: idade, renda, despesas, capital de risco, apetite geral ao risco e se são geralmente otimistas ou pessimistas. Devido a isso, cada pessoa deve determinar que tipo de risco eles podem suportar. Se você tem pouco ou nenhum capital de risco, a melhor abordagem pode ser não negociar e continuar economizando dinheiro.


A maioria dos comerciantes de algo é otimista e acredita que eles podem alcançar melhores resultados do que o seu Joe médio. Isso pode levar a muitos planos de negociação arrojados, com alto risco, que podem ser eliminados muito rapidamente, devido a perdas, ou pelo fato de os comerciantes atingirem seu ponto de tio psicológico com a perspectiva de novas perdas.


Posso assegurar-lhe que é difícil ser tão otimista quanto você estava no início da negociação, quando você está no meio de um grande rebaixamento.


É como quando estou realmente com fome e comendo fora. Eu normalmente peço muito mais comida do que consigo suportar. No entanto, eu não percebo isso até que eu estou recheado e eu tenho 1 ou 2 tacos mais sentados no meu prato.


Na minha experiência, isso é semelhante à implementação da sua primeira estratégia automatizada. Uma estratégia que faz 20% ao ano quando o backtesting é bom, mas cara, 40% ao ano seria muito melhor e tudo o que tenho a fazer é estar disposto a aceitar rebaixamentos maiores!


Antes de lançar o meu fundo, lembro-me de estudar os resultados de desempenho de muitos Conselheiros de Negociação de Commodities sistemáticos, que são administradores de dinheiro regulamentados pela NFA. Muitos dos CTAs que existem há muito tempo tiveram desempenho muito bom, mas volátil, nos primeiros anos, mas depois se tornaram muito mais conservadores. Vai saber.


É minha opinião que sua verdadeira tolerância ao risco é provavelmente menor do que você pensa que é. Nunca se esqueça de que a sobrevivência e a preservação do capital é a coisa mais importante a considerar, não o quanto você pode potencialmente fazer por ano com base nos seus backtests.


Ao executar sua estratégia ao vivo, espere experimentar completamente todo o espectro de emoções. No entanto, acho importante que você não tome decisões impulsivas com base em seus sentimentos, deixando que o medo ou a esperança levem a riscos excessivos ou tentando ultrapassar sua estratégia e fazer negócios com os sentimentos que você tem.


Fortes emoções de medo ou ganância podem levar a decisões ruins quando os sistemas são negociados. Computadores não precisam lidar com isso, então a melhor estratégia para lidar com isso, na minha opinião, é encontrar um sistema de negociação robusto, cumpri-lo e utilizar um processo de pesquisa antes de fazer qualquer alteração.


Suas emoções podem ajudá-lo a identificar pontos fracos e oportunidades potenciais em seu sistema de negociação. Se a volatilidade do seu desempenho comercial está deixando o seu medo o tempo todo, reduza seu risco.


Talvez você veja um movimento que você se arrepende de ter perdido. Ouça esse arrependimento e utilize backtests para explorar maneiras de modificar seu sistema para garantir que você não perca esse tipo de oportunidade no futuro.


Quando eu devolvi muitos lucros ao meu comércio de petróleo, fiquei muito enojado. Isto levou-me a fazer modificações no meu sistema de negociação, o que melhorou a gestão global de risco em riscos individuais de negociação aberta.


Colocando tudo junto.


Aqui estão alguns parâmetros para consideração ao projetar uma estratégia algorítmica direcional:


Risco de entrada por comércio.


Número de períodos de retorno do ATR # ATR múltiplo (multiplique este número de vezes dos períodos de retorno do ATR para o posicionamento de parada)


Filtro comercial (se aplicável)


Insira novas negociações somente quando a seguinte condição for atendida (ou seja, a tendência é baseada em médias móveis duplas)


Inserir parâmetros para o seu indicador técnico favorito Adicione qualquer outra lógica para escalar dentro / fora de negociações (trailing stop, ter lucros em X ATR, etc.)


Risco Máximo de Comércio Individual.


Risco Máximo de Negociação Individual = X% (considere a colocação de topos ou a redução de posições)


Risco Máximo da Carteira.


Risco Máximo da Carteira = Y% (Considerações sobre os tops ou r em p asições)


Outros parâmetros importantes para backtesting:


Isso pode ser calculado em termos de pips ou em termos percentuais, desde o preço de preenchimento até o preço mais baixo / mais alto na barra em que o negócio foi preenchido.


O que você acha essencial para desenvolver e executar uma estratégia de algo?


Perguntas, comentários e feedback são bem-vindos. Me mande uma mensagem no instrutor @ dailyfx.


Para participar da minha lista de distribuição de e-mail, preencha este formulário.


OS RESULTADOS DE DESEMPENHO HIPOTÉTICOS TÊM MUITAS LIMITAÇÕES INERENTES, ALGUNS DOS QUAIS SÃO DESCRITOS ABAIXO. NENHUMA REPRESENTAÇÃO É FEITA QUE QUALQUER CONTA PODERÁ OU POSSIBILITAR LUCROS OU PERDAS SEMELHANTES AOS APRESENTADOS. DE FATO, HÁ DIFERENÇAS FREQUENTEMENTE DIFERENCIADAS ENTRE OS RESULTADOS DE DESEMPENHO HIPOTÉTICOS E OS RESULTADOS REALIZADOS SUBSEQÜENTEMENTE ATINGIDOS POR QUALQUER PROGRAMA DE NEGOCIAÇÃO PARTICULAR.


UMA DAS LIMITAÇÕES DOS RESULTADOS DE DESEMPENHO HIPOTÉTICOS É QUE SÃO GENERALMENTE PREPARADOS COM O BENEFÍCIO DE HINDSIGHT. ALÉM DISSO, A NEGOCIAÇÃO HIPOTÉTICA NÃO ENVOLVE O RISCO FINANCEIRO, E NENHUM REGISTRO DE NEGOCIAÇÃO HIPOTÉTICA PODE COMPLETAMENTE CONTADO PELO IM-PACTO DE RISCO FINANCEIRO NA NEGOCIAÇÃO REAL. POR EXEMPLO, A CAPACIDADE PARA SUPORTAR PERDAS OU ADERIR A UM PROGRAMA DE NEGOCIAÇÃO EM PARTICULAR, DENTRO DAS PERDAS DA NEGOCIAÇÃO, É PONTOS MATERIAIS QUE TAMBÉM PODEM AFETAR A VERSÃO DE RESULTADOS REAIS DA NEGOCIAÇÃO. Existem muitos outros fatores relacionados aos mercados em geral ou à implementação. DE QUALQUER PROGRAMA DE NEGOCIAÇÃO ESPECÍFICO QUE NÃO PODE SER TOTALMENTE CONSIDERADO PARA A PREPARAÇÃO DE RESULTADOS DE DESEMPENHO HIPOTÉTICOS E TODOS OS QUAIS PODEM AFETAR COM ANTECEDÊNCIA OS RESULTADOS REAIS DA NEGOCIAÇÃO.


Quaisquer opiniões, notícias, pesquisas, análises, preços ou outras informações contidas neste site são fornecidas como comentários gerais de mercado e não constituem conselhos de investimento. O grupo FXCM não aceitará responsabilidade por qualquer perda ou dano, incluindo, sem limitação, qualquer perda de lucro, que possa surgir direta ou indiretamente do uso ou confiança contida nos sinais de negociação, ou em quaisquer análises de gráficos acompanhantes.


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


Como identificar estratégias de negociação algorítmicas.


Como identificar estratégias de negociação algorítmicas.


Neste artigo, quero apresentar os métodos pelos quais eu mesmo identifico estratégias lucrativas de negociação algorítmica. Nosso objetivo hoje é entender detalhadamente como encontrar, avaliar e selecionar tais sistemas. Explicarei como as estratégias de identificação envolvem tanto a preferência pessoal quanto o desempenho da estratégia, como determinar o tipo e a quantidade de dados históricos para testes, como avaliar imparcialmente uma estratégia de negociação e, finalmente, como proceder para a fase de backtesting e implementação estratégica.


Identificando suas próprias preferências pessoais para negociação.


Para ser um profissional bem-sucedido - seja de forma discreta ou algorítmica - é necessário fazer algumas perguntas honestas. Negociação fornece a você a capacidade de perder dinheiro a um ritmo alarmante, por isso é necessário "conhecer-se", tanto quanto é necessário compreender a sua estratégia escolhida.


Eu diria que a consideração mais importante no comércio é estar ciente de sua própria personalidade. O comércio e o comércio algorítmico, em particular, exigem um grau significativo de disciplina, paciência e distanciamento emocional. Como você está permitindo que um algoritmo realize sua negociação para você, é necessário que ele seja resolvido para não interferir na estratégia quando ela estiver sendo executada. Isso pode ser extremamente difícil, especialmente em períodos de redução prolongada. No entanto, muitas estratégias que se mostraram altamente lucrativas em um backtest podem ser arruinadas pela simples interferência. Entenda que, se você deseja entrar no mundo do comércio algorítmico, será testado emocionalmente e, para ter sucesso, é necessário superar essas dificuldades!


A próxima consideração é uma das vezes. Você tem um emprego a tempo inteiro? Você trabalha meio período? Você trabalha em casa ou tem um longo trajeto todos os dias? Essas perguntas ajudarão a determinar a frequência da estratégia que você deve procurar. Para aqueles que trabalham em tempo integral, uma estratégia de futuros intradiários pode não ser apropriada (pelo menos até que seja totalmente automatizada!). Suas limitações de tempo também ditarão a metodologia da estratégia. Se a sua estratégia é freqüentemente negociada e depende de feeds de notícias caros (como um terminal da Bloomberg), você terá claramente que ser realista em relação à sua capacidade de executar isso com sucesso no escritório! Para aqueles de vocês com muito tempo, ou as habilidades para automatizar sua estratégia, você pode querer olhar para uma estratégia de negociação de alta frequência (HFT) mais técnica.


Acredito que é necessário realizar pesquisas contínuas em suas estratégias de negociação para manter um portfólio consistentemente lucrativo. Poucas estratégias permanecem "sob o radar" para sempre. Portanto, uma parte significativa do tempo destinado à negociação será na realização de pesquisas em andamento. Pergunte a si mesmo se você está preparado para fazer isso, pois pode ser a diferença entre uma lucratividade forte ou um declínio lento em direção às perdas.


Você também precisa considerar seu capital comercial. O valor mínimo ideal geralmente aceito para uma estratégia quantitativa é de 50.000 USD (aproximadamente £ 35.000 para nós no Reino Unido). Se eu estivesse começando de novo, começaria com uma quantia maior, provavelmente perto de 100.000 USD (aproximadamente £ 70.000). Isso ocorre porque os custos de transação podem ser extremamente caros para as estratégias de média a alta frequência e é necessário ter capital suficiente para absorvê-los em tempos de rebaixamento. Se você está pensando em começar com menos de 10.000 dólares, então você precisará restringir-se a estratégias de baixa frequência, negociando em um ou dois ativos, já que os custos de transação irão rapidamente engolir seus retornos. A Interactive Brokers, que é uma das corretoras mais amigáveis ​​para aqueles com habilidades de programação, devido à sua API, tem uma conta de varejo de no mínimo 10.000 USD.


A habilidade de programação é um fator importante na criação de uma estratégia automatizada de negociação algorítmica. Ter conhecimento em uma linguagem de programação como C ++, Java, C #, Python ou R permitirá que você crie o armazenamento de dados de ponta a ponta, mecanismo de backtest e sistema de execução por conta própria. Isso tem uma série de vantagens, das quais a principal é a capacidade de estar completamente ciente de todos os aspectos da infraestrutura de negociação. Ele também permite que você explore as estratégias de frequência mais alta, pois você estará no controle total da sua "pilha de tecnologia". Embora isso signifique testar seu próprio software e eliminar bugs, também significa mais tempo gasto na codificação de infraestrutura e menos na implementação de estratégias, pelo menos na primeira parte de sua carreira de negociação de algoritmos. Você pode achar que está confortável negociando no Excel ou no MATLAB e pode terceirizar o desenvolvimento de outros componentes. Eu não recomendaria isso, no entanto, especialmente para aqueles que operam em alta freqüência.


Você precisa se perguntar o que você espera alcançar por negociação algorítmica. Você está interessado em uma renda regular, em que você espera obter ganhos de sua conta de negociação? Ou, você está interessado em um ganho de capital a longo prazo e pode se dar ao luxo de negociar sem a necessidade de levantar fundos? Dependência de renda irá ditar a frequência da sua estratégia. Retiradas de renda mais regulares exigirão uma estratégia de negociação de frequência mais alta com menos volatilidade (ou seja, um índice de Sharpe mais alto). Comerciantes de longo prazo podem ter uma frequência de negociação mais tranqüila.


Finalmente, não se iluda com a noção de se tornar extremamente rico em um curto espaço de tempo! Algo negociação não é um esquema de enriquecimento rápido - se alguma coisa pode ser um esquema de tornar-se pobre rápido. É preciso muita disciplina, pesquisa, diligência e paciência para ter sucesso no comércio algorítmico. Pode levar meses, se não anos, para gerar lucratividade consistente.


Idéias de Negociação Algorítmica de Sourcing.


Apesar das percepções comuns em contrário, é bastante simples localizar estratégias de negociação lucrativas no domínio público. Nunca as ideias de negociação foram mais prontamente disponíveis do que são hoje. Revistas de finanças acadêmicas, servidores de pré-impressão, blogs de negociação, fóruns de negociação, revistas semanais de negociação e textos especializados fornecem milhares de estratégias de negociação com as quais basear suas idéias.


Nosso objetivo como pesquisadores quantitativos de negociação é estabelecer um pipeline de estratégia que nos proporcione um fluxo de ideias de negociação em andamento. Idealmente, queremos criar uma abordagem metódica para a terceirização, avaliação e implementação de estratégias com as quais nos deparamos. Os objetivos do pipeline são gerar uma quantidade consistente de novas idéias e nos fornecer uma estrutura para rejeitar a maioria dessas idéias com o mínimo de consideração emocional.


Devemos ser extremamente cuidadosos para não deixar que vieses cognitivos influenciem nossa metodologia de tomada de decisão. Isso pode ser tão simples quanto ter uma preferência por uma classe de ativos sobre outra (ouro e outros metais preciosos vêm à mente) porque eles são percebidos como mais exóticos. Nosso objetivo deve ser sempre encontrar estratégias consistentemente lucrativas, com expectativa positiva. A escolha da classe de ativos deve ser baseada em outras considerações, como restrições de capital comercial, taxas de corretagem e capacidades de alavancagem.


Se você não estiver familiarizado com o conceito de uma estratégia de negociação, então o primeiro lugar para procurar é com livros didáticos estabelecidos. Os textos clássicos fornecem uma ampla gama de ideias mais simples e diretas, com as quais você pode se familiarizar com a negociação quantitativa. Aqui está uma seleção que eu recomendo para aqueles que são novos no comércio quantitativo, que gradualmente se tornam mais sofisticados conforme você trabalha na lista:


Para uma lista mais longa de livros de negociações quantitativas, visite a lista de leitura QuantStart.


O próximo lugar para encontrar estratégias mais sofisticadas é com fóruns de negociação e blogs de negociação. No entanto, uma nota de cautela: Muitos blogs de negociação contam com o conceito de análise técnica. A análise técnica envolve a utilização de indicadores básicos e psicologia comportamental para determinar tendências ou padrões de reversão nos preços dos ativos.


Apesar de ser extremamente popular no espaço comercial geral, a análise técnica é considerada um tanto ineficaz na comunidade financeira quantitativa. Alguns sugeriram que não é melhor do que ler um horóscopo ou estudar folhas de chá em termos de poder preditivo! Na realidade, existem indivíduos bem sucedidos fazendo uso de análise técnica. No entanto, como pessoas com uma caixa de ferramentas matemática e estatística mais sofisticada à nossa disposição, podemos facilmente avaliar a eficácia de tais estratégias baseadas em TA e tomar decisões baseadas em dados em vez de basear as nossas em considerações emocionais ou preconceitos.


Aqui está uma lista de blogs e fóruns de negociação algorítmica bem respeitados:


Depois de ter alguma experiência em avaliar estratégias mais simples, é hora de olhar para as ofertas acadêmicas mais sofisticadas. Algumas revistas acadêmicas serão de difícil acesso, sem altas assinaturas ou custos únicos. Se você é um membro ou ex-aluno de uma universidade, você deve ser capaz de obter acesso a alguns desses periódicos financeiros. Caso contrário, você pode ver os servidores de pré-impressão, que são repositórios da Internet de rascunhos atrasados ​​de trabalhos acadêmicos que estão sendo revisados ​​por especialistas. Como estamos interessados ​​apenas em estratégias que podemos replicar com sucesso, fazer backtest e obter lucratividade, uma revisão por pares é de menor importância para nós.


A principal desvantagem das estratégias acadêmicas é que muitas vezes elas podem estar desatualizadas, exigir dados históricos obscuros e caros, negociar em classes de ativos ilíquidos ou não levar em consideração taxas, escorregões ou spread. Também pode não estar claro se a estratégia de negociação deve ser executada com ordens de mercado, ordens de limite ou se ela contém perdas de parada, etc. Assim, é absolutamente essencial replicar a estratégia você mesmo, fazer o backtest e adicionar transações realistas. custos que incluem tantos aspectos das classes de ativos que você deseja negociar.


Aqui está uma lista dos servidores de pré-impressão mais populares e revistas financeiras que você pode obter idéias de:


Que tal formar suas próprias estratégias quantitativas? Isso geralmente requer (mas não está limitado a) conhecimento em uma ou mais das seguintes categorias:


Microestrutura de mercado - Para estratégias de maior frequência, em particular, pode-se fazer uso da microestrutura de mercado, ou seja, o entendimento da dinâmica da carteira de pedidos para gerar rentabilidade. Diferentes mercados terão várias limitações tecnológicas, regulamentações, participantes do mercado e restrições que serão abertas à exploração por meio de estratégias específicas. Esta é uma área muito sofisticada e os profissionais de varejo terão dificuldade em ser competitivos neste espaço, particularmente porque a competição inclui fundos de hedge quantitativos grandes e bem capitalizados com fortes capacidades tecnológicas. Estrutura do fundo - Fundos de investimento agrupados, como fundos de pensão, parcerias de investimento privado (hedge funds), consultores de negociação de commodities e fundos mútuos são limitados tanto pela pesada regulação quanto por suas grandes reservas de capital. Assim, certos comportamentos consistentes podem ser explorados com aqueles que são mais ágeis. Por exemplo, grandes fundos estão sujeitos a restrições de capacidade devido ao seu tamanho. Assim, se eles precisarem rapidamente descarregar (vender) uma quantidade de títulos, terão que escalonar para evitar "movimentar o mercado". Algoritmos sofisticados podem tirar proveito disso, e outras idiossincrasias, em um processo geral conhecido como arbitragem da estrutura do fundo. Aprendizado de máquina / inteligência artificial - Os algoritmos de aprendizado de máquina se tornaram mais prevalentes nos últimos anos nos mercados financeiros. Classificadores (como Naive-Bayes, et al.) Correspondentes de função não-linear (redes neurais) e rotinas de otimização (algoritmos genéticos) têm sido usados ​​para prever caminhos de ativos ou otimizar estratégias de negociação. Se você tiver experiência nessa área, poderá ter algumas dicas sobre como determinados algoritmos podem ser aplicados a determinados mercados.


Existem, é claro, muitas outras áreas para os quantos investigarem. Discutiremos como detalhar as estratégias personalizadas em um artigo posterior.


Ao continuar a monitorar essas fontes semanalmente ou diariamente, você está se preparando para receber uma lista consistente de estratégias de diversas fontes. O próximo passo é determinar como rejeitar um grande subconjunto dessas estratégias, a fim de minimizar o desperdício de tempo e recursos de backtesting em estratégias que provavelmente não serão lucrativas.


Avaliação de estratégias de negociação.


A primeira e indiscutivelmente mais óbvia consideração é se você realmente entende a estratégia. Você seria capaz de explicar a estratégia de forma concisa ou requer uma série de advertências e listas de parâmetros sem fim? Além disso, a estratégia tem uma base boa e sólida na realidade? Por exemplo, você poderia apontar para algum raciocínio comportamental ou restrição de estrutura de fundos que possa estar causando o (s) padrão (ões) que você está tentando explorar? Essa restrição seria uma mudança de regime, como uma dramática interrupção no ambiente regulatório? A estratégia depende de regras estatísticas ou matemáticas complexas? Aplica-se a qualquer série temporal financeira ou é específico da classe de ativos na qual se afirma ser rentável? Você deve estar constantemente pensando sobre esses fatores ao avaliar novos métodos de negociação, caso contrário você pode perder uma quantidade significativa de tempo tentando fazer backtest e otimizar estratégias não lucrativas.


Depois de determinar que você entende os princípios básicos da estratégia, você precisa decidir se ela se encaixa no perfil de personalidade mencionado anteriormente. Esta não é uma consideração tão vaga quanto parece! Estratégias diferem substancialmente em suas características de desempenho. Existem certos tipos de personalidade que podem lidar com períodos mais significativos de levantamento, ou estão dispostos a aceitar um risco maior de retorno maior. Apesar do fato de que nós, como muitos, tentamos eliminar o máximo de viés cognitivo possível e devemos ser capazes de avaliar uma estratégia imparcialmente, os vieses sempre se infiltrarão. Assim, precisamos de meios consistentes e sem emoção para avaliar o desempenho das estratégias. . Aqui está a lista de critérios que julgo uma nova estratégia em potencial:


Metodologia - A estratégia é baseada no momento, na reversão da média, no neutro do mercado, no direcional? A estratégia baseia-se em técnicas estatísticas sofisticadas (ou complexas!) Ou de aprendizado de máquina que são difíceis de entender e requerem um PhD em estatística para entender? Essas técnicas introduzem uma quantidade significativa de parâmetros, o que pode levar a um viés de otimização? É provável que a estratégia resista a uma mudança de regime (ou seja, nova regulação potencial dos mercados financeiros)? Índice de Sharpe - O índice de Sharpe caracteriza heuristicamente a relação recompensa / risco da estratégia. Quantifica quanto retorno você pode obter para o nível de volatilidade suportado pela curva de capital. Naturalmente, precisamos determinar o período e a frequência com que esses retornos e a volatilidade (ou seja, o desvio padrão) são medidos. Uma estratégia de frequência mais alta exigirá uma taxa de amostragem maior do desvio padrão, mas um período de tempo global mais curto de medição, por exemplo. Alavancagem - A estratégia requer alavancagem significativa para ser rentável? A estratégia requer o uso de contratos de derivativos alavancados (futuros, opções, swaps) para fazer um retorno? Esses contratos alavancados podem ter características pesadas de volatilidade e, portanto, podem facilmente levar a chamadas de margem. Você tem o capital comercial e o temperamento para tal volatilidade? Freqüência - A frequência da estratégia está intimamente ligada à sua pilha de tecnologia (e, portanto, ao conhecimento tecnológico), ao índice de Sharpe e ao nível geral dos custos de transação. Todas as outras questões consideradas, estratégias de maior frequência exigem mais capital, são mais sofisticadas e mais difíceis de implementar. No entanto, supondo que seu mecanismo de backtesting seja sofisticado e livre de erros, eles geralmente terão taxas de Sharpe muito mais altas. Volatilidade - A volatilidade está fortemente relacionada ao "risco" da estratégia. A proporção de Sharpe caracteriza isso. A maior volatilidade das classes de ativos subjacentes, se não protegidas, muitas vezes leva a uma maior volatilidade na curva de capital e, portanto, menores índices de Sharpe. É claro que estou assumindo que a volatilidade positiva é aproximadamente igual à volatilidade negativa. Algumas estratégias podem ter maior volatilidade negativa. Você precisa estar ciente desses atributos. Ganho / Perda, Lucro Médio / Perda - As estratégias diferem em suas características de ganhos / perdas e lucro / prejuízo médio. Pode-se ter uma estratégia muito lucrativa, mesmo se o número de negociações perdedoras exceder o número de negociações vencedoras. As estratégias de impulso tendem a ter esse padrão, pois dependem de um pequeno número de "grandes sucessos" para serem lucrativos. As estratégias de reversão à média tendem a ter perfis opostos nos quais mais dos negócios são "vencedores", mas os negócios perdedores podem ser bastante severos. Drawdown Máximo - O rebaixamento máximo é a maior queda percentual de ponta a ponta na curva de capital da estratégia. As estratégias de dinâmica são bem conhecidas por sofrer de períodos de rebaixamentos prolongados (devido a uma série de muitos comércios de perda incremental). Muitos traders desistirão em períodos de rebaixamento prolongado, mesmo que testes históricos tenham sugerido que isso é "business as usual" para a estratégia. Você precisará determinar qual porcentagem de rebaixamento (e em qual período de tempo) você pode aceitar antes de interromper sua estratégia. Esta é uma decisão altamente pessoal e, portanto, deve ser considerada com cuidado. Capacidade / Luidez - No nível de varejo, a menos que você esteja negociando com um instrumento altamente ilíquido (como ações de pequena capitalização), você não terá que se preocupar muito com a capacidade da estratégia. A capacidade determina a escalabilidade da estratégia para mais capital. Muitos dos maiores fundos de hedge sofrem com problemas de capacidade significativos à medida que suas estratégias aumentam na alocação de capital. Parâmetros - Determinadas estratégias (especialmente aquelas encontradas na comunidade de aprendizado de máquina) exigem uma grande quantidade de parâmetros. Cada parâmetro extra que uma estratégia requer deixa mais vulnerável ao viés de otimização (também conhecido como "ajuste de curva"). Você deve tentar direcionar as estratégias com o menor número de parâmetros possível ou ter quantidades suficientes de dados para testar suas estratégias. Benchmark - Quase todas as estratégias (a menos que caracterizadas como "retorno absoluto") são medidas em relação a algum benchmark de desempenho. O benchmark é geralmente um índice que caracteriza uma grande amostra da classe de ativos subjacente na qual a estratégia negocia. Se a estratégia negociar ações de grande capitalização dos EUA, o S & P500 seria uma referência natural para medir sua estratégia. Você ouvirá os termos "alpha" e "beta", aplicados a estratégias desse tipo. Discutiremos esses coeficientes em profundidade em artigos posteriores.


Observe que não discutimos os retornos reais da estratégia. Por que é isso? Isoladamente, os retornos realmente nos fornecem informações limitadas sobre a eficácia da estratégia. Eles não dão uma visão sobre alavancagem, volatilidade, benchmarks ou requisitos de capital. Assim, as estratégias raramente são julgadas apenas por seus retornos. Sempre considere os atributos de risco de uma estratégia antes de examinar os retornos.


Neste estágio, muitas das estratégias encontradas em seu pipeline serão rejeitadas, pois elas não atenderão às suas necessidades de capital, limitações de alavancagem, tolerância máxima de redução ou preferências de volatilidade. As estratégias que permanecem podem agora ser consideradas para backtesting. No entanto, antes que isso seja possível, é necessário considerar um critério final de rejeição - o dos dados históricos disponíveis sobre os quais testar essas estratégias.


Obtendo dados históricos.


Atualmente, a amplitude dos requisitos técnicos em classes de ativos para armazenamento de dados históricos é substancial. Para manter a competitividade, tanto o lado comprador (fundos) quanto o lado vendedor (bancos de investimento) investem pesadamente em sua infraestrutura técnica. É imperativo considerar sua importância. Em particular, estamos interessados ​​em pontualidade, precisão e requisitos de armazenamento. Agora descreverei os conceitos básicos da obtenção de dados históricos e como armazená-los. Infelizmente este é um tópico muito profundo e técnico, então não poderei dizer tudo neste artigo. No entanto, estarei escrevendo muito mais sobre isso no futuro, já que minha experiência anterior na indústria financeira estava principalmente relacionada à aquisição, armazenamento e acesso de dados financeiros.


Na seção anterior, criamos um pipeline de estratégia que nos permitia rejeitar determinadas estratégias com base em nossos critérios pessoais de rejeição. Nesta seção, filtraremos mais estratégias com base em nossas próprias preferências para obter dados históricos. As principais considerações (especialmente no nível do profissional de varejo) são os custos dos dados, os requisitos de armazenamento e seu nível de especialização técnica. Também precisamos discutir os diferentes tipos de dados disponíveis e as diferentes considerações que cada tipo de dados nos impõe.


Vamos começar discutindo os tipos de dados disponíveis e as principais questões que precisaremos pensar:


Dados Fundamentais - Incluem dados sobre tendências macroeconômicas, como taxas de juros, inflação, ações corporativas (dividendos, desdobramentos), arquivamentos na SEC, contas corporativas, dados de lucros, relatórios de safra, dados meteorológicos etc. Esses dados costumam ser usados ​​para valorizam empresas ou outros ativos em uma base fundamental, ou seja, por meio de alguns fluxos de caixa futuros esperados. Não inclui séries de preços de ações. Alguns dados fundamentais estão disponíveis gratuitamente em sites do governo. Outros dados históricos históricos de longo prazo podem ser extremamente caros. Os requisitos de armazenamento muitas vezes não são particularmente grandes, a menos que milhares de empresas estejam sendo estudadas de uma só vez. Dados de Notícias - Os dados de notícias são frequentemente de natureza qualitativa. É composto por artigos, posts, postagens de microblog ("tweets") e editorial. Técnicas de aprendizado de máquina, como classificadores, são freqüentemente usadas para interpretar sentimentos. Esses dados também costumam estar disponíveis gratuitamente ou são baratos, por meio da assinatura de meios de comunicação. Os bancos de dados de armazenamento de documentos "NoSQL" mais recentes são projetados para armazenar esse tipo de dados qualitativos não estruturados. Dados de Preço do Ativo - Este é o domínio de dados tradicional do quant. Consiste em séries temporais de preços de ativos. Ações (ações), produtos de renda fixa (títulos), commodities e preços de câmbio estão dentro dessa classe. Dados históricos diários geralmente são fáceis de obter para as classes de ativos mais simples, como ações. No entanto, depois que a precisão e a limpeza forem incluídas e os desvios estatísticos forem removidos, os dados poderão se tornar caros. Além disso, os dados de série temporal geralmente possuem requisitos de armazenamento significativos, especialmente quando dados intradiários são considerados. Instrumentos Financeiros - Ações, obrigações, futuros e as opções de derivativos mais exóticas têm características e parâmetros muito diferentes. Assim, não existe uma estrutura de banco de dados "tamanho único" que possa acomodá-los. Deve-se dar um cuidado significativo ao projeto e implementação de estruturas de banco de dados para vários instrumentos financeiros. Discutiremos a situação detalhadamente quando chegarmos a construir um banco de dados mestre de títulos em artigos futuros. Freqüência - Quanto maior a frequência dos dados, maiores são os custos e os requisitos de armazenamento. Para estratégias de baixa frequência, os dados diários costumam ser suficientes. Para estratégias de alta frequência, pode ser necessário obter dados em nível de escala e até cópias históricas de dados específicos do livro de ordens da bolsa de valores. A implementação de um mecanismo de armazenamento para esse tipo de dados é muito intensiva em tecnologia e adequada apenas para aqueles com forte histórico técnico / de programação. Benchmarks - As estratégias descritas acima serão frequentemente comparadas a um benchmark. Isso geralmente se manifesta como uma série temporal financeira adicional. Para ações, este é frequentemente um benchmark de ações nacionais, como o índice S & P500 (EUA) ou FTSE100 (Reino Unido). Para um fundo de renda fixa, é útil comparar com uma cesta de títulos ou produtos de renda fixa. A "taxa livre de risco" (isto é, taxa de juros apropriada) é também outro ponto de referência amplamente aceito. Todas as categorias de classes de ativos possuem uma referência favorecida, portanto, será necessário pesquisar isso com base em sua estratégia específica, se você deseja obter interesse em sua estratégia externamente. Tecnologia - As pilhas de tecnologia por trás de um centro de armazenamento de dados financeiros são complexas. Este artigo pode apenas arranhar a superfície sobre o que está envolvido na construção de um. No entanto, ele gira em torno de um mecanismo de banco de dados, como um RDBMS (Relational Database Management System), como MySQL, SQL Server, Oracle ou um Document Storage Engine (por exemplo, "NoSQL"). Isso é acessado por meio do código de aplicativo "lógica de negócios" que consulta o banco de dados e fornece acesso a ferramentas externas, como MATLAB, R ou Excel. Muitas vezes, essa lógica de negócios é escrita em C ++, C #, Java ou Python. Você também precisará hospedar esses dados em algum lugar, seja em seu próprio computador pessoal ou remotamente por meio de servidores da Internet. Produtos como o Amazon Web Services tornaram isso mais simples e mais barato nos últimos anos, mas ainda exigirão um conhecimento técnico significativo para alcançar de maneira robusta.


Como pode ser visto, uma vez que uma estratégia tenha sido identificada por meio do pipeline, será necessário avaliar a disponibilidade, os custos, a complexidade e os detalhes de implementação de um determinado conjunto de dados históricos. Você pode achar necessário rejeitar uma estratégia baseada somente em considerações de dados históricos. Esta é uma grande área e as equipes de PhDs trabalham em grandes fundos, garantindo que os preços sejam precisos e oportunos. Não subestime as dificuldades de criar um data center robusto para seus fins de backtesting!


Eu quero dizer, no entanto, que muitas plataformas de backtesting podem fornecer esses dados automaticamente para você - a um custo. Assim, você tirará muito da dor da implementação e poderá se concentrar apenas na implementação e otimização da estratégia. Ferramentas como TradeStation possuem essa capacidade. No entanto, minha visão pessoal é implementar o máximo possível internamente e evitar a terceirização de partes da pilha para os fornecedores de software. Eu prefiro estratégias de frequência mais altas devido às suas taxas de Sharpe mais atraentes, mas elas são freqüentemente acopladas à pilha de tecnologia, onde a otimização avançada é crítica.


Agora que discutimos os problemas em torno dos dados históricos, é hora de começar a implementar nossas estratégias em um mecanismo de backtesting. Este será o assunto de outros artigos, pois é uma área de discussão igualmente grande!


Melhor Linguagem de Programação para Sistemas de Negociação Algorítmica?


Melhor Linguagem de Programação para Sistemas de Negociação Algorítmica?


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


Primeiramente, os principais componentes de um sistema de negociação algorítmica serão considerados, como as ferramentas de pesquisa, o otimizador de portfólio, o gerenciador de risco e o mecanismo de execução. Posteriormente, diferentes estratégias de negociação serão examinadas e como elas afetam o design do sistema. Em particular, a frequência de negociação e o volume de negociação provável serão ambos discutidos.


Uma vez que a estratégia de negociação tenha sido selecionada, é necessário arquitetar todo o sistema. Isso inclui a escolha de hardware, o sistema operacional e a resiliência do sistema contra eventos raros e potencialmente catastróficos. Enquanto a arquitetura está sendo considerada, a devida atenção deve ser dada ao desempenho - tanto para as ferramentas de pesquisa quanto para o ambiente de execução ao vivo.


Qual é o sistema de negociação tentando fazer?


Antes de decidir sobre a "melhor" linguagem com a 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 de construção de portfólio? O sistema exigirá um backtester de alto desempenho? Para a maioria das estratégias, o sistema de negociação pode ser dividido em duas categorias: Pesquisa e geração de sinais.


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


A geração de sinais preocupa-se em gerar um conjunto de sinais de negociação de um algoritmo e enviar esses pedidos ao mercado, geralmente por meio de uma corretora. Para determinadas estratégias, é necessário um alto nível de desempenho. Problemas de E / S, como largura de banda de rede e latência, são muitas vezes o fator limitante na otimização de sistemas de execução. Assim, a escolha de idiomas para cada componente de todo o seu sistema pode ser bem 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 que estão sendo negociados, a conectividade com fornecedores de dados externos, a frequência e o volume da estratégia, o trade-off entre a facilidade de desenvolvimento e a otimização de desempenho, bem como qualquer hardware personalizado, incluindo customização co-localizada servidores, GPUs ou FPGAs que possam ser necessários.


As escolhas tecnológicas para uma estratégia de ações norte-americanas de baixa frequência serão muito diferentes daquelas de uma negociação de estratégia de arbitragem estatística de alta frequência no mercado de futuros. Antes da escolha da linguagem, muitos fornecedores de dados devem ser avaliados quanto à estratégia em questão.


Será necessário considerar a conectividade com o fornecedor, a estrutura de quaisquer APIs, a pontualidade dos dados, os requisitos de armazenamento e a resiliência em face de um fornecedor ficar off-line. Também é aconselhável ter acesso rápido a vários fornecedores! Vários instrumentos têm suas próprias peculiaridades de armazenamento, exemplos dos quais incluem vários símbolos de ticker para ações e datas de vencimento para futuros (para não mencionar quaisquer dados OTC específicos). Isso precisa ser levado em conta no design da plataforma.


A frequência da estratégia é provavelmente um dos maiores impulsionadores 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 consideração significativa com relação ao desempenho.


Uma estratégia que excede as segundas barras (isto é, dados de ticks) leva a um design orientado pelo desempenho como o requisito primário. Para estratégias de alta frequência, uma quantidade substancial de dados de mercado precisará ser armazenada e avaliada. Softwares como HDF5 ou kdb + são comumente usados ​​para essas funções.


Para processar os volumes extensos de dados necessários para aplicativos HFT, um backtester e um sistema de execução extensivamente otimizados devem ser usados. C / C ++ (possivelmente com algum montador) é provável que seja o candidato a idioma mais forte. Estratégias de frequência ultra-alta quase certamente exigirão hardware customizado, como FPGAs, co-location de troca e ajuste de interface de rede / kernal.


Sistemas de pesquisa.


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


IDEs típicos nesse espaço incluem o 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 simples da pilha inteira do projeto (via banco de dados ORM, LINQ); MatLab, que é projetado para extensa álgebra linear numérica e operações vetorizadas, mas de uma forma de console interativo; R Studio, which wraps the R statistical language console in a fully-fledged IDE; Eclipse IDE for Linux Java and C++; and semi-proprietary IDEs such as Enthought Canopy for Python, which include data analysis libraries such as NumPy, SciPy, scikit-learn and pandas in a single interactive (console) environment.


For numerical backtesting, all of the above languages are suitable, although it is not necessary to utilise a GUI/IDE as the code will be executed "in the background". The prime consideration at this stage is that of execution speed. A compiled language (such as C++) is often useful if the backtesting parameter dimensions are large. Remember that it is necessary to be wary of such systems if that is the case!


Interpreted languages such as Python often make use of high-performance libraries such as NumPy/pandas for the backtesting step, in order to maintain a reasonable degree of competitiveness with compiled equivalents. Ultimately the language chosen for the backtesting will be determined by specific algorithmic needs as well as the range of libraries available in the language (more on that below). However, the language used for the backtester and research environments can be completely independent of those used in the portfolio construction, risk management and execution components, as will be seen.


Portfolio Construction and Risk Management.


The portfolio construction and risk management components are often overlooked by retail algorithmic traders. This is almost always a mistake. These tools provide the mechanism by which capital will be preserved. They not only attempt to alleviate the number of "risky" bets, but also minimise churn of the trades themselves, reducing transaction costs.


Sophisticated versions of these components can have a significant effect on the quality and consistentcy of profitability. It is straightforward to create a stable of strategies as the portfolio construction mechanism and risk manager can easily be modified to handle multiple systems. Thus they should be considered essential components at the outset of the design of an algorithmic trading system.


The job of the portfolio construction system is to take a set of desired trades and produce the set of actual trades that minimise churn, maintain exposures to various factors (such as sectors, asset classes, volatility etc) and optimise the allocation of capital to various strategies in a portfolio.


Portfolio construction often reduces to a linear algebra problem (such as a matrix factorisation) and hence performance is highly dependent upon the effectiveness of the numerical linear algebra implementation available. Common libraries include uBLAS, LAPACK and NAG for C++. MatLab also possesses extensively optimised matrix operations. Python utilises NumPy/SciPy for such computations. A frequently rebalanced portfolio will require a compiled (and well optimised!) matrix library to carry this step out, so as not to bottleneck the trading system.


Risk management is another extremely important part of an algorithmic trading system. Risk can come in many forms: Increased volatility (although this may be seen as desirable for certain strategies!), increased correlations between asset classes, counter-party default, server outages, "black swan" events and undetected bugs in the trading code, to name a few.


Risk management components try and anticipate the effects of excessive volatility and correlation between asset classes and their subsequent effect(s) on trading capital. Often this reduces to a set of statistical computations such as Monte Carlo "stress tests". This is very similar to the computational needs of a derivatives pricing engine and as such will be CPU-bound. These simulations are highly parallelisable (see below) and, to a certain degree, it is possible to "throw hardware at the problem".


Sistemas de Execução.


The job of the execution system is to receive filtered trading signals from the portfolio construction and risk management components and send them on to a brokerage or other means of market access. For the majority of retail algorithmic trading strategies this involves an API or FIX connection to a brokerage such as Interactive Brokers. The primary considerations when deciding upon a language include quality of the API, language-wrapper availability for an API, execution frequency and the anticipated slippage.


The "quality" of the API refers to how well documented it is, what sort of performance it provides, whether it needs standalone software to be accessed or whether a gateway can be established in a headless fashion (i. e. no GUI). In the case of Interactive Brokers, the Trader WorkStation tool needs to be running in a GUI environment in order to access their API. I once had to install a Desktop Ubuntu edition onto an Amazon cloud server to access Interactive Brokers remotely, purely for this reason!


Most APIs will provide a C++ and/or Java interface. It is usually up to the community to develop language-specific wrappers for C#, Python, R, Excel and MatLab. Note that with every additional plugin utilised (especially API wrappers) there is scope for bugs to creep into the system. Always test plugins of this sort and ensure they are actively maintained. A worthwhile gauge is to see how many new updates to a codebase have been made in recent months.


Execution frequency is of the utmost importance in the execution algorithm. Note that hundreds of orders may be sent every minute and as such performance is critical. Slippage will be incurred through a badly-performing execution system and this will have a dramatic impact on profitability.


Statically-typed languages (see below) such as C++/Java are generally optimal for execution but there is a trade-off in development time, testing and ease of maintenance. Dynamically-typed languages, such as Python and Perl are now generally "fast enough". Always make sure the components are designed in a modular fashion (see below) so that they can be "swapped out" out as the system scales.


Architectural Planning and Development Process.


The components of a trading system, its frequency and volume requirements have been discussed above, but system infrastructure has yet to be covered. Those acting as a retail trader or working in a small fund will likely be "wearing many hats". It will be necessary to be covering the alpha model, risk management and execution parameters, and also the final implementation of the system. Before delving into specific languages the design of an optimal system architecture will be discussed.


Separation of Concerns.


One of the most important decisions that must be made at the outset is how to "separate the concerns" of a trading system. In software development, this essentially means how to break up the different aspects of the trading system into separate modular components.


By exposing interfaces at each of the components it is easy to swap out parts of the system for other versions that aid performance, reliability or maintenance, without modifying any external dependency code. This is the "best practice" for such systems. For strategies at lower frequencies such practices are advised. For ultra high frequency trading the rulebook might have to be ignored at the expense of tweaking the system for even more performance. A more tightly coupled system may be desirable.


Creating a component map of an algorithmic trading system is worth an article in itself. However, an optimal approach is to make sure there are separate components for the historical and real-time market data inputs, data storage, data access API, backtester, strategy parameters, portfolio construction, risk management and automated execution systems.


For instance, if the data store being used is currently underperforming, even at significant levels of optimisation, it can be swapped out with minimal rewrites to the data ingestion or data access API. As far the as the backtester and subsequent components are concerned, there is no difference.


Another benefit of separated components is that it allows a variety of programming languages to be used in the overall system. There is no need to be restricted to a single language if the communication method of the components is language independent. This will be the case if they are communicating via TCP/IP, Zero or some other language-independent protocol.


As a concrete example, consider the case of a backtesting system being written in C++ for "number crunching" performance, while the portfolio manager and execution systems are written in Python using SciPy and IBPy.


Performance Considerations.


Performance is a significant consideration for most trading strategies. For higher frequency strategies it is the most important factor. "Performance" covers a wide range of issues, such as algorithmic execution speed, network latency, bandwidth, data I/O, concurrency/parallelism and scaling. Each of these areas are individually covered by large textbooks, so this article will only scratch the surface of each topic. Architecture and language choice will now be discussed in terms of their effects on performance.


The prevailing wisdom as stated by Donald Knuth, one of the fathers of Computer Science, is that "premature optimisation is the root of all evil". This is almost always the case - except when building a high frequency trading algorithm! For those who are interested in lower frequency strategies, a common approach is to build a system in the simplest way possible and only optimise as bottlenecks begin to appear.


Profiling tools are used to determine where bottlenecks arise. Profiles can be made for all of the factors listed above, either in a MS Windows or Linux environment. There are many operating system and language tools available to do so, as well as third party utilities. Language choice will now be discussed in the context of performance.


C++, Java, Python, R and MatLab all contain high-performance libraries (either as part of their standard or externally) for basic data structure and algorithmic work. C++ ships with the Standard Template Library, while Python contains NumPy/SciPy. Common mathematical tasks are to be found in these libraries and it is rarely beneficial to write a new implementation.


One exception is if highly customised hardware architecture is required and an algorithm is making extensive use of proprietary extensions (such as custom caches). However, often "reinvention of the wheel" wastes time that could be better spent developing and optimising other parts of the trading infrastructure. Development time is extremely precious especially in the context of sole developers.


Latency is often an issue of the execution system as the research tools are usually situated on the same machine. For the former, latency can occur at multiple points along the execution path. Databases must be consulted (disk/network latency), signals must be generated (operating syste, kernal messaging latency), trade signals sent (NIC latency) and orders processed (exchange systems internal latency).


For higher frequency operations it is necessary to become intimately familiar with kernal optimisation as well as optimisation of network transmission. This is a deep area and is significantly beyond the scope of the article but if an UHFT algorithm is desired then be aware of the depth of knowledge required!


Caching is very useful in the toolkit of a quantitative trading developer. Caching refers to the concept of storing frequently accessed data in a manner which allows higher-performance access, at the expense of potential staleness of the data. A common use case occurs in web development when taking data from a disk-backed relational database and putting it into memory. Any subsequent requests for the data do not have to "hit the database" and so performance gains can be significant.


For trading situations caching can be extremely beneficial. For instance, the current state of a strategy portfolio can be stored in a cache until it is rebalanced, such that the list doesn't need to be regenerated upon each loop of the trading algorithm. Such regeneration is likely to be a high CPU or disk I/O operation.


However, caching is not without its own issues. Regeneration of cache data all at once, due to the volatilie nature of cache storage, can place significant demand on infrastructure. Another issue is dog-piling , where multiple generations of a new cache copy are carried out under extremely high load, which leads to cascade failure.


Dynamic memory allocation is an expensive operation in software execution. Thus it is imperative for higher performance trading applications to be well-aware how memory is being allocated and deallocated during program flow. Newer language standards such as Java, C# and Python all perform automatic garbage collection , which refers to deallocation of dynamically allocated memory when objects go out of scope .


Garbage collection is extremely useful during development as it reduces errors and aids readability. However, it is often sub-optimal for certain high frequency trading strategies. Custom garbage collection is often desired for these cases. In Java, for instance, by tuning the garbage collector and heap configuration, it is possible to obtain high performance for HFT strategies.


C++ doesn't provide a native garbage collector and so it is necessary to handle all memory allocation/deallocation as part of an object's implementation. While potentially error prone (potentially leading to dangling pointers) it is extremely useful to have fine-grained control of how objects appear on the heap for certain applications. When choosing a language make sure to study how the garbage collector works and whether it can be modified to optimise for a particular use case.


Many operations in algorithmic trading systems are amenable to parallelisation . This refers to the concept of carrying out multiple programmatic operations at the same time, i. e in "parallel". So-called "embarassingly parallel" algorithms include steps that can be computed fully independently of other steps. Certain statistical operations, such as Monte Carlo simulations, are a good example of embarassingly parallel algorithms as each random draw and subsequent path operation can be computed without knowledge of other paths.


Other algorithms are only partially parallelisable. Fluid dynamics simulations are such an example, where the domain of computation can be subdivided, but ultimately these domains must communicate with each other and thus the operations are partially sequential. Parallelisable algorithms are subject to Amdahl's Law, which provides a theoretical upper limit to the performance increase of a parallelised algorithm when subject to $N$ separate processes (e. g. on a CPU core or thread ).


Parallelisation has become increasingly important as a means of optimisation since processor clock-speeds have stagnated, as newer processors contain many cores with which to perform parallel calculations. The rise of consumer graphics hardware (predominently for video games) has lead to the development of Graphical Processing Units (GPUs), which contain hundreds of "cores" for highly concurrent operations. Such GPUs are now very affordable. High-level frameworks, such as Nvidia's CUDA have lead to widespread adoption in academia and finance.


Such GPU hardware is generally only suitable for the research aspect of quantitative finance, whereas other more specialised hardware (including Field-Programmable Gate Arrays - FPGAs) are used for (U)HFT. Nowadays, most modern langauges support a degree of concurrency/multithreading. Thus it is straightforward to optimise a backtester, since all calculations are generally independent of the others.


Scaling in software engineering and operations refers to the ability of the system to handle consistently increasing loads in the form of greater requests, higher processor usage and more memory allocation. In algorithmic trading a strategy is able to scale if it can accept larger quantities of capital and still produce consistent returns. The trading technology stack scales if it can endure larger trade volumes and increased latency, without bottlenecking .


While systems must be designed to scale, it is often hard to predict beforehand where a bottleneck will occur. Rigourous logging, testing, profiling and monitoring will aid greatly in allowing a system to scale. Languages themselves are often described as "unscalable". This is usually the result of misinformation, rather than hard fact. It is the total technology stack that should be ascertained for scalability, not the language. Clearly certain languages have greater performance than others in particular use cases, but one language is never "better" than another in every sense.


One means of managing scale is to separate concerns, as stated above. In order to further introduce the ability to handle "spikes" in the system (i. e. sudden volatility which triggers a raft of trades), it is useful to create a "message queuing architecture". This simply means placing a message queue system between components so that orders are "stacked up" if a certain component is unable to process many requests.


Rather than requests being lost they are simply kept in a stack until the message is handled. This is particularly useful for sending trades to an execution engine. If the engine is suffering under heavy latency then it will back up trades. A queue between the trade signal generator and the execution API will alleviate this issue at the expense of potential trade slippage. A well-respected open source message queue broker is Rabbit.


Hardware and Operating Systems.


The hardware running your strategy can have a significant impact on the profitability of your algorithm. This is not an issue restricted to high frequency traders either. A poor choice in hardware and operating system can lead to a machine crash or reboot at the most inopportune moment. Thus it is necessary to consider where your application will reside. The choice is generally between a personal desktop machine, a remote server, a "cloud" provider or an exchange co-located server.


Desktop machines are simple to install and administer, especially with newer user friendly operating systems such as Windows 7/8, Mac OSX and Ubuntu. Desktop systems do possess some significant drawbacks, however. The foremost is that the versions of operating systems designed for desktop machines are likely to require reboots/patching (and often at the worst of times!). They also use up more computational resources by the virtue of requiring a graphical user interface (GUI).


Utilising hardware in a home (or local office) environment can lead to internet connectivity and power uptime problems. The main benefit of a desktop system is that significant computational horsepower can be purchased for the fraction of the cost of a remote dedicated server (or cloud based system) of comparable speed.


A dedicated server or cloud-based machine, while often more expensive than a desktop option, allows for more significant redundancy infrastructure, such as automated data backups, the ability to more straightforwardly ensure uptime and remote monitoring. They are harder to administer since they require the ability to use remote login capabilities of the operating system.


In Windows this is generally via the GUI Remote Desktop Protocol (RDP). In Unix-based systems the command-line Secure SHell (SSH) is used. Unix-based server infrastructure is almost always command-line based which immediately renders GUI-based programming tools (such as MatLab or Excel) to be unusable.


A co-located server, as the phrase is used in the capital markets, is simply a dedicated server that resides within an exchange in order to reduce latency of the trading algorithm. This is absolutely necessary for certain high frequency trading strategies, which rely on low latency in order to generate alpha.


The final aspect to hardware choice and the choice of programming language is platform-independence. Is there a need for the code to run across multiple different operating systems? Is the code designed to be run on a particular type of processor architecture, such as the Intel x86/x64 or will it be possible to execute on RISC processors such as those manufactured by ARM? These issues will be highly dependent upon the frequency and type of strategy being implemented.


Resilience and Testing.


One of the best ways to lose a lot of money on algorithmic trading is to create a system with no resiliency . This refers to the durability of the sytem when subject to rare events, such as brokerage bankruptcies, sudden excess volatility, region-wide downtime for a cloud server provider or the accidental deletion of an entire trading database. Years of profits can be eliminated within seconds with a poorly-designed architecture. It is absolutely essential to consider issues such as debuggng, testing, logging, backups, high-availability and monitoring as core components of your system.


It is likely that in any reasonably complicated custom quantitative trading application at least 50% of development time will be spent on debugging, testing and maintenance.


Nearly all programming languages either ship with an associated debugger or possess well-respected third-party alternatives. In essence, a debugger allows execution of a program with insertion of arbitrary break points in the code path, which temporarily halt execution in order to investigate the state of the system. The main benefit of debugging is that it is possible to investigate the behaviour of code prior to a known crash point .


Debugging is an essential component in the toolbox for analysing programming errors. However, they are more widely used in compiled languages such as C++ or Java, as interpreted languages such as Python are often easier to debug due to fewer LOC and less verbose statements. Despite this tendency Python does ship with the pdb, which is a sophisticated debugging tool. The Microsoft Visual C++ IDE possesses extensive GUI debugging utilities, while for the command line Linux C++ programmer, the gdb debugger exists.


Testing in software development refers to the process of applying known parameters and results to specific functions, methods and objects within a codebase, in order to simulate behaviour and evaluate multiple code-paths, helping to ensure that a system behaves as it should. A more recent paradigm is known as Test Driven Development (TDD), where test code is developed against a specified interface with no implementation. Prior to the completion of the actual codebase all tests will fail. As code is written to "fill in the blanks", the tests will eventually all pass, at which point development should cease.


TDD requires extensive upfront specification design as well as a healthy degree of discipline in order to carry out successfully. In C++, Boost provides a unit testing framework. In Java, the JUnit library exists to fulfill the same purpose. Python also has the unittest module as part of the standard library. Many other languages possess unit testing frameworks and often there are multiple options.


In a production environment, sophisticated logging is absolutely essential. Logging refers to the process of outputting messages, with various degrees of severity, regarding execution behaviour of a system to a flat file or database. Logs are a "first line of attack" when hunting for unexpected program runtime behaviour. Unfortunately the shortcomings of a logging system tend only to be discovered after the fact! As with backups discussed below, a logging system should be given due consideration BEFORE a system is designed.


Both Microsoft Windows and Linux come with extensive system logging capability and programming languages tend to ship with standard logging libraries that cover most use cases. It is often wise to centralise logging information in order to analyse it at a later date, since it can often lead to ideas about improving performance or error reduction, which will almost certainly have a positive impact on your trading returns.


While logging of a system will provide information about what has transpired in the past, monitoring of an application will provide insight into what is happening right now . All aspects of the system should be considered for monitoring. System level metrics such as disk usage, available memory, network bandwidth and CPU usage provide basic load information.


Trading metrics such as abnormal prices/volume, sudden rapid drawdowns and account exposure for different sectors/markets should also be continuously monitored. Further, a threshold system should be instigated that provides notification when certain metrics are breached, elevating the notification method (email, SMS, automated phone call) depending upon the severity of the metric.


System monitoring is often the domain of the system administrator or operations manager. However, as a sole trading developer, these metrics must be established as part of the larger design. Many solutions for monitoring exist: proprietary, hosted and open source, which allow extensive customisation of metrics for a particular use case.


Backups and high availability should be prime concerns of a trading system. Consider the following two questions: 1) If an entire production database of market data and trading history was deleted (without backups) how would the research and execution algorithm be affected? 2) If the trading system suffers an outage for an extended period (with open positions) how would account equity and ongoing profitability be affected? The answers to both of these questions are often sobering!


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. There are advantages and disadvantages to both approaches. 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. NET 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. NET 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. Further, they often allow interactive console based development, rapidly reducing the iterative development process.


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. Open source operating systems such as Linux can be trickier to administer.


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.


The benefit of a separated architecture is that it allows languages to be "plugged in" for different aspects of a trading stack, as and when requirements change. A trading system is an evolving tool and it is likely that any language choices will evolve along with it.


A Quantcademy.


Participe do portal de associação da Quantcademy que atende à crescente comunidade de traders de quantificação de varejo e aprenda como aumentar a lucratividade de sua estratégia.


Negociação Algorítmica Bem Sucedida.


Como encontrar novas ideias de estratégia de negociação e avaliá-las objetivamente para o seu portfólio usando um mecanismo de backtesting personalizado no Python.


Comércio Algorítmico Avançado.


Como implementar estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas Bayesianas com R e Python.

Комментариев нет:

Отправить комментарий