Saturday 17 March 2018

Arquitetura do sistema de negociação algorítmica


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


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


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


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


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


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


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


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


A geração de sinais preocupa-se em gerar um conjunto de sinais de negociação de um algoritmo e enviar esses pedidos ao mercado, geralmente por meio de uma corretora. Para determinadas estratégias, é necessário um alto nível de desempenho. Problemas de E / S, como largura de banda de rede e latência, são muitas vezes o fator limitante na otimização de sistemas de execução. Assim, a escolha de idiomas para cada componente de todo o seu sistema pode ser bem diferente.


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


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


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


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


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


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


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


Sistemas de pesquisa.


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


IDEs típicos nesse espaço incluem o Microsoft Visual C ++ / C #, que contém extensos utilitários de depuração, recursos de conclusão de código (via "Intellisense") e visões gerais simples da pilha inteira do projeto (via banco de dados ORM, LINQ); MatLab, que é projetado para extensa álgebra linear numérica e operações vetorizadas, mas de uma forma de console interativo; R Studio, que envolve o console de linguagem estatística R em um IDE completo; Eclipse IDE para Linux Java e C ++; e IDEs semi-proprietários como o Enthought Canopy for 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 consideração principal neste estágio é a velocidade de execução. Uma linguagem compilada (como C ++) é geralmente útil se as dimensões do parâmetro de backtesting forem grandes. Lembre-se que é necessário ter cuidado com esses sistemas, se for esse o caso!


Linguagens interpretadas, como Python, geralmente usam bibliotecas de alto desempenho, como NumPy / pandas, para a etapa de backtesting, a fim de manter um grau razoável de competitividade com equivalentes compilados. Em última análise, a linguagem escolhida para o backtesting será determinada por necessidades algorítmicas específicas, bem como o leque de bibliotecas disponíveis na linguagem (mais sobre isso abaixo). No entanto, a linguagem usada para os ambientes de backtester e de pesquisa pode ser completamente independente daquelas usadas nos componentes de construção de portfólio, gerenciamento de risco e execução, como será visto.


Construção de Carteira e Gestão de Risco.


Os componentes de gerenciamento de risco e de construção de portfólio são frequentemente ignorados pelos traders algorítmicos de varejo. Isso é quase sempre um erro. Essas ferramentas fornecem o mecanismo pelo qual o capital será preservado. Eles não apenas tentam aliviar o número de apostas "arriscadas", mas também minimizam a rotatividade dos 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. É fácil criar uma estratégia estável, pois o mecanismo de construção de portfólio e o gerenciador de risco podem ser facilmente modificados para lidar com vários sistemas. Assim, eles devem ser considerados componentes essenciais no início do projeto de um sistema de negociação algorítmica.


O trabalho do sistema de construção de portfólio é pegar um conjunto de negócios desejados e produzir o conjunto de negociações 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 de portfólio geralmente se reduz a um problema de álgebra linear (como uma fatoração de matriz) e, portanto, o desempenho é altamente dependente da eficácia da implementação da álgebra linear numérica disponível. Bibliotecas comuns incluem uBLAS, LAPACK e NAG para C ++. O MatLab também possui operações de matriz amplamente otimizadas. O Python utiliza o NumPy / SciPy para tais cálculos. Um portfólio freqüentemente reequilibrado exigirá uma biblioteca matricial compilada (e bem otimizada!) Para realizar este passo, de modo a não afunilar o sistema de negociação.


O gerenciamento de riscos é outra parte extremamente importante de um sistema de negociação algorítmica. O risco pode vir de várias formas: aumento da volatilidade (embora isso possa ser visto como desejável para certas estratégias!), Aumento das correlações entre classes de ativos, inadimplência de terceiros, paralisações de servidores, eventos "black swan" e erros não detectados no código de negociação. para nomear alguns.


Os componentes de gerenciamento de risco tentam antecipar os efeitos da volatilidade excessiva e correlação entre as classes de ativos e seus efeitos subseqüentes sobre o capital comercial. Muitas vezes, isso reduz a um conjunto de cálculos estatísticos, como os "testes de estresse" de Monte Carlo. Isso é muito semelhante às necessidades computacionais de um mecanismo de precificação de derivativos e, como tal, será vinculado à CPU. Estas 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 carteira e gestão de risco 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 a Interactive Brokers. As principais considerações ao decidir sobre uma linguagem incluem a qualidade da API, a disponibilidade do wrapper de idioma para uma API, a frequência de execução e o escorregamento previsto.


A "qualidade" da API refere-se a quão bem documentada ela é, que tipo de desempenho ela fornece, se precisa de software independente para ser acessado ou se um gateway pode ser estabelecido de forma desmotivada (ou seja, sem GUI). No caso dos Interactive Brokers, a ferramenta Trader WorkStation precisa estar em execução em um ambiente GUI para acessar sua API. Certa vez, tive que instalar uma edição do Ubuntu do Desktop em um servidor de nuvem da Amazon para acessar o Interactive Brokers remotamente, puramente por esse motivo!


A maioria das APIs fornecerá uma interface C ++ e / ou Java. Geralmente, cabe à comunidade desenvolver wrappers específicos de linguagem para C #, Python, R, Excel e MatLab. Observe que, com cada plug-in adicional utilizado (especialmente os wrappers de APIs), há escopo para os bugs se infiltrarem no sistema. Sempre teste plugins desse tipo e garanta que eles sejam ativamente mantidos. Um indicador que vale a pena é ver quantas novas atualizações foram feitas em uma base de código nos últimos meses.


Freqüência de execução é da maior importância no algoritmo de execução. Observe que centenas de pedidos podem ser enviados a cada minuto e, como tal, o desempenho é crítico. A derrapagem será incorrida através de um sistema de execução com péssimo desempenho e isso terá um impacto dramático na lucratividade.


As linguagens com tipagem estática (veja abaixo) como C ++ / Java são geralmente ótimas para execução, mas há um compromisso em tempo de desenvolvimento, teste e facilidade de manutenção. Linguagens dinamicamente tipificadas, como Python e Perl, são geralmente "rápidas o suficiente". Certifique-se sempre de que os componentes são projetados de maneira modular (veja abaixo) para que possam ser "trocados" conforme o sistema é dimensionado.


Planejamento arquitetônico e processo de desenvolvimento.


Os componentes de um sistema de negociação, seus requisitos de freqüência e volume foram discutidos acima, mas a infra-estrutura do sistema ainda não foi coberta. Aqueles que atuam como comerciantes de varejo ou que trabalham em um fundo pequeno provavelmente estarão "usando muitos chapéus". Será necessário estar cobrindo o modelo alfa, os parâmetros de gerenciamento de risco e execução, e também a implementação final do sistema. Antes de aprofundar em linguagens específicas, o design de uma arquitetura de sistema ideal será discutido.


Separação de preocupações.


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


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


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


Por exemplo, se o armazenamento de dados em uso estiver atualmente com baixo desempenho, mesmo em níveis significativos de otimização, ele poderá ser substituído com reescritas mínimas para a API de acesso a dados ou acesso a dados. Tanto quanto o backtester e componentes subseqüentes estão em causa, não há diferença.


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


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


Considerações de desempenho.


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


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


As ferramentas de criação de perfil são usadas para determinar onde os gargalos surgem. Os perfis podem ser feitos para todos os fatores listados acima, seja em um ambiente MS Windows ou Linux. Existem muitas ferramentas de sistema operacional e idioma disponíveis para isso, bem como utilitários de terceiros. A escolha da língua será agora discutida no contexto do desempenho.


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


Uma exceção é se a arquitetura de hardware altamente personalizada for necessária e um algoritmo estiver fazendo uso extensivo de extensões proprietárias (como caches personalizados). No entanto, muitas vezes a "reinvenção da roda" desperdiça tempo que poderia ser mais bem gasto desenvolvendo e otimizando outras partes da infraestrutura de negociação. O tempo de desenvolvimento é extremamente precioso, especialmente no contexto de desenvolvedores únicos.


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


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


O cache é muito útil no kit de ferramentas de um desenvolvedor de comércio quantitativo. O armazenamento em cache se refere ao conceito de armazenamento de dados acessados ​​com frequência de uma maneira que permite acesso de maior desempenho, em detrimento do possível enfraquecimento dos dados. Um caso de uso comum ocorre no desenvolvimento da Web ao obter dados de um banco de dados relacional baseado em disco e colocá-lo na memória. Quaisquer solicitações subsequentes para os dados não precisam "atingir o banco de dados" e, portanto, os ganhos de desempenho podem ser significativos.


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


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


