среда, 11 апреля 2018 г.

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


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


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


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


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


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


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


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


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


A Algo-trading oferece os seguintes benefícios:


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


O programa de computador deve executar o seguinte:


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


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


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


The Bottom Line.


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


7 Essentials para desenvolver uma estratégia de negociação algorítmica.


por Bryan Fletcher.


1. Gerenciamento de riscos.


Ao formular uma estratégia de negociação, certifique-se de pensar o quanto você está em risco em todos os momentos.


Medir e rastrear seu risco aberto total em todos os momentos, calculando o quanto você perderia se todas as suas posições forem impedidas.


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á, por porcentagem do seu patrimônio da conta total, se todos os seus negócios fossem interrompidos.


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


Deixe-nos dizer que você arrisca .5% do seu patrimônio total em cada novo comércio. A estratégia de exemplo usa uma parada final com base no preço mais baixo dos últimos períodos de X no período de tempo Y. Isso é.


Em mercados de movimento lento e paralelo, a parada se aproximará do preço e o risco será reduzido à medida que o tempo passa. Nos movimentos parabolizantes a seu favor, o preço e o risco aberto mover-se-ão muito mais rápido do que a sua parada final.


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


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


Como podemos 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 determinado limite e depois otimizar esses parâmetros no backtesting.


Risco por Comércio = X% do Patrimônio Líquido Total.


Isso irá controlar o quanto você arrisca inicialmente em cada comércio.


Risco de risco individual máximo = X% (Mover paradas ou reduzir posições)


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


Risco máximo da carteira = Y% (Mover para ou reduzir posições)


Se a sua estratégia comercializar muitos instrumentos, este parâmetro pode manter o risco total do portfólio em cheque. Aqui, um exemplo visual que mostra o risco total do portfólio de uma estratégia de exemplo ao longo do backtest:


Imagem criada usando o software Trading Blox.


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


A minha estratégia era confiável na maioria das vezes em mercados lentos, voláteis e tendenciosos.


Quando eu tinha um longo óleo em 2008, no caminho para mais de US $ 140 / bbl, era emocionante. No entanto, ao mesmo tempo, quanto mais rápido ele subisse, mais preocupado eu olhei o quão longe minhas paradas eram. Lembro-me de ter esperança de que se consolidasse para dar às minhas paradas algum tempo para recuperar o atraso.


Eu tinha um componente de tomada de lucro, mas devido ao grande tamanho do contrato no mercado de futuros, eu era muito limitado em quanto eu poderia reduzir minha posição. Depois que eu fui parado naquela posição, eu me certificava de implementar mudanças no meu sistema que mediam e controlavam o risco, ajustando minhas paradas quando o risco excedia um determinado nível em posições individuais.


Criado com o Marketscope / Trading Station II.


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


2. Seleção do Mercado, Time Frame e Portfolio Construction.


O cronograma (m1, h1, etc.) você 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 colocação forem necessários.


Os sistemas de freqüência mais altos baseando gatilhos ou a execução no tiquetaque ou barras de 1m podem precisar de uma solução baseada na nuvem para permitir o dimensionamento da potência de computação para backtesting e otimização para melhores resultados. Algumas plataformas de negociação algorítmicas de terceiros incluem isso como parte de seu pacote.


O poder de computação junto com um mecanismo de backtesting otimizado para tirar proveito disto irá economizar muito tempo no processo de desenvolvimento da estratégia para qualquer sistema comercial.


Aqueles que consideram uma estratégia de alta freqüência quererão considerar um sistema de produção que seja colocado tão perto dos servidores do seu corretor quanto possível e integrado através da API FIX para garantir que todas as atualizações de preços sejam recebidas, pois todas as cotações são empurradas em vez de puxadas como na negociação Station ou ForexConnect API.


Ao obter um preenchimento ao preço desejado ou melhor, importa muito para sua rentabilidade, assegurando a menor latência em sua arquitetura, código e localização do servidor, possível, você terá a melhor chance de obter tanta liquidez no momento exato que você precisar isto.


Os parceiros VPS da FXCM oferecem serviços de colocação para qualquer necessidade:


Alguns corretores oferecem comissões com desconto para comerciantes de alto volume. Se sua estratégia gera mais de 50 milhões de volume nocional por mês no volume de negócios ou você começa com capital de risco de US $ 150K, você pode obter comissões com desconto de 25-55% com a conta do Active Trader da FXCM, por exemplo.


Compreender as características de liquidez subjacentes de cada mercado também permite que você conheça a escalabilidade da sua estratégia. A liquidez ao preço que deseja não é um recurso ilimitado e pode variar bastante dependendo do mercado, da hora do dia e das circunstâncias.


Nosso guia de Traços de Comerciantes de sucesso tem alguns excelentes dados relacionados a isso.


Os sistemas de baixa freqüência geralmente dão mais margem de erro quando se trata de estimativas de deslizamento. O número mais baixo de trades totais em backtests significa que a contabilização do deslizamento na execução impacta a rentabilidade global menos de estratégias de freqüência muito mais altas.


Se a sua estratégia utiliza as ordens de parada de repouso com base em canais de preços ou algum tipo de indicador de atraso para desencadear uma ordem, reduzir a latência provavelmente ganhou um impacto tão grande, exceto em determinadas situações específicas da estratégia.


