К основному контенту

Estratégia de negociação quant quant


O segredo para encontrar lucro na negociação de pares.


"Quants" é o nome de Wall Street para pesquisadores de mercado que usam análise quantitativa para desenvolver estratégias comerciais lucrativas. Em suma, um quant combina com os índices de preços e as relações matemáticas entre empresas ou veículos comerciais, a fim de divisar as oportunidades comerciais rentáveis. Durante a década de 1980, um grupo de quants trabalhando para Morgan Stanley atingiu o ouro com uma estratégia chamada comércio de pares. Investidores institucionais e mesas de negociação proprietárias em grandes bancos de investimento estão usando a técnica desde então, e muitos fizeram um lucro arrumado com a estratégia.


Raramente é no melhor interesse dos banqueiros de investimento e dos gestores de fundos mútuos compartilhar estratégias de negociação rentáveis ​​com o público, de modo que o comércio de pares continuou sendo um segredo dos profissionais (e alguns indivíduos hábeis) até o advento da internet. O comércio on-line abriu a tampa em informações financeiras em tempo real e deu acesso aos novatos a todos os tipos de estratégias de investimento. Não demorou muito para o comércio de pares atrair investidores individuais e comerciantes de pequeno porte que buscam proteger sua exposição de risco aos movimentos do mercado mais amplo.


O objetivo é combinar dois veículos comerciais que estão altamente correlacionados, negociando um longo e o outro curto quando a relação de preço do par diverge o número "x" de desvios padrão - "x" é otimizado usando dados históricos. Se o par reverte para sua tendência média, um lucro é feito em uma ou ambas as posições.


O primeiro passo na concepção de um comércio de pares é encontrar dois estoques altamente correlacionados. Normalmente isso significa que as empresas estão na mesma indústria ou subsector, mas nem sempre. Por exemplo, os estoques de rastreamento de índices, como o QQQQ (Nasdaq 100) ou o SPY (S & amp; P 500), podem oferecer excelentes oportunidades de negociação de pares. Dois índices que, em geral, comercializam juntos são S & amp; P 500 e Dow Jones Utilities Average. Este gráfico de preços simples dos dois índices demonstra sua correlação:


Para o nosso exemplo, analisaremos duas empresas altamente correlacionadas: GM e Ford. Como ambos são fabricantes de automóveis americanos, seus estoques tendem a se mover juntos.


Abaixo está um gráfico semanal da relação de preço entre Ford e GM (calculado dividindo o preço das ações da Ford pelo preço das ações da GM). Essa relação de preço às vezes é chamada de "desempenho relativo" (não deve ser confundida com o índice de força relativa, algo completamente diferente). A linha branca central representa a relação preço médio nos últimos dois anos. As linhas amarelas e vermelhas representam um e dois desvios padrão da razão média, respectivamente.


No gráfico abaixo, o potencial de lucro pode ser identificado quando o índice de preços atinge seu primeiro ou segundo desvio. Quando ocorrem essas divergências lucrativas, é hora de assumir uma posição longa no desempenho inferior e uma posição curta no overachiever. A receita da venda curta pode ajudar a cobrir o custo da posição longa, tornando o comércio de pares barato para colocar. O tamanho da posição do par deve ser combinado com o valor do dólar em vez do número de ações; desta forma, um movimento de 5% em um é igual a um movimento de 5% na outra. Tal como acontece com todos os investimentos, existe o risco de que os negócios possam se mover para o vermelho, por isso é importante determinar os pontos de parada-perda otimizados antes de implementar o comércio de pares.


Um Exemplo Usando Contratos Futuros.


Um comércio de pares no mercado de futuros pode envolver uma arbitragem entre o contrato de futuros e a posição de caixa de um determinado índice. Quando o contrato de futuros fica à frente da posição de caixa, um comerciante pode tentar lucrar com o curto prazo do futuro e passar muito tempo no estoque de rastreamento do índice, esperando que eles se juntem em algum momento. Muitas vezes, os movimentos entre um índice ou commodity e seu contrato de futuros são tão apertados que os lucros são deixados apenas para os comerciantes mais rápidos - muitas vezes usando computadores para executar automaticamente enormes posições em um piscar de olhos.


Um Exemplo de Opções de Uso.


Evidência de Rentabilidade.