Alocação de memória dinâmica é uma operação cara na execução de software. Assim, é imperativo que os aplicativos de negociação de desempenho mais alto conheçam bem como a memória está sendo alocada e desalocada durante o fluxo do programa. Novos padrões de linguagem, como Java, C # e Python, executam a coleta automática de lixo, que se refere à desalocação da memória alocada dinamicamente quando os objetos saem do escopo.


A coleta de lixo é extremamente útil durante o desenvolvimento, pois reduz os erros e ajuda na legibilidade. No entanto, muitas vezes é sub-ótimo para certas estratégias de negociação de alta frequência. A coleta de lixo personalizada é geralmente desejada para esses casos. Em Java, por exemplo, ajustando o coletor de lixo e a configuração de heap, é possível obter alto desempenho para estratégias de HFT.


O C ++ não fornece um coletor de lixo nativo e, portanto, é necessário manipular toda alocação / desalocação de memória como parte da implementação de um objeto. Embora potencialmente sujeito a erros (potencialmente levando a ponteiros pendentes), é extremamente útil ter um controle refinado de como os objetos aparecem no heap para determinados aplicativos. Ao escolher um idioma, certifique-se de estudar como o coletor de lixo funciona e se ele pode ser modificado para otimizar um determinado caso de uso.


Muitas operações em sistemas de negociação algorítmica são passíveis de paralelização. Isto refere-se ao conceito de realizar múltiplas operações programáticas ao mesmo tempo, isto é, em "paralelo". Os chamados algoritmos "embarassingly parallel" incluem etapas que podem ser calculadas de forma totalmente independente de outras etapas. Certas operações estatísticas, como as simulações de Monte Carlo, são um bom exemplo de algoritmos embarassingly paralelos, pois cada sorteio aleatório e subseqüente operação de caminho podem ser computados sem o conhecimento de outros caminhos.


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


A paralelização tornou-se cada vez mais importante como um meio de otimização, uma vez que as velocidades de clock do processador estagnaram, pois os processadores mais recentes contêm muitos núcleos com os quais executar cálculos paralelos. O aumento do hardware gráfico do consumidor (predominantemente para videogames) levou ao desenvolvimento de Unidades de Processamento Gráfico (Graphical Processing Units - GPUs), que contêm centenas de "núcleos" para operações altamente concorrentes. Essas GPUs agora são muito acessíveis. Estruturas de alto nível, como o CUDA da Nvidia, levaram à adoção generalizada na academia e nas finanças.


Esse hardware GPU geralmente é adequado apenas para o aspecto de pesquisa de finanças quantitativas, enquanto outros hardwares mais especializados (incluindo Field-Programmable Gate Arrays - FPGAs) são usados ​​para (U) HFT. Atualmente, os idiomas mais modernos suportam um grau de simultaneidade / multithreading. Assim, é fácil otimizar um backtester, já que todos os cálculos são geralmente independentes dos demais.


O dimensionamento em engenharia de software e operações refere-se à capacidade do sistema de manipular cargas crescentes consistentemente na forma de solicitações maiores, maior uso do processador e mais alocação de memória. No comércio algorítmico, uma estratégia é capaz de escalonar se puder aceitar maiores quantidades de capital e ainda produzir retornos consistentes. A pilha de tecnologia de negociação é dimensionada se puder suportar maiores volumes de negócios e maior latência, sem gargalos.


Embora os sistemas devam ser projetados para escalar, muitas vezes é difícil prever antecipadamente onde ocorrerá um gargalo. Registro, testes, criação de perfil e monitoramento rigorosos ajudarão muito a permitir que um sistema seja dimensionado. Os próprios idiomas são geralmente descritos como "não escaláveis". Isso geralmente é resultado de desinformação, e não de fatos concretos. É a pilha total de tecnologia que deve ser verificada para escalabilidade, não para o idioma. É claro que certas linguagens têm um desempenho maior do que outras em casos de uso específicos, mas uma linguagem nunca é "melhor" que outra em todos os sentidos.


Um meio de administrar escala é separar as preocupações, como dito acima. De modo a introduzir ainda a capacidade de lidar com "picos" no sistema (isto é, volatilidade súbita que desencadeia uma série de operações), é útil criar uma "arquitectura de fila de mensagens". Isso significa simplesmente colocar um sistema de fila de mensagens entre os componentes para que os pedidos sejam "empilhados" se um determinado componente não puder processar muitas solicitações.


Em vez de solicitações serem perdidas, elas são simplesmente mantidas em uma pilha até que a mensagem seja manipulada. Isso é particularmente útil para enviar negociações para um mecanismo de execução. Se o motor estiver sofrendo sob latência pesada, ele fará o backup dos negócios. Uma fila entre o gerador de sinais de negociação e a API de execução aliviará essa questão às custas do escorregamento comercial em potencial. Um broker de fila de mensagens de software livre bem respeitado é o RabbitMQ.


Hardware e Sistemas Operacionais.


O hardware que executa sua estratégia pode ter um impacto significativo na lucratividade de seu algoritmo. Este não é um problema restrito a operadores de alta frequência. Uma má escolha em hardware e sistema operacional pode levar a uma falha da máquina ou reinicializar no momento mais inoportuno. Assim, é necessário considerar onde seu aplicativo irá residir. A escolha é geralmente entre uma máquina desktop pessoal, um servidor remoto, um provedor "nuvem" ou um servidor co-localizado em troca.


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


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


Um servidor dedicado ou uma máquina baseada em nuvem, embora frequentemente mais cara do que uma opção de desktop, permite uma infraestrutura de redundância mais significativa, como backups automáticos de dados, a capacidade de garantir mais tempo de atividade e monitoramento remoto. Eles são mais difíceis de administrar, pois exigem a capacidade de usar os recursos de login remoto do sistema operacional.


No Windows, isso geralmente é feito através do protocolo RDP (Remote Desktop Protocol) da GUI. Em sistemas baseados em Unix, a linha de comando Secure SHell (SSH) é usada. A infra-estrutura de servidor baseada em Unix é quase sempre baseada em linha de comando, o que imediatamente torna as ferramentas de programação baseadas em GUI (como MatLab ou Excel) inutilizáveis.


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


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


Resiliência e Teste.


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


É provável que, em qualquer aplicação de negociação quantitativa personalizada razoavelmente complicada, pelo menos 50% do tempo de desenvolvimento seja gasto em depuração, teste e manutenção.


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


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


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


O TDD requer um design de especificação inicial extenso, bem como um grau saudável de disciplina, a fim de realizar com sucesso. Em C ++, o Boost fornece uma estrutura de teste de unidade. Em Java, a biblioteca JUnit existe para cumprir o mesmo propósito. O Python também possui o módulo unittest como parte da biblioteca padrão. Muitas outras linguagens possuem frameworks de testes unitários e muitas vezes há várias opções.


Em um ambiente de produção, o registro sofisticado é absolutamente essencial. O registro refere-se ao processo de saída de mensagens, com vários graus de gravidade, em relação ao comportamento de execução de um sistema para um arquivo ou banco de dados simples. Os logs são uma "primeira linha de ataque" ao procurar um comportamento inesperado do tempo de execução do programa. Infelizmente, as deficiências de um sistema de extração de madeira tendem a ser descobertas após o fato! Como com os backups discutidos abaixo, um sistema de registro deve ser considerado antes de um sistema ser projetado.


Tanto o Microsoft Windows quanto o Linux vêm com um amplo recurso de registro do sistema, e as linguagens de programação tendem a ser fornecidas com bibliotecas de registro padrão que cobrem a maioria dos casos de uso. É sempre aconselhável centralizar as informações de registro para analisá-las em uma data posterior, pois elas podem levar a idéias sobre como melhorar o desempenho ou a redução de erros, o que quase certamente terá um impacto positivo em seus retornos de negociação.


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


Métricas de negociação, tais como preços / volume anormais, levantamentos repentinos rápidos e exposição de contas para diferentes setores / mercados também devem ser continuamente monitorados. Além disso, deve ser instigado um sistema de limite que forneça notificação quando certas métricas forem violadas, elevando o método de notificação (email, SMS, chamada telefônica automatizada), dependendo da gravidade da métrica.


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