Velocidade venceu, não melhorar os preenchimentos que você obtém em quaisquer paradas ou limites que tenham estado sentados nos servidores dos corretores.


Os mercados individuais podem ter grandes variações no desempenho. Alguns podem estar limitados por longos períodos, enquanto outros vão em uma lágrima. Por isso, uma pequena quantidade 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, existem alguns mercados que podem adicionar benefícios de diversificação ao seu portfólio, como USD / ZAR, usando uma estratégia de freqüência muito menor, mas podem não ser rentáveis ​​ao usar quadros curtos, dependendo da sua estratégia.


3. Utilize tipos de pedidos avançados.


Um grande número de comerciantes apenas utilizam ordens de mercado para entrar e sair de seus negócios. Em condições típicas do mercado, a maioria ficará feliz com os enchimentos que eles recebem. No entanto, em mercados rápidos onde há muita incerteza, os provedores de liquidez tendem a enviar cotações mais amplas para se proteger e os preços podem se mover muito rapidamente.


As estratégias baseadas em pênalas e em momentum podem ser sujeitas a uma derrapagem se os negócios forem desencadeados quando os níveis de resistência foram retirados e o fluxo de pedidos é pesado em uma direção. Somente usando ordens de paradas para entrar em negociações irá garantir a execução, mas deixa seu risco de deslizamento bem aberto. As ordens de entrada de intervalo podem ser usadas para entrar no comércio dentro de um intervalo aceitável, mas rejeitar ordens onde o deslizamento é considerado inaceitável.


Algumas estratégias podem encontrar deslizamento zero ou mesmo deslizamento positivo se as ordens limite ou as ordens Fill ou Kill forem utilizadas. Um exemplo disso pode ser uma reversão média de alta freqüência ou uma estratégia baseada em eventos. Backtesting pode assumir 100% de execução em cada comércio, mas a realidade pode ser diferente em mercados rápidos.


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


Tipos de ordem de exemplo.


Exemplo de Comandos comerciais.


4. Dimensionamento da Posição.


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


Dimensionamento de posição baseado em lote fixo: negociação do mesmo tamanho de lote, independentemente do tamanho do número de risco com base em risco: o risco é calculado para cada troca com base no posicionamento da parada de perdas.


Dimensionamento fixo da posição do lote.


Esta abordagem é popular entre muitos comerciantes, mas as limitações nesta abordagem podem levar a sobreponderar os mercados mais voláteis e a subponderação em mercados menos voláteis. As diferenças nas taxas de câmbio podem levar a diferenças dramáticas no tamanho do comércio nocional.


Dimensionamento de posição baseado em risco.


Muitos dos sistemas automatizados que vejo hoje têm um montante fixo de perda de parada em pips para cada posição. Eu não sou fã desta abordagem, pois acredito que isso pode levar a uma configuração muito próxima em mercados voláteis e muito longe em mercados silenciosos. O risco por comércio também está em todo o mapa com essa abordagem.


O dimensionamento de posição baseado em risco considera o risco por comércio, onde o risco é igual ao preço de entrada menos a parada inicial.


Uma abordagem sofisticada fará parte das gamas de preços médias únicas e recentes de cada mercado e determinarão a parada de colocação.


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


Aqui, o cálculo do dimensionamento de posição baseado na volatilidade:


((Total Equity * Risco por comércio) / (X período ATR em pips * ATR offset * valor de pip por lote 1K)) = Tamanho comercial em lotes de 1K.


Equidade total = $ 100K.


Risco por Comércio = 1%


X período ATR em pips = 50.


Valor da pipa por lote 1K = $ 0,10.


133.333 = Tamanho comercial em lotes de 1K (Reduzir para 133 para enviar o comércio EUR / USD 133K)


Em mercados voláteis, a faixa média de preços por barra, independentemente do prazo, pode saltar bastante em tempos de incerteza e resultar em mercados muito rápidos e muito ruído sem direção, levando a muitos comerciantes a serem abalados.


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


Por outro lado, minhas configurações de comércio favoritas sempre vêm em mercados silenciosos, com intervalos de negociação restritos. Utilizar o ATR recente para dimensionar suas posições levará a paradas mais apertadas e tamanhos de posição maiores em mercados com baixas gamas de preços relativos.


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


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


A primeira coisa que você precisa é dados. Eu acho que é importante para testar o que você troca e comercializa o que você prova. A natureza descentralizada do mercado FX significa que cada corretor provavelmente terá historias de preços históricos e spreads.


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


Algumas plataformas de negociação algorítmicas de terceiros oferecem acesso aos dados históricos da FXCM & rsquo; também, mas talvez não possamos nosso conjunto de dados completo. Se você estiver usando um destes e quiser mais dados para testar novamente, você pode adicionar aos seus arquivos de dados com essas opções.


É uma coisa 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 irrealistas, você provavelmente vai ter um tempo difícil lidar com o seu primeiro rebaixamento.


Se os seus testes anteriores não são realistas ou utilizam os pressupostos errados, como assumindo uma execução perfeita em cada comércio, você pode achar que seus resultados ao vivo são muito diferentes dos seus testes alternativos.


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


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


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


