Thursday, 12 April 2018

Estratégia de reversão média python


QuantStart.
Junte-se ao portal de membros privados da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento. Você encontrará um grupo bem informado de mentalistas quant pronto para responder suas perguntas comerciais mais importantes.
Confira meu ebook sobre o comércio de quant, onde eu ensino você como criar estratégias de negociação sistemáticas lucrativas com ferramentas Python, desde o início.
Dê uma olhada no meu novo ebook sobre estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas bayesianas, com Python e R.
Por Michael Halls-Moore em 20 de fevereiro de 2014.
Neste artigo, vamos considerar nossa primeira estratégia de negociação intradiária. Será usando uma idéia comercial clássica, a de "pares comerciais". Neste caso, vamos fazer uso de dois Exchange Traded Funds (ETFs), SPY e IWM, que são negociados na Bolsa de Valores de Nova York (NYSE) e tentam representar os índices do mercado de ações dos EUA, os S & P500 e Russell 2000, respectivamente.
A estratégia cria, em termos gerais, uma "propagação" entre o par de ETFs saudade de um e curto um montante do outro. A proporção de longo a curto pode ser definida de muitas maneiras, como a utilização de técnicas de coesão estatística de séries temporais. Nesse cenário, vamos calcular uma relação de cobertura entre SPY e IWM através de uma regressão linear rotativa. Isso nos permitirá criar uma "propagação" entre o SPY eo IWM, que é normalizado para um escore z. Os sinais de negociação serão gerados quando o escore z exceder certos limiares sob a crença de que a propagação reverterá para a média.
O raciocínio para a estratégia é que a SPY e a IWM caracterizam aproximadamente a mesma situação, a da economia de um grupo de corporações de grandes capitais e de capitais pequenos. A premissa é que, se alguém adotar a propagação dos preços, isso deve ser reverso, já que os eventos "locais" (no tempo) podem afetar separadamente os índices S & P500 ou Russell 2000 (como small-cap / large - diferenças de limite, datas de reequilíbrio ou negociações de bloco), a série de preços de longo prazo dos dois provavelmente será cointegrada.
A estratégia.
A estratégia é realizada nas seguintes etapas:
Dados - barras de 1 minuto de SPY e IWM são obtidas de abril de 2007 até fevereiro de 2014. Processamento - Os dados estão corretamente alinhados e as barras ausentes são mutuamente descartadas. Spread - A relação de cobertura entre os dois ETFs é calculada tomando uma regressão linear rotativa. Isso é definido como o coeficiente de regressão $ \ beta $ usando uma janela de lookback que se desloca para a frente em 1 barra e recalcula os coeficientes de regressão. Assim, a taxa de cobertura $ \ beta_i $, para o bar $ b_i $ é calculada entre os pontos $ b_ $ a $ b_ $ para um lookback de $ k $ bars. Z-Score - O escore padrão do spread é calculado da maneira usual. Isso significa subtrair a média (amostra) da propagação e dividir pelo desvio padrão (amostra) da propagação. O raciocínio para isso é tornar os parâmetros de limiar mais simples para interpet, uma vez que o z-score é uma quantidade sem dimensão. Eu deliberadamente introduzi uma polarização de lookahead nos cálculos, a fim de mostrar quão sutil pode ser. Tente e cuide disso! Operações - Os sinais longos são gerados quando o escore z negativo cai abaixo de um limite pré-determinado (ou pós-otimizado), enquanto os sinais curtos são o inverso disso. Os sinais de saída são gerados quando o escore z absoluto cai abaixo de um limite adicional. Para essa estratégia, eu (um pouco arbitrariamente) escolhei um limite de entrada absoluto de $ | z | = 2 $ e um limite de saída de $ | z | = 1 $. Supondo um comportamento de reversão médio na propagação, espero que capture esse relacionamento e ofereça um desempenho positivo.
Talvez a melhor maneira de entender a estratégia em profundidade é implementá-la. A seção a seguir descreve um código Python completo (arquivo único) para implementar esta estratégia de reversão média. Eu comande o código de forma liberal para ajudar a entender.
Implementação do Python.
Tal como acontece com todos os tutoriais Python / pandas, é necessário configurar um ambiente de pesquisa Python como descrito neste tutorial. Uma vez configurada, a primeira tarefa é importar as bibliotecas Python necessárias. Para este backtest, matplotlib e pandas são obrigatórios.
As versões específicas da biblioteca que estou usando são as seguintes:
Vamos continuar e importar os bibliotecários:
A seguinte função create_pairs_dataframe importa dois arquivos CSV contendo as barras intradias de dois símbolos. No nosso caso, isso será SPY e IWM. Em seguida, ele cria um conjunto de quadros de dados separados, que usa os índices de ambos os arquivos originais. Como os seus timestamps são susceptíveis de serem diferentes devido a negociações e erros perdidos, isso garante que teremos dados correspondentes. Este é um dos principais benefícios de usar uma biblioteca de análise de dados como pandas. O código "boilerplate" é tratado de maneira muito eficiente.
O próximo passo é realizar a regressão linear de rolamento entre SPY e IWM. Nessa instância, IWM é o preditor ('x') e SPY é a resposta ('y'). Define uma janela de lookback padrão de 100 barras. Conforme discutido acima, este é um parâmetro da estratégia. Para que a estratégia seja considerada robusta, idealmente queremos ver um perfil de retorno (ou outra medida de desempenho) como uma função convexa do período de lookback. Assim, em uma fase posterior do código, realizaremos uma análise de sensibilidade ao variar o período de lookback em um intervalo.
Uma vez que o coeficiente de rolamento beta é calculado no modelo de regressão linear para SPY-IWM, nós o adicionamos aos pares DataFrame e soltamos as linhas vazias. Isso constitui o primeiro conjunto de barras igual ao tamanho do lookback como medida de corte. Em seguida, criamos o spread dos dois ETFs como uma unidade de SPY e $ - \ beta_i $ unidades de IWM. Claramente, esta não é uma situação realista, pois estamos tomando quantidades fracionárias de IWM, o que não é possível em uma implementação real.
Finalmente, criamos a pontuação z da propagação, que é calculada subtraindo a média da propagação e normalizando pelo desvio padrão da propagação. Note-se que há um viés bastante parecido com a aparência aqui. Eu deliberadamente deixei isso no código, pois queria enfatizar o quão fácil é cometer um erro na pesquisa. A média eo desvio padrão são calculados para toda a série de tempo de propagação. Se isso for para refletir a verdadeira precisão histórica, essa informação não estaria disponível, pois isso implicitamente faz uso de informações futuras. Assim, devemos usar um meio de rolamento e stdev para calcular o escore z.
Em create_long_short_market_signals, os sinais de negociação são criados. Estes são calculados ao longo do spread quando o escore z excede negativamente um escore z negativo e diminui o spread quando o escore z excede positivamente um escore z positivo. O sinal de saída é dado quando o valor absoluto do escore z é menor ou igual a outro (menor em magnitude).
Para alcançar essa situação, é necessário saber, para cada barra, se a estratégia está "dentro" ou "fora" do mercado. long_market e short_market são duas variáveis ​​definidas para acompanhar as posições de mercado longo e curto. Infelizmente, isso é muito mais simples de codificar de forma iterativa em oposição a uma abordagem vetorializada e, portanto, é lento para calcular. Apesar dos bares de 1 minuto que exigem.
700.000 pontos de dados por arquivo CSV ainda é relativamente rápido para calcular em minha máquina de desktop mais antiga!
Para iterar sobre um pandas DataFrame (que é verdade que NÃO é uma operação comum) é necessário usar o método iterrows, que fornece um gerador sobre o qual iterar:
Nesta fase, atualizamos pares para conter os sinais longos / curtos reais, o que nos permite determinar se precisamos estar no mercado. Agora, precisamos criar um portfólio para acompanhar o valor de mercado das posições. A primeira tarefa é criar uma coluna de posições que combine os sinais longos e curtos. Isso conterá uma lista de elementos de $ (1,0, -1) $, com $ 1 $ representando uma posição longa / de mercado, US $ 0 $ que não representa nenhuma posição (deve ser encerrado) e $ -1 $ representando uma posição de curto / mercado . As colunas sym1 e sym2 representam os valores de mercado das posições SPY e IWM no final de cada barra.
Uma vez que os valores de mercado da ETF foram criados, os somamos para produzir um valor de mercado total no final de cada barra. Isso é transformado em um fluxo de devoluções pelo método pct_change para esse objeto da série. Linhas subsequentes de código eliminam as entradas incorretas (elementos NaN e inf) e, finalmente, calculam a curva de capital integral.
A função __main__ junta tudo. Os arquivos CSV intradiários estão localizados no caminho do datadir. Certifique-se de modificar o código abaixo para apontar para o seu diretório particular.
Para determinar quão sensível é a estratégia para o período de lookback, é necessário calcular uma métrica de desempenho para uma variedade de lookbacks. Eu escolhi a porcentagem total final de retorno do portfólio como a medida de desempenho e a faixa de lookback em $ [50,200] $ com incrementos de 10. Você pode ver no código a seguir que as funções anteriores estão envolvidas em um loop para este intervalo , com outros limiares mantidos fixos. A tarefa final é usar matplotlib para criar um gráfico de linha de lookbacks vs returns:
O gráfico do período de lookback versus retornos agora pode ser visto. Observe que existe um máximo "global" em torno de um lookback igual a 110 barras. Se tivéssemos visto uma situação em que o lookback fosse independente dos retornos, isso teria sido motivo de preocupação:
Análise de sensibilidade do período de lookback de regressão linear SPY-IWM.
Nenhum artigo de backtesting seria completo sem uma curva de equidade inclinada para cima! Assim, se você deseja traçar uma curva dos retornos cumulados versus tempo, você pode usar o seguinte código. Ele irá traçar o portfólio final gerado a partir do estudo de parâmetros de lookback. Assim, será necessário escolher o lookback dependendo do gráfico que deseja visualizar. O gráfico também traça os retornos de SPY no mesmo período para facilitar a comparação:
O gráfico de curva de equidade a seguir é para um período de lookback de 100 dias:
Análise de sensibilidade do período de lookback de regressão linear SPY-IWM.
Note-se que a redução da SPY é significativa em 2009 durante o período da crise financeira. A estratégia também teve um período volátil nesta fase. Observe também que o desempenho deteriorou-se um pouco no último ano devido à natureza fortemente tendencial da SPY neste período, o que reflete o índice S & P500.
Note que ainda temos que levar em consideração o viés de lookahead ao calcular o escore z do spread. Além disso, todos esses cálculos foram realizados sem custos de transação. Esta estratégia certamente funcionaria muito mal quando esses fatores forem levados em consideração. As taxas, a propagação / desistência de lance / pedido são todas atualmente desaparecidas. Além disso, a estratégia é negociada em unidades fracionárias de ETFs, o que também é muito pouco realista.
Em artigos posteriores, criaremos um backtester muito mais sofisticado baseado em eventos que levará esses fatores em consideração e nos dará uma confiança significativa na nossa curva de equidade e métricas de desempenho.
Apenas iniciando o comércio quantitativo?
3 razões para se inscrever para a lista de e-mails QuantStart:
1. Quant Trading Lessons.
Você terá acesso instantâneo a um curso de e-mail gratuito de 10 partes, repleto de sugestões e dicas para ajudá-lo a começar a negociação quantitativa!
2. Todo o conteúdo mais recente.
Todas as semanas, vou enviar-lhe um envoltório de todas as atividades no QuantStart para que você nunca mais perca uma postagem novamente.
Real, dicas de negociação viáveis, sem tonturas.