Backups e alta disponibilidade devem ser as principais preocupações de um sistema de negociação. 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. Existem vantagens e desvantagens para ambas as abordagens. It is necessary to consider how well a language is supported, the activity of the community surrounding a language, ease of installation and maintenance, quality of the documentation and any licensing/maintenance costs.


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


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


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


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


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


The main benefit of using interpreted languages is the speed of development time. Python and R require far fewer lines of code (LOC) to achieve similar functionality, principally due to the extensive libraries. Further, they often allow interactive console based development, rapidly reducing the iterative development process.


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


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


While proprietary software is not immune from dependency/versioning issues it is far less common to have to deal with incorrect library versions in such environments. Open source operating systems such as Linux can be trickier to administer.


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


Batteries Included?


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


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


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


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


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


Conclusão.


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


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


A Quantcademy.


Junte-se ao portal de adesão da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento e saiba como aumentar a rentabilidade da sua estratégia.


Negociação Algorítmica Bem Sucedida.


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


Negociação Algorítmica Avançada.


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


Requisitos do sistema de negociação algorítmica.


Atualmente, estou levando uma aula sobre arquiteturas de software. Para esta classe, cada aluno escolhe um sistema, define seus requisitos arquitetônicos e projeta uma solução capaz de satisfazer esses requisitos. Escolhi um sistema de negociação algorítmica por causa do desafio tecnológico e porque adoro os mercados financeiros. Os sistemas de negociação algorítmica (ATs) usam algoritmos computacionais para tomar decisões comerciais, enviar ordens e gerenciar pedidos após a submissão. Nos últimos anos, as ATs ganharam popularidade e agora representam a maioria das negociações realizadas através de trocas internacionais. Distinção é feita entre negociação programada e negociação algorítmica. A negociação programada envolve a quebra de pedidos de grandes mercados em pacotes de ações menores. Neste artigo, o comércio programado é considerado um requisito de segurança de um ATs.


Introdução aos sistemas de negociação algorítmica.


Falando em geral, existem cinco tipos de participantes do mercado: investidores de varejo, comerciantes proprietários, criadores de mercado, instituições de compra e instituições de venda. Os ATs são mais utilizados por instituições proprietárias de buy-side, mas essa dinâmica está mudando. O comércio algorítmico como serviço (ATAAS) torna o comércio algorítmico acessível ao investidor de varejo (ver apêndice). Este artigo descreve os requisitos arquitetônicos para um ATs usado por uma instituição proprietária de compra exclusiva. Na maior parte do nível, um ATs tem três funções: tomar decisões comerciais, criar ordens de negociação e gerenciar essas ordens após a submissão. Abaixo disso, há uma série de requisitos funcionais mais detalhados, alguns dos quais podem ser satisfeitos pela arquitetura.


Introdução à arquitetura de software.


Um monte de debate ainda envolve a definição do que é uma arquitetura de software. No contexto deste artigo, a arquitetura do software é definida como a infra-estrutura dentro da qual os componentes do aplicativo que fornecem a funcionalidade do usuário podem ser especificados, implantados e executados. Um sistema de software deve satisfazer seus requisitos funcionais e não funcionais. Os requisitos funcionais especificam as funções dos componentes dos sistemas. Os requisitos não funcionais especificam medidas através das quais o desempenho do sistema é medido. Um sistema de software que satisfaça seus "requisitos funcionais", ainda não atende às expectativas dos usuários, e. um ATs que pode enviar negócios, mas não em tempo hábil, causaria perdas financeiras. A arquitetura do software basicamente fornece uma infra-estrutura que satisfaça os requisitos não funcionais e dentro do qual os componentes que satisfazem os requisitos funcionais podem ser implantados e executados. Os requisitos do sistema de negociação algorítmica podem, portanto, ser amplamente divididos em requisitos funcionais e não funcionais.


Requisitos funcionais.


Sob o requisito de nível superior de "fazer negociação", existem três requisitos de alto nível:


Obtenha dados de mercado - baixe, filtre e armazene dados estruturados e não estruturados. Os dados estruturados incluem dados de mercado em tempo real da Reuters ou Bloomberg transmitidos usando um protocolo, e. CONSERTAR. Dados não estruturados incluem notícias e dados de redes sociais. Definir estratégia de negociação - especifique novas regras e estratégias de negociação. A regra de negociação consiste em um indicador, uma desigualdade e um valor numérico, e. "Razão PE" & lt; 10. As regras de negociação são estruturadas em uma árvore de decisão para definir uma estratégia de negociação (ilustrada abaixo). Analise os títulos em relação à estratégia de negociação - para cada segurança, obtenha dados e filtre-o através da estratégia de negociação para determinar qual segurança para comprar. Adicionalmente: para cada posição aberta, determine qual segurança vender. Nota: este requisito pode variar.


Sob o requisito de nível superior de "criar pedidos de negociação", existem dois requisitos de alto nível:


Obtenha informações de comércio - para cada decisão, obtenha o símbolo de segurança, preço, quantidade, etc. Crie uma ordem comercial - para cada decisão, especifique um tipo de ordem e adicione informações comerciais. Existem seis tipos de pedidos: longo, curto, mercado, limite, parada e condicional.


Sob o requisito de nível superior de "gerenciar pedidos", existem três requisitos de alto nível:


Gerenciar ordens pendentes - para cada pedido, validar e confirmar esse pedido Ordem de rota / enviar - encaminhe cada pedido para uma troca, grupo escuro ou corretora Gerenciar ordens enviadas - acompanhar o status de cada pedido enviado, se a ordem for combinada, então crie uma posição aberta . Se a ordem não for correspondida, pare a ordem.


Este diagrama mostra como uma estratégia de negociação pode ser definida como uma árvore de decisão das regras de negociação.


Requisitos não Funcionais.


Existem muitos requisitos não funcionais que são comercializados entre os outros, e. O aumento do desempenho geralmente ocorre com um aumento no custo total de propriedade. Os requisitos do sistema de negociação algorítmico não funcional incluem,


Escalabilidade - é a capacidade de um sistema para lidar e executar sob uma carga de trabalho aumentada ou em expansão. Os ATs devem ser escaláveis ​​em relação ao número de feeds de dados em processos, número de trocas comerciais e títulos que podem negociar. Desempenho - é a quantidade de trabalho realizado por um sistema em comparação com o tempo e os recursos necessários para fazer esse trabalho. Um ATs deve ter tempos de resposta rápidos (de volta ao mercado) e alto processamento e transferência de rede. Modificabilidade - é a facilidade com que o sistema pode ser alterado. Um ATs deve ter estratégias de negociação e processamento de dados facilmente modificáveis. Confiabilidade - é a precisão e confiabilidade de um sistema para produzir saídas corretas para as entradas que recebe. Como erros e erros em um ATs podem resultar em enormes perdas e multas, a confiabilidade é crucial. Veja a debacle do capital do Cavaleiro para obter provas disso. Auditabilidade - é a facilidade com que o sistema pode ser auditado. Recentes casos de alto perfil de ATs que estão faltando colocaram a ATs em destaque para empresas de auditoria. Eles devem, portanto, ser auditáveis ​​tanto do ponto de vista financeiro, como da conformidade e da TI. Segurança - é a segurança de uma organização contra atividades criminosas, como terrorismo, roubo ou espionagem. Como as estratégias de negociação são proprietárias e representam uma propriedade intelectual valiosa, elas devem ser garantidas. Além disso, para proteger os ATs de caçados, as ordens devem ser ofuscadas usando estratégias de negociação programadas. Tolerância a falhas - é a capacidade de um sistema continuar a funcionar corretamente após uma falha ou falha. Isso é semelhante à confiabilidade, exceto que os ATs devem continuar sendo confiáveis ​​mesmo após uma falha para evitar perdas financeiras. Interoperabilidade - é a facilidade com que o sistema é capaz de operar com uma ampla gama de sistemas relacionados. Isso é importante para um ATs que pode ser necessário para interagir com sistemas de gerenciamento de pedidos, sistemas de gerenciamento de portfólio, sistemas de gerenciamento de riscos, sistemas de contabilidade e até sistemas bancários.


Visão geral do escopo arquitetônico.


