суббота, 7 апреля 2018 г.

Pair trading python


Estratégia de negociação de par 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.
Uma implementação simples de uma estratégia de negociação de pares.
Este roteiro foi parte de um documento de seminário que fiz para um curso de econometria financeira na minha universidade. Precisa de muita melhoria, mas continuarei a atualizá-la.
&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.

Pares de negociação de arbitragem estatística em Python: usando correlação, integração de cointegramentos e Engle-Granger.
Pós-navegação.
Esta é a primeira iteração da minha exploração em troca de pares. Pairs trading é um tipo de arbitragem estatística que tenta aproveitar os ativos com preços baixos no mercado.
Arbitrage é um & # 8216; livre de risco & # 8217; estratégia de negociação que tenta explorar ineficiências em um ambiente de mercado. Um exemplo clássico de arbitragem tecnológica é a arbitragem ETF. Os ETFs (Exchange Traded Funds) consistem em uma cesta de ações que permite aos comerciantes investir em um único instrumento, mantendo-se bem diversificado em todo um setor. Os ETFs podem representar setores (XLK: Tecnologia), títulos (HYG: High Yield Bonds) e até mesmo os principais índices (SPY: Dow Jones Industrials). Os ETFs são constituídos por uma série de ações diferentes que são agrupadas para criar um fundo. Se um comerciante tem a quantidade correta de ações, ele pode realmente ir ao gerente do ETF e trocar seus estoques por um ETF. Da mesma forma, se você possui um ETF, você pode ir ao gestor do fundo e resgatar seu ETF para os estoques subjacentes. Então, se um ETF fosse composto por 1 GOOG, 2 AAPL e 5 IBM, um comerciante poderia fornecer todas as peças ao ETF e resgatar e ETF, ou resgatar seu ETF para as ações. A oportunidade de um rbitrage ocorre quando há uma discrepância de preço entre o preço do ETF e o preço do subjacente, uma vez que estes devem ser sempre iguais. No entanto, existe uma pequena oportunidade para alguns fabricantes de mercado se beneficiar com essas pequenas discrepâncias. As empresas de produção de mercado como a Jane Street Capital dedicam recursos significativos ao desenvolvimento do hardware mais sofisticado para explorar as pequenas oportunidades de arbitragem que existem neste espaço.
A tabela abaixo mostra como um ETF do Google, Apple e IBM pode ser mispriced contra o que as ações individuais estão negociando. Você pode ver que o ETF vale menos do que os estoques individuais. Isso significa que você poderia ter um comércio livre de risco se você comprar o ETF e vender os estoques individuais exatamente no mesmo momento.
Oportunidades como esta só podem ser aproveitadas pelos fabricantes de mercado profissionais com fórmulas avançadas e uma forte infra-estrutura tecnológica. Esses tipos de negócios ocorrem em milissegundos e não fornecem uma oportunidade de negociação viável para os comerciantes de varejo. Por isso, nos concentraremos em Arbitragem Estatística, que pode ocorrer em semanas ou meses.
Arbitragem estatística.
Arbitragem estatística não é tão livre de riscos e # 8217; Em vez de explorar as ineficiências do mercado, você faz certos pressupostos sobre como os preços devem se mover em relação um ao outro. Por exemplo, suponha que duas empresas Ford (F) e General Motors (GM) tenham movimentos de preços semelhantes ao longo dos últimos anos.
Dados financeiros de Quandl.
Você pode assumir que, se esses dois estoques divergem, eles deveriam eventualmente re-convergir. Arbitragem estatística concentra-se nesta ideia. Pode-se dizer que é uma estratégia de reversão média, que pressupõe que os preços das ações tendem a reverter para a média. Pairs Trading é a idéia de que existe algum subconjunto de pares de ações que tendem a convergir e alcançar seu equilíbrio teórico ao longo do tempo. O objetivo do Pairs Trading é monitorar os estoques que se mantêm em conjunto e identificar quando eles começam a divergir. Ao comprar a equidade subvalorizada e vender a equidade sobrevalorizada, você espera capturar a convergência de volta ao equilíbrio. Vou descrever os métodos que usei para descobrir ações correlacionadas no mercado, bem como examinar alguns métodos para negociação nos pares.
Identificando estoques correlacionados.
Coeficiente de Pearson.
Antes que você possa começar a usar Arbitragem Estatística para realizar Pairs Trading, você deve identificar um conjunto de ações que se movem juntas. Existem vários métodos para pesquisar ações correlacionadas. Nesta seção, analisarei um método para identificar a correlação nos movimentos do preço das ações. O método usa dados históricos para calcular um Coeficiente de Pearson que representa a correlação de duas ações no passado. A abordagem geral é tirar a distância média dos preços e fornecer uma pontuação. O Coeficiente Pearson é calculado abaixo.
Pearson & # 8217; s Coefficient Formula.
Nesta fórmula, X e Y são dois estoques diferentes, e r, é o Coeficiente de Pearson & # 8217; s. O próximo r é para 1,0, quanto mais correlacionados forem os dois estoques. Inversamente, o fechamento r é para -1,0, quanto mais inversamente estão correlacionados (X sobe, Y desce).
Matriz de correlação.
Para identificar estoques correlacionados, você deve pesquisar todas as combinações de pares de ações no mercado e comparar seus respectivos Coeficientes Pearson. Isso é difícil, a menos que você seja fluente em Python! (Don & # 8217; t se preocupe, toda a fonte está abaixo). Comecei por produzir uma matriz de correlação que destacaria as ações que estavam altamente correlacionadas. Abaixo está um exemplo de uma visualização usando Pearson & # 8217; s Coefficient para comparar correlações entre ações. Estes valores foram calculados utilizando dados de estoque de Quandl de 1 de janeiro de 2018 a 1 de dezembro de 2018.
Matriz de correlação, incluindo vários estoques de consumo discricionário e tecnologia.
Se você observar melhor a figura, você começará a notar alguns resultados interessantes. Em primeiro lugar, GOOG e GOOGL têm uma correlação muito alta entre si. Isso faz sentido intuitivo porque GOOG e GOOGL são patrimônio na mesma empresa. Você também pode ver que FB, MSFT e GOOG / GOOGL também possuem fatores de correlação muito altos. Também é interessante ver que AAPL não se encaixa no clube de ações correlacionadas. Outro resultado interessante é que a IBM realmente tem correlação negativa com o resto dos estoques escolhidos. Eu escolhi as próximas quatro imagens para comparar GOOGL, MSFT, AAPL e o desempenho da IBM versus o GOOG. Tente comparar o valor de correlação calculado na matriz de correlação com os padrões de estoque abaixo.
Isso ilustra com mais detalhes como GOOG / GOOGL estão muito correlacionados. Em seguida, desenvolveremos uma estratégia que observa esses pares e negociações quando divergem. GOOG / AAPL e GOOG / IBM têm coeficientes de correlação mais baixos e mostra as imagens acima. Apple e Google convergem ligeiramente, mas o tempo é tão aleatório que é difícil fornecer uma alta correlação. GOOG / IBM quase parece se mover oposta um do outro. À medida que a IBM avança, nos estágios iniciais, GOOG desce. Isso também continua nos meses mais recentes.
A matriz de correlação acima inclui 14 títulos. Obviamente, há mais de 14 ações na troca. Esta função pode ser executada em todo o conjunto de dados (aproximadamente 3.000 ações), e fornece uma matriz de correlação 3000 e 3000; É difícil exibir os resultados visualmente, mas a fonte será incluída nesta publicação. Ele permite que você forneça uma lista de tickers e retornará todos os pares de ações que tenham uma classificação de correlação acima de um limite fornecido. Este é um bom método para pesquisar rapidamente todos os estoques correlacionados. Para os propósitos deste blog, vou me concentrar apenas em um pequeno subconjunto dos potenciais pares de negociação.
Cointegração.
Cointegration é uma abordagem que tenta modelar processos estacionários. A estacionarização descreve os processos que se projetam horizontalmente. Harris & amp; Sollis postula que um processo y está parado se e somente se todas as seguintes condições forem satisfeitas:
Se um processo segue essas propriedades, podemos usar cointegração para modelar esse processo. Obviamente, os preços das ações não se movem em um caminho estacionário. No entanto, se você tiver um par de ações, esse movimento com correlação, as diferenças nos preços, devem ser estacionárias. É assim que a cointegração pode ser aplicada ao comércio de pares.
O método padrão de avaliação da cointegração é estimar a relação linear entre os dois preços das ações usando uma regressão linear. Se assumirmos a estacionaridade, o relacionamento deve ser linear de acordo com os princípios acima, e se você tiver um preço, você poderá determinar o preço do outro com base no desempenho passado. O modelo de regressão segue a forma:
Onde P At é o preço do estoque A no tempo t, e P Bt é o preço do estoque B no tempo t. γ é chamado de coeficiente de cointegração. Isto é suposto representar o slop da regressão, ou a quantidade de estoque A aumenta por um aumento de um por cento no estoque B. ε t é o erro residual no tempo t. Sob perfeita correlação, ε t deve ser zero para todos os t. Se a qualquer momento, ε t não é zero, é uma indicação de que um par de ações correlacionado é divergente. Podemos reescrever formalmente esta equação para isolar esse valor e chegar a uma equação que nos dará um indicador de divergência.
Onde S t é uma variável aleatória média zero representando o erro longe do processo estacionário. Abaixo está uma trama de S t. comparando St da fórmula acima. Observe como, embora ele se mova para cima e para baixo, o processo é bastante negativo. Pelo menos um retorno muito mais significativo do que um preço das ações isoladamente. Também incluo a média total nos últimos dois anos. Compare o gráfico residual com o gráfico de preços normalizado para ver como os dois se relacionam.
Eu indiquei os dois picos no gráfico Residuals. À medida que o preço do estoque B aumenta, S t aumenta, e vice-versa. Stock B neste cenário é MSFT, então, quando S t aumenta muito além da média, você pode concluir que a Microsoft pode estar sobrevalorada em comparação com o Google. Isso proporcionaria uma oportunidade comercial. Você pode MSFT curto e GOOGL longo. E você pode ver que esses dois estoques convergem depois que os picos surgem. Isso sugere que pode haver uma estratégia viável em troca de pares depois de tudo.
A partir da escrita deste, 12/22/2018, a Microsoft está negociando em US $ 63,78, e o Google (GOOGL) está negociando em US $ 809,62. Parece que esses dois estoques começaram a divergir, e uma convergência deve ocorrer em breve. O tempo é a parte mais difícil sobre o mercado de ações, mas essa estratégia deve sugerir que a MSFT não fornece a mesma quantidade de potencial positivo ao lado do GOOGL. Um comerciante que usa a estratégia de negociação de pares desejaria estoque longo GOOGL hoje, e seja curto, ou seja plano em MSFT, dependendo das preferências de risco dos investidores.
Sinais de entrada e saída.
Até agora, identificamos pares de ações correlacionadas e construímos um modelo para mostrar-nos sobre valores avaliados e subvalorizados em relação uns aos outros. Agora, a parte mais importante, é como podemos trocar isso. Essa estratégia pode ser usada em todos os pares correlacionados, mas muitas vezes alguns pares estão mais correlacionados do que outros. Se você olha GOOG e GOOGL, estes são altamente correlacionados, mas muito raramente eles divergem. No entanto, se você detectar uma divergência, você definitivamente deve entrar no comércio.
A maneira recomendada de trocar isso é definir um limite que, se sua parcela residual estiver vazia, você deve entrar. Lembre-se, se maior o residual, o estoque B sobrevalorizado é o estoque A. Portanto, se o seu gráfico de resíduos se mover acima do seu limite, você gostaria de estoque curto B e estoque longo A. Do mesmo modo, se os resíduos se movessem abaixo do seu limite, O estoque A seria sobrevalorizado em relação ao estoque B. Neste caso, você gostaria de curto B e longo A para capturar a re-convergência.
Vindo com o limite é difícil e pode variar de acordo com os tipos de ações que você está negociando. Seu objetivo é capturar o tempo mais lucrativo para entrar em um comércio. Abaixo está um exemplo de uma maneira de identificar potenciais pontos de ruptura. Eu tenho linhas de grade de lugares para marcadores de desvio padrão. Este é um foi quantificar o quanto de um outlier é um movimento específico. Quanto mais longe da média (quanto mais desvios padrão), mais provável é que nós estamos experimentando uma divergência.
Isso nos dá uma abordagem possível para encontrar pontos de compra e venda. Procure classificações residuais que estejam mais de 1,5 desvios padrão longe da média. Como estamos assumindo um processo de reversão médio, quanto mais longe os resíduos obtêm, mais provável serão convergir. Você pode ver que esta pode ser uma boa oportunidade para entrar em uma posição de curto prazo MSFT ou comprar GOOGL.
Outros exemplos.
Para automatizar isso, eu gostaria de comparar muito mais parâmetros. Coisas como risco de mercado, P / E, dividendos, relatórios de ganhos, etc. Eu não implementei um modelo de backtesting, mas vou fornecer alguns exemplos de outros estoques que encontrei para mover com alta correlação. Algumas correlações fazem sentido, outras podem ser apenas da lei de grandes números, e algumas das maiores ações de capitalização simplesmente se movem com o mercado, de modo que você terá alguma correlação do próprio mercado, à medida que as grandes ações se movem juntas quando o mercado está em tendência.
MMM e CSCO.
MMM e CSCO são utilizados em muitos dos principais índices de rastreamento de mercado. Embora pareça que 3M e a Cisco estão em indústrias totalmente diferentes, isso sugere que elas se movam umas com as outras, o que é provavelmente devido às tendências gerais do mercado. A razão pela qual eles se correlacionam não importa tanto, desde que permaneçam significativos para reverter. Como você pode ver, quando o gráfico de resíduos cruza acima do desvio padrão 3/2, os preços acima se encaixam imediatamente.
Código fonte.
Eu acho que este blog postou muito tempo para incluir um esboço detalhado passo-a-passo do código-fonte. Então, em vez disso, eu apenas o link para o github. Posso examinar como reproduzir os resultados, mas acho que, se você entender o Python, você pode ser capaz de lê-lo facilmente.

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 2018.
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 2018. 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.

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 21 de setembro de 2018.
Anteriormente, no QuantStart, consideramos os fundamentos matemáticos de State Space Models e Kalman Filters, bem como a aplicação da biblioteca pykalman a um par de ETFs para ajustar dinamicamente uma relação de hedge como base para uma estratégia de negociação de reversão média.
Neste artigo, discutiremos uma estratégia comercial originalmente devido a Ernest Chan (2018) [1] e testada por Aidan O'Mahony em Quantopian [2]. Usaremos a estrutura de teste de QSTrader de código aberto baseada em Python para implementar a estratégia. O QSTrader realizará o "levantamento pesado" do rastreamento de posição, o manuseio de portfólio e a ingestão de dados, enquanto nos concentramos exclusivamente no código que gera os sinais de negociação.
A Estratégia de Negociação.
A estratégia de negociação de pares é aplicada a um par de fundos negociados em bolsa (ETF) que acompanham o desempenho de diferentes títulos do Tesouro dos EUA. Eles são:
O objetivo é construir uma estratégia de reversão média desse par de ETFs.
O "spread" sintético entre TLT e IEI é a série de tempo em que realmente estamos interessados ​​em saudade ou curto prazo. O Filtro Kalman é usado para rastrear dinamicamente a relação de cobertura entre os dois, a fim de manter a propagação estacionária (e, portanto, reverter).
Para criar as regras de negociação, é necessário determinar quando o spread se afastou muito do valor esperado. Como determinamos o que é "muito longe"? Poderíamos utilizar um conjunto de valores absolutos fixos, mas estes deveriam ser determinados empiricamente. Isso introduziria outro parâmetro livre no sistema que exigiria otimização (e perigo adicional de superação).
Uma abordagem "sem parâmetros" para criar esses valores é considerar um múltiplo do desvio padrão da propagação e usá-los como limites. Por simplicidade, podemos definir o coeficiente do múltiplo como igual a um.
Portanto, podemos ir "long the spread" se o erro de previsão cair abaixo do desvio padrão negativo da propagação. Respectivamente, podemos ir "curto o spread" se o erro de previsão exceder o desvio padrão positivo da propagação. As regras de saída são simplesmente o oposto das regras de entrada.
A relação de hedge dinâmico é representada por um componente do vetor de estado oculto no tempo $ t $, $ \ theta_t $, o qual denotaremos como $ \ theta ^ 0_t $. Este é o valor de inclinação "beta" que é bem conhecido por regressão linear.
"Longing the spread" aqui significa comprar (anseio) $ N $ unidades de TLT e venda (shorting) $ \ lfloor $, onde $ \ lfloor $ é o "andar" que representa o número inteiro mais alto inferior a $ x $. Este último é necessário, pois devemos transacionar um número inteiro de unidades dos ETFs. "Shorting the spread" é ​​o oposto disso. $ N $ controla o tamanho total da posição.
$ e_t $ representa o erro de previsão ou erro residual da previsão no tempo $ t $, enquanto $ Q_t $ representa a variação dessa previsão no tempo $ t $.
Para completar, as regras são especificadas aqui:
$ e_t \ lt - \ sqrt $ - Longo spread: Vá longo $ N $ partes de TLT e vá curto $ \ lfloor $ unidades de IEI $ e_t \ ge - \ sqrt $ - Sair long: Feche todas as posições longas de TLT e IEI $ e_t \ gt \ sqrt $ - Curta o spread: Vá curto $ N $ partes de TLT e vá longo $ \ lfloor $ unidades de IEI $ e_t \ le \ sqrt $ - Sair curto: feche todas as posições curtas de TLT e IEI .
O papel do filtro Kalman é para nos ajudar a calcular $ \ theta_t $, bem como $ e_t $ e $ Q_t $. $ \ theta_t $ representa o vetor dos valores de intercepção e inclinação na regressão linear entre TLT e IEI no tempo $ t $. É estimado pelo filtro de Kalman. O erro de previsão / residual $ e_t = y_t - \ hat _t $ é a diferença entre o valor previsto do TLT hoje e a estimativa do TLT do filtro de Kalman hoje. $ Q_t $ é a variância das previsões e, portanto, $ \ sqrt $ é o desvio padrão da previsão.
A implementação da estratégia envolve as seguintes etapas:
Receba as barras de OHLCV do mercado diário para TLT e IEI Use o filtro recursivo "on-line" de Kalman para estimar o preço do TLT hoje com base nas observações de ontem do IEI. Tome a diferença entre a estimativa de TLT de TLM e o valor real, muitas vezes chamado de erro de previsão ou erro residual, que é uma medida de quanto a propagação de TLT e IEI se afasta do seu valor esperado Longa propagação quando o movimento está negativamente longe do valor esperado e, consequentemente, abre a propagação quando o movimento está positivamente longe do esperado valor Sair das posições longas e curtas quando a série reverte para o valor esperado.
Para realizar esta estratégia, é necessário ter dados de preços OHLCV para o período coberto por este backtest. Em particular, é necessário fazer o download do seguinte:
TLT - Para o período de 3 de agosto de 2009 a 1º de agosto de 2018 (link aqui) IEI Para o período de 3 de agosto de 2009 a 1º de agosto de 2018 (link aqui).
Esses dados precisarão ser colocados no diretório especificado pelo arquivo de configurações do QSTrader se desejar replicar os resultados.
Python QSTrader Implementation.
Como o QSTrader lida com o rastreamento de posição, gerenciamento de portfólio, ingestão de dados e gerenciamento de pedidos, o único código que precisamos escrever envolve o próprio objeto Estratégia.
A Estratégia se comunica com o PortfolioHandler através da fila de eventos, fazendo uso de objetos SignalEvent para fazê-lo. Além disso, devemos importar a classe de estratégia abstrata base, AbstractStrategy.
Note-se que na versão alpha atual do QSTrader também devemos importar a classe PriceParser. Isso é usado para multiplicar todos os preços na entrada por um grande múltiplo ($ 10 ^ 8 $) e executar aritmética inteira quando rastrear posições. Isso evita questões de arredondamento de ponto flutuante que podem se acumulam durante o longo período de um backtest. Devemos dividir todos os preços por PriceParser. PRICE_MULTIPLIER para obter os valores corretos:
O próximo passo é criar a classe KalmanPairsTradingStrategy. O trabalho desta classe é determinar quando criar objetos SignalEvent com base no BarEvent recebido das barras diárias OHLCV de TLT e IEI da Yahoo Finance.
Existem muitas maneiras diferentes de organizar essa classe. Optei por codificar todos os parâmetros da classe para maior clareza da explicação. Notavelmente eu consertei o valor de $ \ delta = 10 ^ $ e $ v_t = 10 ^ $. Eles representam a variação do ruído do sistema e do ruído de medição no modelo do filtro Kalman. Isso também pode ser implementado como um argumento de palavra-chave no __init__ construtor da classe. Tal abordagem permitiria otimização direta de parâmetros.
A primeira tarefa é definir o tempo e os membros investidos iguais a Nenhum, pois serão atualizados à medida que os dados de mercado sejam aceitos e os sinais comerciais produzidos. latest_prices é um dois tipos de preços atuais de TLT e IEI, usados ​​para conveniência através da classe.
O próximo conjunto de parâmetros está relacionado ao Filtro Kalman e é explicado detalhadamente nos dois artigos anteriores aqui e aqui.
O conjunto final de parâmetros inclui dias, usado para acompanhar quantos dias se passaram, bem como qty e cur_hedge_qty, usados ​​para rastrear as quantidades absolutas de ETFs para comprar tanto para o lado longo quanto para o curto. Eu estabeleci isso para ser 2.000 unidades em um patrimônio da conta de 100.000 USD.
O próximo método _set_correct_time_and_price é um método "helper" utilizado para garantir que o Filtro Kalman tenha todas as informações de preços corretas disponíveis no ponto certo. Isso é necessário porque, em um sistema de backtest dirigido a eventos, como a informação do mercado QSTrader chega sequencialmente.
Podemos estar em uma situação no dia $ K $, onde recebemos um preço para o IEI, mas não o TFT. Portanto, devemos esperar até que os eventos de mercado TFT e IEI tenham chegado do loop backtest, através da fila de eventos. Na negociação ao vivo, isso não é um problema, pois chegarão quase instantaneamente em comparação com o período de troca de alguns dias. No entanto, em um backtest dirigido por eventos, devemos aguardar os dois preços para chegar antes de calcular a nova atualização do filtro de Kalman.
O código verifica essencialmente se o evento subsequente é para o dia atual. Se for, então o preço correto é adicionado à lista de preços mais recentes de TLT e IEI. Se é um novo dia, os preços mais recentes são reiniciados e os preços corretos são mais uma vez adicionados.
Este tipo de método de "limpeza doméstica" provavelmente será absorvido na base de código QSTrader no futuro, reduzindo a necessidade de escrever o código "boilerplate", mas, por enquanto, deve fazer parte da própria estratégia.
O núcleo da estratégia é realizado no método calcule_signals. Em primeiro lugar, estabelecemos os horários e os preços corretos (conforme descrito acima). Então, verificamos que temos os preços para TLT e IEI, em que ponto podemos considerar novos sinais comerciais.
$ y $ é ajustado igual ao preço mais recente para IEI, enquanto $ F $ é a matriz de observação que contém o preço mais recente para TLT, bem como um espaço reservado para representar a interceptação na regressão linear. O filtro Kalman é posteriormente atualizado com esses preços mais recentes. Finalmente, calculamos o erro de previsão $ e_t $ e o desvio padrão das previsões, $ \ sqrt $. Vamos passar por esse código passo a passo, já que parece um pouco complicado.
A primeira tarefa é formar o valor escalar y e a matriz de observação F, contendo os preços de IEI e TLT respectivamente. Calculamos a matriz de variação-covariância R ou configurá-la para a matriz zero se ainda não tiver sido inicializada. Posteriormente, calculamos a nova previsão da observação yhat, bem como o erro de previsão e.
Então calculamos a variância das previsões de observação Qt, bem como o desvio padrão sqrt_Qt. Usamos as regras de atualização derivadas aqui para obter a distribuição posterior dos estados theta, que contém a relação hedge / declive entre os dois preços:
Finalmente, geramos os sinais comerciais com base nos valores de $ e_t $ e $ \ sqrt $. Para fazer isso, precisamos verificar qual o status "investido" - quer "longo", "curto" ou "Nenhum". Observe como precisamos ajustar a quantidade de hedge atual cur_hedge_qty quando vamos longos ou curtos, pois a inclinação $ \ theta ^ 0_t $ está constantemente ajustando-se no tempo:
Este é o código necessário para o objeto Estratégia. Também precisamos criar um arquivo de retorno para encapsular toda a nossa lógica de negociação e escolhas de classe. A versão específica é muito semelhante à usada no diretório de exemplos e substitui o patrimônio de 500,000 USD com 100,000 USD.
Ele também muda o FixedPositionSizer para o NaivePositionSizer. O último é usado para aceitar "ingenuamente" as sugestões de quantidades absolutas de unidades ETF para negociar conforme determinado na classe KalmanPairsTradingStrategy. Em um ambiente de produção, seria necessário ajustar isso dependendo dos objetivos de gerenciamento de risco do portfólio.
Aqui está o código completo para o kalman_qstrader_backtest. py:
Enquanto QSTrader estiver instalado corretamente e os dados tiverem sido baixados do Yahoo Finance, o código pode ser executado através do seguinte comando no terminal:
Graças aos esforços de muitos desenvolvedores voluntários, particularmente @ryankennedyio e @femtotrader, o código é bem otimizado para os dados da barra OHLCV e executa o backtesting rapidamente.
Resultados da Estratégia.
Um dos recursos mais recentes a serem adicionados ao QSTrader é o da "lágrima" desenvolvida principalmente por @nwillemse. Este recurso ainda está em estágio inicial de desenvolvimento, mas será demonstrado aqui.
Uma lágrima é usada principalmente em configurações institucionais como uma descrição de "um pager" de uma estratégia de negociação. A classe TearsheetStatistics na base de código QSTrader replica muitas das estatísticas encontradas em um relatório típico de desempenho de estratégia.
Os dois principais gráficos representam a curva de equidade e a porcentagem de redução, respectivamente. Sob este são os painéis de desempenho mensais e anuais. Finalmente, a curva de equidade, estatísticas de nível comercial e tempo são apresentadas:
Clique na imagem para ampliar.
A curva de equidade começa relativamente plana no primeiro ano da estratégia, mas rapidamente se intensifica em 2018. Durante o ano de 2018, a estratégia torna-se significativamente mais volátil permanecendo "subaquática" até 2018 e atingindo uma porcentagem máxima de redução diária de 15,79%. O desempenho aumenta gradualmente a partir da redução máxima no final de 2018 até 2018.
A estratégia tem um CAGR de 8,73% com uma Ratio Sharpe de 0,75. Ele também tem uma longa duração máxima de remoção de 777 dias - em dois anos! Note-se que esta estratégia é realizada de forma bruta de custos de transação, de modo que a verdadeira performance provavelmente seria pior.
Próximos passos.
Há um grande trabalho de pesquisa necessário para transformar isso em uma estratégia rentável que nós implantaremos em uma configuração ao vivo. As possíveis avenidas de pesquisa incluem:
Otimização de parâmetros - Variando os parâmetros do Filtro de Kalman através de busca de grade de validação cruzada ou alguma forma de otimização de aprendizagem de máquina. No entanto, isso introduz a possibilidade distinta de superação de dados históricos. Seleção de ativos - A escolha de pares de ETFs adicionais ou alternativos ajudaria a agregar diversificação ao portfólio, mas aumenta a complexidade da estratégia, bem como a quantidade de negócios (e, portanto, custos de transação).
Em futuros artigos, consideraremos como realizar esses procedimentos para várias estratégias de negociação.
Referências.
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.

Wallstreetbets.
1 120 & # 32; пользователей находятся здесь.
МОДЕРАТОРЫ.
Bem-vindo ao Reddit,
a primeira página da internet.
e inscreva-se em uma das milhares de comunidades.
Это архивированный пост. Você está interessado em иолосовать или комментировать.
Quer adicionar à discussão?
[-] bigpersonguy Produz dinheiro para o bolso, mothafucka & # 32; 0 очков 1 очко 2 очка & # 32; 2 horas (1 dia)
[-] CHAINSAW_VASECTOMY RAAAAAAIINBOOOOOOOOWWWW PEEEEEEEEENRAAAAAAIINBOOOOOOOOWWWW PEEEE & # 32; 0 очков 1 очко 2 очка & # 32; 2 anos (2 dias)
[-] CHAINSAW_VASECTOMY RAAAAAAIINBOOOOOOOOWWWW PEEEEEEEEENRAAAAAAIINBOOOOOOOOWWWW PEEEE & # 32; 0 очков 1 очко 2 очка & # 32; 2 года назад (0 дочерних комментарев)
помощь правила сайта центр поддержки вики реддикет mod guidelines связаться с нами.
приложенияи инструменты Reddit para iPhone Reddit para o site móvel Android кнопки.
Использование данного сайта означает, что вы принимаете & # 32; пользовательского соглашения & # 32; и & # 32; Политика конфиденциальности. &cópia de; 2018 reddit инкорпорейтед. Все права защищены.
REDDIT e o logotipo ALIEN são marcas registradas da reddit inc.
& pi; Renderizado pelo PID 27140 em & # 32; app-269 & # 32; em 2018-01-13 01: 06: 32.749271 + 00: 00 executando o código do país b995ef9: UA.

Комментариев нет:

Отправить комментарий