Estratégia de reversão média python
Puxe pedidos 0.
Participe do GitHub hoje.
O GitHub é o lar de mais de 20 milhões de desenvolvedores que trabalham juntos para hospedar e rever o código, gerenciar projetos e criar software juntos.
Clone com HTTPS.
Use o Git ou o check-out com o SVN usando o URL da web.
Um programa que simula a negociação de ações em tempo real usando um algoritmo básico de reversão média.
PYX é um programa flexível que simula a negociação de equidade usando diferentes algoritmos. O algoritmo atualmente utilizado é uma estratégia de reversão média. A PYX compra e vende partes de ações com base no preço comparado às suas bandas de bollinger superior e inferior.
Cria um banco de dados (SQLAlchemy) para armazenar cada transação e carteira. Cria uma carteira a partir da qual os fundos simulados serão adicionados e subtraídos. Calcula a média móvel exponencial de 50 dias para o estoque especificado. Calcula as bandas Bollinger superiores e inferiores com base nos 50 dias EMA Checks se o preço do estoque especificado for & gt; = ou & lt; = as bandas de bollinger superior e inferior, respectivamente, se o preço da ação for & lt; = a banda inferior de bollinger, o programa comprará ações Se o preço da ação for = & gt; a banda superior bollinger, o programa venderá ações compradas anteriormente. Cada transação é registrada em um banco de dados transaction_database. db com a seguinte informação: id | stock | symbol | buy / sell | price | ema | shares | date.
A reversão média é a teoria sugerindo que os preços e os retornos eventualmente se movem para a média ou a média. Isso significa que o PYX utiliza é chamado de média móvel exponencial de 50 dias.
PYX depende de duas dependências principais, yahoo_finance e sqlalchemy. O PYX também utiliza o módulo de data e data incorporado do Python 3.5.
Para instalar esses módulos com o PyPI, primeiro instale o pip, em cmd ou bash run:
pip install yahoo_finance.
pip instalar sqlalchemy.
Uma vez que os pacotes foram descompactados e instalados, o programa é bom para ser executado.
Equação para calcular o EMA de 50 dias:
Equação para calcular a banda superior de Bollinger:
upperBand = EMA * (1 + .02)
Equação para calcular a menor banda de bollinger:
lowerBand = EMA * (1 - .02)
Ajuste o .02 para aumentar e baixar as bandas de bollinger. Quanto maior você aumentar o número, menor será a probabilidade de estoque ser comprado.
Exemplo de bandas de Bollinger:
Um banco de dados com duas tabelas é criado na primeira inicialização do programa, carteiras e transações. Se não houver nenhum banco de dados transaction_database. db, um será criado. Uma carteira contendo um nome e um saldo também será criada e inserida em carteiras na primeira vez em que o programa for executado. Para alterar o equilíbrio das carteiras, simplesmente edite balance = '100000' na função main ().
Toda vez que as ações de uma ação são compradas e vendidas, uma linha é adicionada ao banco de dados de transações, código abaixo.
Para ajustar o número de ações que estão sendo compradas, altere as ações = '100' para as muitas partes que deseja que o programa compre.
A melhor maneira de executar o PYX e testar suas capacidades é executá-lo a partir de um servidor. Ao utilizar um programador de tarefas baseado em tempo como o Cron, você pode executar PYX a cada minuto, hora ou mesmo dia. Quanto mais frequente você executá-lo, menor será o desvio padrão para cada banda de bollinger, isso produzirá mais resultados.
Este programa não gasta dinheiro real, nem compra ações reais de ações. É simplesmente uma simulação.
&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.