Os interessados ​​na técnica de negociação de pares podem encontrar mais informações e instruções no livro Pairs Trading da Ganapathy Vidyamurthy: métodos quantitativos e análise, que você pode encontrar aqui.


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


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, vamos discutir uma estratégia de negociação originalmente devido a Ernest Chan (2012) [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 interceptaçã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 2016 (link aqui) IEI Para o período de 3 de agosto de 2009 a 1º de agosto de 2016 (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. Eu 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 está 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 estável para o primeiro ano da estratégia, mas cresce rapidamente durante 2011. Durante o ano de 2012, a estratégia se torna significativamente mais volátil, restante "subaquática" até 2015 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 2013 até 2016.


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 na QuantStart List:


1. Quant Trading Lessons.


Você terá acesso instantâneo a um curso gratuito de 10 partes, com 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 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 na QuantStart List:


1. Quant Trading Lessons.


Você terá acesso instantâneo a um curso gratuito de 10 partes, com 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.


Par Estratégia de Negociação [MODELO EXCEL]


Par Trading.


A negociação de par é uma estratégia de negociação que corresponde a uma posição longa em um estoque / ativo com uma posição de compensação em outro estoque / ativo que está relacionado estatisticamente. O intercâmbio de pares é uma estratégia de reversão média onde apostamos que os preços reverterão para suas tendências históricas.


Quem pode usar este modelo Excel?


Pessoas interessadas em negociação algorítmica e Quant, aqueles que querem aprender sobre arbitragem estatística.


Como isso ajuda?


Este modelo de excel irá ajudá-lo a:


Aprenda a aplicação da reversão média Compreender o comércio de pares Otimizar os parâmetros de negociação Compreender os retornos significativos da arbitragem estatística.


Por que você deve baixar o modelo de negociação?


Como a lógica de negociação é codificada nas células da folha, você pode melhorar a compreensão, baixando e analisando os arquivos em sua própria conveniência. Não só isso, você pode brincar com os números para obter melhores resultados. Você pode encontrar parâmetros adequados que proporcionem maiores lucros do que o especificado no artigo.


Explicação do modelo.


Neste exemplo, consideramos os pares MSCI e Nifty, pois ambos são índices do mercado de ações. Implementamos estratégia de reversão média nesse par. A reversão média é uma propriedade de séries temporais estacionárias. Uma vez que afirmamos que o par que escolhemos significa reverter, devemos testar se segue a estacionança. O diagrama a seguir mostra o gráfico da relação logarítmica de Nifty para MSCI. No início, isso parece ser significante reverter com um valor médio de 2.088, mas usamos Dicky Fuller Test para testar se ele é estacionário com uma significância estatística. Os resultados da tabela de resultados da Cointegração mostram que a série de preços é estacionária e, portanto, significa reverter. A estatística do teste de Dicky Fuller e um valor de p significativamente baixo (& lt; 0,05) confirmam nossa suposição. Tendo determinado que a reversão média é válida para o par escolhido, procedemos com a especificação de suposições e parâmetros de entrada.


Premissas.


Para fins de simplificação, ignoramos os spreads de oferta. Os preços estão disponíveis no intervalo de 5 minutos e nós negociamos somente no preço de fechamento de 5 minutos. Uma vez que este é um dado discreto, o desligamento da posição acontece no final da vela, isto é, ao preço disponível no final de 5 minutos. Apenas a sessão regular (T) é negociada. Os custos de transação são de US $ 0,375 para Nifty e US $ 1,10 para MSCI. A margem para cada comércio é de US $ 990 (aproximado de US $ 1000).


Parâmetros de entrada.


Observe que todos os valores dos parâmetros de entrada mencionados abaixo são configuráveis.


Média de 10 velas (uma vela = a cada 5 minutos de preço) é considerada. Um "z" pontuação de +2 é considerado para compra e -2 para venda. Uma queda de $ 100 e um limite de lucro de $ 200 é definido. O tamanho da ordem para negociação MSCI é de 50 (1 lote) e para Nifty é de 6 (3 lotes).


Os dados de mercado e os parâmetros de negociação estão incluídos na folha de cálculo a partir da 12 ª fila em diante. Então, quando a referência é feita para a coluna D, deve ser óbvio que a referência começa a partir de D12 em diante.


Explicação das colunas no modelo do Excel.


A coluna C representa o preço do MSCI.


A coluna D representa o preço Nifty.


A coluna E é a relação logarítmica de Nifty para MSCI.


A coluna F calcula a média de 10 velas. Como 10 valores são necessários para os cálculos médios, não há valores de F12 a F22. A fórmula = IF (A23 & gt; $ C $ 3, MÉDIA (ÍNDICE ($ E $ 13: $ E $ 1358, A23- $ C $ 3): E22), & # 8220; & # 8221;) significa que a média só deve ser calculada se a amostra de dados disponível for superior a 10 (ou seja, o valor especificado na célula C3), caso contrário, a célula deve estar em branco. Considere a célula F22. A célula correspondente A22 tem um valor de 10. Como A22 & gt; $ C $ 3 falha, a entrada nessa célula está em branco. A próxima célula F23 tem um valor, pois A23 & gt; $ C $ 3 é verdade. O próximo bit da fórmula.


MÉDIA (ÍNDICE ($ E $ 13: $ E $ 1358, A23- $ C $ 3): E22) calcula o valor médio das últimas 10 (como mencionadas na célula C3) velas de dados da coluna E. Uma lógica semelhante é válida para a coluna G onde o desvio padrão é calculado. O resultado "z" é calculado na coluna H. A fórmula para calcular o escore "z" é z = (x -) / (σ). Aqui x é a amostra (Coluna E), é o valor médio (Coluna F) e σ é o desvio padrão (Coluna G).


A coluna I representa o sinal de negociação. Conforme mencionado nos parâmetros de entrada, se a pontuação "z" for inferior a -2 nós compramos e, se for superior a +2 nós vendemos. Quando dizemos comprar, temos uma posição longa em 3 lotes de Nifty e temos uma posição curta em 1 lote de MSCI. Da mesma forma, quando dizemos que vendemos, temos uma posição longa em 1 lote de MSCI e temos uma posição curta em 3 lotes de Nifty, colocando assim a posição. Temos uma posição aberta o tempo todo. Para entender o que isso significa, considere dois sinais comerciais "comprar" e "vender". Para o sinal de "compra", como explicado anteriormente, compramos 3 lotes de futuro Nifty e um curto 1% de MSCI futuro. Uma vez que a posição é tomada, rastreamos a posição usando a coluna Status, ou seja, a coluna M. Em cada nova fila enquanto a posição continua, verificamos se a perda de parada (como mencionado na célula C6) ou o lucro obtido (como mencionado na célula C7) é atingido. A perda de stop é dado o valor de USD -100, ou seja, a perda de US $ 100 e o lucro obtido recebe o valor de USD 200 nas células C6 e C7, respectivamente. Enquanto a posição não atinge qualquer perda de parada ou lucro, continuamos com esse comércio e ignoramos todos os sinais que aparecem na coluna I. Uma vez que o comércio atinge a perda de parada ou o lucro, novamente começamos a olhar os sinais na coluna Eu e abrir uma nova posição comercial assim que tivermos o sinal de Compra ou Venda na coluna I.


A coluna M representa os sinais de negociação com base nos parâmetros de entrada especificados. Coluna Eu já tenho sinais de negociação e M nos fala sobre o status de nossa posição de negociação, ou seja, nós somos longos ou curtos ou reservamos os lucros ou saímos na parada de perda. Se o comércio não for encerrado, transportamos a posição para a próxima vela, repetindo o valor da coluna de status na vela anterior. Se o movimento do preço ocorrer de forma a quebrar o TP ou SL determinado, nós colocamos nossa posição, denotando-a assim por "TP" e "SL", respectivamente.


A coluna L representa Mark to Market. Especifica a posição da carteira no final do período de tempo. Conforme especificado nos parâmetros de entrada, trocamos 1 lote de MSCI e 3 lotes de Nifty. Então, quando trocamos nossa posição, a diferença de preço apropriada (dependendo da compra ou venda) é multiplicada pelo número de lotes.


A coluna N representa o status de lucro / perda do comércio. P / L é calculado apenas quando nós colocamos a nossa posição. A coluna O calcula o lucro acumulado.


A tabela de saída possui algumas métricas de desempenho tabuladas. A perda de todas as negociações de perda é de US $ 3699 e o lucro de negociações que atingiram TP é de US $ 9280. Então, o total de P / L é de US $ 9280- $ 3699 = $ 5581. Os negócios de perda são os negócios que resultaram na perda de dinheiro nas posições de negociação. Negociações rentáveis ​​são os negócios bem sucedidos que acabam por ganhar causa. O lucro médio é a proporção do lucro total para o número total de negócios. O lucro médio líquido é calculado após subtrair os custos de transação, que somam US $ 91,77.

Комментарии

Популярные сообщения из этого блога

Estratégia de forex heiken ashi strategy

Heikin Ashi Forex Trading Estratégia que é simples de aprender. Qualquer estratégia Heikin-Ashi é uma variação dos castiçais japoneses e é muito útil quando usada como uma estratégia de negociação geral em mercados como o Forex. Ao contrário dos castiçais japoneses regulares, os castiçais heikin-ashi fazem um excelente trabalho de filtrar o ruído que vemos com candelabros japoneses. Eles também são capazes de destacar a tendência do mercado muito mais fácil do que outros métodos de traçado. HEIKIN ASHI CONTRA CANDELOSAS JAPONESAS. O gráfico de castiçal Heiken Ashi parece semelhante ao de sua contraparte, mas o cálculo do castiçal dá o aspecto diferente. Olhando para gráficos padrão de candelabro, cada castiçal tem quatro preços diferentes: aberto, alto, baixo e amp; fechar. Cada castiçal que se forma não tem relação, exceto o preço de abertura (exceto em alguns casos) para o castiçal que veio antes. Um castiçal Heikin ashi é calculado usando algumas informações do castiçal anterior: Pa...