O escopo arquitetônico é o conjunto de serviços suportados pela arquitetura que são consumidos por componentes para atender aos requisitos funcionais e não funcionais. Uma discriminação mais detalhada deste escopo arquitetônico está disponível no documento de requisitos detalhados. Em um nível alto, os seguintes serviços deveriam ser fornecidos pela arquitetura:


Um ambiente de processamento pré-processamento de dados modificável - que suporta vários fluxos de dados, filtros para dados irrelevantes e particionamento de dados temporários Um ambiente de processamento distribuído - que suporta várias unidades de processamento (clusters), monitoramento de desempenho em tempo real, uma estrutura de comunicação orientada a mensagens, agendamento de conjuntos de dados temporais, balanceamento de carga e replicação de dados Unidades de processamento individuais - que suportam filas na memória e processamento complexo de eventos (em dados temporais) Uma rede de área de armazenamento (SAN) - que suporta agregação de dados temporais, consultas contínuas e log (para trilhas de auditoria) Um ambiente de recuperação de dados (DR) - replica o SAN e o sistema de gerenciamento de pedidos Um ambiente de integração - que expõe uma API padrão para componentes e conecta componentes internos e externos uns aos outros. Um sistema de gerenciamento de pedidos - que aceita fluxos de entrada simultâneos , redundância passiva e balanceamento de carga, critérios ACID em pedidos, uma trilha de auditoria e é reposta cated Um ambiente de uso do sistema - que suporta múltiplos perfis de usuários e expõe um front-end totalmente gerenciado ao sistema de comércio algorítmico.


Requisitos de acesso e integração.


Os requisitos de acesso descrevem maneiras pelas quais os usuários podem acessar os componentes do sistema. Um sistema de comércio algorítmico deve expor três interfaces: uma interface para definir novas regras de negociação, estratégias de negociação e fontes de dados; uma interface de back-end para administradores de sistema para adicionar clusters e configurar a arquitetura; e uma interface de auditoria somente leitura para verificar controles de TI e direitos de acesso de usuários. Os pré-requisitos para integração entre componentes e sistemas externos são chamados de requisitos de integração. O sistema de negociação algorítmica deve apoiar integração baseada em arquivos, integração baseada em mensagens e integração de banco de dados. Como tal, os seguintes requisitos devem ser satisfeitos pela arquitetura:


Integração de banco de dados - suporte ODBC, JDBC, ADO e XQC Integração baseada em arquivos - suporte a arquivos CSV, XML e JSON Integração baseada em mensagens - suporte FIX, FAST e FIXatdl.


Restrições arquitetônicas.


Os pontos azuis mostram os locais físicos onde a latência da rede é minimizada e os pontos vermelhos mostram os locais físicos das grandes trocas financeiras. A fim de maximizar o desempenho do sistema de negociação algorítmica, deve-se alojar o sistema em locais que minimizem a latência da rede. Fonte: MIT open press: dspace. mit. edu/handle/1721.1/6285.


Restrições arquitetônicas são fatores que restringem o desempenho da arquitetura que está sendo construída. As duas restrições que vou mencionar aqui são restrições de rede física e restrições regulatórias. Restrições de rede física são colocadas em um sistema como resultado de redes de telecomunicações de baixo custo. Para mitigar essa restrição, o sistema deve ser construído onde a latência da rede é minimizada. Outra maneira de mitigar as restrições de rede é co-localizar o sistema de negociação algorítmica com a troca de mercado. Uma vez que foi dito, a decisão de co-localizar apresenta restrições de processamento e espaço adicionais.


As restrições regulatórias são introduzidas através de leis e regulamentos, que são principalmente países e câmbio específicos. Este é um fator cada vez mais importante na concepção e implementação de um sistema de negociação algorítmica porque a negociação algorítmica está se tornando mais regulada após o crash do Flash de 2010. Falando em geral, os ATs devem, pelo menos, cumprir as regras da SEC relativas à conformidade e integridade do sistema (SCI), as diretrizes EMEA para sistemas de negociação algorítmica, os padrões de negociação algorítmica ISO 9000 (AT9000) e as normas internacionais de relatório financeiro (IFRS) .


Conclusão.


As arquiteturas de sistemas de negociação algorítmica são complicadas pelos rigorosos requisitos não funcionais esperados do sistema e pela ampla gama de requisitos regulatórios e de conformidade que regem a negociação automatizada. Devido a essas complexidades, deve-se considerar cuidadosamente o design e a implementação da arquitetura do sistema. Ao projetar uma arquitetura de negociação algorítmica de fonte aberta, espero apontar os requisitos arquitetônicos que muitas vezes são ignorados no início do projeto de tais sistemas. Os requisitos identificados neste documento provavelmente não serão concluídos e inevitavelmente evoluirão com o passar do tempo. A segunda parcela deste artigo incluirá meu design para uma arquitetura de software que atenda aos requisitos acima mencionados. Para obter mais informações sobre negociação algorítmica, não hesite em contactar-me.


Para baixar uma cópia do meu relatório, clique aqui. Para obter uma lista completa de fontes, consulte o relatório.


Os provedores de serviços da ATAAS incluem, mas não estão limitados a:


Quantopian - os usuários definem estratégias de negociação quantitativas em Python e podem testá-las novamente. Os usuários também podem executar essas estratégias em mercados ativos. Quantopian recentemente recebeu um investimento de 6,7 milhões de dólares para ampliar seus serviços. EquaMetrics - usando os usuários do RIZM, criam visualmente novas estratégias de negociação algorítmica, testam essas estratégias e executam essas estratégias em mercados ativos. A EquaMetrics anunciou recentemente um novo financiamento para a RIZM avaliado em 4,5 milhões de USD. Corretoras - algumas corretoras permitem que os comerciantes criem bots de negociação que executem automaticamente suas estratégias de negociação.


História anterior.


Previsão econômica BRICs usando redes neurais.


Próxima História.


Arquitetura do sistema de comércio algorítmico.


Envie um comentário.


Cancelar resposta.


Siga a Turing Finance.


Turing Finance Mailing List.


Amigos da Turing Finance.


Quantocracy é o melhor agregador de blog de finanças quantitativas com links para novas análises postadas todos os dias.


NMRQL é o fundo hedge quantitativo de que sou parte. Usamos a aprendizagem de máquinas para tentar vencer o mercado.


Arquitetura do sistema de comércio algorítmico.


Anteriormente, neste blog, escrevi sobre a arquitetura conceitual de um sistema de negociação algorítmico inteligente, bem como os requisitos funcionais e não funcionais de um sistema de negociação algorítmica de produção. Desde então, projetei uma arquitetura de sistema que, acredito, poderia satisfazer esses requisitos arquitetônicos. Nesta publicação, descreverei a arquitetura seguindo as diretrizes dos padrões ISO / IEC / IEEE 42010 e padrão de descrição da arquitetura de engenharia de software. De acordo com este padrão, uma descrição de arquitetura deve:


Contém várias visualizações arquitetônicas padronizadas (por exemplo, em UML) e Mantenha a rastreabilidade entre decisões de design e requisitos arquitetônicos.


Definição de arquitetura de software.


Ainda não há consenso quanto ao que é uma arquitetura do sistema. No contexto deste artigo, é definido como a infra-estrutura dentro da qual os componentes do aplicativo que satisfazem os requisitos funcionais podem ser especificados, implantados e executados. Os requisitos funcionais são as funções esperadas do sistema e seus componentes. Os requisitos não funcionais são medidas através das quais a qualidade do sistema pode ser medida.


Um sistema que satisfaça plenamente seus requisitos funcionais ainda pode não atender às expectativas se os requisitos não funcionais forem deixados insatisfeitos. Para ilustrar este conceito, considere o seguinte cenário: um sistema de negociação algorítmico que você acabou de comprar / construir faz excelentes decisões de negociação, mas é completamente inoperacional com os sistemas de gestão e contabilidade de risco das organizações. Esse sistema atenderia às suas expectativas?


Arquitetura conceitual.


Uma visão conceitual descreve conceitos e mecanismos de alto nível que existem no sistema no mais alto nível de granularidade. Nesse nível, o sistema de negociação algorítmica segue uma arquitetura orientada a eventos (EDA) dividida em quatro camadas e dois aspectos arquitetônicos. Para cada camada e referência de aspecto arquiteturas e padrões são usados. Padrões arquitetônicos são estruturas comprovadas e genéricas para alcançar requisitos específicos. Os aspectos arquitetônicos são preocupações transversais que abrangem múltiplos componentes.