Estratégia de reversão média python
Puxe pedidos 0.
Participe do GitHub hoje.
O GitHub é o lar de mais de 20 milhões de desenvolvedores que trabalham juntos para hospedar e rever o código, gerenciar projetos e criar software juntos.
Clone com HTTPS.
Use o Git ou o check-out com o SVN usando o URL da web.
Um modelo simples de negociação de ações comerciais na Interactive Brokers 'API lidando com (pseudo) estudos de dados de alta freqüência.
Refator e conforme as normas PEP8 Nova exibição de gráfico com 4 subparcelas.
Uma conta Interactive Brokers com gateway TWS / API (ou use a conta 'edemo / demouser') IbPy github / blampe / IbPy Pandas NumPy matplotlib.
A pasta de classes contém a pasta de modelos de arquivos de classe requerida contém uma pasta de params modelo de modelo simples que contém arquivos armazenando as várias configurações utilizadas. Execute o main. py para iniciar o modelo.
No momento presente, este modelo utiliza arbitragem estatística incorporando essas metodologias:
Bootstrapping o modelo com dados históricos para derivar parâmetros de estratégia utilizáveis ​​Reaprendizagem de séries temporais não homogêneas para séries temporais homogêneas Seleção de pares de ações altamente correlacionadas A capacidade de curto em um estoque e longo o outro. Usando taxa de volatilidade para detectar tendência para cima ou para baixo. Avaliação justa de segurança usando beta, ou a média em algum intervalo passado. One pandas DataFrame para armazenar preços, outro para armazenar valores de indicadores.
Gerar sinais de comércio e colocar ordens de compra / venda de mercado com base em todos os dados de ticks recebidos. Reavaliação de beta a cada intervalo em segundos.
E muito inspirado por esses artigos:
Eu escrevi um livro intitulado 'Mastering Python for Finance', discutindo a interface do IbPy com Interactive Brokers passo a passo. Também são discutidos vários outros tópicos, como análises, idéias comerciais algorítmicas, grandes dados e teoria financeira. Você pode achar util. Está disponível nos principais canais de vendas, incluindo Amazon, Safari Online e Barnes & amp; Noble, em brochura, Kindle e ebook. Obtenha:
Códigos fonte e índice de conteúdo no GitHub:
Veja esses livros incríveis também:
E quanto a futuros de negociação? Psst, eu tenho você coberto.
Simplesmente chamado 'The Gateway', é um aplicativo C # que expõe um soquete e o método API público exige a interface de Python com mercados futuros, incluindo CME, CBOT, NYSE, Eurex e ICE.
Eu adoraria estender esse modelo no futuro imprevisível:
Extendendo para mais de 2 títulos e negociação em preços ótimos Gerar sinais comerciais com base na correlação e co-integração Usando o PCA para a avaliação no próximo período Incluir regressões automáticas do vetor Conta para mudanças de regime (tendências ou estados de reversão média) Conta para quebras estruturais Usando EMA kernels em vez de um retangular adicionar em alfas (P / E, B / P ratios) e Kalman filtro de predição.
Qualquer título listado não é uma solicitação de negociação Este modelo não foi provado ser rentável em uma conta ao vivo, e não serei responsável por qualquer resultado de suas negociações. Se você for rentável, as notas de agradecimento são bem-vindas.
Claro, eu tive algumas perguntas "como é esta alta freqüência" ou "não para UHFT" ou "isso não está em frente". Vamos dar uma olhada nessas definições:
Financiamento de alta freqüência: o estudo de dados de cheques recebidos que chegam a altas freqüências, dizem centenas de carrapatos por segundo. O financiamento de alta freqüência visa derivar fatos estilizados a partir de sinais de alta freqüência. Comércio de alta frequência: o volume de negócios de posições em altas frequências; As posições normalmente são mantidas no máximo em segundos, o que equivale a centenas de negócios por segundo.
Este modelo pretende incorporar as duas funções acima e apresentar uma visão simplista para os comerciantes que desejam automatizar seus negócios, começar a operar Python ou usar uma plataforma de negociação gratuita.
Eu não encontrei nenhum modelo completo de negociação de alta freqüência ao redor, então aqui está um para começar do chão e correr. Este modelo nunca foi usado com uma conta real. Todos os testes foram feitos somente na conta de demonstração. Os parâmetros de estratégia incluídos são condições ideais teóricas, que não foram ajustadas para resultados testados novamente. Este projeto ainda é um trabalho em andamento. Um bom modelo pode levar meses ou mesmo anos!
&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.

