Desenvolvimento do sistema de negociação c ++


Comerciantes e empresas comerciais, alavancar a nossa experiência na construção de alto desempenho negociação front-ends, software de auto-execução, sistemas de negociação e outros comerciais e software de análise. VanKar emprega uma equipe interna de desenvolvedores e programadores. Se você tem sua própria equipe de desenvolvimento, podemos trabalhar com eles para criar novos ou melhorar a tecnologia existente. Wersquoll trabalhar com você para encontrar uma solução. Nossa força reside na nossa capacidade de resolver problemas complexos e não tradicionais rapidamente, ao mesmo tempo em que cumpremos os mais altos padrões de qualidade. A VanKar está envolvida em todos os aspectos da aplicação de software, desenvolvimento e atividades de consultoria. Usamos as plataformas de desenvolvimento de software e as ferramentas de desenvolvimento de aplicativos apropriadas, bem como empregamos as mais recentes técnicas de gerenciamento de projetos e práticas de engenharia de software para atender às suas necessidades de programação. Nós construímos soluções de software robustas, confiáveis ​​e de qualidade profissional para seus requisitos exclusivos. Nossos programadores têm anos de experiência trabalhando com grupos de negociação proprietários, corretoras, CTArsquos e hedge funds. Começamos agora Nossos serviços Serviços de terceirização econômicos Desenvolvimento de software personalizado usando as mais recentes tecnologias Programação do sistema de negociação Expert TradeStation Codificação EasyLanguage Personalização da plataforma LT Trader Desenvolvimento de front ends de negociação de alto desempenho Assistência para conectar aplicativos ao Trading Technologies FIX e API VK API para conexão De software personalizado ou de terceiros Especialistas em mercados financeiros Especialistas em automação de execução de ordens Algoritmo e análise de sistemas e testes Integração de qualquer sistema ou caixa preta em plataforma de execução automática Desenvolvimento Web Nossa Especialidade C / C / C Visual Basic Delphi Java Perl PHP VBScript / Jscript Python ActionScript TradeStation EasyLanguage FIX VK API Patsystems API Trading Technologies API e FIX Desenvolvimento de site O que VanKar pode fazer por você Sobre nós A VanKar Trading Corp. é um grupo de corretagem de futuros, FX e OTC criado em 2001. A NFA registrada como independente Introduzindo corretor, VanKar Trading Corp tem clearing relacionamentos e comissão ultra-competitiva lida com várias grandes empresas de compensação global e FX e OTC revendedores. A VanKar Trading Corp. está sediada no Chicago Board of Trade e oferece um conjunto único de serviços, preços e relacionamentos com seus clientes e parceiros. Fale Conosco Endereço: VanKar Trading Corporation. 141 W. Jackson Blvd Suite 2026 Chicago, IL 60604 Telefone: 1 312 578 0225 1 312 578 0226Como desenvolver um sistema comercial É também importante que a borda seja robusta. Um sistema é robusto quando mantém expectativa positiva. O sistema deve ser testado em um movimento para cima, para baixo e para os lados. Muitos tendências que seguem sistemas funcionam bem quando as tendências de instrumento mas don8217t fazem também quando o instrumento está em um período lateral whipsaw. É crucial que o período seja levado em conta durante o teste de volta. Eu recomendo back-testing em pelo menos 2000 barras. Se você está backtesting um sistema nos gráficos diários eu recomendo usar 10 anos. Nos gráficos intra-dia recomendo back testar os sistemas até onde seu fornecedor de dados permitirá. Isso geralmente é de 6 meses a um ano. Back Testing Programs É importante usar software de nível profissional com recursos de back-testing ao desenvolver seu sistema. Para citar alguns: Um dos melhores programas de teste de volta lá fora, embora a programação pode ser difícil, como é no Pascal. Não há telefone serviço ao cliente para riqueza-laboratório quer. NCMfx oferece serviços de programação a preços competitivos, e em tremendos descontos para seus clientes de forex existentes. Gerenciamento de riscos Recursos Assistente de desenvolvimento de sistema Software de teste e análise de nível profissional. Metastock oferece inúmeros sistemas de negociação e indicadores. Metastock tem sua própria linguagem, pode ser um pouco mais fácil do que Wealth-Lab, mas muito mais limitado. O serviço ao cliente é bom. E existem inúmeros add ons e plug ins que você pode comprar para suíte seu estilo de negociação. NCMfx oferece serviços de programação a preços competitivos, e em tremendos descontos para seus clientes de forex existentes. Alexander Nekritin é um comerciante profissional com mais de 8 anos de experiência. Suas especialidades incluem gerenciamento de risco e desenvolvimento de sistemas. Alexander é o CEO de forexyourself. Que é um corretor de forex e empresa de educação que ajuda a suite client8217s precisa de negociação forex. Alexander tem um grau com uma concentração em Banca de Investimento e instrumentos derivados de Babson College em Massachusetts. Building Automated Trading Systems, 1st Edition Principais Características Ensina o design do sistema financeiro e desenvolvimento a partir do zero usando o Microsoft Visual C 2005. Fornece dezenas de exemplos que ilustram a As abordagens de programação no livro Capítulos são suportados por screenshots, equações, planilhas Excel de exemplo e código de programação Descrição Nos próximos anos, as indústrias proprietárias de negociação e hedge funds irão em grande parte migrar para sistemas automatizados de seleção e execução de comércio. Na verdade, isso já está acontecendo. Enquanto vários livros de finanças fornecem código C para derivativos de preços e realização de cálculos numéricos, nenhum aborda o tópico a partir de uma perspectiva de projeto de sistema. Este livro será dividido em duas técnicas de seçõesprogramming e sistema automatizado de comércio (ATS) technologyand ensinar o projeto de sistema financeiro e desenvolvimento do absoluto chão usando Microsoft Visual C 2005. MS Visual C 2005 foi escolhido como a linguagem de implementação principalmente porque a maioria das empresas comerciais E grandes bancos desenvolveram e continuam a desenvolver seus algoritmos proprietários em ISO C e Visual C oferece a maior flexibilidade para incorporar esses algoritmos legados em sistemas de trabalho. Além disso, o Framework eo ambiente de desenvolvimento fornecem as melhores bibliotecas e ferramentas para o rápido desenvolvimento de sistemas de negociação. A primeira seção do livro explica o Visual C 2005 em detalhes e concentra-se no conhecimento de programação necessário para o desenvolvimento automatizado do sistema de negociação, incluindo design orientado a objeto, delegados e eventos, enumerações, geração de números aleatórios, temporização e objetos timer e gerenciamento de dados com STL E coleções. Além disso, uma vez que a maior parte do código legado e código de modelagem nos mercados financeiros é feito em ISO C, este livro examina em profundidade vários tópicos avançados relacionados ao gerenciamento gerenciado / não gerenciado de memória e interoperabilidade. Além disso, este livro fornece dezenas de exemplos que ilustram o uso de conectividade de banco de dados com ADO e um extenso tratamento de SQL e FIX e XML / FIXML. Tópicos avançados de programação, como threading, soquetes, bem como usando C para se conectar ao Excel também são discutidos em comprimento e com suporte por exemplos. A segunda seção do livro explica preocupações tecnológicas e conceitos de design para sistemas automatizados de negociação. Especificamente, os capítulos são dedicados ao tratamento de feeds de dados em tempo real, gerenciamento de ordens no livro de ordens de troca, seleção de posições e gerenciamento de riscos. Um. dll está incluído no livro que emulará a conexão a uma indústria API amplamente utilizada (Trading Technologies, Inc. s XTAPI) e fornecerá maneiras de testar algoritmos de gerenciamento de posição e ordem. Padrões de projeto são apresentados para sistemas de mercado baseados em análise técnica, bem como para sistemas de mercado que utilizam spreads intermercados. Como todos os capítulos giram em torno de programação de computadores para a engenharia financeira e desenvolvimento de sistemas de comércio, este livro vai educar comerciantes, engenheiros financeiros, analistas quantitativos, estudantes de finanças quantitativas e até programadores experientes sobre questões tecnológicas que giram em torno do desenvolvimento de aplicações financeiras em um Microsoft Ambiente ea construção e implementação de sistemas e ferramentas de negociação em tempo real. Audiência primária: engenheiros financeiros, analistas quantitativos, programadores em empresas comerciais estudantes de pós-graduação em engenharia financeira e cursos de mercados financeiros e programas. Benjamin Van Vliet Ben Van Vliet é Professor do Instituto de Tecnologia de Illinois (IIT), onde também atua como Diretor Associado do M. S. Mercados Financeiros. Na IIT ele ensina cursos em finanças quantitativas, C e programação, e design e desenvolvimento automatizado de sistema de negociação. Ele é vice-presidente do Instituto de Tecnologia de Mercado, onde preside o conselho consultivo para o programa Certified Trading System Developer (CTSD). Ele também atua como editor de séries da série Financial Markets Technology para a Elsevier / Academic Press e consulta extensivamente na indústria de mercados financeiros. O Sr. Van Vliet é também autor de Modeling Financial Markets com Robert Hendry (2003, McGraw Hill) e Building Automated Trading Systems (2007, Academic Press), além de vários artigos nas áreas de finanças e tecnologia e Pesquisa em várias conferências acadêmicas e profissionais Afiliações e Experiência Professora e Diretora Adjunta do Programa de Mestrado em Mercados Financeiros, Escola de Negócios Stuart, Instituto de Tecnologia de Illinois, EUA Publicação RecenteBest Linguagem de Programação para Algorithmic Trading Systems Por Michael Halls-Moore on Julho 26th, 2017 Uma das perguntas mais frequentes que recebo no mailbag 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 consideradas. Este artigo descreverá os componentes necessários de uma arquitetura algorítmica do sistema de negociação e como as decisões relativas à implementação afetam a escolha da linguagem. Em primeiro lugar, serão consideradas as principais componentes de um sistema de negociação algorítmica, tais como as ferramentas de pesquisa, otimizador de portfólio, gerente de risco e mecanismo de execução. Posteriormente, diferentes estratégias de negociação serão examinadas e como elas afetam a concepção do sistema. Em especial, a frequência das negociações e o provável volume de transacções serão discutidos. Uma vez selecionada a estratégia de negociação, é necessário arquitetar todo o sistema. Isso inclui a escolha do hardware, do (s) sistema (s) operacional (is) e da resiliência do sistema contra eventos raros, potencialmente catastróficos. Enquanto a arquitetura está sendo considerada, devemos ter devidamente em conta o desempenho - tanto para as ferramentas de pesquisa como para o ambiente de execução ao vivo. O que é o sistema de negociação que tenta fazer Antes de decidir-se sobre a mais melhor língua com que para escrever um sistema negociando automatizado é necessário definir os requisitos. Será que o sistema vai ser puramente baseado na execução Será que o sistema requer um módulo de gestão de risco ou construção de carteira Será que o sistema requer 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 sinal. A pesquisa se preocupa com a avaliação do desempenho de uma 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 ea complexidade algorítmica terão um grande impacto na intensidade computacional do backtester. A velocidade ea simultaneidade da CPU são frequentemente os fatores limitantes na otimização da velocidade de execução da pesquisa. Geração de sinal está preocupado com a geração de um conjunto de sinais de negociação a partir de um algoritmo e enviar tais ordens para o mercado, geralmente através de uma corretora. Para certas 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 freqüentemente o fator limitante na otimização de sistemas de execução. Assim, a escolha das linguagens para cada componente de todo o seu sistema pode ser bastante diferente. Tipo, Frequência e Volume da Estratégia O tipo de estratégia algorítmica empregada terá um impacto substancial na concepção do sistema. Será necessário considerar os mercados sendo negociados, a conectividade com fornecedores de dados externos, a freqüência e o volume da estratégia, o trade-off entre facilidade de desenvolvimento e otimização de desempenho, bem como qualquer hardware personalizado, Servidores, GPUs ou FPGAs que possam ser necessários. As escolhas tecnológicas para uma estratégia de ações de baixa freqüência nos EUA serão muito diferentes das de uma estratégia de arbitragem estatística de alta freqüência negociada no mercado de futuros. Antes da escolha do idioma muitos fornecedores de dados devem ser avaliados que pertencem a uma estratégia em mãos. Será necessário considerar a conectividade com o fornecedor, a estrutura de qualquer API, a oportunidade dos dados, os requisitos de armazenamento e a resiliência em face de um fornecedor ficar offline. Também é aconselhável possuir acesso rápido a vários fornecedores. Vários instrumentos têm todos os seus próprios caprichos de armazenamento, exemplos dos quais incluem múltiplos símbolos de ticker para ações e datas de vencimento para futuros (sem mencionar quaisquer dados OTC específicos). Isso precisa ser incorporado ao design da plataforma. Freqüência da estratégia é provável que seja um dos maiores drivers de como a pilha de tecnologia será definida. Estratégias empregando dados mais freqüentemente do que minuciosamente ou em segundo lugar barras exigem consideração significativa com relação ao desempenho. Uma estratégia que ultrapassa as barras secundárias (isto é, dados de carraça) conduz a um design conduzido pelo desempenho como o requisito primário. Para estratégias de alta freqüência, uma quantidade substancial de dados de mercado precisará ser armazenada e avaliada. Software como HDF5 ou kdb são comumente usados ​​para essas funções. Para processar os volumes extensos de dados necessários para aplicações HFT, um sistema de backtester e de execução extensivamente otimizado deve ser usado. C / C (possivelmente com algum montador) é provável que o candidato linguagem mais forte. As estratégias de freqüência ultra-alta quase certamente exigirão hardware personalizado, como FPGAs, troca de co-location e kernal / interface de rede. Sistemas de pesquisa Os sistemas de pesquisa normalmente envolvem uma mistura de desenvolvimento interativo e scripts automatizados. O primeiro ocorre frequentemente dentro de um IDE, como Visual Studio, MatLab ou R Studio. Este último envolve cálculos numéricos extensos sobre vários parâmetros e pontos de dados. Isso leva a uma escolha de linguagem proporcionando um ambiente direto 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 neste espaço incluem Microsoft Visual C / C, que contém utilitários de depuração extensa, capacidades de conclusão de código (via Intellisense) e visões gerais diretas de toda a pilha de projeto (via o banco de dados ORM, LINQ) MatLab. Que é projetado para a álgebra linear numerosa extensa e operações vectorized, mas em uma maneira console interativa R Studio. Que envolve o console de linguagem estatística R em um Edi IDE Eclipse totalmente desenvolvido para Linux Java e C e IDEs semi-proprietários, como o Enthought Canopy para Python, que incluem bibliotecas de análise de dados como NumPy. SciPy. Scikit-learn e pandas em um único ambiente interativo (console). Para backtesting numérico, todos os idiomas acima são adequados, embora não seja necessário utilizar uma GUI / IDE, pois o código será executado em segundo plano. A principal consideração nesta fase é a da velocidade de execução. Uma linguagem compilada (como C) é frequentemente útil se as dimensões do parâmetro backtesting forem grandes. Lembre-se que é necessário ter cuidado com esses sistemas, se for esse o caso. Interpretadas linguagens como Python muitas vezes fazem uso de bibliotecas de alto desempenho como NumPy / pandas para o backtesting passo, a fim de manter um grau razoável de competitividade com compilado Equivalentes. Em última análise, o idioma escolhido para o backtesting será determinado por necessidades específicas algorítmicas, bem como a gama de bibliotecas disponíveis no idioma (mais sobre isso abaixo). No entanto, a linguagem utilizada para o backtester e os ambientes de pesquisa pode ser completamente independente daqueles usados ​​nos componentes de construção de portfólio, gerenciamento de risco e execução, como será visto. Construção de Portfólio e Gerenciamento de Risco Os componentes de construção de carteira e gerenciamento de risco são freqüentemente ignorados por comerciantes de algoritmos de varejo. Isso é quase sempre um erro. Essas ferramentas fornecem o mecanismo pelo qual o capital será preservado. Eles não só tentam aliviar o número de apostas arriscadas, mas também minimizar churn das próprias operações, 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 um estável de estratégias, pois o mecanismo de construção do portfólio e o gerenciador de riscos podem ser facilmente modificados para lidar com vários sistemas. Assim, 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 carteira é ter um conjunto de negócios desejados e produzir o conjunto de negócios reais que minimizam 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 da carteira reduz-se frequentemente a um problema de álgebra linear (tal como uma factorização de matriz) e, portanto, o desempenho é altamente dependente da eficácia da implementação de álgebra linear numérica disponível. As bibliotecas comuns incluem uBLAS. LAPACK e NAG para C. MatLab também possui operações de matriz amplamente otimizadas. Python utiliza NumPy / SciPy para tais computações. Uma carteira freqüentemente reequilibrada exigirá uma biblioteca de matriz compilada (e bem otimizada) para realizar essa etapa, de modo a não encolher o sistema de negociação. A gestão de risco é outra parte extremamente importante de um sistema de negociação algorítmica. O risco pode vir de muitas formas: Aumento da volatilidade (embora isso possa ser visto como desejável para certas estratégias), aumento das correlações entre classes de ativos, padrão de contraparte, interrupções de servidores, eventos de cisne preta e bugs não detectados no código de negociação poucos. 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 se reduz a um conjunto de cálculos estatísticos, como testes de estresse de Monte Carlo. Isso é muito semelhante às necessidades computacionais de um mecanismo de preços de derivativos e, como tal, será ligado à CPU. Essas simulações são altamente paralelas (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 filtrada dos componentes de construção de portfólio e gerenciamento de risco e enviá-los para uma corretora ou outros meios de acesso ao mercado. Para a maioria das estratégias de negociação de algoritmos de varejo, isso envolve uma conexão API ou FIX para uma corretora, como Interactive Brokers. As considerações principais ao decidir sobre uma linguagem incluem a qualidade da API, a disponibilidade do wrapper de linguagem para uma API, a freqüência de execução e a antecipação do deslizamento. A qualidade da API refere-se a quão bem documentada é, que tipo de desempenho fornece, se ele precisa de software autônomo para ser acessado ou se um gateway pode ser estabelecido de uma forma sem cabeça (ou seja, sem GUI). No caso de Interactive Brokers, a ferramenta Trader WorkStation precisa estar em execução em um ambiente GUI para acessar sua API. Uma vez tive que instalar uma edição Desktop Ubuntu em um servidor de nuvem Amazon para acessar Interactive Brokers remotamente, puramente por esta razão A maioria das APIs irá fornecer uma interface C e / ou Java. Normalmente, é a comunidade que desenvolve invólucros específicos de linguagem para C, Python, R, Excel e MatLab. Note que com cada plugin adicional utilizado (especialmente API wrappers) há espaço para bugs a fluência no sistema. Sempre testar plugins deste tipo e garantir que eles são mantidos ativamente. Um indicador valioso é ver quantas novas atualizações de um codebase foram feitas nos últimos meses. A freqüência de execução é de extrema 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. Slippage será incorrido através de um sistema de execução mal executando e isso terá um impacto dramático sobre a rentabilidade. Linguagens estaticamente tipadas (veja abaixo), como C / Java, geralmente são ótimas para execução, mas há um trade-off no tempo de desenvolvimento, testes e facilidade de manutenção. As linguagens de tipo dinâmico, como Python e Perl, são agora geralmente suficientemente rápidas. Certifique-se sempre de que os componentes são projetados de forma modular (veja abaixo) para que possam ser trocados para fora à medida que o sistema é escalado. Processo de Planejamento e Desenvolvimento Arquitetônico Os componentes de um sistema de negociação, suas necessidades de freqüência e volume foram discutidos acima, mas a infra-estrutura do sistema ainda não foi coberta. Aqueles que atuam como um comerciante de varejo ou trabalhando em um pequeno fundo provavelmente será usando muitos chapéus. Será necessário estar cobrindo o modelo alfa, os parâmetros de gerenciamento e execução de riscos, e também a implementação final do sistema. Antes de aprofundar em linguagens específicas o projeto de uma arquitetura de sistema ideal será discutido. Separação de preocupações Uma das decisões mais importantes que devem ser tomadas desde o início é como separar as preocupações de um sistema de comércio. No desenvolvimento de software, isso significa essencialmente como quebrar os diferentes aspectos do sistema de comércio em componentes modulares separados. Ao expor as 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 externa. Esta é a melhor prática para esses sistemas. Para estratégias em freqüências mais baixas tais práticas são aconselhadas. Para negociação de freqüência ultra alta o livro de regras pode ter que ser ignorado às custas de ajustar o sistema para ainda mais desempenho. 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 ótima é certificar-se de que há componentes separados para as entradas de dados históricos e em tempo real do mercado, armazenamento de dados, API de dados de acesso, backtester, parâmetros de estratégia, construção de portfólio, gestão de risco e sistemas de execução automatizada. Por exemplo, se o armazenamento de dados que está sendo usado está underperforming, até mesmo em níveis significativos de otimização, ele pode ser trocado com rewrites mínimo para a ingestão de dados ou API de acesso a dados. Tanto quanto o backtestter e componentes subsequentes estão em causa, não há diferença. Outro benefício de componentes separados é que ele permite que uma variedade de linguagens de programação para ser usado no sistema global. Não é necessário restringir-se a uma única língua se o método de comunicação dos componentes for independente da língua. Este será o caso se eles estão se comunicando via TCP / IP, ZeroMQ ou algum outro protocolo independente de linguagem. Como exemplo concreto, considere o caso de um sistema de backtesting sendo escrito em C para desempenho de crunching de números, enquanto o gerenciador de portfólio e sistemas de execução são escritos em Python usando SciPy e IBPy. Considerações sobre Desempenho O desempenho é uma consideração significativa para a maioria das estratégias de negociação. Para estratégias de freqüência mais alta, é o fator mais importante. O desempenho abrange uma ampla gama de problemas, como velocidade de execução algorítmica, latência da rede, largura de banda, E / S de dados, paralelismo e paralelismo e escalonamento. Cada uma dessas áreas são cobertas individualmente por grandes livros didáticos, portanto, este artigo apenas arranhará a superfície de cada tópico. A arquitetura ea escolha da língua serão agora discutidas em termos de seus efeitos sobre o desempenho. A sabedoria prevalecente como afirmado por 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 freqüência Para aqueles que estão interessados ​​em estratégias de baixa freqüência, uma abordagem comum é construir um sistema da maneira mais simples possível e apenas otimizar como gargalos começam a aparecer. As ferramentas de criação de perfil são usadas para determinar onde surgem gargalos. Perfis podem ser feitos para todos os fatores listados acima, em um ambiente MS Windows ou Linux. Existem muitas ferramentas de sistema operacional e linguagem disponíveis para fazê-lo, 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 (tanto como parte de seu padrão ou externamente) para estrutura de dados básicos e trabalho algorítmico. C é fornecido com a Biblioteca de modelos padrão, enquanto o Python contém NumPy / SciPy. Tarefas matemáticas comuns devem ser encontradas nessas bibliotecas e raramente é benéfico escrever uma nova implementação. Uma exceção é se a arquitetura de hardware altamente personalizada é necessária e um algoritmo está fazendo uso extensivo de extensões proprietárias (como caches personalizados). No entanto, muitas vezes reinvenção da roda desperdiça tempo que poderia ser melhor gasto desenvolvendo e otimizando outras partes da infra-estrutura de negociação. Tempo de desenvolvimento é extremamente precioso especialmente no contexto de desenvolvedores exclusivos. A latência é muitas vezes uma questão do sistema de execução, uma vez que as ferramentas de pesquisa estão normalmente situadas na mesma máquina. Para o primeiro, 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), sinais devem ser gerados (sistema operacional, latência de mensagens kernal), sinais de comércio enviados (latência 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 otimização kernal, bem como otimização da transmissão em rede. Esta é uma área profunda e está significativamente além do escopo do artigo, mas se um algoritmo UHFT é desejado, em seguida, estar ciente da profundidade de conhecimento necessário Caching é muito útil no conjunto de ferramentas de um desenvolvedor de negociação quantitativa. O cache refere-se ao conceito de armazenar dados acessados ​​com frequência de uma forma que permite um acesso de melhor desempenho, à custa da potencial indisponibilidade dos dados. Um caso de uso comum ocorre no desenvolvimento da web ao tirar dados de um banco de dados relacional com suporte a disco e colocá-lo na memória. Quaisquer solicitações subseqüentes para os dados não precisam acertar o banco de dados e, portanto, os ganhos de desempenho podem ser significativos. Para situações de negociação cache pode ser extremamente benéfico. Por exemplo, o estado atual de um portfólio de estratégia pode ser armazenado em um cache até que seja reequilibrado, de modo que a lista não precisa ser regenerada em cada loop do algoritmo de negociação. Tal regeneração é provável que seja uma CPU alta ou operação de E / S de disco. No entanto, cache não é sem seus próprios problemas. A regeneração de dados de cache de uma só vez, devido à natureza volátil do armazenamento em cache, pode colocar uma demanda significativa na infra-estrutura. Outra questão é dog-piling. Onde várias gerações de uma nova cópia de cache são realizadas sob carga extremamente alta, o que leva a uma falha em cascata. A alocação dinâmica de memória é uma operação cara na execução do software. Portanto, é imperativo que aplicativos de negociação de maior desempenho estejam bem conscientes de como a memória está sendo alocada e desalocada durante o fluxo do programa. Padrões de linguagem mais recentes, como Java, C e Python, todos executam a coleta automática de lixo. Que se refere à desalocação de memória alocada dinamicamente quando objetos saem do escopo. A coleta de lixo é extremamente útil durante o desenvolvimento, pois reduz os erros e facilita a legibilidade. No entanto, muitas vezes é sub-ideal para certas estratégias de negociação de alta freqüência. A coleta de lixo personalizada é freqüentemente desejada para esses casos. Em Java, por exemplo, ajustando o coletor de lixo ea configuração de heap, é possível obter alto desempenho para estratégias de HFT. C não fornece um coletor de lixo nativo e, portanto, é necessário lidar com todos alocação de memória / desalocação como parte de uma implementação de objetos. Embora potencialmente propenso a erros (potencialmente levando a ponteiros pendentes), é extremamente útil ter controle de grão fino de como objetos aparecem no heap para determinadas aplicações. Ao escolher um idioma, certifique-se de estudar como o coletor de lixo funciona e se ele pode ser modificado para otimizar para um caso de uso específico. Muitas operações em sistemas de negociação algorítmicos são passíveis de paralelização. Refere-se ao conceito de realizar operações programáticas múltiplas ao mesmo tempo, isto é, em paralelo. Os chamados algoritmos embarassingly paralelos incluem etapas que podem ser calculadas de forma totalmente independente de outras etapas. Certas operações estatísticas, tais como simulações Monte Carlo, são um bom exemplo de algoritmos embarassingly paralelos como cada sorteio aleatório e operação de caminho subsequente pode ser computado sem conhecimento de outros caminhos. Outros algoritmos são apenas parcialmente paralelizáveis. As simulações de dinâmica de fluidos são um exemplo, onde o domínio de computação pode ser subdividido, mas, em última análise, esses domínios devem se comunicar uns com os outros e, portanto, as operações são parcialmente sequenciais. Algoritmos paralelizáveis ​​estão sujeitos à Lei Amdahls. Que proporciona um limite superior te�ico para o aumento de desempenho de um algoritmo paralelizado quando sujeito a N processos separados (por exemplo, num n�leo ou segmento de CPU). A paralelização tornou-se cada vez mais importante como 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 realizar cálculos paralelos. A ascensão do hardware gráfico de consumo (predominantemente para jogos de vídeo) levou ao desenvolvimento de Unidades de Processamento Gráfico (GPUs), que contêm centenas de núcleos para operações altamente concorrentes. Essas GPUs são agora muito acessíveis. As estruturas de alto nível, como a Nvidias CUDA, têm levado à adopção generalizada na academia e nas finanças. Tal hardware GPU é geralmente adequado apenas para o aspecto de investigação de finanças quantitativas, enquanto outros hardware mais especializados (incluindo Field-Programmable Gate Arrays - FPGAs) são usados ​​para (U) HFT. Hoje em dia, a maioria de langauges modernos suportam um grau de simultaneidade / multithreading. Assim, é fácil otimizar um backtester, uma vez que todos os cálculos são geralmente independentes dos outros. Escala em engenharia de software e operações refere-se à capacidade do sistema para lidar consistentemente aumentando cargas na forma de solicitações maiores, maior uso do processador e mais alocação de memória. Na negociação algorítmica uma estratégia é capaz de escalar se ele pode aceitar grandes quantidades de capital e ainda produzir retornos consistentes. A pilha de tecnologia de negociação escalas se ele pode suportar maiores volumes de comércio e aumento da latência, sem gargalos. Enquanto os sistemas devem ser projetados para escalar, muitas vezes é difícil prever antecipadamente onde um gargalo irá ocorrer. Registros, testes, perfis e monitoramento rigorosos ajudarão grandemente a permitir que um sistema seja dimensionado. As próprias línguas são muitas vezes descritas como não escaláveis. Este é geralmente o resultado de desinformação, ao invés de fato duro. É a pilha de tecnologia total que deve ser determinada para escalabilidade, não a linguagem. É claro que certas línguas têm um desempenho maior do que outras em casos de uso específicos, mas uma língua nunca é melhor do que outra em todos os sentidos. Um meio de gerenciar escala é separar preocupações, como mencionado acima. A fim de introduzir adicionalmente a capacidade de lidar com picos no sistema (isto é, a volatilidade súbita que desencadeia uma série de negócios), é útil criar uma arquitectura de enfileiramento 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 conseguir processar muitos pedidos. Ao invés de solicitações sendo perdidas eles são simplesmente mantidos em uma pilha até que a mensagem é tratada. Isso é particularmente útil para enviar comércios para um mecanismo de execução. Se o motor está sofrendo sob latência pesada, então ele vai fazer o backup de comércios. Uma fila entre o gerador de sinal de comércio e a API de execução aliviará esta questão à custa de uma potencial desvalorização do comércio. Um corretor de fila de mensagens de código aberto bem respeitado é o RabbitMQ. Hardware and Operating Systems The hardware running your strategy can have a significant impact on the profitability of your algorithm. This is not an issue restricted to high frequency traders either. A poor choice in hardware and operating system can lead to a machine crash or reboot at the most inopportune moment. Thus it is necessary to consider where your application will reside. The choice is generally between a personal desktop machine, a remote server, a cloud provider or an exchange co-located server. Desktop machines are simple to install and administer, especially with newer user friendly operating systems such as Windows 7/8, Mac OSX and Ubuntu. Desktop systems do possess some significant drawbacks, however. The foremost is that the versions of operating systems designed for desktop machines are likely to require reboots/patching (and often at the worst of times). They also use up more computational resources by the virtue of requiring a graphical user interface (GUI). Utilising hardware in a home (or local office) environment can lead to internet connectivity and power uptime problems. The main benefit of a desktop system is that significant computational horsepower can be purchased for the fraction of the cost of a remote dedicated server (or cloud based system) of comparable speed. A dedicated server or cloud-based machine, while often more expensive than a desktop option, allows for more significant redundancy infrastructure, such as automated data backups, the ability to more straightforwardly ensure uptime and remote monitoring. They are harder to administer since they require the ability to use remote login capabilities of the operating system. In Windows this is generally via the GUI Remote Desktop Protocol (RDP). In Unix-based systems the command-line Secure SHell (SSH) is used. Unix-based server infrastructure is almost always command-line based which immediately renders GUI-based programming tools (such as MatLab or Excel) to be unusable. A co-located server, as the phrase is used in the capital markets, is simply a dedicated server that resides within an exchange in order to reduce latency of the trading algorithm. This is absolutely necessary for certain high frequency trading strategies, which rely on low latency in order to generate alpha. The final aspect to hardware choice and the choice of programming language is platform-independence. Is there a need for the code to run across multiple different operating systems Is the code designed to be run on a particular type of processor architecture, such as the Intel x86/x64 or will it be possible to execute on RISC processors such as those manufactured by ARM These issues will be highly dependent upon the frequency and type of strategy being implemented. Resilience and Testing One of the best ways to lose a lot of money on algorithmic trading is to create a system with no resiliency . This refers to the durability of the sytem when subject to rare events, such as brokerage bankruptcies, sudden excess volatility, region-wide downtime for a cloud server provider or the accidental deletion of an entire trading database. Years of profits can be eliminated within seconds with a poorly-designed architecture. It is absolutely essential to consider issues such as debuggng, testing, logging, backups, high-availability and monitoring as core components of your system. It is likely that in any reasonably complicated custom quantitative trading application at least 50 of development time will be spent on debugging, testing and maintenance. Nearly all programming languages either ship with an associated debugger or possess well-respected third-party alternatives. In essence, a debugger allows execution of a program with insertion of arbitrary break points in the code path, which temporarily halt execution in order to investigate the state of the system. The main benefit of debugging is that it is possible to investigate the behaviour of code prior to a known crash point . Debugging is an essential component in the toolbox for analysing programming errors. However, they are more widely used in compiled languages such as C or Java, as interpreted languages such as Python are often easier to debug due to fewer LOC and less verbose statements. Despite this tendency Python does ship with the pdb. which is a sophisticated debugging tool. The Microsoft Visual C IDE possesses extensive GUI debugging utilities, while for the command line Linux C programmer, the gdb debugger exists. Testing in software development refers to the process of applying known parameters and results to specific functions, methods and objects within a codebase, in order to simulate behaviour and evaluate multiple code-paths, helping to ensure that a system behaves as it should. A more recent paradigm is known as Test Driven Development (TDD), where test code is developed against a specified interface with no implementation. Prior to the completion of the actual codebase all tests will fail. As code is written to fill in the blanks, the tests will eventually all pass, at which point development should cease. TDD requires extensive upfront specification design as well as a healthy degree of discipline in order to carry out successfully. In C, Boost provides a unit testing framework. In Java, the JUnit library exists to fulfill the same purpose. Python also has the unittest module as part of the standard library. Many other languages possess unit testing frameworks and often there are multiple options. In a production environment, sophisticated logging is absolutely essential. Logging refers to the process of outputting messages, with various degrees of severity, regarding execution behaviour of a system to a flat file or database. Logs are a first line of attack when hunting for unexpected program runtime behaviour. Unfortunately the shortcomings of a logging system tend only to be discovered after the fact As with backups discussed below, a logging system should be given due consideration BEFORE a system is designed. Both Microsoft Windows and Linux come with extensive system logging capability and programming languages tend to ship with standard logging libraries that cover most use cases. It is often wise to centralise logging information in order to analyse it at a later date, since it can often lead to ideas about improving performance or error reduction, which will almost certainly have a positive impact on your trading returns. While logging of a system will provide information about what has transpired in the past, monitoring of an application will provide insight into what is happening right now . All aspects of the system should be considered for monitoring. System level metrics such as disk usage, available memory, network bandwidth and CPU usage provide basic load information. Trading metrics such as abnormal prices/volume, sudden rapid drawdowns and account exposure for different sectors/markets should also be continuously monitored. Further, a threshold system should be instigated that provides notification when certain metrics are breached, elevating the notification method (email, SMS, automated phone call) depending upon the severity of the metric. System monitoring is often the domain of the system administrator or operations manager. However, as a sole trading developer, these metrics must be established as part of the larger design. Many solutions for monitoring exist: proprietary, hosted and open source, which allow extensive customisation of metrics for a particular use case. Backups and high availability should be prime concerns of a trading system. Consider the following two questions: 1) If an entire production database of market data and trading history was deleted (without backups) how would the research and execution algorithm be affected 2) If the trading system suffers an outage for an extended period (with open positions) how would account equity and ongoing profitability be affected The answers to both of these questions are often sobering It is imperative to put in place a system for backing up data and also for testing the restoration of such data. Many individuals do not test a restore strategy. If recovery from a crash has not been tested in a safe environment, what guarantees exist that restoration will be available at the worst possible moment Similarly, high availability needs to be baked in from the start. Redundant infrastructure (even at additional expense) must always be considered, as the cost of downtime is likely to far outweigh the ongoing maintenance cost of such systems. I wont 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 doesnt catch everything, and this is where exception handling comes in due to the necessity of having to handle unexpected operations. Dynamic languages (i. e. those that are dynamically-typed) can often lead to run-time errors that would otherwise be caught with a compilation-time type-check. For this reason, the concept of TDD (see above) and unit testing arose which, when carried out correctly, often provides more safety than compile-time checking alone. Another benefit of statically-typed languages is that the compiler is able to make many optimisations that are otherwise unavailable to the dynamically - typed language, simply because the type (and thus memory requirements) are known at compile-time. In fact, part of the inefficiency of many dynamically-typed languages stems from the fact that certain objects must be type-inspected at run-time and this carries a performance hit. Libraries for dynamic languages, such as NumPy/SciPy alleviate this issue due to enforcing a type within arrays. Open Source or Proprietary One of the biggest choices available to an algorithmic trading developer is whether to use proprietary (commercial) or open source technologies. There are advantages and disadvantages to both approaches. It is necessary to consider how well a language is supported, the activity of the community surrounding a language, ease of installation and maintenance, quality of the documentation and any licensing/maintenance costs. The Microsoft stack (including Visual C, Visual C) and MathWorks MatLab are two of the larger proprietary choices for developing custom algorithmic trading software. Both tools have had significant battle testing in the financial space, with the former making up the predominant software stack for investment banking trading infrastructure and the latter being heavily used for quantitative trading research within investment funds. Microsoft and MathWorks both provide extensive high quality documentation for their products. Further, the communities surrounding each tool are very large with active web forums for both. The software allows cohesive integration with multiple languages such as C, C and VB, as well as easy linkage to other Microsoft products such as the SQL Server database via LINQ. MatLab also has many plugins/libraries (some free, some commercial) for nearly any quantitative research domain. There are also drawbacks. With either piece of software the costs are not insignificant for a lone trader (although Microsoft does provide entry-level version of Visual Studio for free). Microsoft tools play well with each other, but integrate less well with external code. Visual Studio must also be executed on Microsoft Windows, which is arguably far less performant than an equivalent Linux server which is optimally tuned. MatLab also lacks a few key plugins such as a good wrapper around the Interactive Brokers API, one of the few brokers amenable to high-performance algorithmic trading. The main issue with proprietary products is the lack of availability of the source code. This means that if ultra performance is truly required, both of these tools will be far less attractive. Open source tools have been industry grade for sometime. Much of the alternative asset space makes extensive use of open-source Linux, MySQL/PostgreSQL, Python, R, C and Java in high-performance production roles. However, they are far from restricted to this domain. Python and R, in particular, contain a wealth of extensive numerical libraries for performing nearly any type of data analysis imaginable, often at execution speeds comparable to compiled languages, with certain caveats. The main benefit of using interpreted languages is the speed of development time. Python and R require far fewer lines of code (LOC) to achieve similar functionality, principally due to the extensive libraries. Further, they often allow interactive console based development, rapidly reducing the iterative development process. Given that time as a developer is extremely valuable, and execution speed often less so (unless in the HFT space), it is worth giving extensive consideration to an open source technology stack. Python and R possess significant development communities and are extremely well supported, due to their popularity. Documentation is excellent and bugs (at least for core libraries) remain scarce. Open source tools often suffer from a lack of a dedicated commercial support contract and run optimally on systems with less-forgiving user interfaces. A typical Linux server (such as Ubuntu) will often be fully command-line oriented. In addition, Python and R can be slow for certain execution tasks. There are mechanisms for integrating with C in order to improve execution speeds, but it requires some experience in multi-language programming. While proprietary software is not immune from dependency/versioning issues it is far less common to have to deal with incorrect library versions in such environments. Open source operating systems such as Linux can be trickier to administer. I will venture my personal opinion here and state that I build all of my trading tools with open source technologies. In particular I use: Ubuntu, MySQL, Python, C and R. The maturity, community size, ability to dig deep if problems occur and lower total cost ownership (TCO) far outweigh the simplicity of proprietary GUIs and easier installations. Having said that, Microsoft Visual Studio (especially for C) is a fantastic Integrated Development Environment (IDE) which I would also highly recommend. Batteries Included The header of this section refers to the out of the box capabilities of the language - what libraries does it contain and how good are they This is where mature languages have an advantage over newer variants. C, Java and Python all now possess extensive libraries for network programming, HTTP, operating system interaction, GUIs, regular expressions (regex), iteration and basic algorithms. C is famed for its Standard Template Library (STL) which contains a wealth of high performance data structures and algorithms for free. Python is known for being able to communicate with nearly any other type of system/protocol (especially the web), mostly through its own standard library. R has a wealth of statistical and econometric tools built in, while MatLab is extremely optimised for any numerical linear algebra code (which can be found in portfolio optimisation and derivatives pricing, for instance). Outside of the standard libraries, C makes use of the Boost library, which fills in the missing parts of the standard library. In fact, many parts of Boost made it into the TR1 standard and subsequently are available in the C11 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 . Conclusion 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. Michael Halls-Moore Mike é o fundador da QuantStart e tem estado envolvido na indústria de finanças quantitativas nos últimos cinco anos, principalmente como desenvolvedor quantitativo e, mais tarde, como consultor de comerciante de quant para hedge funds.

Comments

Popular posts from this blog

60 second binary options system

Best way to trade stock options

Dm bre forex