Arquitetura orientada a eventos - uma arquitetura que produz, detecta, consome e reage a eventos. Os eventos incluem movimentos do mercado em tempo real, eventos ou tendências complexas e eventos comerciais, e. enviando um pedido.


Este diagrama ilustra a arquitetura conceitual do sistema de negociação algorítmica.


Arquiteturas de referência.


Para usar uma analogia, uma arquitetura de referência é semelhante aos planos para uma parede de suporte de carga. Esta impressão azul pode ser reutilizada para projetos de construção múltipla independentemente do edifício que está sendo construído, pois satisfaz um conjunto de requisitos comuns. Da mesma forma, uma arquitetura de referência define um modelo contendo estruturas genéricas e mecanismos que podem ser usados ​​para construir uma arquitetura de software concreta que satisfaça requisitos específicos. A arquitetura para o sistema de negociação algorítmica usa uma arquitetura baseada em espaço (SBA) e um controlador de exibição de modelo (MVC) como referências. São também utilizadas boas práticas, como o armazenamento de dados operacionais (ODS), o padrão de transformação e carregamento de extratos (ETL) e um data warehouse (DW).


Controle de exibição de modelo - um padrão que separa a representação de informações da interação do usuário com ela. Arquitetura baseada em espaço - especifica uma infra-estrutura onde as unidades de processamento acopladas vagamente interagem entre si através de uma memória associativa compartilhada chamada espaço (mostrado abaixo).


Visão estrutural.


A visão estrutural de uma arquitetura mostra os componentes e subcomponentes do sistema de negociação algorítmica. Ele também mostra como esses componentes são implantados em infra-estrutura física. Os diagramas UML utilizados nesta visão incluem diagramas de componentes e diagramas de implantação. Abaixo está a galeria dos diagramas de implantação do sistema de negociação algorítmico geral e as unidades de processamento na arquitetura de referência SBA, bem como diagramas de componentes relacionados para cada uma das camadas.


Diagrama de componentes de processamento de comerciantes / eventos automatizados Fonte de dados e diagrama de componente de camada de pré-processamento Diagrama de componente de interface de usuário baseado em MVC.


Táticas arquitetônicas.


De acordo com o instituto de engenharia de software, uma tática arquitetônica é um meio de satisfazer um requisito de qualidade, manipulando algum aspecto de um modelo de atributo de qualidade através de decisões de design arquitetônico. Um exemplo simples usado na arquitetura do sistema de negociação algorítmica é 'manipular' um armazenamento de dados operacional (ODS) com um componente de consulta contínua. Este componente analisaria continuamente o ODS para identificar e extrair eventos complexos. As seguintes táticas são usadas na arquitetura:


O padrão do disruptor nas filas de eventos e pedidos Memória compartilhada para as filas de eventos e pedidos Linguagem de consulta contínua (CQL) na filtragem de dados ODS com o padrão de design do filtro em dados recebidos Algoritmos de evitação de congestionamentos em todas as conexões de entrada e saída Gerenciamento de filas ativas (AQM ) e notificação de congestionamento explícito Recursos de computação de mercadorias com capacidade de atualização (escalável) Redundância ativa para todos os pontos de falha únicos Indicação e estruturas de persistência otimizadas no ODS Programe backup de dados regulares e scripts de limpeza para ODS Histórico de transações em todos os bancos de dados Súmrios para todos Ordens para detectar falhas Anotar eventos com timestamps para ignorar eventos "obsoletos". Regras de validação de pedidos, por exemplo, quantidades de comércio máximo Componentes de comerciante automatizado usam um banco de dados em memória para análise Autenticação em dois estágios para interfaces de usuário conectando-se à ATs Criptografia em interfaces de usuário e conexões ao padrão de design ATs Observer para que o MVC gerencie visualizações.


A lista acima é apenas algumas decisões de design que identifiquei durante o projeto da arquitetura. Não é uma lista completa de táticas. À medida que o sistema está sendo desenvolvido, táticas adicionais devem ser empregadas em múltiplos níveis de granularidade para atender aos requisitos funcionais e não funcionais. Abaixo estão três diagramas que descrevem o padrão de design do disruptor, o padrão de design do filtro e o componente de consulta contínua.


Visão comportamental.


Essa visão de uma arquitetura mostra como os componentes e camadas devem interagir um com o outro. Isso é útil ao criar cenários para testar projetos de arquitetura e para entender o sistema de ponta a ponta. Essa visão consiste em diagramas de seqüência e diagramas de atividades. Diagramas de atividades que mostram o processo interno do sistema de negociação algorítmica e como os comerciantes devem interagir com o sistema de negociação algorítmica são mostrados abaixo.


Tecnologias e estruturas.


O passo final na concepção de uma arquitetura de software é identificar potenciais tecnologias e estruturas que poderiam ser utilizadas para realizar a arquitetura. Como princípio geral, é melhor aproveitar as tecnologias existentes, desde que satisfaçam adequadamente os requisitos funcionais e não funcionais. Uma estrutura é uma arquitetura de referência realizada, e. JBoss é uma estrutura que realiza a arquitetura de referência JEE. As seguintes tecnologias e frameworks são interessantes e devem ser consideradas na implementação de um sistema de negociação algorítmico:


CUDA - NVidia tem uma série de produtos que suportam modelagem de finanças computacionais de alto desempenho. Pode-se conseguir até 50x melhorias no desempenho ao executar simulações Monte Carlo na GPU em vez da CPU. Rio Apache - Rio é um kit de ferramentas usado para desenvolver sistemas distribuídos. Ele foi usado como uma estrutura para a construção de aplicativos com base no padrão SBA Apache Hadoop - no caso de registro invasivo ser um requisito, então o uso do Hadoop oferece uma solução interessante para o problema dos grandes dados. O Hadoop pode ser implantado em um ambiente em cluster que suporta tecnologias CUDA. AlgoTrader - uma plataforma de negociação algorítmica de código aberto. O AlgoTrader poderia ser implantado no lugar dos componentes do comerciante automatizado. FIX Engine - um aplicativo autônomo que aceita os protocolos do Financial Information Exchange (FIX), incluindo FIX, FAST e FIXatdl.


Embora não seja uma tecnologia ou uma estrutura, os componentes devem ser criados com uma interface de programação de aplicativos (API) para melhorar a interoperabilidade do sistema e seus componentes.


Conclusão.


A arquitetura proposta foi projetada para satisfazer requisitos muito genéricos identificados para sistemas de negociação algorítmica. Geralmente, os sistemas de negociação algorítmica são complicados por três fatores que variam de acordo com cada implementação:


Dependências em sistemas empresariais e de intercâmbio externos Requisitos não funcionais desafiadores e restrições arquitetônicas em evolução.


Por conseguinte, a arquitetura de software proposta deve ser adaptada caso a caso para satisfazer requisitos organizacionais e regulatórios específicos, bem como para superar restrições regionais. A arquitetura do sistema de negociação algorítmica deve ser vista como apenas um ponto de referência para indivíduos e organizações que desejam projetar seus próprios sistemas de negociação algorítmica.


Para uma cópia completa e fontes usadas, baixe uma cópia do meu relatório. Obrigado.


História anterior.


Requisitos do sistema de negociação algorítmica.


Próxima História.


Otimização de portfólio usando otimização de enxertia de partículas.


Excelente visão geral, e um bom começo na arquitetura. Sua conclusão foi adequada, e apontou por que os sistemas de software de negociação algorítmica requerem back-testing e ajustes constantes para mantê-los relevantes. Boa leitura!


1 de fevereiro de 2016.


Quando os dados de commodities ou renda fixa são imprecisos ou lentos em receber, os modelos podem ter dificuldade em calcular especialmente no espaço de um evento Black Swann.


Muito obrigado por este artigo. Estive pensando em AI em finanças desde o final da década de 90 e, finalmente, as tecnologias e as APIs estão comumente disponíveis. Seu artigo e blog são uma ótima ajuda para fazer esses primeiros passos para tornar realidade os sonhos dos anos anteriores. Muito obrigado e boa sorte em seus novos empreendimentos!


Mantenha-me atualizado no seu progresso. Estou muito interessado. Obrigado.


Envie um comentário.


Cancelar resposta.


Siga a Turing Finance.


Turing Finance Mailing List.


Amigos da Turing Finance.