Estratégia de reversão média python
Eu sou novo tanto em Quantopian quanto na negociação em geral, mas eu tentei implementar uma estratégia de reversão média. Eu estou comprando ações de baixo desempenho e vendendo os estoques de alto desempenho todos os dias, ponderando o desempenho de tudo em relação às demais ações da carteira.
Neste ponto, estou tentando interpretar os resultados, mas não tenho certeza de como os resultados são do algoritmo e quanto são simplesmente uma conseqüência das ações que eu selecionei.
Se alguém tiver dúvidas, comentários ou sugestões, avise-me!
Me diverti muito aprendendo e trabalhando com a plataforma.
Estou olhando o código-fonte do seu algoritmo e não consigo seguir a lógica do seu loop final. Você pode adicionar algumas explicações / comentários ao trecho de código?
Claro, deixe-me tentar explicar o que estava tentando fazer.
Eu passo através de cada estoque que eu estou assistindo e calculo quantas dessas ações eu comprar ou vender com a minha posição atual, dinheiro e desempenho. O valor a comprar é o número máximo de ações que eu poderia comprar (caixa / preço de ações) ponderado pelo desempenho em relação às demais ações da minha carteira. O valor que queremos vender é o valor desse estoque que possuímos ponderado da mesma maneira.
Eu não estou 100% convencido da validade desta lógica (eu sinto que deveria estar ponderando os estoques que tiveram ganhos e perdas independentemente uns dos outros, mas eu ainda não o implementei). O meu raciocínio era que, se assumirmos que o estoque é significativo, é sensato comprar mais dos que tiveram um desempenho ruim e vender rapidamente mais do que estava funcionando bem. As ponderações foram minha maneira de expressar essa idéia.
A próxima parte implementa a compra e venda. Nós calculamos o quanto compraríamos ou vendemos para cada estoque, mas apenas compramos ou vendemos se a mudança de porcentagem normalizada for negativa ou positiva.
Nós também não queremos enviar uma ordem de compra ou venda, a menos que tenhamos atingido algum tipo de limite para o quanto isso mudou. Nos casos em que a mudança total foi muito pequena, apenas nos seguramos. Pode valer a pena considerar o desempenho das ações a partir do ponto em que compramos o caso em que estamos vendendo, mas eu não consegui testar isso.
Espero que seja útil, deixe-me saber se você tem outras questões.
Muito obrigado por essa resposta. Isso ajuda muito.
Feliz eu poderia ajudar!
Eu segui adiante e implementei as mudanças que eu estava pensando, e parece melhorar o algoritmo. Confira!
O material deste site é fornecido apenas para fins informativos e não constitui uma oferta de venda, uma solicitação de compra ou uma recomendação ou endosso para qualquer segurança ou estratégia, nem constitui uma oferta de prestação de serviços de consultoria de investimento pela Quantopian. Além disso, o material não oferece nenhuma opinião em relação à adequação de qualquer segurança ou investimento específico. Nenhuma informação contida neste documento deve ser considerada como uma sugestão para se envolver ou abster-se de qualquer curso de ação relacionado ao investimento, já que nenhuma das empresas atacadas ou nenhuma das suas afiliadas está a comprometer-se a fornecer conselhos de investimento, atuar como conselheiro de qualquer plano ou entidade sujeito a A Lei de Segurança de Renda de Aposentadoria do Empregado de 1974, conforme alterada, conta de aposentadoria individual ou anuidade de aposentadoria individual, ou dar conselhos em capacidade fiduciária em relação aos materiais aqui apresentados. Se você é um aposentadorio individual ou outro investidor, entre em contato com seu consultor financeiro ou outro fiduciário não relacionado a Quantopian sobre se qualquer idéia, estratégia, produto ou serviço de investimento descrito aqui pode ser apropriado para suas circunstâncias. Todos os investimentos envolvem risco, incluindo perda de principal. A Quantopian não oferece garantias sobre a precisão ou integridade das opiniões expressas no site. Os pontos de vista estão sujeitos a alterações e podem ter se tornado pouco confiáveis ​​por vários motivos, incluindo mudanças nas condições do mercado ou nas circunstâncias econômicas.
Eu pensei que tentaria testar o algoritmo contra os dez melhores dividendos da NYSE nos últimos doze meses, e obtive esse resultado: consideravelmente pior!
Desculpe, algo deu errado. Tente novamente ou contate-nos enviando comentários.
Você enviou um ticket de suporte com sucesso.
Nossa equipe de suporte estará em contato em breve.
O material deste site é fornecido apenas para fins informativos e não constitui uma oferta de venda, uma solicitação de compra ou uma recomendação ou endosso para qualquer segurança ou estratégia, nem constitui uma oferta de prestação de serviços de consultoria de investimento pela Quantopian.
Além disso, o material não oferece nenhuma opinião em relação à adequação de qualquer segurança ou investimento específico. Nenhuma informação contida neste documento deve ser considerada como uma sugestão para se envolver ou abster-se de qualquer curso de ação relacionado ao investimento, já que nenhuma das empresas atacadas ou nenhuma das suas afiliadas está a comprometer-se a fornecer conselhos de investimento, atuar como conselheiro de qualquer plano ou entidade sujeito a A Lei de Segurança de Renda de Aposentadoria do Empregado de 1974, conforme alterada, conta de aposentadoria individual ou anuidade de aposentadoria individual, ou dar conselhos em capacidade fiduciária em relação aos materiais aqui apresentados. Se você é um aposentadorio individual ou outro investidor, entre em contato com seu consultor financeiro ou outro fiduciário não relacionado a Quantopian sobre se qualquer idéia, estratégia, produto ou serviço de investimento descrito aqui pode ser apropriado para suas circunstâncias. Todos os investimentos envolvem risco, incluindo perda de principal. A Quantopian não oferece garantias sobre a precisão ou integridade das opiniões expressas no site. Os pontos de vista estão sujeitos a alterações e podem ter se tornado pouco confiáveis ​​por vários motivos, incluindo mudanças nas condições do mercado ou nas circunstâncias econômicas.
O material deste site é fornecido apenas para fins informativos e não constitui uma oferta de venda, uma solicitação de compra ou uma recomendação ou endosso para qualquer segurança ou estratégia, nem constitui uma oferta de prestação de serviços de consultoria de investimento pela Quantopian.
Além disso, o material não oferece nenhuma opinião em relação à adequação de qualquer segurança ou investimento específico. Nenhuma informação contida neste documento deve ser considerada como uma sugestão para se envolver ou abster-se de qualquer curso de ação relacionado ao investimento, já que nenhuma das empresas atacadas ou nenhuma das suas afiliadas está a comprometer-se a fornecer conselhos de investimento, atuar como conselheiro de qualquer plano ou entidade sujeito a A Lei de Segurança de Renda de Aposentadoria do Empregado de 1974, conforme alterada, conta de aposentadoria individual ou anuidade de aposentadoria individual, ou dar conselhos em capacidade fiduciária em relação aos materiais aqui apresentados. Se você é um aposentadorio individual ou outro investidor, entre em contato com seu consultor financeiro ou outro fiduciário não relacionado a Quantopian sobre se qualquer idéia, estratégia, produto ou serviço de investimento descrito aqui pode ser apropriado para suas circunstâncias. Todos os investimentos envolvem risco, incluindo perda de principal. A Quantopian não oferece garantias sobre a precisão ou integridade das opiniões expressas no site. Os pontos de vista estão sujeitos a alterações e podem ter se tornado pouco confiáveis ​​por vários motivos, incluindo mudanças nas condições do mercado ou nas circunstâncias econômicas.