Se você não otimiza a sua estratégia de negociação, as chances são de que você terá uma estratégia que ganhou e estará perto tão bom 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. A chave do `s é encontrar um equilíbrio entre estes.


O maior risco que você enfrenta ao otimizar sua estratégia com backtesting é o ajuste de curva. Eu sempre me preocupo com os 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 o seu sistema comercial, torna-se muito fácil aperfeiçoar perfeitamente os parâmetros no histórico de preços passados ​​com resultados surpreendentes, o que provavelmente é apenas o ruído e não um padrão repetitivo.


Backtesting sua estratégia em apenas um mercado pode ter o mesmo efeito. Uma vez que você apenas está simulando resultados em um fluxo de preços, será muito fácil superar seus parâmetros em dados passados ​​com resultados incríveis, mas pouco significado estatístico.


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


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


7. Tolerância ao risco.


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


A maioria dos comerciantes de algo são otimistas e acreditam que podem obter 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 por comerciantes atingindo seu ponto de tio psicológico na perspectiva de novas perdas.


Posso garantir-lhe que é difícil ser tão otimista como você estava no início da negociação quando você está sentado no meio de uma grande retirada.


É como quando eu estou realmente com fome e comendo fora. Normalmente, eu ordeno muito mais comida do que posso lidar. No entanto, eu não percebo isso até que eu fiquei cheio e eu tenho uma ou mais 2 tacos sentados no meu prato.


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


Antes de lançar meu fundo, lembro-me de estudar os resultados de desempenho de muitos consultores sistemáticos de negociação de commodities, que são gerentes de dinheiro regulados pela NFA. Muitas das CTAs há muito tempo tiveram um excelente desempenho, mas volátil em seus primeiros anos, mas depois se tornaram muito mais conservadoras. Vai saber.


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


Ao executar sua estratégia ao vivo, espere experimentar completamente todo o espectro de emoções. No entanto, penso que é importante que você não faça decisões impulsivas com base em seus sentimentos, deixando o medo ou a esperança levar a uma tomada excessiva de riscos ou a tentar superar sua estratégia e fazer negócios com sentimentos que você possui.


Emoções fortes de medo ou ganância podem levar a decisões ruins quando o comércio de sistemas. Os computadores não precisam lidar com isso, então a melhor estratégia para lidar com isso na minha opinião é encontrar um sistema comercial robusto, cumpri-lo e utilizar um processo de pesquisa antes de fazer qualquer alteração.


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


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


Quando devolvi muitos lucros no meu comércio de petróleo, fiquei muito enojado. Isso me levou a fazer modificações no meu sistema de negociação, o que melhorou a gestão geral de risco em risco de comércio aberto individual.


Juntando tudo.


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


Risco de entrada por comércio.


# de períodos de observação ATR # múltiplo ATR (multiplique este número de vezes de períodos de retorno de ATR para parar a colocação)


Filtro de comércio (se aplicável)


Insira novos negócios somente quando a condição a seguir for atendida (ou seja, a tendência é baseada em duas médias móveis)


Insira parâmetros para o seu indicador técnico favorito Adicione qualquer outra lógica para escalar dentro / fora de negociações (parada final, tirar lucros no X ATR, etc.)


Risco de risco individual máximo.


Risco máximo de comércio individual = X% (Considere o melhoramento ou a redução de opções)


Risco máximo de portfólio.


Risco Máximo de Carteira = Y% (Considere o número de visitas ou a apresentação de informações)


Outros parâmetros importantes para backtesting:


Isso pode ser calculado em termos de pips ou em termos percentuais de seu preço de preenchimento ao preço mais baixo / mais alto na barra em que o comércio foi preenchido.


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


Perguntas, comentários e comentários são bem-vindos. Deixe-me uma linha no instructordailyfx.


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


RESULTADOS DE DESEMPENHO HIPOTÉTICOS TEM MUITAS LIMITAÇÕES INHERENTES, ALGUNS DESCRITOS ABAIXO. NENHUMA REPRESENTAÇÃO NÃO É REALIZADA QUE QUALQUER CONTA VÁ OU PODERÁ AGRADECIMENTAMENTE ALCANÇAR LUCROS OU PERDAS SIMILARES ÀOS MOSTRADOS. POR FAVOR, HÁ DIFERENÇAS FREQUENTEMENTE SHARP ENTRE RESULTADOS DE DESEMPENHO HIPOTÉTICOS E OS RESULTADOS REAIS REALIZADOS POR TODOS OS PROGRAMAS DE NEGOCIAÇÕES PARTICULARES.


UMA DAS LIMITAÇÕES DOS RESULTADOS DE DESEMPENHO HIPOTÉTICOS É QUE ESTÃO GERALMENTE PREPARADAS COM O BENEFÍCIO DE HINDSIGHT. NA ADDIÇÃO, A NEGOCIAÇÃO HIPOTÉTICA NÃO IMPORTA RISCOS FINANCEIROS, E NENHUM GRUPO DE NEGOCIAÇÃO HIPOTÉTICA PODE CONTACTO COMPLETAMENTE PARA O IM-PATO DE RISCOS FINANCEIROS NA NEGOCIAÇÃO REAL. POR EXEMPLO, A CAPACIDADE DE TERMINAR PERDAS OU ADEQUAR EM UM PROGRAMA DE NEGOCIAÇÃO ESPECÍFICO EM ESPIRRO DE PERDAS DE NEGOCIAÇÃO É PONTOS MATERIAIS QUE PODEM TAMBÉM ADIDÁVEL EFECTUAR RESULTADOS REAIS DE NEGOCIAÇÃO. HÁ NOMBROSOS OUTROS FATORES RELACIONADOS COM OS MERCADOS EM GERAL OU NA IMPLEMENTAÇÃO. DE QUALQUER PROGRAMA ESPECÍFICO DE NEGOCIAÇÃO QUE NÃO PODE SER TOTALMENTE COMPTABILIZADO NA PREPARAÇÃO DE RESULTADOS DE DESEMPENHO HIPOTÉTICOS E TODOS OS QUE PODEMOS ADVERSAMENTE EFECTUAR RESULTADOS REAIS DE 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 do mercado e não constituem conselhos de investimento. O grupo FXCM não aceita a responsabilidade por qualquer perda ou dano, incluindo, sem limitação, qualquer perda de lucro, que possa surgir, direta ou indiretamente, do uso ou dependência contida nos sinais de negociação, ou em qualquer análise de gráfico que acompanha.


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


Próximos eventos.


Calendário econômico Forex.


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


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


QuantStart.


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


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


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


Por Michael Halls-Moore em 19 de abril de 2013.


Neste artigo, quero apresentar-lhe os métodos pelos quais eu próprio identifico estratégias de negociação algorítmicas rentáveis. Nosso objetivo hoje é entender em detalhes como encontrar, avaliar e selecionar esses sistemas. Vou explicar como as estratégias de identificação são tanto sobre preferências pessoais quanto sobre o desempenho da estratégia, como determinar o tipo e a quantidade de dados históricos para o teste, como avaliar de forma imparcial uma estratégia de negociação e, finalmente, como avançar para a fase de backtesting e implementação estratégica.


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


Para ser um comerciante bem sucedido - de forma discricionária ou algorítmica - é necessário fazer-se algumas perguntas honestas. O Trading oferece a você a capacidade de perder dinheiro em uma taxa alarmante, por isso é necessário "conhecer você mesmo" tanto quanto é necessário entender a estratégia escolhida.


Eu diria que a consideração mais importante na negociação é estar ciente de sua própria personalidade. O comércio e o comércio algorítmico em particular, requer um grau significativo de disciplina, paciência e desapego emocional. Como você está deixando um algoritmo executar sua negociação para você, é necessário ser resolvido para não interferir com a estratégia quando está sendo executado. Isso pode ser extremamente difícil, especialmente em períodos de redução prolongada. No entanto, muitas estratégias que mostraram ser altamente rentáveis ​​em um backtest podem ser arruinadas por uma simples interferência. Compreenda que se você deseja entrar no mundo da negociação algorítmica, você será testado emocionalmente e, para ser bem-sucedido, é necessário trabalhar com essas dificuldades!


A próxima consideração é uma das vezes. Você tem um emprego a tempo inteiro? Você trabalha a tempo parcial? Você trabalha em casa ou tem uma longa viagem diária? Essas perguntas ajudarão a determinar a freqüência da estratégia que você deve procurar. Para aqueles de você no emprego a tempo inteiro, uma estratégia de futuros intradiária pode não ser apropriada (pelo menos até que seja totalmente automatizada!). Suas restrições de tempo também ditarão a metodologia da estratégia. Se sua estratégia é freqüentemente negociada e dependente de feeds de notícias caras (como um terminal da Bloomberg), você terá claramente que ser realista sobre sua capacidade de executar com sucesso durante o escritório! Para aqueles de vocês com muito tempo, ou as habilidades para automatizar sua estratégia, você pode querer examinar uma estratégia mais técnica de negociação de alta freqüência (HFT).


Minha opinião é que é necessário realizar pesquisas contínuas sobre suas estratégias de negociação para manter um portfólio consistentemente lucrativo. Poucas estratégias permanecem "sob o radar" para sempre. Assim, uma parte importante do tempo atribuído à 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 forte rentabilidade ou um declínio lento em relação a perdas.


Você também precisa considerar seu capital de negociação. 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, eu começaria com uma quantidade maior, provavelmente mais perto de 100,000 USD (aproximadamente £ 70,000). Isso ocorre porque os custos de transação podem ser extremamente caros para estratégias de média a alta freqüência e é necessário ter capital suficiente para absorvê-los em tempos de redução. Se você está considerando começar com menos de 10.000 USD, então você precisará se restringir a estratégias de baixa freqüência, negociando em um ou dois ativos, já que os custos de transação irão comer rapidamente em seus retornos. Interactive Brokers, que é um dos corretores mais amigáveis ​​para aqueles com habilidades de programação, devido à sua API, tem uma conta de varejo mínima de 10.000 USD.


A habilidade de programação é um fator importante na criação de uma estratégia de negociação algorítmica automatizada. Estar bem informado em uma linguagem de programação como C ++, Java, C #, Python ou R permitirá que você crie o sistema de armazenamento de dados, o sistema de backtest e o sistema de execução de ponta a ponta. Isso tem uma série de vantagens, cujo chefe é a capacidade de estar completamente atento a todos os aspectos da infra-estrutura comercial. Também permite que você explore as estratégias de freqüência mais alta, pois você terá o controle total da sua "pilha de tecnologia". Embora isso signifique que você possa testar seu próprio software e eliminar erros, também significa mais tempo gasto na codificação de infra-estrutura e menos na implementação de estratégias, pelo menos na parte anterior da sua carreira de trading. Você pode achar que você está confortável negociando no Excel ou MATLAB e pode terceirizar o desenvolvimento de outros componentes. Eu não recomendaria isso no entanto, especialmente para aqueles que negociavam em alta freqüência.


Você precisa se perguntar o que você espera alcançar por meio de negociação algorítmica. Você está interessado em um rendimento regular, pelo qual você espera obter lucros de sua conta de negociação? Ou, você está interessado em um ganho de capital a longo prazo e pode se negociar sem a necessidade de retirar fundos? A dependência de renda determinará a freqüência de sua estratégia. As retiradas de renda mais regulares exigirão uma estratégia de negociação de maior freqüência com menor volatilidade (ou seja, uma proporção Sharpe mais alta). Os comerciantes de longo prazo podem pagar uma frequência comercial mais tranquila.


Finalmente, não se ilude com a noção de tornar-se extremamente rico num curto espaço de tempo! O comércio de Algo não é um esquema rápido e rápido - se alguma coisa pode ser um esquema rápido e rápido. É preciso disciplina, pesquisa, diligência e paciência importantes para serem bem-sucedidos no comércio algorítmico. Pode levar meses, senão anos, gerar rentabilidade consistente.


Sourcing Algorithmic Trading Ideas.


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


Nosso objetivo como pesquisadores quantitativos de negócios é estabelecer um pipeline estratégico que nos forneça um fluxo de idéias comerciais em andamento. Idealmente, queremos criar uma abordagem metódica para sourcing, avaliação e implementação de estratégias que encontramos. Os objetivos do pipeline são gerar uma quantidade consistente de novas idéias e fornecer-nos uma estrutura para rejeitar a maioria dessas idéias com o mínimo de consideração emocional.


Devemos ser extremamente cuidadosos para não permitir influências cognitivas na nossa metodologia de tomada de decisão. Isso pode ser tão simples como ter uma preferência por uma classe de ativos sobre outra (o ouro e outros metais preciosos vêm à mente) porque são percebidos como mais exóticos. Nosso objetivo sempre deve ser encontrar estratégias consistentemente lucrativas, com expectativas positivas. A escolha da classe de ativos deve basear-se em outras considerações, como restrições de capital de negociação, taxas de corretagem e capacidades de alavancagem.


Se você não está completamente familiarizado com o conceito de estratégia comercial, então o primeiro lugar a procurar é com os livros didáticos estabelecidos. Os textos clássicos fornecem uma ampla gama de idéias mais simples e diretas, para se familiarizarem com a negociação quantitativa. Aqui está uma seleção que eu recomendo para aqueles que são novos para negociação quantitativa, que gradualmente se tornam mais sofisticados enquanto você trabalha através da lista:


Para uma lista mais longa de livros de negociação quantitativos, visite a lista de leitura QuantStart.


O próximo lugar para encontrar estratégias mais sofisticadas é com fóruns de negociação e blogs comerciais. No entanto, uma nota de cautela: muitos blogs comerciais dependem do 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 pouco ineficaz na comunidade de finanças quantitativas. Alguns sugeriram que não é melhor que ler um horóscopo ou estudar folhas de chá em termos de seu poder preditivo! Na realidade, existem indivíduos bem-sucedidos que utilizam análises técnicas. No entanto, como quants 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 nossas em considerações ou preconceitos emocionais.


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


Depois de ter tido alguma experiência na avaliação de 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 inscrições elevadas ou custos pontuais. Se você é um membro ou ex-aluno de uma universidade, você poderá obter acesso a algumas dessas revistas financeiras. Caso contrário, você pode olhar para os servidores de pré-impressão, que são repositórios de internet de rascunhos finais de documentos acadêmicos que estão sendo submetidos a revisão pelos pares. Uma vez que estamos apenas interessados ​​em estratégias que possamos replicar com sucesso, fazer backtest e obter rentabilidade, uma revisão por pares é de menor importância para nós.


A principal desvantagem das estratégias acadêmicas é que muitas vezes podem estar desatualizadas, exigir dados históricos obscuros e dispendiosos, negociar classes de ativos ilíquidas ou não influenciar taxas, derrapagens ou propagação. Também não está claro se a estratégia de negociação deve ser realizada com ordens de mercado, ordens limitadas ou se contém perdas de parada, etc. Portanto, é absolutamente essencial replicar a estratégia o melhor que puder, fazer o backtest e adicionar uma transação realista 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 das quais você pode criar ideias:


E sobre como 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 freqüência mais altas em particular, pode-se usar a microestrutura do mercado, ou seja, a compreensão da dinâmica do livro de pedidos, a fim de gerar rentabilidade. Diferentes mercados terão várias limitações tecnológicas, regulamentos, participantes do mercado e restrições que estão abertas à exploração através 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 - Os fundos de investimento em conjunto, como fundos de pensão, parcerias de investimento privado (hedge funds), consultores de negociação de commodities e fundos de investimento, são limitados por uma forte regulamentação e 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 precisam rapidamente descarregar (vender) uma quantidade de valores mobiliários, eles terão que diminuí-lo para evitar "mover o mercado". Algoritmos sofisticados podem tirar proveito disso, e outras idiossincrasias, em um processo geral conhecido como arbitragem de estrutura de fundos. Aprendizado de máquinas / inteligência artificial - Os algoritmos de aprendizagem de máquinas tornaram-se mais prevalentes nos últimos anos nos mercados financeiros. Os classificadores (como Naive-Bayes, et al.) Correspondentes de função não-linear (redes neurais) e rotinas de otimização (algoritmos genéticos) foram todos usados ​​para prever caminhos de ativos ou otimizar estratégias de negociação. Se você tem um histórico nesta área, você pode ter alguma visão sobre como determinados algoritmos podem ser aplicados a certos mercados.


Há, é claro, muitas outras áreas para investigar quants. Vamos discutir como apresentar estratégias personalizadas em detalhes em um artigo posterior.


Ao continuar monitorando essas fontes em uma base semanal, ou mesmo diária, você está se preparando para receber uma lista consistente de estratégias de uma variedade diversificada de fontes. O próximo passo é determinar como rejeitar um grande subconjunto dessas estratégias, a fim de minimizar o desperdício de seu tempo e os recursos de backtesting em estratégias que provavelmente não serão lucrativas.


Avaliando Estratégias de Negociação.


A primeira consideração, e indiscutivelmente mais óbvia, é se você realmente entende a estratégia. Você poderia explicar a estratégia de forma concisa ou exigir uma série de advertências e listas de parâmetros infinitas? Além disso, a estratégia tem uma base boa e sólida na realidade? Por exemplo, você poderia apontar alguma lógica comportamental ou restrição da estrutura do fundo que possa estar causando o (s) padrão (s) que você está tentando explorar? Esta restrição suportaria uma mudança de regime, como uma dramática perturbação do ambiente regulatório? A estratégia depende de regras estatísticas ou matemáticas complexas? Aplica-se a qualquer série de tempo financeiro ou é específico para a classe de ativos em que se afirma ser lucrativo? Você deve constantemente pensar nesses fatores ao avaliar novos métodos comerciais, caso contrário você pode desperdiçar uma quantidade significativa de tempo tentando fazer backtest e otimizar estratégias não lucrativas.


Uma vez que você tenha determinado que você entende os princípios básicos da estratégia, você precisa decidir se ele se encaixa com o seu perfil de personalidade acima mencionado. Esta não é uma consideração tão vaga quanto parece! As estratégias diferirão substancialmente em suas características de desempenho. Existem certos tipos de personalidade que podem lidar com períodos mais significativos de redução ou estão dispostos a aceitar um maior risco de retorno maior. Apesar do fato de que nós, como quants, tentamos eliminar todo o viés cognitivo possível e devemos avaliar uma estratégia de forma imparcial, os preconceitos sempre entrarão. Por isso, precisamos de um meio consistente e sem emoção para avaliar o desempenho das estratégias . Aqui está a lista de critérios que eu julgo uma nova estratégia potencial por:


Metodologia - O impulso da estratégia está baseado, o retorno médio, o mercado neutro, direcional? A estratégia baseia-se em técnicas de aprendizado estatístico ou de máquinas complexas (ou complexas) que são difíceis de entender e exigem um doutorado em estatísticas para entender? Essas técnicas introduzem uma quantidade significativa de parâmetros, o que pode levar a um viés de otimização? A estratégia é susceptível de suportar uma mudança de regime (ou seja, uma nova regulamentação potencial dos mercados financeiros)? Sharpe Ratio - O índice de Sharpe caracteriza heuristicamente o índice de recompensa / risco da estratégia. Quantifica quanto retorno você consegue para o nível de volatilidade sofrido pela curva patrimonial. Naturalmente, precisamos determinar o período e a frequência em que esses retornos e volatilidade (ou seja, o desvio padrão) são medidos. Uma estratégia de freqüência mais alta exigirá maior taxa de amostragem do desvio padrão, mas um período de tempo geral mais curto, por exemplo. Alavancagem - A estratégia exige alavancagem significativa para ser lucrativa? A estratégia exige o uso de contratos de derivativos alavancados (futuros, opções, swaps) para fazer um retorno? Estes contratos alavancados podem ter uma forte volatilidade e, portanto, podem facilmente levar a chamadas de margem. Você tem o capital comercial e o temperamento para essa volatilidade? Frequência - A frequência da estratégia está intimamente ligada à sua pilha de tecnologia (e, portanto, à experiência tecnológica), ao índice Sharpe e ao nível geral dos custos de transação. Todas as outras questões consideradas, as estratégias de maior freqüência requerem mais capital, são mais sofisticadas e difíceis de implementar. No entanto, assumindo que seu mecanismo de teste de backtest é sofisticado e livre de erros, eles geralmente terão taxas Sharpe muito maiores. Volatilidade - A volatilidade está fortemente relacionada ao "risco" da estratégia. A relação Sharpe caracteriza isso. A maior volatilidade das classes de ativos subjacentes, se não coberta, muitas vezes leva a uma maior volatilidade na curva patrimonial e, portanto, menores índices de Sharpe. Naturalmente, suponho que a volatilidade positiva seja aproximadamente igual à volatilidade negativa. Algumas estratégias podem ter maior volatilidade negativa. Você precisa estar ciente desses atributos. Ganhe / Perda, Lucro / Perda Médio - As estratégias serão diferentes nas suas ganhos / perdas e características médias de lucro / perda. Pode-se ter uma estratégia muito lucrativa, mesmo que o número de negócios perdidos exceda 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 onde mais dos negócios são "vencedores", mas os negócios perdidos podem ser bastante graves. Drawdown máximo - A redução máxima é a maior queda percentual global na curva de equidade da estratégia. As estratégias de Momentum são bem conhecidas por sofrerem períodos de redução prolongada (devido a uma série de muitos negócios perdidos incrementais). Muitos comerciantes vão desistir em períodos de redução prolongada, mesmo que os testes históricos sugeriram que este é "business as usual" para a estratégia. Você precisará determinar qual porcentagem de redução (e em que período de tempo) você pode aceitar antes de deixar de negociar sua estratégia. Esta é uma decisão altamente pessoal e, portanto, deve ser considerada com cuidado. Capacidade / liquidez - No nível de varejo, a menos que você esteja negociando em um instrumento altamente ilíquido (como um estoque de pequena capital), você não terá que se preocupar muito com a capacidade da estratégia. A capacidade determina a escalabilidade da estratégia para aumentar o capital. Muitos dos maiores hedge funds sofrem de importantes problemas de capacidade à medida que suas estratégias aumentam em alocação de capital. Parâmetros - Certas estratégias (especialmente aquelas encontradas na comunidade de aprendizagem de máquinas) requerem uma grande quantidade de parâmetros. Todo parâmetro adicional que uma estratégia exige deixa-o mais vulnerável ao viés de otimização (também conhecido como "ajuste de curva"). Você deve tentar segmentar estratégias com o menor número possível de parâmetros ou garantir que você tenha quantidades suficientes de dados para testar suas estratégias. Benchmark - Quase todas as estratégias (a menos que sejam caracterizadas como "retorno absoluto") são medidas em relação a um benchmark de desempenho. O benchmark geralmente é um índice que caracteriza uma grande amostra da classe de ativos subjacentes em que a estratégia negocia. Se a estratégia negociar ações americanas de grande capitalização, o S & P500 seria uma referência natural para medir sua estratégia. Você ouvirá os termos "alfa" e "beta", aplicado a estratégias deste tipo. Vamos discutir esses coeficientes em profundidade em artigos posteriores.


Observe que não discutimos os retornos reais da estratégia. Por que é isso? De forma isolada, os retornos realmente nos fornecem informações limitadas sobre a eficácia da estratégia. Eles não lhe dão uma visão de alavancagem, volatilidade, benchmarks ou requisitos de capital. Assim, as estratégias raramente são avaliadas apenas em seus retornos. Considere sempre os atributos de risco de uma estratégia antes de analisar os retornos.


Nesta fase, muitas das estratégias encontradas no seu pipeline serão rejeitadas, uma vez que não atenderão aos requisitos de capital, restrições de alavancagem, tolerâncias máximas de tolerância ou preferências de volatilidade. As estratégias que permanecem podem agora ser consideradas para testes anteriores. No entanto, antes disso é possível, é necessário considerar um critério de rejeição final - o dos dados históricos disponíveis para testar essas estratégias.


Obtenção de dados históricos.


Hoje em dia, a amplitude dos requisitos técnicos em todas as classes de ativos para o armazenamento histórico de dados é substancial. Para se manter competitivo, tanto o lado da compra (fundos) como os de venda (bancos de investimento) investem fortemente em sua infraestrutura técnica. É imperativo considerar sua importância. Em particular, estamos interessados ​​em requisitos de tempo, precisão e armazenamento. Agora vou descrever os conceitos básicos de obtenção de dados históricos e como armazená-lo. Infelizmente, este é um tópico muito profundo e técnico, então não poderei dizer tudo neste artigo. No entanto, vou escrever muito mais sobre isso no futuro, já que minha experiência na indústria anterior no setor financeiro estava principalmente preocupada com aquisição, armazenamento e acesso de dados financeiros.


Na seção anterior, estabelecemos um pipeline de estratégia que nos permitiu rejeitar certas estratégias com base em nossos próprios critérios de rejeição pessoal. Nesta seção, vamos filtrar 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 varejista) são os custos dos dados, dos requisitos de armazenamento e do seu nível de experiência 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 os principais problemas sobre os quais devemos pensar:


Dados fundamentais - Isso inclui dados sobre tendências macroeconômicas, como taxas de juros, índices de inflação, ações corporativas (dividendos, estoque-divisões), registros da SEC, contas corporativas, números de ganhos, relatórios de culturas, dados meteorológicos etc. Esses dados são freqüentemente usados ​​para valorizar as 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 nos sites do governo. Outros dados fundamentais históricos de longo prazo podem ser extremamente caros. Os requisitos de armazenamento geralmente 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 geralmente de natureza qualitativa. Consiste em artigos, postagens de blog, postagens de microblog ("tweets") e editoriais. As técnicas de aprendizagem de máquinas, como os classificadores, costumam ser usadas para interpretar o sentimento. Esses dados também são freqüentemente disponíveis gratuitamente ou baratos, por meio da assinatura de meios de comunicação. Os bancos de dados de armazenamento de documentos "NoSQL" mais novos foram projetados para armazenar esse tipo de dados qualitativos não estruturados. Dados do preço do recurso - Este é o domínio de dados tradicional do quant. Consiste em séries temporais de preços dos ativos. As ações (ações), produtos de renda fixa (títulos), commodities e preços de câmbio se enquadram nesta classe. Os dados históricos diários são geralmente simples de obter para as classes de ativos mais simples, como ações. No entanto, uma vez que a precisão e a limpeza estão incluídas e os preconceitos estatísticos removidos, os dados podem se tornar caros. Além disso, os dados das séries temporais geralmente possuem requisitos de armazenamento significativos, especialmente quando os dados intradiários são considerados. Instrumentos Financeiros - Ações, títulos, futuros e opções derivadas mais exóticas possuem características e parâmetros muito diferentes. Assim, não existe uma estrutura de banco de dados "tamanho único" que possa acomodá-los. Deve ser dado um cuidado significativo à concepção e implementação de estruturas de banco de dados para vários instrumentos financeiros. Vamos discutir a situação ao longo de quando chegamos a construir um banco de dados mestre de valores mobiliários em futuros artigos. Frequê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 são frequentemente suficientes. Para estratégias de alta freqüência, pode ser necessário obter dados de nível de tiquetaque e até mesmo cópias históricas de determinados dados de cadastro de trocas comerciais. A implementação de um mecanismo de armazenamento para esse tipo de dados é muito tecnicamente intensiva e só é adequada para aqueles que possuem uma sólida base de programação / técnica. Pontos de referência - As estratégias descritas acima serão muitas vezes comparadas a uma referência. Isso geralmente se manifesta como uma série de tempo financeiro adicional. Para as ações, isso geralmente é um benchmark de estoque nacional, como o índice S & P500 (US) ou FTSE100 (Reino Unido). Para um fundo de renda fixa, é útil comparar-se com uma cesta de títulos ou produtos de renda fixa. A "taxa livre de risco" (ou seja, a taxa de juros apropriada) também é outra referência amplamente aceita. Todas as categorias de classe de ativos possuem um benchmark favorecido, por isso será necessário pesquisar isso com base em sua estratégia específica, se desejar ganhar 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 apenas pode arranhar a superfície sobre o que está envolvido na construção de um. No entanto, ele se centra em torno de um mecanismo de banco de dados, como um Sistema de Gerenciamento de Banco de Dados Relacional (RDBMS), como MySQL, SQL Server, Oracle ou um Document Storage Engine (ou seja, "NoSQL"). Isso é acessado através do código de aplicativo "lógica comercial" que consulta o banco de dados e fornece acesso a ferramentas externas, como MATLAB, R ou Excel. Muitas vezes, esta lógica de negócios está escrita em C ++, C #, Java ou Python. Você também precisará hospedar esses dados em algum lugar, seja em seu próprio computador pessoal, seja remotamente através de servidores de internet. Produtos como o Amazon Web Services tornaram isso mais simples e barato nos últimos anos, mas ainda exigirá conhecimentos técnicos significativos para alcançar de forma robusta.


Como pode ser visto, uma vez que uma estratégia tenha sido identificada através 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 que é necessário rejeitar uma estratégia baseada unicamente em considerações de dados históricos. Esta é uma grande área e equipes de doutorados trabalham em grandes fundos garantindo que os preços sejam precisos e oportunos. Não subestime as dificuldades de criar um centro de dados robusto para os seus efeitos de backtesting!


Eu quero dizer, no entanto, que muitas plataformas de backtesting podem fornecer esses dados para você automaticamente - a um custo. Assim, demorará muito da dor de implementação para você, e você pode se concentrar exclusivamente na implementação e otimização da estratégia. Ferramentas como a 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 fornecedores de software. Eu prefiro estratégias de freqüência mais altas devido aos seus índices de Sharpe mais atraentes, mas muitas vezes estão fortemente acoplados à pilha de tecnologia, onde a otimização avançada é crítica.


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


Apenas iniciando o comércio quantitativo?


3 razões para se inscrever na QuantStart List:


1. Quant Trading Lessons.


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


2. Todo o conteúdo mais recente.


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


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


QuantStart.


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


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


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


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


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


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


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


Qual é o sistema de comércio tentando fazer?


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


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


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


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


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


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


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


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


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


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


Sistemas de pesquisa.


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


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


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


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


Construção de carteiras e gerenciamento de riscos.


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


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


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


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


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


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


Sistemas de Execução.


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


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, ZeroMQ 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 RabbitMQ.


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


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


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


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


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


The main benefit of using interpreted languages is the speed of development time. Python and R require far fewer lines of code (LOC) to achieve similar functionality, principally due to the extensive libraries. 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. Se for necessário um alto desempenho, as corretoras suportarão o protocolo FIX.


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.


Apenas iniciando o comércio quantitativo?


3 razões para se inscrever na QuantStart List:


1. Quant Trading Lessons.


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


2. Todo o conteúdo mais recente.


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


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

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

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