Quantocracy é o melhor agregador de blog de finanças quantitativas com links para novas análises postadas todos os dias.


NMRQL é o fundo hedge quantitativo de que sou parte. Usamos a aprendizagem de máquinas para tentar vencer o mercado.


Algorithmic Trading Platform | Programas.


ALGORITHMIC TRADING PLATFORM.


design for professionals!


Algorithmic Trading Platform.


Professional algorithmic trading tools give you the power, speed and precision. Power over how and when to react to any situation that appears on the market. With our tools, you can organize the chaos of market information – automatically analyse thousands of events and react on the most important. React in a very precise manner, measured in milliseconds. The speed of reaction and the ability to process huge amounts of data is an advantage over other market participants, who are not equipped with professional tools and algorithms. This will be your advantage over the market.


Algorithmic trading tools will work for you doing the tedious processing work, while you can concentrate on the essentials – control and strategic issues. They have the ability to change the balance of power in the market. They can multiply the power of your capital. Compensate for a smaller number of people employed in the fund. They improve processes, portfolio management and risk management. Our tools multiply your strength in the market. Multiply the spectrum of investment opportunities that you will be able to respond. Our tools give you the power. Multiplied.


Advantages for traders and quants.


Screenshot from Empirica TradePad application.


Algorithmic Trading Platform is a complete environment, dedicated to create, test and execute algorithmic strategies for financial institutions. It aids traders and quants in financial institutions with:


possibility of implementation of investment strategies inaccessible by traditional methods savings in transaction costs for large orders exploit market inefficiencies with usage of quantitative analysis portfolio & risk management automation real-time monitoring of hundreds of instruments for occurrence of certain market events performance, stability and security parameters at the highest level required by financial institutions direct connectivity to exchanges, easy integration with brokerage systems our support for the ROI estimation before starting of the project.


Construir, testar, comércio.


Construir. Development process of trading algorithms using tools and libraries provided by Empirica has been greatly simplified. At the same time such simplification by no means restricts users in creation of complex algorithms, which is often the case when working with tools based on scripting languages or block diagrams.


Teste. Empirica Trading Platform allows users to safely test algorithms before deployment on live markets. Those tests include the ability to verify algorithm behaviour against historical market data, user generated situations or on the real market without executing actual transactions.


Comércio. Empirica Trading Platform takes care of all technical operations concerning connections to financial markets, brokerage systems, orders processing, and feeding algorithms with market data. This allows users to fully focus on their algorithm’s market performance.


Algorithmic Trading Platform has been developed according to high requirements of financial institutions regarding stability, reliability, security, efficiency, low latency, and built-in real time replication mechanisms.


high throughput – ability to process thousands of orders per second, low latency – minimal delay generated by system components itself, efficiency of server side processing, possibility of collocation in exchange infrastructure, built-in mechanisms of scalability to accommodate workload growth.


system certified by the Warsaw Stock Exchange, ability to concurrently trade on multiple markets and connect to multiple data sources, standard market access support for connecting to new markets, open, modular architecture allowing easy integration with financial institutions’ sistemas.


dedicated component for processing user’s positions data, implemented Black-Scholes model for options pricing.


set of powerful tools including stock exchange simulator, back-tests on historical data, live market tests, paper trading possibility to simulate all possible market scenarios.


feature rich desktop application – TradePad, ample functionality including among other things manual trading functions, variety of graphical data presentation and charting, rich set of configuration options to fit user requirements.


set of safeguards and warnings against most common human errors, configurable set of limitations and protection mechanisms on the server level, extensive, configurable alerts system.


Arquitetura de plataforma.


Open and efficient architecture of Algorithmic Trading Platform allows scalability along with financial institution growing demands.


Algorithmic Trading Platform can be connected to the market via the brokerage system or directly to the exchange system.


Client GUI application, installed on the user’s workstation. From this application end users can monitor and manage theirs orders and strategies.


Order Engine.


Designed for maximal efficiency server component responsible for sending orders directly to the exchange or via the brokerage system.


Strategy Executor.


Server component responsible for executing strategies.


Portfolio Monitor.


Server component processing information on the user’s transactions and providing status information about positions, profit&loss and risk.


Exchange Simulator.


Multifunctional component for strategy testing.


Experienced team of developers, testers and quants is ready to support our customers in functionality development, integration with external systems as well as assistance in implementation of algorithmic strategies.


Algorithmic Strategy Development.


tools used by professional developers, users can define custom screens for strategies being developed.


programming the logic of algorithm is based on incoming events from defined data sources, event example are: change in instrument order book or transactions, algorithm’s logic defines possible reactions to events like: sending, modifying or cancelling orders, computing statistics, etc. advanced logic can be build upon those simple mechanism.


Empirica offers ready-to-use implementations of the most popular algorithmic strategies like VWAP, TWAP, pairs trading, basket orders for educational purposes source code of example algorithms is provided. This way users can quickly learn how to use Empirica Trading Platform API and write their own strategies documentation, along with examples of implementing API elements is also provided in addition number of free, open-source libraries (mathematical, statistical, technical analysis) which contain immense amount of implemented functions, indexes and models can be used.


Technologies are irreversibly changing both the picture and the structure of financial markets, promoting those institutions that invest in their IT infrastructure. At Empirica we support our partners in technological aspects of those challenges.


BOLETIM DE NOTÍCIAS.


Para notícias sobre criptomoedas, negociação algorítmica, bitcoin, ethereum, trocas de criptografia, estratégias quantitativas de criptomoeda, blockchain e software de negociação algorítmica.


How Does An Algorithmic Trading System Work?


Whether you are a retail trader investing your savings in stock market or a technical analysis expert or a hedge fund manager, the first step to start your own algorithmic trading is to understand how it works.


Algorithmic Trading requires removing a human trader by a machine, which can make its own trading decisions and executes those decisions. The algorithmic trading system consists of three major components which are shown in the diagram below:


Market Adapter.


Exchange or any market data vendor sends data in their own format. Your algorithmic trading system may or may not understand that language. Exchange provides you with an API or an Application Program Interface which allows you program and create your own adapter which can convert the format of the data into the format your system can understand.


Complex Event Processing Engine.


This part is the brain of your strategy. Once you have the data, you would need to work with it as per your strategy which involves doing various statistical calculations, comparisons with historical data and decision making for order generation. The order terms of type of order, order quantity is prepared in this block.


Order Routing System.


The order is encrypted in the language which exchange can understand, again using the APIs which are provided by the exchange. There are two kinds of APIs provided by the exchange: native API and FIX API. Native APIs are those which are specific to a certain exchange. The FIX (Financial Information Exchange) protocol is a set of rules used across different exchanges to make the data flow in security markets easier and effective.


In case of open economy, one can send orders to exchanges or non-exchanges and ORP should be able to handle orders to different destinations.


Se você é um profissional de varejo ou um profissional da área de tecnologia que deseja iniciar sua própria agência de negociação automatizada, comece a aprender o comércio de algoritmos hoje mesmo! Begin with basic concepts like automated trading architecture, market microstructure, strategy backtesting system and order management system. You can also enrol in EPAT, one of the most extensive algorithmic trading training programme available in the industry.


Como funcionam os sistemas comerciais.


A negociação automatizada algorítmica ou a negociação algorítmica foi no centro do mundo comercial há mais de uma década. A porcentagem de volumes atribuídos à negociação automatizada algorítmica teve um aumento significativo na última década. As a result, it has become a highly competitive market that is heavily dependent on technology. Conseqüentemente, a arquitetura básica de sistemas de negociação automatizados que executam estratégias algorítmicas sofreu grandes mudanças ao longo da última década e continua a fazê-lo. Para as empresas, especialmente aquelas que utilizam sistemas de negociação de alta freqüência, tornou-se uma necessidade de inovar em tecnologia para competir no mundo do comércio algorítmico, tornando assim a comercialização de algoritmos um foco de avanços nas tecnologias de computadores e redes.


Nesta publicação, desmistificaremos a arquitetura por trás dos sistemas de negociação automatizada para nossos leitores. Comparamos a nova arquitetura dos sistemas de negociação automatizados com a arquitetura comercial tradicional e compreendemos alguns dos principais componentes por trás desses sistemas.


Traditional Architecture.


Any trading system, conceptually, is nothing more than a computational block that interacts with the exchange on two different streams.


Receives market data Sends order requests and receives replies from the exchange.