Reversão média de teste de teste de python - Parte 3.
Bem-vindo de volta a todos, finalmente encontrei um pouco de tempo para chegar ao fim desta série curta sobre a estratégia de reversão média Python Backtesting em pares ETF.
Na última publicação, chegamos até a criação da série de propagação entre as duas séries de preços da ETF em questão (primeiro executando uma regressão linear para encontrar a relação de hedge) e executou um teste Aumentado Dickey Fuller, juntamente com o cálculo da meia-vida de que espalham séries para ver se era um candidato decente para um par de estratégias negociáveis.
Agora, temos que escrever a parte do script que irá calcular o & # 8220; normalizado & # 8221; Z-Score da série de propagação, e crie um & # 8220; bollinger-band & # 8221; sistema de entrada e saída de estilo em que negociações curtas são inseridas se a pontuação Z normalizada sobe acima de 2 e sai quando cai abaixo de 0 e vice-versa para negociações longas (ou seja, o Z-Score deve cair abaixo de -2 para entrar e saia quando ele sobe acima de 0).
Agora, na verdade, vamos calcular o Z-Score usando uma janela de rolamento para o desvio padrão e médio, definido como a semi-vida previamente calculada na publicação anterior do blog. Isso nos poupa de comprometer um viés avançado usando a média em todo o período, ou de escolher uma janela de visualização arbitrária que precisaria ser otimizada e poderia levar a uma tendência de mineração de dados.
Calculamos e traçamos a classificação Z normalizada da seguinte forma:
meanSpread = df1.spread. rolling (window = halflife).mean () stdSpread = df1.spread. rolling (window = halflife).std () df1 ['zScore'] = (df1.spread-meanSpread) / stdSpread df1 [ 'zScore']. plot ()
Ok, então a próxima parte pode ser um pouco complicada; o que precisamos terminar é uma coluna no nosso quadro de dados que significa se, atualmente, deveríamos ser longos, curtos ou planos em termos de posição. Podemos realizar isso seguindo alguns passos.
Em primeiro lugar, configuraremos uma coluna chamada & # 8220; num units long & # 8221; o que significará quando precisamos ser longos preenchendo essas linhas com um 1 e preencher as linhas restantes com um 0 para significar não uma posição longa.
Em seguida, faremos exatamente o mesmo para posições curtas, configurando uma coluna chamada & # 8220; num units short & # 8221; e preencha essas linhas onde devemos ser curtos com um -1 e aqueles onde não há uma posição curta com um 0.
Isto é conseguido da seguinte forma (também estabelecemos nossa entrada absoluta e saio Z-Scores como 2 e 0, respectivamente):
entryZscore = 2 exitZscore = 0 #set up num units long df1 ['long entry'] = ((df1.zScore & lt; - entryZscore) e (df1.zScore. shift (1) & gt; - entryZscore)) df1 [' saída longa '] = ((df1.zScore & gt; - exitZscore) & (df1.zScore. shift (1) & lt; - exitZscore)) df1 [' num units long '] = np. nan df1.loc [df1 [ 'entrada longa'], 'num units long'] = 1 df1.loc [df1 ['long exit'], 'num units long'] = 0 df1 ['num units long'] [0] = 0 df1 [' num units long '] = df1 [' num units long ']. fillna (method =' pad ') # set up num unidades short df1 [' short entry '] = ((df1.zScore & gt; entryZscore) e (df1.zScore. shift (1) & lt; entryZscore)) df1 ['short exit'] = ((df1.zScore & lt; exitZscore) e (df1.zScore. shift (1) & gt; exitZscore)) df1.loc [df1 ['short entry'], 'num units short'] = -1 df1.loc [df1 ['short exit'], 'num units short'] = 0 df1 ['num units short'] [0] = 0 df1 ['num units short'] = df1 ['num units short']. fillna (method = 'pad')
Agora, podemos simplesmente criar outra coluna, que resume as unidades numéricas de & # 8220; longas & # 8221; e & # 8220; num units short & # 8221; para nos obter nosso & # 8220; numUnits & # 8221; & # 8211; a posição geral em que nosso portfólio deveria estar nesse momento; quer longo (1), curto (-1) ou plano (0).
Também geraremos uma coluna contendo a variação percentual da série de spread e, em seguida, geraremos uma coluna de retorno de portfólio, multiplicando a variação percentual das séries de spread pela atual retenção da carteira (longa, curta ou plana).
Os retornos diários da carteira são então adicionados cumulativamente para gerar uma curva de patrimônio, realizada em & # 8220; cum rets & # 8221 ;.
df1 ['numUnits'] = df1 ['num units long'] + df1 ['num units short'] df1 ['spread pct ch'] = (df1 ['spread'] - df1 ['spread']. shift ( 1)) / ((df1 ['x'] * abs (df1 ['hr']) + df1 ['y']) df1 ['port rets'] = df1 ['spread pct ch'] * df1 [ 'numUnits']. shift (1) df1 ['cum rets'] = df1 ['port rets']. cumsum () df1 ['cum rets'] = df1 ['cum rets'] + 1.
Agora podemos traçar a curva de patrimônio da carteira da seguinte forma:
plt. plot (df1 ['cum rets']) plt. xlabel (i [1]) plt. ylabel (i [0]) plt. show ()
Agora, tudo o que restamos é calcular a Razão de Sharpe e a Taxa de Crescimento Contábil Anual (CAGR):
sharpe = ((df1 ['port rets']. mean () / df1 ['port rets']. std ()) * sqrt (252)) start_val = 1 end_val = df1 ['cum rets']. iat [- 1] start_date = df1.iloc [0].name end_date = df1.iloc [-1].name days = (end_date - start_date).days CAGR = round (((float (end_val) / float (start_val)) ** (252.0 / dias)) - 1,4) imprimir "CAGR = <>%".format (CAGR * 100) imprimir "Sharpe Ratio = <>".format (round (sharpe, 2))
CAGR = 0,33% Razão de Sharpe = 0,09.
Wow ok, então esse resultado não parece muito bom em termos de retorno e # 8211; dificilmente melhor do que plana e quando as taxas de transação e os custos de negociação são levados em consideração que será um retorno geral negativo.
Agora, acho que tudo o que resta é testar a estratégia em diferentes pares ETF e em diferentes intervalos de tempo.
Nós iremos sobre isso na próxima e última publicação do blog sobre esta estratégia de reversão de significados.
Uma advertência final para tudo isso, é que eu tentei o meu melhor para escrever este Python Backtest de uma maneira precisa e lógica # 8211; Se alguém pode detectar erros no código, seja a partir de uma perspectiva de script ou mesmo de uma perspectiva de erro de estratégia fundamental, me avise na seção de comentários. Lembre-se de que ainda estou aprendendo Python, então minha palavra está longe, longe do evangelho por qualquer meio.
Eu tentarei não deixá-lo tão longo até a próxima postagem desta vez & # 8211; Eu preciso de um chute no culo para estar um pouco mais ativo com minhas atualizações.
Posts Relacionados.
Python Backtesting Mean Reversion & # 8211; Parte 2.
Reversão média de teste de teste de python - Parte 4.
8 Comentários.
vai bem até a linha:
Oi, sim, esta é uma solução fácil e # 8230; os pandas & # 8220; rolling & # 8221; A função apenas aceita inteiros como a janela, enquanto que a variável de semi-vida é atualmente um número de ponto flutuante. Basta lançar a semi-vida como um número inteiro e você está bem.
Então, apenas adicione a seguinte linha:
E você deve ser bom para ir!
Você tentou calcular taxas de cobertura por TLS em vez de OLS? recentemente, eu vi um pdf de Paul Teetor onde ele o descreveu e soa "# img. logical.
Ei, obrigado pela postagem. Tenho uma pergunta sobre a seguinte linha:
Você chama isso & # 8216; spread pct change & # 8217; mas este cálculo é diferente da mudança normal do pct.
Normalmente, no denominador é o primeiro valor (df1 [& # 8216; spread & # 8217;]. Shift (1) & # 8211; no nosso caso), em vez disso, você coloca, se eu entender corretamente, a soma de dinheiro (ou unidades) ) de ambos os ativos.
Você poderia explicar o porquê?
Eu calculei o retorno encontrando: mudança de pct de x + relação de cobertura * mudança de página de y.
Oi, a maneira como eu vi isso era a seguinte & # 8230;
Digamos para o argumento que você calculou uma relação de hedge de -1, então, para cada unidade de x que você compra, você vende 1 unidade de y. Deixe dizer que o preço de x = $ 10 e o preço de y = $ 15 em algum momento, T, de modo que o spread seja de US $ 5.
Se, ao mudar para o tempo T + 1, o preço de x permanece em 10, eo preço de y cai para US $ 14, então você ganhou $ 1 na venda de y, se o denominador do & # 8220; spread pct change & # 8221; foi a propagação inicial no tempo T, então representaria uma mudança (5 & # 8211; 4) / 5 = 20% e um lucro de 20% & # 8220 ;. Mas você realmente não fez 20% apenas porque o spread mudou em US $ 1.
Eu acho que um melhor denominador de uso é o valor bruto da carteira; isso é o $ 10 + $ 15 que representaria um retorno de (5 & # 8211; 4) / (10 + 15) = 4%.
É sempre difícil conceituar os retornos percentuais das carteiras longas / curtas, pois você realmente recebe fundos da venda curta de ativos, o que, teoricamente, pode causar o seu investimento inicial # 82221; para ser zero, o que todos sabemos resultados em um retorno sem sentido do infinito.
Eu escolhi usar o valor absoluto do portfólio longo / curto como mencionado no livro de Ernie Chan & # 8220; Algorithmic Trading Winning Strategies and Their Rationale & # 8221;

MEU ESTRATÉGIAS DE REVERSÃO EM PYTHON (Curso Online) Pelo Dr. Ernest P. Chan.
Oi pessoal, encontrei esse curso do EP Chan sobre estratégias de reversão médias. Parece bastante bom para o preço, vale a pena conferir. Eu usei o código de cupom MRS35 e consegui um desconto de + 35%. Não tenho certeza se ainda está ativo, veja se isso funciona para você. Ligação.
Este é um curso de certificação da Quantinsti - Instituto de Pesquisa e Treinamento de Algorítmica e pioneira da Ásia, focado na preparação de profissionais de mercado financeiro para o campo contemporâneo de Negociação Algorítmica e de Alta Freqüência. Esta é a primeira vez que lançamos o curso em colaboração com Ernest Chan, que é o diretor-gerente da QTS Capital Management, na Quantra. Este curso irá discutir quatro tipos de estratégias de negociação de reversão média. Primeiro, vamos discutir a estacionaria para uma única série de preços e criar uma estratégia de negociação de reversão média se a série de preços estiver estacionada. Em segundo lugar, aprenderemos sobre um portfólio de instrumentos que são cointegrados e criamos uma estratégia de reversão média em pares e trigêmeos. A terceira estratégia que discutiremos neste curso é para uma cesta de ações, que é a estratégia Index Arbitrage, que também é uma extensão de pares e trigêmeos. A estratégia final que aprenderemos é Long-Short Portfolio, que se baseia na reversão da média transversal. Juntamente com essas estratégias, também discutiremos diferentes técnicas estatísticas, nomeadamente o teste Augmented Dickey-Fuller (ADF), teste CADF, Half-life, teste Johansen, etc., para detectar estacionança e cointegração de um portfólio de instrumentos. Além dos conceitos teóricos, é fornecido um código Python para download para todas as quatro estratégias, juntamente com muita codificação prática em exercícios de codificação interativa.
Quem pode se beneficiar deste curso?
O objetivo geral deste curso é fornecer um guia prático para significar reverter as estratégias de negociação que podem ser facilmente implementadas pelos comerciantes de varejo e institucionais. Este curso pode ser usado por comerciantes, analistas, pesquisadores, profissionais de ensino e estudantes. Qualquer pessoa que queira aprender sobre as estratégias de reversão média e quer otimizar seu desempenho de estratégia é perfeitamente adequada para este curso.
Benefícios de se inscrever neste curso:
Saiba mais sobre estacionança e teste de estacionaria de uma única série de preços.
Saiba mais sobre cointegração e teste de cointegração de duas séries de preços.
Aprenda a criar estratégias de reversão significativas e compreenda os problemas práticos encontrados na negociação ao vivo.
Saiba como criar uma estratégia de arbitragem de índice e compreender as dificuldades na implementação da estratégia de arbitragem de índice.
Aprenda a criar estratégias de portfólio de longo prazo e compreenda como refinar a estratégia.
Saiba mais sobre a importância de parar a perda na implementação de estratégias de Reverting Média.
Você receberá todos os códigos de estratégia em um notebook iPython.
Você receberá seu próprio ambiente de codificação Python onde você pode praticar os códigos.
Oportunidade de ser certificada pela QuantInsti.
Inscreva-se uma vez e obtenha acesso vitalício ao curso!
Ao bater palmas mais ou menos, você pode nos indicar quais são as histórias que realmente se destacam.

No comments:

Post a Comment