Biblioteca de Negociação Algorítmica Python.
PyAlgoTrade é uma Biblioteca de Negociação Algorítmica Python com foco em backtesting e suporte para negociação de papel e negociação ao vivo. Digamos que você tenha uma idéia de uma estratégia de negociação e que você gostaria de avaliá-la com dados históricos e ver como ela se comporta. PyAlgoTrade permite que você faça isso com um esforço mínimo.
Principais características.
Totalmente documentado. Evento conduzido. Suporta pedidos Market, Limit, Stop e StopLimit. Suporta Yahoo! Finanças, Google Finance e NinjaTrader CSV. Suporta qualquer tipo de dados da série temporal no formato CSV, por exemplo, Quandl. Suporte comercial Bitcoin através do Bitstamp. Indicadores técnicos e filtros como SMA, WMA, EMA, RSI, Bandas Bollinger, Expositores Hurst e outros. Métricas de desempenho como a taxa de Sharpe e análise de redução. Manipulação de eventos do Twitter em tempo real. Perfil de eventos. Integração TA-Lib.
Muito fácil de dimensionar horizontalmente, ou seja, usando um ou mais computadores para testar uma estratégia.
PyAlgoTrade é gratuito, de código aberto e está licenciado sob a Licença Apache, Versão 2.0.
Jon V.
BigData. Iniciantes. Negociação.
BigData. Iniciantes. Negociação.
Construindo um sistema backtesting em Python: ou como perdi $ 3400 em duas horas.
Construir um sistema de backtest é realmente muito fácil. Fácil de estragar eu quero dizer. Embora existam toneladas de excelentes bibliotecas por aí (e as abordaremos em algum momento), eu sempre gosto de fazer isso por conta própria para ajustá-la.
De todos os sistemas de backtesting que vi, podemos supor que existem duas categorias:
Hoje, falaremos sobre loopers.
Os "loopers" são meus tipos favoritos de backtesters. Eles são triviais para escrever e super divertidos para expandir, mas eles têm alguns fluxos vitais e, infelizmente, a maioria dos backtesters lá fora é "for-loopers" (ps: Eu preciso encontrar um nome melhor para isso!).
Como funcionam os loopers? Usando um loop for (como você pode ter adivinhado). É algo assim:
Muito simples, certo? É assim que funciona um sistema de backtesting, que executa uma estratégia de impulso:
Então qual é o problema?
Muito difícil de escalar (horizontalmente) Precisa de muito trabalho para manter sua estratégia de aplicação () trabalhando no backtesting e na produção Você precisa ter tudo na mesma linguagem de programação.
Vamos mergulhar neles, um por um.
Escalabilidade. Eu estava experimentando algumas semanas atrás com um algoritmo de escalada para otimizar uma das minhas estratégias. Ainda está em execução. Depois de duas semanas. E eu construo sistemas robustos para uma vida. Por que ainda está funcionando? Você pode usar multiprocessamento, Disco, produtor / consumidor (usando o ZeroMQ) ou apenas threads para acelerar isso, mas alguns problemas não são "paralisações embaraçosas" (sim, este é um termo real, e não uma das minhas palavras inventadas). A quantidade de trabalho para escalar um backtester como este (especialmente quando você quer fazer o mesmo aprendizado de máquina em cima dele) é enorme. Você pode fazê-lo, mas é o caminho errado.
Produção e backtesting em sincronia. As vezes que fui mordido por isso. Posso recordar as trocas perdidas onde eu estava "hm, por que eu entrei nesse comércio?" ou o meu antigo favorito "POR QUE A PARADA DE REALIZAÇÃO FOI APLICADA AGORA?".
Hora da história: Eu tive uma idéia para otimizar minha estratégia, para executar um backtester para ver o que aconteceria se eu pudesse colocar uma parada depois que o negócio fosse lucrativo, a fim de sempre garantir lucros. Backtesting funcionou como um charme com um aumento de 13% nos ganhos e a produção perdeu todo comércio. Eu percebi isso depois que meu algo perdeu $ 3400 em um par de horas (uma lição muito cara).
Manter a estratégia apply_strategy em sincronia é muito difícil e torna-se quase impossível quando você deseja fazê-lo de forma distribuída. E você não quer ter duas versões da sua estratégia que são "quase" idênticas. A menos que você tenha US $ 3400 de sobra.
Usando diferentes idiomas, adoro Python. E Erlang. E Clojure. E J. E C. E R. E Ruby (não, na verdade, eu odeio Ruby). Eu quero poder aproveitar a força de outros idiomas no meu sistema. Quero experimentar estratégias em R onde há bibliotecas muito bem testadas e há uma enorme comunidade por trás disso. Eu quero ter Erlang para escalar meu código e C para processar dados. Se você quer ser bem sucedido (não apenas na negociação), você precisa ser capaz de usar todos os recursos disponíveis sem preconceitos. Eu aprendi toneladas de coisas de sair com desenvolvedores de R sobre como você pode delta de títulos de hedge e visualizá-los ou por que razão de Sharpe pode ser uma mentira. Todo idioma tem uma multidão diferente e você quer que muitas pessoas despejam idéias em seu sistema. Se você tentar aplicar a estratégia apply_strategy em idioma diferente, então, boa sorte com (2).
Você está convencido agora? Bem, eu não estou tentando convencê-lo como for-loopers é uma ótima maneira de executar seus testes iniciais. Foi assim que comecei e, para muitas estratégias, não as envio para o pipeline. Um "melhor" caminho (assim você pode dormir à noite) é o gerador de eventos.
Próximamente, compartilhando e discutindo meu backtester mais simples (mas com maior sucesso)!
Se você tiver mais comentários, clique-me no jonromero ou inscreva-se no boletim informativo.
Outro Jurídico Este é um tutorial de engenharia sobre como construir uma plataforma algotrading para experimentação e FUN. Qualquer sugestão aqui não é um conselho financeiro. Se você perder qualquer (ou todos) o seu dinheiro porque seguiu quaisquer conselhos de negociação ou implantou este sistema na produção, não pode culpar este blog aleatório (e / ou eu). Aproveite a seu próprio risco.
bt - Backtesting flexível para Python¶
O que é bt?
O bt é um framework de backtesting flexível para Python usado para testar estratégias de negociação quantitativa. Backtesting é o processo de testar uma estratégia em um dado conjunto de dados. Essa estrutura permite criar facilmente estratégias que combinam e combinam diferentes Algos. O objetivo é promover a criação de blocos de lógica de estratégia facilmente testáveis, reutilizáveis e flexíveis para facilitar o rápido desenvolvimento de estratégias de negociação complexas.
O objetivo: salvar os demais de reinventarem a roda e deixá-los concentrar-se na parte importante do desenvolvimento da estratégia de trabalho.
O bt é codificado em Python e se junta a um ecossistema vibrante e rico para análise de dados. Existem inúmeras bibliotecas para aprendizado de máquina, processamento de sinais e estatísticas, e podem ser aproveitadas para evitar reinventar a roda - algo que acontece com muita freqüência quando se usa outras linguagens que não têm a mesma riqueza de alta qualidade. projetos de origem.
bt é construído sobre o ffn - uma biblioteca de funções financeiras para Python. Confira!
Um exemplo rápido¶
Aqui está um gostinho rápido de bt:
Um backtest de estratégia simples¶
Vamos criar uma estratégia simples. Criaremos uma estratégia mensalmente reequilibrada, de longa duração, em que colocamos pesos iguais em cada ativo em nosso universo de ativos.
Primeiro, vamos baixar alguns dados. Por padrão, o bt. get (apelido para ffn. get) faz o download do Ajusted Close do Yahoo! Finança. Vamos baixar alguns dados a partir de 1º de janeiro de 2010 para os fins desta demonstração.
Assim que tivermos nossos dados, criaremos nossa estratégia. O objeto Strategy contém a lógica da estratégia combinando vários Algos.
Por fim, criaremos um Backtest, que é a combinação lógica de uma estratégia com um conjunto de dados.
Feito isso, podemos executar o backtest e analisar os resultados.
Agora podemos analisar os resultados do nosso backtest. O objeto Result é um wrapper fino em torno de ffn. GroupStats que adiciona alguns métodos auxiliares.
Modificando uma estratégia¶
E se executássemos essa estratégia semanalmente e também usássemos alguma abordagem de estilo de paridade de risco usando pesos que são proporcionais ao inverso da volatilidade de cada ativo? Bem, tudo o que temos a fazer é conectar alguns algos diferentes. Ver abaixo:
Como você pode ver, a lógica da estratégia é fácil de entender e, mais importante, fácil de modificar. A ideia de usar Algos simples e compostos para criar estratégias é um dos principais blocos de construção do bt.
Estrutura da Árvore A estrutura da árvore facilita a construção e a composição de estratégias complexas de negociação algorítmica que são modulares e reutilizáveis. Além disso, cada nó da árvore possui seu próprio índice de preços que pode ser usado pelos Algos para determinar a alocação de um Nó. Algorithm Stacks Algos e AlgoStacks são outro recurso essencial que facilita a criação de lógica de estratégia modular e reutilizável. Devido à sua modularidade, esses blocos lógicos também são mais fáceis de testar - um passo importante na construção de soluções financeiras robustas. Gráficos e relatórios bt também fornece muitas funções úteis de gráficos que ajudam a visualizar os resultados do backtest. Também planejamos adicionar mais gráficos, tabelas e formatos de relatório no futuro, como gerar relatórios em PDF gerados automaticamente. Estatísticas detalhadas Além disso, o bt calcula um monte de estatísticas relacionadas a um backtest e oferece uma maneira rápida de comparar essas várias estatísticas em vários backtests diferentes por meio dos métodos de exibição do Results.
Os futuros esforços de desenvolvimento se concentrarão em:
Velocidade Devido à natureza flexível do BT, um trade-off teve que ser feito entre usabilidade e desempenho. A usabilidade sempre será a prioridade, mas queremos melhorar o desempenho o máximo possível. Algos Também estaremos desenvolvendo mais algoritmos com o passar do tempo. Nós também encorajamos qualquer um a contribuir com seus próprios algos também. Criação de gráficos e relatórios Esta é outra área que desejamos melhorar constantemente, pois os relatórios são um aspecto importante do trabalho. Gráficos e relatórios também facilitam encontrar bugs na lógica da estratégia.
Backtesting Estratégias de Negociação Sistemática em Python: Considerações e Estruturas de Código Aberto.
Backtesting Estratégias de Negociação Sistemática em Python: Considerações e Estruturas de Código Aberto.
Neste artigo, Frank Smietana, um dos colaboradores convidados especializados da QuantStart, descreve o cenário de software de backtesting de código aberto Python e fornece conselhos sobre qual framework de backtesting é adequado para as necessidades de seu próprio projeto.
Backtesting é indiscutivelmente a parte mais crítica do processo de produção da Sistemática de Negociação Sistemática (STS), sentado entre o desenvolvimento da estratégia e a implantação (negociação ao vivo). Se uma estratégia é defeituosa, um teste rigoroso provavelmente expõe isso, evitando que uma estratégia de perda seja implantada.
Uma série de capacidades relacionadas se sobrepõem com backtesting, incluindo simulação comercial e negociação ao vivo. O Backtesting usa dados históricos para quantificar o desempenho STS. Os simuladores de negociação levam backtesting um passo adiante, visualizando o desencadeamento de trades e desempenho de preços em uma base bar-a-bar. A negociação simulada / ao vivo implementa um STS testado em tempo real: negociações de sinalização, gerando ordens, roteando ordens para corretores e mantendo as posições à medida que as ordens são executadas.
A maioria dos quadros vai além do backtesting para incluir algumas capacidades de negociação ao vivo. Isso é conveniente se você deseja implantar a partir de sua estrutura de backtesting, que também funciona com o seu fornecedor preferido e fontes de dados. Quantopian / Zipline vai um passo adiante, fornecendo uma solução totalmente integrada de desenvolvimento, backtesting e implantação.
A comunidade Python é bem servida, com pelo menos seis estruturas de backtesting de código aberto disponíveis. No entanto, estão em vários estágios de desenvolvimento e documentação. Se você gosta de trabalhar em uma equipe construindo uma estrutura de backtesting de código aberto, confira seus reembolsos Github.
Antes de avaliar as estruturas de backtesting, vale a pena definir os requisitos do seu STS.
Qual classe de ativos você está negociando? Embora a maioria dos frameworks ofereça suporte aos dados da US Equities via YahooFinance, se uma estratégia incorporar derivados, ETFs ou títulos de EM, os dados precisam ser importados ou fornecidos pela estrutura. As coberturas de classe de ativos vão além dos dados. O framework pode lidar com futuros e opções de tamanho finito e gerar negociações de roll-over automaticamente? E quanto aos mercados ilíquidos, quão realista é uma suposição ao executar grandes encomendas?
Qual a frequência e o detalhe dos dados do seu STS? Um sistema de negociação que exige que cada marca ou lance / peça tenha um conjunto muito diferente de problemas de gerenciamento de dados do que um intervalo de 5 minutos ou horário. Os hedge funds e as lojas HFT investiram significativamente na construção de quadros robustos e escaláveis de backtesting para lidar com esse volume e freqüência de dados. Algumas plataformas fornecem um conjunto rico e profundo de dados para várias classes de ativos, como ações da S & P, com resolução de um minuto.
Qual (s) tipo (s) de ordem o seu STS requer? No mínimo, o limite, as paradas e o OCO devem ser suportados pela estrutura.
Nível de suporte e amp; documentação necessária. Os quadros de estágio inicial têm escassa documentação, poucos têm suporte além de placas comunitárias.
Os Componentes de um Quadro de Teste de Backtesting.
Dados e aquisição de STS: os componentes de aquisição consomem o arquivo de script / definição STS e fornecem os dados necessários para testes. Se a estrutura exige que qualquer STS seja recodificado antes do teste posterior, a estrutura deve suportar funções enlatadas para os indicadores técnicos mais populares para acelerar o teste STS. Os usuários determinam o tempo de um período histórico para fazer backtest com base no que o framework fornece, ou o que eles são capazes de importar.
O teste de desempenho aplica a lógica STS à janela de dados históricos solicitada e calcula uma ampla gama de riscos & amp; métricas de desempenho, incluindo redução máxima, taxas Sharpe e Sortino. A maioria dos frameworks suporta um número decente de capacidades de visualização, incluindo curvas de equidade e estatísticas decimais.
A otimização tende a exigir a maior parte dos recursos de computação no processo STS. Se o seu STS precisar de otimização, concentre-se em uma estrutura que suporte processamento escalável distribuído / paralelo.
No contexto de estratégias desenvolvidas usando indicadores técnicos, os desenvolvedores de sistemas tentam encontrar um conjunto ideal de parâmetros para cada indicador. Mais simplesmente, a otimização pode achar que um STS crossover médio de 6 e 10 dias acumulou mais lucro sobre os dados de teste históricos do que qualquer outra combinação de períodos de tempo entre 1 e 20. Já com este exemplo trivial, 20 * 20 = 400 combinações de parâmetros ser calculado & amp; classificado.
No contexto de um portfólio, a otimização procura encontrar a ponderação ideal de cada ativo na carteira, incluindo os instrumentos em curto e alavancado. Em uma base periódica, a carteira é reequilibrada, resultando na compra e venda de participações de carteira conforme necessário para alinhar com os pesos otimizados.
O dimensionamento de posição é um uso adicional de otimização, ajudando os desenvolvedores de sistemas a simular e analisar o impacto da alavancagem e o dimensionamento dinâmico da posição no STS e no desempenho do portfólio.
Seis quadros de teste para o Python.
As capacidades padrão das plataformas open source Python backtesting parecem incluir:
Evento orientado Licenciamento muito flexível e irrestrito Coleção decente de indicadores técnicos predefinidos Capacidades de cálculo / visualização / relatório de métricas de desempenho padrão.
PyAlgoTrade.
PyAlgoTrade é uma estrutura de backtesting mutuamente documentada, juntamente com capacidades de negociação em papel e ao vivo. O suporte a dados inclui Yahoo! Finanças, Google Finance, NinjaTrader e qualquer tipo de série de tempo baseada em CSV, como Quandl. Os tipos de pedidos suportados incluem Market, Limit, Stop e StopLimit.
O PyAlgoTrade suporta a negociação Bitcoin via Bitstamp e o gerenciamento de eventos do Twitter em tempo real.
bt - Backtesting para Python.
bt "visa promover a criação de blocos de lógica de estratégia facilmente testáveis, reutilizáveis e flexíveis para facilitar o rápido desenvolvimento de estratégias comerciais complexas".
O framework é particularmente adequado para testar STS com base em portfólio, com algos para ponderação de ativos e reequilíbrio de portfólio. A modificação de uma estratégia para executar em diferentes freqüências de tempo ou pesos de ativos alternativos envolve um mínimo de ajuste de código. bt é construído sobre o ffn - uma biblioteca de funções financeiras para Python.
Backtrader.
Esta plataforma está excepcionalmente bem documentada, com um blog acompanhante e uma comunidade on-line ativa para postar perguntas e solicitações de recursos. O Backtrader suporta uma série de formatos de dados, incluindo arquivos CSV, Pandas DataFrames, iteradores de incandescência e feeds de dados em tempo real de três corretores. Esses feeds de dados podem ser acessados simultaneamente e podem até representar diferentes períodos de tempo. Os corretores suportados incluem Oanda para negociação de Forex e negociação de classes de ativos múltiplos através de Interactive Brokers e Visual Chart.
Pysystemtrade.
O desenvolvedor da Pysystemtrade, Rob Carver, tem uma ótima postagem em discussão sobre o porquê ele se propôs a criar mais uma nova estrutura de teste do Python e os argumentos para e contra o desenvolvimento do framework. A estrutura backtesting para pysystemtrade é discutida no livro Rob, "Systematic Trading".
Pysystemtrade lista uma série de recursos de roteiro, incluindo um testador de back-up completo, que inclui técnicas de otimização e calibração e negociação de futuros totalmente automáticos com Interactive Brokers. Os contribuidores da fonte aberta são bem-vindos.
Zipline é um simulador de negociação algorítmica com capacidades de negociação em papel e ao vivo. Acessível através da interface do navegador IPython baseado no navegador, a Zipline fornece uma alternativa fácil de usar para ferramentas de linha de comando. Suportado e desenvolvido pela Quantopian, o Zipline pode ser usado como uma estrutura de backtesting autônoma ou como parte de um ambiente de desenvolvimento, teste e implementação de STS completo da Quantipian / Zipline. A Zipline fornece 10 anos de dados de estoque históricos históricos de última hora e uma série de opções de importação de dados.
QSTrader é uma estrutura de backtesting com capacidades de negociação ao vivo. O Fundador da QuantStart, Michael Halls-Moore, lançou o QSTrader com o intuito de construir uma plataforma robusta e escalável o suficiente para atender às necessidades de quantias institucionais de hedge funds, bem como aos traders quantificados de varejo. O QSTrader atualmente suporta dados de resolução "barra" da OHLCV em várias escalas de tempo, mas permite que dados de marca sejam usados.
Tanto o backtesting como o comércio ao vivo são completamente orientados para eventos, simplificando a transição das estratégias da pesquisa para o teste e, finalmente, a negociação ao vivo. A estratégia básica / código do portfólio geralmente é idêntico em ambas as implementações.
O principal benefício do QSTrader é em sua modularidade, permitindo uma ampla personalização de código para aqueles que possuem requisitos específicos de gerenciamento de risco ou portfólio.
Abraçando o Backtest.
É da natureza humana concentrar-se na recompensa de desenvolver um (esperançosamente lucrativo) STS, depois se apressar em implantar uma conta financiada (porque estamos esperançosos), sem gastar tempo e recursos suficientes para fazer um backtesting completo da estratégia. Mas backtesting não é apenas um gatekeeper para nos impedir de implementar estratégias erradas e perder capital comercial, também fornece uma série de diagnósticos que podem informar o processo de desenvolvimento STS. Por exemplo, testando um STS idêntico em dois intervalos de tempo diferentes, compreendendo a redução máxima de uma estratégia no contexto de correlações de ativos e criando portfólios mais inteligentes por backtesting de alocações de ativos em várias regiões geográficas.
Em futuras postagens, iremos abordar frameworks de backtesting para ambientes que não sejam Python e o uso de várias técnicas de amostragem como bootstrapping e jackknife para testar modelos de negociação preditivos.
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.
Pesquise Ambientes de Backtesting em Python com pandas.
Pesquise Ambientes de Backtesting em Python com pandas.
Backtesting é o processo de pesquisa da aplicação de uma ideia de estratégia de negociação aos dados históricos, a fim de verificar o desempenho 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 da estratégia, permitindo que as estratégias sejam filtradas antes de serem colocadas em produção.
Neste artigo (e aqueles que o seguem), um sistema básico de backtesting orientado a objeto escrito em Python será descrito. Este sistema inicial será principalmente um "auxiliar de ensino", usado para demonstrar os diferentes componentes de um sistema de backtesting. À medida que avançamos nos artigos, funcionalidades mais sofisticadas serão adicionadas.
Visão geral do backtesting.
O processo de projetar um sistema de backtesting robusto é extremamente difícil. Simular efetivamente todos os componentes que afetam o desempenho de um sistema de negociação algorítmica é um desafio. Pouca granularidade de dados, opacidade de roteamento de ordens em um corretor, latência de pedidos e uma miríade de outros fatores conspiram para alterar o desempenho "verdadeiro" de uma estratégia versus o desempenho de backtested.
Ao desenvolver um sistema de backtesting, é tentador querer constantemente "reescrevê-lo do zero", já que mais fatores são considerados cruciais para avaliar o desempenho. Nenhum sistema de backtesting é 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 outras questões (otimização de portfólio, gerenciamento de riscos, manipulação de custos de transação), o backtester se tornará mais robusto.
Tipos de sistemas de backtesting.
Geralmente, existem dois tipos de sistema de backtesting 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 aquelas para uma avaliação mais séria. Esses sistemas de backtesting de pesquisa são frequentemente escritos em Python, R ou MatLab, já que a velocidade de desenvolvimento é mais importante do que a velocidade de execução nessa fase.
O segundo tipo de sistema de backtesting é baseado em eventos. Ou seja, ele realiza o processo de backtesting em um loop de execução semelhante (se não idêntico) ao próprio sistema de execução de negociação. Ele irá modelar de forma realista os dados de mercado e o processo de execução de ordens, a fim de fornecer uma avaliação mais rigorosa de uma estratégia.
Os últimos sistemas geralmente são escritos em uma linguagem de alto desempenho, como C ++ ou Java, onde a velocidade de execução é essencial. Para estratégias de frequência mais baixa (embora ainda intradiário), o Python é mais que suficiente para ser usado neste contexto.
Backtester de pesquisa orientada a objeto em Python.
O projeto e a implementação de um ambiente de backtesting baseado em pesquisa orientado a objeto serão agora discutidos. A orientação a objetos foi escolhida como o paradigma de design de software pelos seguintes motivos:
As interfaces de cada componente podem ser especificadas antecipadamente, enquanto as partes internas de cada componente podem ser modificadas (ou substituídas) à medida que o projeto progride Ao especificar as interfaces antecipadamente, é possível testar efetivamente como cada componente se comporta (por meio de testes de unidade). Os novos componentes do sistema podem ser construídos ou em adição a outros, seja por herança ou composição.
Nesta fase, o backtester é projetado para facilidade de implementação e um grau razoável de flexibilidade, em detrimento da verdadeira precisão do mercado. Em particular, este backtester só será capaz de lidar com estratégias que atuam em um único instrumento. Posteriormente, o backtester será modificado para lidar com conjuntos de instrumentos. Para o backtester inicial, os seguintes componentes são necessários:
Estratégia - Uma classe Strategy recebe um Pandas DataFrame de barras, ou seja, uma lista de pontos de dados Open-High-Low-Close-Volume (OHLCV) em uma frequência específica. A Estratégia produzirá uma lista de sinais, que consistem em um registro de data e hora e um elemento do conjunto $ \ $ indicando um sinal longo, retido ou curto, respectivamente. Portfólio - A maior parte 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 em um componente em dinheiro. O trabalho do objeto Portfolio é produzir uma curva de capital, incorporar os custos básicos de transação e acompanhar os negócios. Desempenho - O objeto Performance pega um portfólio e produz um conjunto de estatísticas sobre seu desempenho. Em particular, ele produzirá características de risco / retorno (Sharpe, Sortino e Proporções de Informações), métricas de comércio / lucro e informações de rebaixamento.
O que está a faltar?
Como pode ser visto, esse backtester não inclui nenhuma referência ao gerenciamento de portfólio / risco, gerenciamento de execução (ou seja, sem ordens de limite) nem fornecerá modelagem sofisticada dos custos de transação. Isso não é muito problemático neste estágio. Isso nos permite ganhar familiaridade com o processo de criação de um backtester orientado a objetos e as bibliotecas Pandas / NumPy. Com o tempo, será melhorado.
Implementação.
Vamos agora proceder para delinear as implementações para cada objeto.
O objeto Strategy deve ser bastante genérico neste estágio, já que estará lidando com estratégias de previsão, reversão à média, momentum e volatilidade. As estratégias que estão sendo consideradas aqui serão sempre baseadas em séries temporais, ou seja, "orientadas pelo preço". Um requisito inicial para esse backtester é que as classes Strategy derivadas aceitarão uma lista de barras (OHLCV) como entrada, em vez de ticks (preços de trade-by-trade) ou dados de pedidos. Assim, a melhor granularidade considerada aqui será de 1 segundo.
A classe Strategy também sempre produzirá recomendações de sinal. Isso significa que ele informará uma instância do portfólio no sentido de ir longo / curto ou manter uma posição. Essa flexibilidade nos permitirá criar vários "assessores" 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 base 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 Strategy requer que qualquer subclasse implemente o método generate_signals.
Para evitar que a classe Strategy seja instanciada diretamente (já que é abstrata!), É necessário usar os objetos ABCMeta e abstractmethod do módulo abc. Nós definimos uma propriedade da classe, chamada __metaclass__, para ser igual a ABCMeta e depois decoramos o método generate_signals com o decorador abstractmethod.
Embora a interface acima seja simples, 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 de estratégia nesta configuração é fornecer uma lista de sinais longos / curtos / suspensos para cada instrumento a ser enviado para um portfólio.
A classe Portfolio é onde a maioria da lógica de negociação residirá. Para este backtester de pesquisa, a Carteira é responsável por determinar o dimensionamento de posição, a análise de risco, a gestão de custos de transação e a gestão de execução (ou seja, ordens de mercado em aberto e de fecho de mercado). Posteriormente, essas tarefas serão divididas em componentes separados. No momento, eles serão encaminhados para uma aula.
Esta classe faz amplo uso de pandas e fornece um ótimo exemplo de onde a biblioteca pode economizar uma enorme quantidade de tempo, particularmente no que diz respeito à disputa de dados "clichê". Como um aparte, o principal truque com pandas e NumPy é evitar iterar sobre qualquer conjunto de dados usando o for d in. sintaxe. Isso ocorre porque o NumPy (que sustenta os pandas) otimiza o loop por operações vetorizadas. Assim, você verá poucas iterações diretas (se houver alguma) ao utilizar pandas.
O objetivo da classe Portfolio é, em última análise, produzir uma sequência de negociações e uma curva de capital, que será analisada pela classe Performance. Para conseguir isso, deve ser fornecida uma lista de recomendações de negociação de um objeto Strategy. Mais tarde, este será um grupo de objetos Strategy.
A classe Portfolio precisará ser informada sobre como o capital deve ser implantado para um determinado conjunto de sinais de negociação, como lidar com custos de transação e quais formulários de ordens serão utilizados. O objeto Estratégia está operando em barras de dados e, portanto, as premissas devem ser feitas em relação aos preços alcançados na execução de um pedido. Como o preço alto / baixo de qualquer barra é desconhecido a priori, só é possível usar os preços de abertura e fechamento para negociação. Na realidade, é impossível garantir que uma encomenda seja preenchida a um destes preços específicos quando se utiliza uma ordem de mercado, pelo que será, na melhor das hipóteses, uma aproximação.
Além das suposições sobre pedidos sendo preenchidos, este backtester irá ignorar todos os conceitos de restrições de margem / corretagem e assumirá que é possível ir de forma longa e curta em qualquer instrumento livremente, sem quaisquer restrições de liquidez. Isto é claramente uma suposição muito irrealista, mas é algo que pode ser relaxado mais tarde.
A listagem a seguir continua backtest. py:
Nesta fase, as classes base abstratas de Strategy e Portfolio foram introduzidas. Estamos agora em posição de gerar algumas implementações derivadas concretas dessas classes, a fim de produzir uma "estratégia de brinquedo" funcional.
Começaremos gerando uma subclasse de Estratégia chamada RandomForecastStrategy, cuja única tarefa é produzir sinais longos / curtos escolhidos aleatoriamente! Embora esta seja claramente uma estratégia comercial absurda, ela atenderá às nossas necessidades demonstrando a estrutura de backtesting orientada a objetos. Assim, iniciaremos um novo arquivo chamado random_forecast. py, com a listagem do preditor aleatório, da seguinte maneira:
Agora que temos um sistema de previsão "concreto", devemos criar uma implementação de um objeto Portfolio. Este objeto irá abranger a maioria do código de backtesting. Ele é projetado para criar dois DataFrames separados, o primeiro dos quais é um quadro de posições, usado para armazenar a quantidade de cada instrumento contido em qualquer barra específica. A segunda carteira, na verdade, contém o preço de mercado de todas as participações de cada barra, bem como uma contagem do dinheiro, assumindo um capital inicial. Isso acaba por fornecer uma curva de capital para 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 custos de transação, ordens de mercado, etc. Neste exemplo básico, considerei que seria possível usar um instrumento muito fácil, sem restrições ou margem, comprar ou vender diretamente ao preço de abertura da barra, custos de transação zero (englobando derrapagens, taxas e impacto no mercado) e especificando a quantidade de estoque diretamente para compra para cada negociação.
Esta é a continuação da listagem random_forecast. py:
Isso nos dá tudo o que precisamos para gerar uma curva de capital baseada em tal sistema. O passo final é amarrar tudo junto com uma função __main__:
A saída do programa é a seguinte. A sua será diferente da saída abaixo, dependendo do período selecionado e da semente aleatória usada:
Neste caso, a estratégia perdeu dinheiro, o que não é surpreendente, dada a natureza estocástica do previsor! As próximas etapas são criar um objeto Performance que aceite uma instância de portfólio e forneça 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 comissões e slippage do Interactive Brokers). Também podemos incluir diretamente um mecanismo de previsão em um objeto Strategy, que (esperançosamente) produzirá melhores resultados. Nos artigos a seguir, exploraremos esses conceitos com mais profundidade.
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.
No comments:
Post a Comment