Os dados de mercado recebidos normalmente informam o sistema do último pedido. It might contain some additional information like the volume traded so far, the last traded price and quantity for a scrip. However, to make a decision on the data, the trader might need to look at old values or derive certain parameters from history. To cater to that, a conventional system would have a historical database to store the market data and tools to use that database. A análise também envolveria um estudo das tradições passadas pelo comerciante. Hence another database for storing the trading decisions as well. Last, but not the least, a GUI interface for the trader to view all this information on the screen.


The entire trading system can now be broken down into.


The exchange(s) – the external world The server Market Data receiver Store market data Store orders generated by the user Application Take inputs from the user including the trading decisions Interface for viewing the information including the data and orders An order manager sending orders to the exchange.


Nova arquitetura.


A arquitetura tradicional não pôde aumentar as necessidades e demandas do comércio automatizado com DMA. A latência entre a origem do evento para a geração da ordem foi além da dimensão do controle humano e entrou nos reinos de milissegundos e microssegundos. So the tools to handle market data and its analysis it needed to adapt accordingly. O gerenciamento de pedidos também precisa ser mais robusto e capaz de lidar com muito mais pedidos por segundo. Uma vez que o período de tempo é tão pequeno em comparação com o tempo de reação humano, o gerenciamento de riscos também precisa lidar com pedidos em tempo real e de forma completamente automática.


Por exemplo, mesmo que o tempo de reação para uma ordem seja de 1 milissegundo (o que é bastante comparado às latências que vemos hoje), o sistema ainda é capaz de fazer 1000 decisões comerciais em um único segundo. Isso significa que cada uma dessas 1000 decisões comerciais deve passar pelo gerenciamento de riscos no mesmo segundo para alcançar a troca. This is just a problem of complexity. Uma vez que a arquitetura agora envolve lógica automatizada, 100 comerciantes agora podem ser substituídos por um único sistema de negociação automatizado. Isso adiciona escala ao problema. Então, cada uma das unidades lógicas gera 1000 pedidos e 100 dessas unidades significam 100.000 pedidos a cada segundo. Isso significa que a parte de tomada de decisão e envio de pedidos precisa ser muito mais rápida que o receptor de dados de mercado para corresponder à taxa de dados.


Por isso, o nível de infra-estrutura que este módulo exige deve ser muito superior em comparação com o de um sistema tradicional (discutido na seção anterior). Portanto, o mecanismo que executa a lógica de tomada de decisão, também conhecido como mecanismo de "Processamento de Eventos Complexos", ou CEP, foi movido de dentro do aplicativo para o servidor. The Application layer, now, is little more than a user interface for viewing and providing parameters to the CEP.


The problem of scaling also leads to an interesting situation. Digamos que 100 lógicas diferentes estão sendo executadas em um evento de dados de mercado único (como discutido no exemplo anterior). No entanto, pode haver peças comuns de cálculos complexos que precisam ser executados para a maioria das 100 unidades lógicas. Por exemplo, cálculo de gregos para opções. Se cada lógica funcionasse de forma independente, cada unidade faria o mesmo cálculo grega que iria desnecessariamente usar os recursos do processador. Para otimizar a redundância do cálculo, os cálculos redundantes complexos geralmente são mantidos em um mecanismo de cálculo separado que fornece os gregos como uma entrada para o CEP.


Embora a camada de aplicação seja basicamente uma visão, algumas das verificações de risco (que agora são operações famintas por recursos devido ao problema de escala) podem ser transferidas para a camada de aplicação, especialmente aquelas relacionadas à integridade das entradas do usuário. erros. As demais verificações de risco são executadas agora por um Sistema de Gerenciamento de Riscos (RMS) separado no Order Manager (OM), imediatamente antes de liberar um pedido. O problema de escala também significa que onde antes havia 100 traders diferentes gerenciando seu risco, agora há apenas um sistema RMS para gerenciar riscos em todas as unidades / estratégias lógicas. No entanto, algumas verificações de risco podem ser específicas de determinadas estratégias, e algumas podem precisar ser feitas em todas as estratégias. Daí o próprio RMS envolve, RMS de nível de estratégia (SLRMS) e RMS global (GRMS). Também pode envolver uma interface do usuário para visualizar o SLRMS e o GRMS.


Emergence of protocols for automated trading systems.


Com inovações vêm as necessidades. Como a nova arquitetura era capaz de escalonar várias estratégias por servidor, surgiu a necessidade de se conectar a vários destinos a partir de um único servidor. Assim, o gerenciador de pedidos hospedou vários adaptadores para enviar pedidos para vários destinos e receber dados de várias trocas. Cada adaptador atua como um intérprete entre o protocolo que é entendido pela troca e o protocolo de comunicação dentro do sistema. Várias trocas significam vários adaptadores.


No entanto, para adicionar uma nova troca ao sistema, um novo adaptador deve ser projetado e conectado à arquitetura, uma vez que cada troca segue seu protocolo apenas otimizado para recursos fornecidos pela troca. Para evitar esse incômodo de adição do adaptador, os protocolos padrão foram projetados. O mais proeminente entre eles é o protocolo FIX (Financial Information Exchange) (veja nossa publicação na introdução ao protocolo FIX). Isso não só torna possível conectar-se a diferentes destinos rapidamente, mas também reduz drasticamente a entrada no mercado quando se trata de conectar-se a um novo destino. Para obter mais informações adicionais: Conectando o FXCM ao FIX, um tutorial detalhado.


A presença de protocolos padrão facilita a integração com fornecedores de terceiros, também para análises ou feeds de dados de mercado. Como resultado, o mercado torna-se muito eficiente, pois a integração com um novo destino / fornecedor não é mais uma restrição.


Além disso, a simulação torna-se muito fácil, já que receber dados do mercado real e enviar pedidos a um simulador é apenas uma questão de usar o protocolo FIX para conectar-se a um simulador. The simulator itself can be built in-house or procured from a third party vendor. Os dados gravados de forma semelhante apenas podem ser reproduzidos com os adaptadores sendo agnósticos para saber se os dados estão sendo recebidos do mercado ao vivo ou de um conjunto de dados gravados.


Emergência de arquiteturas de baixa latência.


Com os blocos de construção de um sistema de comércio algorítmico implementado, as estratégias otimizam a capacidade de processar enormes quantidades de dados em tempo real e tomar decisões comerciais rápidas. Mas com o advento de protocolos de comunicação padrão como FIX, a barreira de entrada de tecnologia para configurar uma mesa de negociação algorítmica, tornou-se menor e, portanto, mais competitivo. À medida que os servidores obtiveram mais memória e freqüências de clock mais altas, o foco mudou para reduzir a latência para a tomada de decisões. Com o tempo, reduzir a latência tornou-se uma necessidade por vários motivos, como:


A estratégia só faz sentido em um ambiente de baixa latência. Sobrevivência do mais apto - os competidores o escolhem se você não for rápido o suficiente.


O problema, no entanto, é que a latência é realmente um termo abrangente que engloba vários atrasos diferentes. To quantify all of them in one generic term may not usually make much sense. Embora seja muito fácil de entender, é muito difícil quantificar. Por isso, torna-se cada vez mais importante como o problema da redução da latência é abordado.


Se olharmos para o ciclo de vida básico,


Um pacote de dados de mercado é publicado pela troca O pacote viaja pelo fio O pacote chega a um roteador do lado do servidor. O roteador encaminha o pacote pela rede do lado do servidor. O pacote chega na porta Ethernet do servidor. Dependendo se este é processamento UDP / TCP ocorre e o pacote despojado de seus cabeçalhos e trailers faz o caminho para a memória do adaptador. O adaptador então analisa o pacote e o converte em um formato interno para a plataforma de negociação algorítmica. Este pacote agora percorre os vários módulos do sistema - CEP, tick store, etc. O CEP analisa e envia um pedido de pedido. através do reverso do ciclo como o pacote de dados do mercado.


Alta latência em qualquer uma dessas etapas garante uma latência alta durante todo o ciclo. Portanto, a otimização da latência geralmente começa com o primeiro passo neste ciclo que está sob nosso controle, ou seja, “o pacote viaja pelo fio”. A coisa mais fácil de fazer aqui seria encurtar a distância até o destino, tanto quanto possível. Colocações são instalações fornecidas por trocas para hospedar o servidor de negociação nas proximidades da troca. O diagrama a seguir ilustra os ganhos que podem ser feitos cortando a distância.


