Sunday 23 July 2017

Django Trading System


Adam Grandt Adam Grandt Abr 2014 Diretor de Tecnologia atual ndash Visual Trading Systems Inc. metatrader4, java, c, jboss, javabeans, node. js, php, jquery, fix, python Visual Trading É o produto amalgamado da fusão de várias firmas FinTech . Nessa função administrei várias equipes de desenvolvimento usando pilhas variadas. Incluindo uma plataforma de negociação baseada em Java, sistemas de CRM baseados em PHP e um sistema Python ERP. Eu forneci orientação arquitetônica em toda a organização. Estabelecimento de melhores práticas para a integração de código legado com uma solução de ponta. Trabalhando com a equipe de liderança para realizar a visão organizacional. Março 2013 dezembro 2014 Arquiteto e desenvolvedor principal ndash M1: ZERO LLC linux, mongodb, python, turbogears2, scrapy, jquery, backbone. js, twitter-bootstrap, tor Em M1: ZERO Desenvolvi uma ferramenta de coleta e análise para localizar e avaliar humanos Evidência de tráfico na web clara e escura. A principal ferramenta está sendo testada por uma força-tarefa FBIDHSMBI e foi envolvida em várias missões de resgate de sucesso. Jun 2008 Abr 2014 Diretor de Tecnologia ndash GallantVPS Inc postgresdb, linux, wine, xvnc, python, django, php, html5, canvas, prototypejs, apache2, iptables Fundamos a GallantVPS com um parceiro em 2008. Reconhecemos uma necessidade específica no forex Indústria e tornou-se líder tecnológico no campo por mais de cinco anos. Continuei gerenciando todos os aspectos técnicos desta empresa, formando as melhores equipes com as quais tive o prazer de trabalhar, até a compra no início de 2014. Jan 2005 May 2008 Diretor de Tecnologia ndash eTouchWare c. Net, web-services, xslt Entrei como diretor da QA e fui encarregado de levar o produto ao mercado. Eu estabeleci os procedimentos de QA, criei uma equipe de QA e implementou metodologias de desenvolvimento ágil. Comecei a supervisionar as equipes de desenvolvimento cerca de dois anos e fiquei nesse cargo até que a empresa fosse comprada em 2008. Mar 2003 Jan 2005 Fundador ndash Inuwashi Inc php, mysql, javascript Sob o guarda-chuva da minha primeira empresa de consultoria de software, especializei-me em Solução ERPCRM personalizada para SMBs. Eu projetei e desenvolvi soluções para várias indústrias, incluindo: transporte, construção, segurança, medicina e comércio eletrônico. Cada projeto atendeu padrões específicos do setor e melhores práticas de desenvolvimento. 1999 2002 Diretor de Serviços de TI ndash Forças de Defesa de Israel, Comando Central, Divisão de RH sql, troca, vms, diretório ativo, servidor de Windows Mandou uma equipe de onze homens que gerenciou as necessidades de TI de mais de 600 usuários no ambiente diverso e agitado. É o do Comando Central da IDF, Divisão de Pessoal. Nós gerenciamos e apoiamos vários sistemas legados, bem como um novo sistema integrado à medida que as Forças defensivas israelenses evoluíram para a era da informação. A mesma posição incluiu a aplicação de políticas de segurança de informações e o gerenciamento de infraestrutura de cross corp. Projetos amp Interesses Sistema e método para acesso remoto de cliente único WO 2007106496 A2 ndash patents. justiapatent20070220008 A invenção compreende um sistema e método para facilitar a transferência de um arquivo de dados através de uma rede de comunicação. Numa concretização, uma primeira estação de trabalho que tem um arquivo de dados armazenado nela identifica um receptor do arquivo de dados e transmite ao receptor um convite para receber o arquivo de dados. O receptor, uma segunda estação de trabalho, usa o convite para comunicar a um servidor web um endereço para receber o arquivo de dados. O processador de informações recebe de forma segura pacotes do arquivo de dados e modifica a informação do cabeçalho nos pacotes antes de encaminhar os pacotes do arquivo de dados para a segunda estação de trabalho. Em uma forma de realização alternativa, a estação de trabalho do destinatário convida uma estação de trabalho remetente a transmitir um arquivo. Apps amp Software java, delphi, svn, git Visual Trading Systems forneceu o backbone tecnológico para os Serviços de Mercado de Capitais (CMS). A VT Spot, uma abrangente solução de negociação frente a frente, e alcançando o prestigiado ranking em Forex Datasources inaugural FOREXDS Traders Choice Awards. Arquiteto e Gerenciador de Produto html5, tela, vinho, iptables, xvnc, vnc, cloud, amazon-web-services, websocket, python Uma plataforma SaaS que oferece plataformas de negociação e hospedagem de negociação algorítmica em recursos de nuvem Linux usando WINE quando necessário, exposto à web Usuários através de um cliente VNC proxy HTML5 que se conecta ao XVNC, Architect e lead developerCointrol é um bote de negociação Bitcoin e um painel de controle em tempo real para o Bitstamp criado pelo jkbrzt. Cointrol foi criado para automatizar a especulação de Bitcoin. Além de negociação automatizada com base em disparadores de mudança de preço e várias estratégias de negociação, ele também fornece um painel de atualização atualizado em tempo real para a sua conta Bitstamp onde você pode ver todos os seus pedidos e transações atualizadas em tempo real (algo que a Bitstamp não possui). O painel para uma visão geral atualizada em tempo real também pode ser usado autônomo sem permitir que o Cointrol faça qualquer transação. Mesmo que a idéia original fosse talvez fornecer um serviço hospedado de pleno direito, o sistema permaneceu bastante básico, já que ele já foi usado por seu criador por um período de tempo no inverno de 1314 (quando as flutuações de preços da BTC eram bastante insanas). Algumas das vantagens óbvias que podem ser facilmente abordadas são: somente as estratégias de negociação básicas são implementadas. Única conta de usuárioBitstamp é suportada. Apenas uma sessão de negociação ativo por vez. O valor da conta inteira é usado ao negociar o administrador do Django é usado para manipulações de negociação de autenticação e negociação. Mesmo Embora a Cointrol tenha sido usada para transações reais, nenhuma garantia é fornecida em termos de segurança, correção, etc. (ver LICENÇA). O sistema consiste nos seguintes componentes: Enuncia vários pontos finais da API do Bitstamp Grava mudanças no DB Publica mudanças no Redis pubsub Abre ordens, quando apropriado Serve arquivos estáveis ​​do Webapp Exporta o DB para o Webapp via uma API REST Forwards Redis pubsub mensagens de Trader para Webapp via WebSocket Exposes Administração do Django que atualmente é usada para gerenciar sessões de negociação Aplicativo de página única RESTWebSocket API Visão geral atualizada em tempo real em pedidos, transações e sessões de negociação As partes do lado do servidor (cointrol-server cointrol-trader) são escritas em Python 3 (3.3 É necessário) e use uma mistura de Django (modelos, admin) e Tornado (WebSockets, IO assíncrono). Outras bibliotecas que são usadas incluem sockjs-tornado, framework Django REST. O webapp de uma página está escrito em CoffeeScript, Sass, Handlebars e usa Backbone. js, Brunch, socksjs-client, Bootstrap. Certifique-se de que você tenha o seguinte software instalado no seu sistema: 3.1 Obter API e segredo Ir para bitstamp. netaccountsecurityapi. Crie uma nova chave e configure as permissões para isso. O Cointrol precisa de pelo menos as seguintes permissões: Saldo da conta Transações do usuário Abrir ordens Se desejar que o Cointrol faça transações para você, selecione duas seguintes permissões: Comprar ordem limite Ordem limite de venda Não esqueça de ativar a chave clicando em Ativar e confirmar o e-mail Receber da Bitstamp. 3.2 Configure o Cointrol com as credenciais da API Ative o virtualenv e execute o cointrol-server Vá para localhost: 8000admincoreaccount1 e insira seu nome de usuário do Bitstamp, bem como a chave da API e segredo para o formulário lá. Por padrão, ele será executado no localhost: 8000. Você pode mudar a porta com --portltportgt. Use este conveniente link para efetuar o login: localhost: 8000adminloginnext a interface de administração do Django é usada para autenticação, e este link garante o redirecionamento de volta para o aplicativo depois de iniciá-lo. As cores do indicador de conexão explicaram: Verde: o aplicativo da Web possui uma conexão WebSocket para cointrol - servidor. E recentemente ouvi de coletor-comerciante. Amber: o aplicativo da Web possui uma conexão WeSocket para cointrol-server. Mas não ouviu falar de coletor em um tempo. Vermelho: o aplicativo da Web não pôde estabelecer a conexão do WebSocket ao cointrol-server. Observe, até que a negociação esteja configurada e as configurações COINTROLDOTRADE definidas como True (cobertas em uma etapa posterior), o comerciante não efetuará nenhuma transação. Ele só puxa seus dados do Bitstamp para preencher a exibição do painel. Até que as seguintes etapas sejam concluídas e a negociação seja ativada explicitamente, o Cointrol não tenta fazer qualquer transação em seu nome: através do administrador (localhost: 8000admin), você pode criar um perfil de estratégia de negociação. Pode ser para o fixo (os preços fixos em USD são usados ​​como desencadeadores Buysell) ou a estratégia relativa (porcentagem do preço inicial da BTC são usadas). Crie uma sessão de negociação (também na interface de administração). Para executar transações reais, você deve habilitá-las nas configurações (utilizamos o módulo settingsdev que os desativa). Adicione COINTROLDOTRADE Fiel ao seu cointrolcointrolconfsettingslocal. py. As configurações são resolvidas nessa ordem: settingslocal. py settings (proddev).py settingsdefaults. py Padrões do Django Durante o processo de instalação, você criou cointrolcointrolconfsettingslocal. py que importa as configurações do arquivo settingsdev. py. Todas as configurações são configurações do Django. As únicas configurações não-Django são COINTROLDOTRADE (False in dev. True in prod). Você pode substituir qualquer uma das configurações padrão no arquivo settingslocal. py. Além de settingsdev. py. O diretório conf também possui configuraçõesprod. py. Que é mais adequado para o uso da produção. Ele define a configuração de registro que faz mensagens de um nível gt AVISO registrado pelo comerciante para ser enviado por e-mail (por exemplo, quando o comerciante faz um pedido ou há um erro). Se você decidir usar este arquivo de configurações (alterando a importação em settingslocal. py para. settingsprod import. Você precisará configurar pelo menos DATABASES. ADMINS e SECRETKEY também em seu settingslocal. py. Ambientes Backtesting de pesquisa em Python com pandas Backtesting é o processo de pesquisa da aplicação de uma idéia de estratégia de negociação para dados históricos, a fim de verificar o desempenho do passado. Em particular, um backtester não garante o desempenho futuro da estratégia. No entanto, eles são um componente essencial do processo de pesquisa de pipeline estratégica, Permitindo que as estratégias sejam filtradas antes de serem colocadas em produção. Neste artigo (e aqueles que a seguem) será descrito um sistema básico de backtesting orientado a objetos escrito em Python. Esse sistema inicial será principalmente um auxiliar de ensino, usado para demonstrar a Diferentes componentes de um sistema backtesting. À medida que avançamos nos artigos, serão adicionadas funcionalidades mais sofisticadas. Backtesting Ove Rview O processo de criação de um sistema robusto de backtesting é extremamente difícil. Simular de forma efetiva todos os componentes que afetam a performance de um sistema de negociação algorítmica é um desafio. A fraca precisão de dados, a opacidade do roteamento de ordens em um corretor, a latência de pedidos e uma miríade de outros fatores conspiram para alterar o verdadeiro desempenho de uma estratégia em relação à performance testada. Ao desenvolver um sistema de backtesting, é tentador querer reescrevê-lo constantemente a partir do zero, à medida que mais fatores são considerados cruciais na avaliação do desempenho. Nenhum sistema de backtesting já foi concluído e um julgamento deve ser feito em um ponto durante o desenvolvimento que fatores suficientes foram capturados pelo sistema. Com essas preocupações em mente, o backtester apresentado aqui será um pouco simplista. À medida que exploramos novos problemas (otimização de portfólio, gerenciamento de riscos, processamento de custos de transações), o backtester se tornará mais robusto. Tipos de sistemas de teste de retorno Existem, geralmente, dois tipos de sistema de teste de retorno que serão de interesse. O primeiro é baseado em pesquisa. Usado principalmente nos estágios iniciais, onde muitas estratégias serão testadas para selecionar aqueles para uma avaliação mais séria. Esses sistemas de pesquisa backtesting são frequentemente escritos em Python, R ou MatLab, uma vez que a velocidade de desenvolvimento é mais importante do que a velocidade de execução nesta fase. O segundo tipo de sistema backtesting é baseado em eventos. Ou seja, executa o processo backtesting em um loop de execução similar (se não idêntico) ao próprio sistema de execução de negociação. Ele irá modelar de maneira realista os dados do mercado e o processo de execução da ordem, a fim de fornecer uma avaliação mais rigorosa de uma estratégia. Os últimos sistemas são muitas vezes escritos em uma linguagem de alto desempenho, como C ou Java, onde a velocidade de execução é essencial. Para estratégias de baixa freqüência (embora ainda intradias), Python é mais que suficiente para ser usado neste contexto. Object-Oriented Research Backtester in Python O projeto e a implementação de um ambiente baseado em pesquisa orientado a objeto backtesting agora serão discutidos. A orientação do objeto foi escolhida como o paradigma do projeto de software pelas seguintes razões: as interfaces de cada componente podem ser especificadas antecipadamente, enquanto os componentes internos de cada componente podem ser modificados (ou substituídos) à medida que o projeto progride Ao especificar as interfaces de frente, é possível Para testar eficazmente como cada componente se comporta (através de testes de unidade) Ao estender o sistema, novos componentes podem ser construídos sobre ou além de outros, seja por herança ou composição. Nesta fase, o backtester foi projetado para facilidade de implementação e um grau razoável de flexibilidade , À custa da verdadeira precisão do mercado. Em particular, este backtester só poderá lidar com estratégias que atuem em um único instrumento. Mais tarde, o backtester será modificado para lidar com conjuntos de instrumentos. Para o backtester inicial, são necessários os seguintes componentes: Estratégia - Uma classe de estratégia recebe um Pandas DataFrame de barras. Ou seja, uma lista de pontos de dados Open-High-Low-Close-Volume (OHLCV) em uma determinada freqüência. A Estratégia produzirá uma lista de sinais. Que consistem em um timestamp e um elemento do conjunto que indica um sinal longo, de espera ou curto, respectivamente. Portfólio - A maioria do trabalho de backtesting ocorrerá na classe Portfolio. Ele receberá um conjunto de sinais (conforme descrito acima) e criará uma série de posições, alocadas contra um componente de caixa. O trabalho do objeto Portfolio é produzir uma curva de equidade. Incorporar custos básicos de transação e acompanhar os negócios. Desempenho - O objeto Performance obtém um portfólio e produz um conjunto de estatísticas sobre seu desempenho. Em particular, produzirá características de retorno de risco (Sharpe, Sortino e Razões de Informações), métricas de tradeprofit e informações de redução. O que está faltando Como se pode ver, este backtester não inclui nenhuma referência ao gerenciamento do portfoliorisk, gerenciamento de execução (ou seja, ordens sem limite), nem fornecerá modelos sofisticados de custos de transação. Este não é um grande problema nesta fase. Isso nos permite familiarizar-se com o processo de criação de um backtester orientado a objetos e das bibliotecas PandasNumPy. Com o tempo, será melhorado. Implementação Vamos agora descrever as implementações para cada objeto. O objeto Estratégia deve ser bastante genérico nesta fase, já que tratará as estratégias de previsão, média-reversão, momentum e volatilidade. As estratégias a serem consideradas aqui sempre serão baseadas em séries temporais, ou seja, orientadas a preços. Uma exigência precoce para este backtester é que as classes de Estratégias derivadas aceitarão uma lista de barras (OHLCV) como entrada, em vez de carrapatos (preços de comércio por comércio) ou dados do livro de pedidos. Assim, a granularidade mais fina que está sendo considerada aqui será barras de 1 segundo. A classe Estratégia também produzirá sempre recomendações de sinal. Isso significa que irá aconselhar uma instância do Portfolio no sentido de avançar ou manter uma posição. Essa flexibilidade nos permitirá criar vários conselheiros de estratégia que fornecem um conjunto de sinais, que uma classe de portfólio mais avançada pode aceitar para determinar as posições reais que estão sendo inseridas. A interface das classes será aplicada utilizando uma metodologia de classe básica abstrata. Uma classe base abstrata é um objeto que não pode ser instanciado e, portanto, somente classes derivadas podem ser criadas. O código Python é dado abaixo em um arquivo chamado backtest. py. A classe Estratégia requer que qualquer subclasse implemente o método genatesignals. Para evitar que a classe de estratégia seja instanciada diretamente (uma vez que é resumo) é necessário usar os objetos ABCMeta e abstractmethod do módulo abc. Nós estabelecemos uma propriedade da classe, chamada metaclass para ser igual a ABCMeta e depois decorar o método genatesignals com o decorador abstractmethod. Embora a interface acima seja direta, ela se tornará mais complicada quando essa classe for herdada para cada tipo específico de estratégia. Em última análise, o objetivo da classe Estratégia nesta configuração é fornecer uma lista de sinais longshorthold para cada instrumento a ser enviado para uma Carteira. A classe Portfolio é onde a maioria da lógica de negociação irá residir. Para este testador de pesquisa, o Portfolio é responsável por determinar o dimensionamento da posição, a análise de risco, o gerenciamento de custos de transações e o gerenciamento de execução (ou seja, o mercado aberto, o mercado de fechamento de pedidos). Em uma etapa posterior, essas tarefas serão divididas em componentes separados. Agora, eles serão incorporados a uma classe. Esta classe faz um amplo uso de pandas e fornece um ótimo exemplo de onde a biblioteca pode economizar uma enorme quantidade de tempo, especialmente no que diz respeito a discussões de dados. Como um lado, o truque principal com pandas e NumPy é evitar iterar sobre qualquer conjunto de dados usando a sintaxe d para. Isso ocorre porque o NumPy (que está subjacente aos pandas) otimiza o looping por operações vectorizadas. Assim, você verá poucas (se houver) diretivas diretas ao utilizar pandas. O objetivo da classe Portfolio é, em última análise, produzir uma seqüência de trades e uma curva patrimonial, que será analisada pela classe Performance. Para conseguir isso, deve ser fornecida uma lista de recomendações de negociação de um objeto Estratégia. Mais tarde, este será um grupo de objetos Estratégia. A classe Portfolio deve ser informada sobre como o capital deve ser implantado para um determinado conjunto de sinais de negociação, como lidar com os custos de transação e quais formas de pedidos serão utilizadas. O objeto Estratégia está operando em barras de dados e, portanto, pressupostos devem ser feitos em relação aos preços alcançados na execução de um pedido. Como o preço elevado de qualquer barra é desconhecido a priori, só é possível usar os preços abertos e fechados para negociação. Na realidade, é impossível garantir que um pedido seja preenchido em um desses preços particulares ao usar uma ordem de mercado, por isso será, na melhor das hipóteses, uma aproximação. Além dos pressupostos sobre as encomendas que estão sendo preenchidas, este backtester irá ignorar todos os conceitos de restrições de margem de correção e assumirá que é possível passar longo e brevemente em qualquer instrumento livremente sem restrições de liquidez. Esta é claramente uma hipótese muito irrealista, mas é uma que pode ser relaxada mais tarde. A seguinte lista continua backtest. py: Nesta fase, as classes de base abstrata Estratégia e portfólio foram introduzidas. Agora estamos em condições de gerar algumas implementações derivadas concretas dessas classes, a fim de produzir uma estratégia de brinquedo de trabalho. Começaremos por gerar uma subclasse de Estratégia chamada RandomForecastStrategy. Cuja única tarefa é produzir sinais longshort escolhidos aleatoriamente. Embora esta seja claramente uma estratégia de negociação absurda, ela atenderá as nossas necessidades, demonstrando a estrutura de backtesting orientada a objetos. Assim, iniciaremos um novo arquivo chamado randomforecast. py. Com a listagem do pré provisorio aleatório da seguinte forma: agora que temos um sistema de previsão concreto, devemos criar uma implementação de um objeto Portfolio. Este objeto abrangerá a maioria do código de teste. Ele é projetado para criar dois DataFrames separados, o primeiro dos quais é um quadro de posições, usado para armazenar a quantidade de cada instrumento segurado em qualquer barra particular. O segundo, o portfólio. Na verdade, contém o preço de mercado de todas as participações para cada barra, bem como uma contagem do caixa, assumindo um capital inicial. Isso, em última instância, fornece uma curva de equidade na qual avaliar o desempenho da estratégia. O objeto Portfolio, embora extremamente flexível em sua interface, requer escolhas específicas quando se trata de como lidar com os custos de transação, pedidos de mercado, etc. Neste exemplo básico, considero que será possível avançar facilmente com um instrumento sem restrições ou margem, Comprar ou vender diretamente no preço aberto do bar, zero custos de transação (abrangendo deslizamento, taxas e impacto no mercado) e especificou a quantidade de estoque diretamente para comprar para cada comércio. Aqui está a continuação da lista de randomforecast. py: isso nos dá tudo o que precisamos para gerar uma curva de equidade baseada nesse sistema. O passo final é amarrar tudo junto com uma função principal: a saída do programa é a seguinte. O seu será diferente do resultado abaixo, dependendo do intervalo de datas selecionado e da semente aleatória utilizada. Nessa instância, a estratégia perdeu dinheiro, o que não é surpreendente dada a natureza estocástica do previsor. Os próximos passos são criar um objeto de desempenho que aceite um Instância de portfólio e fornece uma lista de métricas de desempenho sobre as quais basear uma decisão para filtrar a estratégia ou não. Também podemos melhorar o objeto Portfolio para ter um tratamento mais realista dos custos de transação (como as comissões Interactive Brokers e o deslizamento). Também podemos incluir diretamente um mecanismo de previsão em um objeto de Estratégia, o que (espero) produza melhores resultados. Nos seguintes artigos, exploraremos esses conceitos com mais profundidade.

No comments:

Post a Comment