Para qualquer tipo de estratégia de alta frequência envolvendo um único destino, Colocation tornou-se um imperdível. No entanto, as estratégias que envolvem múltiplos destinos precisam de um planejamento cuidadoso. Vários fatores, como o tempo gasto pelo destino para responder pedidos de pedidos e sua comparação com o tempo de ping entre os dois destinos, devem ser considerados antes de tomar essa decisão. A decisão também pode depender da natureza da estratégia.


A latência da rede geralmente é o primeiro passo na redução da latência geral de um sistema de comércio algorítmico. No entanto, existem muitos outros lugares onde a arquitetura pode ser otimizada.


Propagation latency.


A latência de propagação significa o tempo necessário para enviar os bits ao longo do fio, limitados pela velocidade da luz, é claro.


Foram introduzidas várias otimizações para reduzir a latência de propagação além de reduzir a distância física. Por exemplo, o tempo estimado de ida e volta para um cabo comum entre Chicago e Nova York é de 13,1 milissegundos. As redes de propagação, em outubro de 2012, anunciaram melhorias de latência que trouxeram o tempo estimado de ida e volta para 12,98 milissegundos. A comunicação por microondas foi adotada ainda mais por empresas como Tradeworx, trazendo o tempo estimado de ida e volta para 8,5 milissegundos. Observe que o mínimo teórico é de cerca de 7,5 milissegundos. Continuing innovations are pushing the boundaries of science and fast reaching the theoretical limit of speed of light. Os últimos desenvolvimentos em comunicação a laser, adotados anteriormente em tecnologias de defesa, afugentaram ainda mais uma latência já diluída por nanosegundos em curtas distâncias.


Latência de processamento de rede.


Network processing latency signifies the latency introduced by routers, switches, etc.


O próximo nível de otimização na arquitetura de um sistema de negociação algorítmico seria o número de saltos que um pacote levaria para viajar do ponto A para o ponto B. Um salto é definido como uma parte do caminho entre a origem eo destino durante o qual um pacote não passa por um dispositivo físico como um roteador ou um switch. Por exemplo, um pacote pode percorrer a mesma distância através de dois caminhos diferentes. Mas pode ter dois saltos no primeiro caminho versus 3 saltos no segundo. Supondo que o atraso de propagação é o mesmo, os roteadores e switches introduzem sua própria latência e geralmente como uma regra geral, e mais o latido é a latência adicionada.


A latência do processamento da rede também pode ser afetada pelo que nos referimos como microbursts. Microbursts são definidos como um aumento súbito da taxa de transferência de dados que pode não afetar necessariamente a taxa média de transferência de dados. Como os sistemas de negociação algorítmica são baseados em regras, todos esses sistemas reagirão ao mesmo evento da mesma maneira. Como resultado, muitos sistemas participantes podem enviar ordens que levam a uma onda repentina de transferência de dados entre os participantes e o destino que leva a um microburst. O diagrama a seguir representa o que é um microburst.


A primeira figura mostra uma visão de 1 segundo da taxa de transferência de dados. Podemos ver que a taxa média está bem abaixo da largura de banda disponível de 1Gbps. However if dive deeper and look at the seconds image (the 5 millisecond view), we see that the transfer rate has spiked above the available bandwidth several times each second. Como resultado, os buffers de pacote na pilha de rede, tanto nos pontos de extremidade da rede como nos roteadores e switches, podem transbordar. Para evitar isso, normalmente uma largura de banda muito superior à taxa média observada é geralmente alocada para um sistema de comércio algorítmico.


Latência de serialização.


A latência de serialização significa o tempo necessário para puxar os bits para dentro e fora do fio.


Um tamanho de pacote de 1500 bytes transmitidos em uma linha T1 (1.544.000 bps) produziria um atraso de serialização de cerca de 8 milissegundos. No entanto, o mesmo pacote de 1500 bytes usando um modem de 56K (57344bps) levaria 200 milissegundos. Uma linha Ethernet 1G reduziria essa latência para cerca de 11 microssegundos.


Latência de interrupção.


A latência de interrupção significa uma latência introduzida por interrupções ao receber os pacotes em um servidor.


Interrupt latency is defined as the time elapsed between when an interrupt is generated to when the source of the interrupt is serviced. Quando uma interrupção é gerada? Interrupções são sinais para o processador emitido pelo hardware ou software, indicando que um evento precisa de atenção imediata. O processador, por sua vez, responde suspendendo sua atividade atual, salvando seu estado e manipulando a interrupção. Sempre que um pacote é recebido na NIC, uma interrupção é enviada para manipular os bits que foram carregados no buffer de recebimento da NIC. O tempo gasto para responder a essa interrupção não afeta apenas o processamento da carga útil recém-chegada, mas também a latência dos processos existentes no processador.


Solarflare introduziu onload aberto em 2011, que implementa uma técnica conhecida como bypass do kernel, onde o processamento do pacote não é deixado para o kernel do sistema operacional, mas para o próprio espaço de usuários. Todo o pacote é diretamente mapeado para o espaço do usuário pela NIC e é processado lá. Como resultado, as interrupções são completamente evitadas.


Como resultado, a taxa de processamento de cada pacote é acelerada. O diagrama a seguir demonstra claramente as vantagens do bypass do kernel.


Latência da aplicação.


A latência da aplicação significa o tempo gasto pelo processo para processar.


Isso depende dos vários pacotes, do processamento alocado para a lógica do aplicativo, da complexidade do cálculo envolvido, da eficiência da programação, etc. O aumento do número de processadores no sistema, em geral, reduzirá a latência da aplicação. O mesmo ocorre com o aumento da frequência do relógio. Muitos sistemas de negociação algorítmica aproveitam a dedicação de núcleos de processadores para elementos essenciais da aplicação, como a lógica de estratégia, por exemplo. Isso evita a latência introduzida pelo processo de alternância entre os núcleos.


Da mesma forma, se a programação da estratégia foi feita, tenha em mente os tamanhos de cache e a localização do acesso à memória, então haveria muitos hits no cache da memória resultando em uma redução adicional da latência. Para facilitar isso, muitos sistemas usam linguagens de programação de nível muito baixo para otimizar o código para a arquitetura específica dos processadores. Algumas empresas chegaram até a extensão da queima de cálculos complexos em hardware usando matrizes de portas totalmente programáveis ​​(FPGA). Com a crescente complexidade vem o custo crescente e o diagrama a seguir ilustra isso.


Levels of sophistication.


O mundo do comércio algorítmico de alta freqüência entrou em uma era de competição intensa. Com cada participante adotando novos métodos de expulsão da concorrência, a tecnologia progrediu aos trancos e barrancos. As arquiteturas de negociação algorítmica modernas são bastante complexas em comparação com as suas partes anteriores. Consequentemente, os sistemas avançados são mais caros de construir em termos de tempo e dinheiro.


Conclusão:


Este foi um post detalhado sobre arquitetura de sistema de negociação algorítmica que temos certeza que nos deu um conhecimento muito perspicaz dos componentes envolvidos e também dos vários desafios que os desenvolvedores de arquitetura precisam lidar / superar para construir sistemas de negociação automatizados robustos.


Se você quiser aprender vários aspectos da negociação algorítmica, consulte o Programa Executivo em Negociação Algorítmica (EPAT ™). O curso abrange módulos de treinamento como Statistics & amp; Econometria, Computação Financeira e Tecnologia e Algoritmica & amp; Negociação Quantitativa. EPAT ™ equipa você com os conjuntos de habilidades necessárias para construir uma carreira promissora na negociação algorítmica. Inscreva-se agora!


Posts Relacionados:


2 pensamentos sobre "Como os sistemas comerciais funcionam"


15 de dezembro de 2017.


Postagem muito boa. Eu simplesmente tropecei em seu blog e queria dizer que eu realmente gostei de navegar em suas postagens no blog. Afinal de contas, vou me inscrever no seu feed e espero que você escreva novamente em breve!


15 de dezembro de 2017.


We are really glad that you like our posts. A apreciação é o que nos mantém em pé.


Certifique-se de continuar adicionando conteúdo fresco periodicamente. Compartilhe nossas postagens e ajude-nos a espalhar a palavra sobre como as pessoas podem aproveitar a partir de negociação algorítmica e quantitativa.

No comments:

Post a Comment