Monday, 19 March 2018

Estratégia de negociação quant pairs


Guia para negociação de pares.


A negociação de pares é uma estratégia de negociação neutra de mercado que corresponde a uma posição comprada com uma posição vendida em um par de instrumentos altamente correlacionados, como duas ações, fundos negociados em bolsa (ETFs), moedas, commodities ou opções. Os operadores de pares aguardam a fraqueza na correlação e, em seguida, perdem tempo com o sub-performer, ao mesmo tempo que vendem em curto, o super-performer, fechando as posições à medida que o relacionamento retorna às normas estatísticas.


O lucro da estratégia é derivado da diferença na mudança de preço entre os dois instrumentos, e não da direção que cada um move. Portanto, um lucro pode ser realizado se a posição longa subir mais do que a curta, ou a posição curta cair mais do que a longa (em uma situação perfeita, a posição longa sobe e a posição curta cai, mas isso não é um requisito para fazendo um lucro). É possível para os comerciantes de pares lucrarem durante uma variedade de condições de mercado, incluindo períodos em que o mercado sobe, desce ou de lado - e durante períodos de baixa ou alta volatilidade. (Veja também: 4 fatores que moldam as tendências do mercado.)


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


"Quants" é o nome de Wall Street para pesquisadores de mercado que usam análise quantitativa para desenvolver estratégias de negociação lucrativas. Em suma, um quant cobre as relações de preço e relações matemáticas entre empresas ou veículos de negociação, a fim de divinar oportunidades de negociação rentáveis. Durante a década de 1980, um grupo de quantos trabalhando para o Morgan Stanley atingiu o ouro com uma estratégia chamada de comércio de pares. Os investidores institucionais e as mesas proprietárias de negociação nos principais bancos de investimento têm usado a técnica desde então, e muitos obtiveram um lucro com a estratégia.


Raramente é do interesse dos banqueiros de investimento e gestores de fundos mútuos compartilharem estratégias de negociação lucrativas com o público, de modo que o comércio de pares permaneceu um segredo dos profissionais (e de alguns indivíduos hábeis) até o advento da internet. O comércio on-line abriu as portas para informações financeiras em tempo real e deu ao novato acesso a todos os tipos de estratégias de investimento. Não demorou muito para que o comércio de pares atraísse investidores individuais e pequenos traders que buscavam proteger sua exposição ao risco dos movimentos do mercado mais amplo.


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


O primeiro passo para projetar uma troca de pares é encontrar duas ações altamente correlacionadas. Normalmente, isso significa que as empresas estão no mesmo setor ou subsetor, mas nem sempre. Por exemplo, os estoques indexados, como o QQQQ (Nasdaq 100) ou o SPY (S & amp; 500), podem oferecer excelentes oportunidades de negociação de pares. Dois índices que geralmente são negociados juntos são o S & P 500 e o Dow Jones Utilities Average. Este gráfico de preço simples dos dois índices demonstra sua correlação:


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


Abaixo está um gráfico semanal da relação de preços entre a Ford e a GM (calculado pela divisão do preço das ações da Ford pelo preço das ações da GM). Esta razão de preço é algumas vezes chamada de "desempenho relativo" (não confundir com o índice de força relativa, algo completamente diferente). A linha branca do centro representa a relação do preço médio nos últimos dois anos. As linhas amarela e vermelha 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 a relação de preço atinge seu primeiro ou segundo desvio. Quando essas divergências lucrativas ocorrem, é hora de assumir uma posição comprada no mau desempenho e uma posição curta no superastro. A receita da venda a descoberto pode ajudar a cobrir o custo da posição comprada, fazendo com que os pares se tornem pouco dispendiosos. O tamanho da posição do par deve corresponder ao valor em dólares em vez do número de ações; Desta forma, um movimento de 5% em um é igual a um movimento de 5% no outro. Como em todos os investimentos, existe o risco de que os negócios possam entrar no vermelho, por isso é importante determinar pontos otimizados de stop-loss antes de implementar o comércio de pares.


Um exemplo usando contratos de futuros.


Uma negociação 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 futuro fica à frente da posição de caixa, um comerciante pode tentar lucrar com o curto prazo e seguir em frente no índice de rastreamento, esperando que eles se juntem em algum momento. Muitas vezes, os movimentos entre um índice ou commodity e seu contrato futuro são tão rígidos que os lucros são deixados apenas para o mais rápido dos traders - frequentemente usando computadores para executar automaticamente posições enormes em um piscar de olhos.


Um exemplo usando opções.


Evidência de Rentabilidade.


Os interessados ​​na técnica de troca de pares podem encontrar mais informações e instruções no livro de Ganapathy Vidyamurthy, Pairs Trading: Métodos Quantitativos e Análise, que você pode encontrar aqui.


Guia para iniciantes em negociação quantitativa.


Guia para iniciantes em negociação quantitativa.


Neste artigo, vou apresentar alguns dos conceitos básicos que acompanham um sistema de negociação quantitativo de ponta a ponta. Espera-se que este post atenda a dois públicos-alvo. O primeiro será indivíduos tentando obter um emprego em um fundo como um comerciante quantitativo. A segunda será pessoas que desejam tentar montar seu próprio negócio de comércio algorítmico "de varejo".


A negociação quantitativa é uma área extremamente sofisticada de finanças quânticas. Pode levar uma quantidade significativa de tempo para obter o conhecimento necessário para passar uma entrevista ou construir suas próprias estratégias de negociação. Não só isso, mas requer extensa experiência em programação, pelo menos em uma linguagem como MATLAB, R ou Python. No entanto, à medida que a frequência de negociação da estratégia aumenta, os aspectos tecnológicos tornam-se muito mais relevantes. Assim, estar familiarizado com o C / C ++ será de suma importância.


Um sistema de negociação quantitativo consiste em quatro componentes principais:


Identificação Estratégica - Encontrando uma estratégia, explorando uma vantagem e decidindo sobre a frequência de negociação Backtesting da estratégia - Obtendo dados, analisando o desempenho da estratégia e removendo vieses Sistema de Execução - Vinculando a uma corretora, automatizando a negociação e minimizando custos de transação tamanho da aposta "/ critério de Kelly e psicologia de negociação.


Começaremos dando uma olhada em como identificar uma estratégia de negociação.


Identificação de estratégia.


Todos os processos de negociação quantitativos começam com um período inicial de pesquisa. Este processo de pesquisa engloba encontrar uma estratégia, verificando se a estratégia se encaixa em um portfólio de outras estratégias que você pode estar executando, obtendo quaisquer dados necessários para testar a estratégia e tentando otimizar a estratégia para retornos mais altos e / ou menor risco. Você precisará levar em conta suas próprias necessidades de capital se administrar a estratégia como um operador de "varejo" e como os custos de transação afetarão a estratégia.


Ao contrário da crença popular, é bastante simples encontrar estratégias lucrativas por meio de várias fontes públicas. Os acadêmicos publicam regularmente resultados teóricos de negociação (embora, em sua maioria, sejam brutos dos custos de transação). Os blogs de finanças quantitativas discutirão as estratégias em detalhes. Os jornais de comércio delinearão algumas das estratégias empregadas pelos fundos.


Você pode questionar por que os indivíduos e as empresas estão interessados ​​em discutir suas estratégias lucrativas, especialmente quando sabem que outras pessoas "que estão ocupando o mercado" podem impedir que a estratégia funcione a longo prazo. A razão está no fato de que eles não costumam discutir os parâmetros exatos e os métodos de ajuste que eles realizaram. Essas otimizações são a chave para transformar uma estratégia relativamente medíocre em uma altamente lucrativa. Na verdade, uma das melhores maneiras de criar suas próprias estratégias únicas é encontrar métodos semelhantes e, em seguida, realizar seu próprio procedimento de otimização.


Aqui está uma pequena lista de lugares para começar a procurar ideias estratégicas:


Muitas das estratégias que você irá analisar se encaixarão nas categorias de reversão à média e tendência / momento. Uma estratégia de reversão à média é aquela que tenta explorar o fato de que existe uma média de longo prazo em uma "série de preços" (como o spread entre dois ativos correlatos) e que desvios de curto prazo dessa média acabarão sendo revertidos. Uma estratégia de momentum tenta explorar tanto a psicologia do investidor quanto a grande estrutura de fundos, "pegando carona" em uma tendência de mercado, que pode ganhar impulso em uma direção e seguir a tendência até que ela se reverta.


Outro aspecto extremamente importante da negociação quantitativa é a frequência da estratégia de negociação. A negociação de baixa frequência (LFT) geralmente se refere a qualquer estratégia que detenha ativos por mais de um dia de negociação. Correspondentemente, a negociação de alta frequência (HFT) geralmente se refere a uma estratégia que mantém ativos intraday. Negociação de frequência ultra-alta (UHFT) refere-se a estratégias que mantêm ativos na ordem de segundos e milissegundos. Como profissionais de varejo, HFT e UHFT certamente são possíveis, mas apenas com conhecimento detalhado da "pilha de tecnologia" e da dinâmica do livro de pedidos. Não vamos discutir esses aspectos em grande medida neste artigo introdutório.


Uma vez que uma estratégia, ou conjunto de estratégias, tenha sido identificada, ela agora precisa ser testada quanto à lucratividade nos dados históricos. Esse é o domínio do backtesting.


Backtesting de estratégia.


O objetivo do backtesting é fornecer evidências de que a estratégia identificada por meio do processo acima é lucrativa quando aplicada a dados históricos e fora da amostra. Isso define a expectativa de como a estratégia funcionará no "mundo real". No entanto, backtesting não é garantia de sucesso, por várias razões. É talvez a área mais sutil do comércio quantitativo, uma vez que implica inúmeros vieses, que devem ser cuidadosamente considerados e eliminados, tanto quanto possível. Discutiremos os tipos comuns de polarização, incluindo viés de antecipação, viés de sobrevivência e viés de otimização (também conhecido como viés de "espionagem de dados"). Outras áreas de importância dentro do backtesting incluem a disponibilidade e a limpeza de dados históricos, levando em consideração custos de transação realistas e decidindo sobre uma plataforma robusta de backtesting. Discutiremos os custos de transação na seção Sistemas de Execução abaixo.


Uma vez que uma estratégia tenha sido identificada, é necessário obter os dados históricos através dos quais realizar testes e, talvez, refinamento. Há um número significativo de fornecedores de dados em todas as classes de ativos. Seus custos geralmente variam de acordo com a qualidade, profundidade e pontualidade dos dados. O ponto de partida tradicional para os comerciantes de quantia iniciais (pelo menos no nível de varejo) é usar o conjunto de dados gratuito do Yahoo Finance. Não vou me debruçar muito sobre fornecedores aqui, em vez disso, gostaria de me concentrar nas questões gerais ao lidar com conjuntos de dados históricos.


As principais preocupações com dados históricos incluem exatidão / limpeza, viés de sobrevivência e ajuste para ações corporativas, como dividendos e desdobramentos:


Precisão pertence à qualidade geral dos dados - se contém algum erro. Às vezes, os erros podem ser fáceis de identificar, como com um filtro de pico, que detecta "picos" incorretos nos dados de séries temporais e os corrige. Em outras ocasiões, podem ser muito difíceis de detectar. Muitas vezes é necessário ter dois ou mais provedores e, em seguida, verificar todos os seus dados uns contra os outros. O viés de sobrevivência é muitas vezes uma "característica" de conjuntos de dados gratuitos ou baratos. Um conjunto de dados com viés de sobrevivência significa que ele não contém ativos que não estão mais sendo negociados. No caso de ações, isso significa ações excluídas / falidas. Esse viés significa que qualquer estratégia de negociação de ações testada em tal conjunto de dados provavelmente terá um desempenho melhor do que no "mundo real", já que os "vencedores" históricos já foram pré-selecionados. As ações corporativas incluem atividades "logísticas" realizadas pela empresa, que geralmente causam uma mudança na função de etapa do preço bruto, que não deve ser incluída no cálculo dos retornos do preço. Ajustes para dividendos e desdobramentos são os culpados comuns. Um processo conhecido como ajuste de costas é necessário para ser realizado em cada uma dessas ações. É preciso ter muito cuidado para não confundir uma divisão de ações com um verdadeiro ajuste de retorno. Muitos traders foram pegos por uma ação corporativa!


Para realizar um procedimento de backtest, é necessário usar uma plataforma de software. Você tem a escolha entre softwares backtest dedicados, como o Tradestation, uma plataforma numérica como o Excel ou o MATLAB ou uma implementação personalizada completa em uma linguagem de programação como Python ou C ++. Eu não vou me demorar muito em Tradestation (ou similar), Excel ou MATLAB, como eu acredito em criar uma pilha de tecnologia interna completa (por razões descritas abaixo). Um dos benefícios disso é que o software de backtest e o sistema de execução podem ser totalmente integrados, mesmo com estratégias estatísticas extremamente avançadas. Para as estratégias de HFT, em particular, é essencial usar uma implementação personalizada.


Ao fazer o backtest de um sistema, é preciso ser capaz de quantificar o desempenho do mesmo. As métricas "padrão da indústria" para estratégias quantitativas são o rebaixamento máximo e o Índice de Sharpe. O rebaixamento máximo caracteriza a maior queda de ponta a ponta na curva de patrimônio da conta em um determinado período de tempo (geralmente anual). Isso é mais frequentemente citado como uma porcentagem. As estratégias de LFT tenderão a ter rebaixamentos maiores do que as estratégias de HFT, devido a vários fatores estatísticos. Um backtest histórico mostrará o último drawdown máximo, que é um bom guia para o futuro desempenho de drawdown da estratégia. A segunda medida é o Índice de Sharpe, que é definido heuristicamente como a média dos retornos excedentes dividida pelo desvio padrão desses retornos excedentes. Aqui, os retornos excedentes referem-se ao retorno da estratégia acima de um benchmark pré-determinado, como o S & P500 ou um Tesouro de 3 meses. Note-se que o retorno anualizado não é uma medida normalmente utilizada, pois não leva em conta a volatilidade da estratégia (ao contrário do Índice de Sharpe).


Uma vez que uma estratégia tenha sido testada novamente e seja considerada livre de vieses (na medida em que isso seja possível!), Com um bom Sharpe e rebaixamentos minimizados, é hora de construir um sistema de execução.


Sistemas de Execução.


Um sistema de execução é o meio pelo qual a lista de negociações geradas pela estratégia é enviada e executada pelo intermediário. Apesar do fato de que a geração de comércio pode ser semi ou totalmente automatizada, o mecanismo de execução pode ser manual, semi-manual (ou seja, "um clique") ou totalmente automatizado. Para estratégias de LFT, técnicas manuais e semi-manuais são comuns. Para as estratégias de HFT, é necessário criar um mecanismo de execução totalmente automatizado, que muitas vezes será fortemente acoplado ao gerador de comércio (devido à interdependência entre estratégia e tecnologia).


As principais considerações ao criar um sistema de execução são a interface com a corretora, a minimização dos custos de transação (incluindo comissão, derrapagem e spread) e a divergência de desempenho do sistema ao vivo do desempenho do backtested.


Há muitas maneiras de interagir com uma corretora. Eles variam de chamar seu corretor por telefone até uma Application Programming Interface (API) de alto desempenho totalmente automatizada. O ideal é que você queira automatizar a execução de seus negócios o máximo possível. Isso libera você para se concentrar em mais pesquisas, bem como permitir que você execute várias estratégias ou mesmo estratégias de maior frequência (na verdade, HFT é essencialmente impossível sem execução automatizada). O software comum de backtesting descrito acima, como MATLAB, Excel e Tradestation, é bom para estratégias mais simples e de menor frequência. No entanto, será necessário construir um sistema de execução interno escrito em uma linguagem de alto desempenho, como C ++, para fazer qualquer HFT real. Como uma anedota, no fundo em que eu costumava trabalhar, tínhamos um "ciclo de negociação" de 10 minutos, onde baixávamos novos dados de mercado a cada 10 minutos e depois executávamos negociações com base nessas informações no mesmo período de tempo. Isso estava usando um script Python otimizado. Para qualquer coisa que se aproxime de dados de frequência de minutos ou segundos, acredito que C / C ++ seria mais ideal.


Em um fundo maior, muitas vezes não é o domínio do comerciante de quantificação para otimizar a execução. No entanto, em pequenas lojas ou empresas de HFT, os comerciantes são os executores e, portanto, um conjunto de habilidades muito mais amplo é geralmente desejável. Tenha isso em mente se você deseja ser empregado por um fundo. Suas habilidades de programação serão tão importantes, se não mais, do que suas estatísticas e talentos econométricos!


Outra questão importante que cai sob a bandeira da execução é a minimização dos custos de transação. Geralmente, há três componentes nos custos de transação: Comissões (ou impostos), que são as taxas cobradas pela corretora, pela bolsa e pela SEC (ou órgão regulador governamental similar); escorregamento, que é a diferença entre o que você pretendia que seu pedido fosse preenchido versus o que foi realmente preenchido; spread, que é a diferença entre o preço de compra / venda do título negociado. Observe que o spread NÃO é constante e depende da liquidez atual (ou seja, disponibilidade de ordens de compra / venda) no mercado.


Os custos de transação podem fazer a diferença entre uma estratégia extremamente lucrativa com um bom índice de Sharpe e uma estratégia extremamente não lucrativa com um índice de Sharpe terrível. Pode ser um desafio prever corretamente os custos de transação de um backtest. Dependendo da frequência da estratégia, você precisará acessar os dados históricos do câmbio, que incluirão dados de ticks para preços de compra / venda. Equipes inteiras de quantos são dedicadas à otimização da execução nos fundos maiores, por esses motivos. Considere o cenário em que um fundo precisa descarregar uma quantidade substancial de negociações (das quais as razões para isso são muitas e variadas!). Ao "despejar" tantas ações no mercado, elas rapidamente deprimirão o preço e podem não obter uma execução ideal. Daí algoritmos que "gotejam feed" ordens para o mercado existem, embora o fundo corre o risco de derrapagem. Além disso, outras estratégias "atacam" essas necessidades e podem explorar as ineficiências. Este é o domínio da arbitragem da estrutura do fundo.


A última grande questão para os sistemas de execução diz respeito à divergência de desempenho da estratégia do desempenho do backtested. Isso pode acontecer por vários motivos. Já analisamos o viés de look-ahead e o viés de otimização em profundidade, ao considerar os backtests. No entanto, algumas estratégias não facilitam o teste desses vieses antes da implantação. Isso ocorre em HFT mais predominantemente. Pode haver bugs no sistema de execução, bem como a própria estratégia de negociação que não aparece em um backtest, mas aparece no live trading. O mercado pode ter sido sujeito a uma mudança de regime após a implantação de sua estratégia. Novos ambientes regulatórios, mudanças no sentimento do investidor e fenômenos macroeconômicos podem levar a divergências na forma como o mercado se comporta e, consequentemente, na rentabilidade de sua estratégia.


Gerenciamento de riscos.


A peça final do quebra-cabeça de negociação quantitativa é o processo de gerenciamento de risco. "Risco" inclui todos os vieses anteriores que discutimos. Isso inclui risco de tecnologia, como servidores co-localizados na central de repente desenvolvendo um mau funcionamento do disco rígido. Isso inclui risco de corretagem, como o corretor estar falido (não tão louco quanto parece, dado o recente susto com a MF Global!). Em suma, abrange quase tudo o que poderia interferir com a implementação comercial, dos quais existem muitas fontes. Livros inteiros são dedicados à gestão de risco para estratégias quantitativas, então eu não tentarei elucidar todas as possíveis fontes de risco aqui.


A gestão de risco também abrange o que é conhecido como alocação de capital ideal, que é um ramo da teoria de portfólio. Esse é o meio pelo qual o capital é alocado a um conjunto de estratégias diferentes e aos negócios dentro dessas estratégias. É uma área complexa e depende de algumas matemáticas não triviais. O padrão da indústria pelo qual a alocação ótima de capital e a alavancagem das estratégias estão relacionadas é chamado de critério de Kelly. Como este é um artigo introdutório, não vou me alongar em seu cálculo. O critério de Kelly faz algumas suposições sobre a natureza estatística dos retornos, que muitas vezes não são verdadeiros nos mercados financeiros, de modo que os operadores geralmente são conservadores quando se trata da implementação.


Outro componente fundamental do gerenciamento de riscos é lidar com o próprio perfil psicológico. Existem muitos vieses cognitivos que podem surgir na negociação. Embora isso seja reconhecidamente menos problemático com negociação algorítmica se a estratégia for deixada em paz! Um viés comum é o da aversão à perda, em que uma posição perdedora não será fechada devido à dor de ter que perceber uma perda. Da mesma forma, os lucros podem ser tomados muito cedo porque o medo de perder um lucro já ganho pode ser muito grande. Outro viés comum é conhecido como viés de recência. Isso se manifesta quando os operadores enfatizam demais os eventos recentes e não a longo prazo. Então, é claro, há o par clássico de preconceitos emocionais - medo e ganância. Estes podem muitas vezes levar a sub ou sobre-alavancagem, o que pode causar blow-up (ou seja, o título da conta indo para zero ou pior!) Ou lucros reduzidos.


Como pode ser visto, o comércio quantitativo é uma área extremamente complexa, embora muito interessante, de financiamento quantitativo. Eu literalmente arranhei a superfície do tópico neste artigo e já está ficando bastante longo! Livros e documentos inteiros foram escritos sobre questões para as quais eu só dei uma ou duas sentenças. Por esse motivo, antes de se candidatar a cargos quantitativos de negociação de fundos, é necessário realizar uma quantidade significativa de estudo de base. No mínimo, você precisará de um extenso conhecimento em estatística e econometria, com muita experiência em implementação, por meio de uma linguagem de programação como MATLAB, Python ou R. Para estratégias mais sofisticadas no final de frequência mais alta, seu conjunto de habilidades é provável para incluir a modificação do kernel do Linux, C / C ++, programação de montagem e otimização de latência de rede.


Se você estiver interessado em tentar criar suas próprias estratégias de negociação algorítmica, minha primeira sugestão seria se programar bem. Minha preferência é construir o máximo possível de dados capturados, backtester de estratégia e sistema de execução. Se o seu próprio capital está em jogo, não dormiria melhor à noite sabendo que você testou completamente o seu sistema e está ciente de suas armadilhas e problemas específicos? Terceirizar isso para um fornecedor, enquanto potencialmente economiza tempo a curto prazo, pode ser extremamente caro a longo prazo.


A Quantcademy.


Participe do portal de associação da Quantcademy que atende à crescente comunidade de traders de quantificação de varejo e aprenda como aumentar a lucratividade de sua estratégia.


Negociação Algorítmica Bem Sucedida.


Como encontrar novas ideias de estratégia de negociação e avaliá-las objetivamente para o seu portfólio usando um mecanismo de backtesting personalizado no Python.


Comércio Algorítmico Avançado.


Como implementar estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas Bayesianas com R e Python.


Estratégia de negociação de pares baseada em filtro de Kalman no QSTrader.


Estratégia de negociação de pares baseada em filtro de Kalman no QSTrader.


Anteriormente, no QuantStart, consideramos os fundamentos matemáticos dos Modelos de Espaço de Estado e Filtros de Kalman, bem como a aplicação da biblioteca pykalman a um par de ETFs para ajustar dinamicamente uma taxa 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 na Quantopian [2]. Usaremos a estrutura de backtesting QSTrader de código aberto baseada em Python para implementar a estratégia. O QSTrader realizará o "levantamento pesado" do rastreamento de posição, manuseio de portfólio e ingestão de dados, enquanto nos concentramos unicamente 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 Exchange Traded Funds (ETF) que acompanham o desempenho de títulos do Tesouro dos EUA de duração variável. Eles são:


O objetivo é construir uma estratégia de reversão da média deste par de ETFs.


O "spread" sintético entre TLT e IEI é a série temporal em que estamos realmente interessados ​​em saudades ou em curto. O Filtro de Kalman é usado para rastrear dinamicamente a taxa de cobertura entre os dois, a fim de manter o spread estacionário (e, portanto, reverter).


Para criar as regras de negociação, é necessário determinar quando o spread se afastou muito do valor esperado. Como podemos determinar o que "longe demais" é? Poderíamos utilizar um conjunto de valores absolutos fixos, mas estes teriam que ser determinados empiricamente. Isso introduziria outro parâmetro livre no sistema que exigiria otimização (e perigo adicional de overfitting).


Uma abordagem "sem parâmetros" para criar esses valores é considerar um múltiplo do desvio padrão do spread e usá-los como limites. Por simplicidade, podemos definir o coeficiente do múltiplo para ser igual a um.


Portanto, podemos ir "longo o spread" se o erro de previsão cai abaixo do desvio padrão negativo do spread. Respectivamente podemos ir "curto o spread" se o erro de previsão exceder o desvio padrão positivo do spread. As regras de saída são simplesmente o oposto das regras de entrada.


A relação de hedge dinâmica é representada por um componente do vetor de estado oculto no tempo $ t $, $ \ theta_t $, que será denotado como $ \ theta ^ 0_t $. Este é o valor do declive "beta" que é bem conhecido a partir da regressão linear.


"Longing the spread" significa aqui comprar (long) $ N $ unidades de TLT e vender (shorting) $ \ lfloor $, onde $ \ lfloor $ é o "floor" representando o maior inteiro menor que $ x $. Este último é necessário, pois devemos transacionar um número inteiro de unidades dos ETFs. "Reduzir o spread" é ​​o oposto disso. $ N $ controla o tamanho geral 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 momento $ t $.


Para completar, as regras são especificadas aqui:


$ e_t \ lt - \ sqrt $ - Longo o spread: Vá por muito tempo $ N $ em ações de TLT e vá em $ \ lfloor $ unidades de IEI $ e_t \ ge - \ sqrt $ - Saia por muito tempo: feche todas as posições longas de TLT e IEI $ e_t \ gt \ sqrt $ - Reduza o spread: Vá em baixa $ N $ em ações de TLT e vá em frente $ \ lfloor $ unidades de IEI $ e_t \ le \ sqrt $ - Saia em curto: feche todas as posições curtas de TLT e IEI .


O papel do filtro de Kalman é nos ajudar a calcular $ \ theta_t $, bem como $ e_t $ e $ Q_t $. $ \ theta_t $ representa o vetor dos valores de intercepto 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 de TLT hoje e a estimativa de 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 os seguintes passos:


Receber barras de mercado OHLCV diariamente para TLT e IEI Use o filtro de Kalman recursivo "on-line" para estimar o preço de TLT hoje baseado em observações de IEI de ontem Tome a diferença entre a estimativa de TLT de Kalman e o valor real ou erro residual, que é uma medida de quanto o spread de TLT e IEI se afasta de seu valor esperado Longo o spread quando o movimento está negativamente longe do valor esperado e correspondentemente curto o spread quando o movimento está positivamente longe do esperado valor Saia das posições longa e curta quando a série reverter para o seu valor esperado.


Para executar esta estratégia, é necessário ter dados de preços do 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 você quiser replicar os resultados.


Implementação do Python QSTrader.


Como o QSTrader lida com 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 Strategy.


A Estratégia se comunica com o PortfolioHandler por meio da fila de eventos, fazendo uso dos objetos SignalEvent para fazer isso. Além disso, devemos importar a classe de estratégia abstrata base, AbstractStrategy.


Observe que na versão alfa atual do QSTrader também devemos importar a classe PriceParser. Isso é usado para multiplicar todos os preços na entrada por um múltiplo grande ($ 10 ^ 8 $) e realizar aritmética inteira ao rastrear posições. Isso evita problemas de arredondamento de ponto flutuante que podem se acumular 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 dessa classe é determinar quando criar objetos SignalEvent com base nos BarEvent s recebidos das barras OHLCV diárias de TLT e IEI do Yahoo Finance.


Existem muitas maneiras diferentes de organizar essa classe. Eu optei por codificar todos os parâmetros da classe para esclarecer a explicação. Notavelmente eu fixei o valor de $ \ delta = 10 ^ $ e $ v_t = 10 ^ $. Eles representam o ruído do sistema e a variação de ruído de medição no modelo do Filtro de Kalman. Isso também pode ser implementado como um argumento de palavra-chave no construtor __init__ da classe. Tal abordagem permitiria a otimização direta de parâmetros.


A primeira tarefa é definir o tempo e os membros investidos como iguais a Nenhum, pois eles serão atualizados conforme os dados de mercado forem aceitos e os sinais de negociação gerados. latest_prices é uma matriz de dois dos preços atuais de TLT e IEI, usados ​​por conveniência através da classe.


O próximo conjunto de parâmetros está relacionado ao Filtro de Kalman e é explicado em profundidade nos dois artigos anteriores aqui e aqui.


O conjunto final de parâmetros inclui dias, usados ​​para rastrear quantos dias se passaram, bem como qty e cur_hedge_qty, usados ​​para rastrear as quantidades absolutas de ETFs a serem comprados para o lado longo e curto. Eu defini isso para ser 2.000 unidades em um patrimônio de conta de 100.000 USD.


O próximo método _set_correct_time_and_price é um método "auxiliar" utilizado para garantir que o Filtro de Kalman tenha todas as informações de preço corretas disponíveis no ponto certo. Isso é necessário porque, em um sistema de backtest baseado em eventos, como as informações de mercado do QSTrader, chegam sequencialmente.


Podemos estar em uma situação no dia em que recebemos um preço por IEI, mas não por TFT. Portanto, devemos aguardar até que os eventos de mercado TFT e IEI tenham chegado do loop de backtest, através da fila de eventos. Na negociação ao vivo, isso não é um problema, uma vez que eles chegarão quase instantaneamente em comparação com o período de negociação de alguns dias. No entanto, em um backtest baseado em eventos, devemos aguardar a chegada dos dois preços antes de calcular a nova atualização do filtro de Kalman.


O código essencialmente verifica se o evento subsequente é para o dia atual. Se for, o preço correto é adicionado à lista latest_price de TLT e IEI. Se for um novo dia, os preços mais recentes são redefinidos e os preços corretos são adicionados novamente.


Esse tipo de método "housekeeping" provavelmente será absorvido pela base de código do QSTrader no futuro, reduzindo a necessidade de escrever código "boilerplate", mas por enquanto ele deve fazer parte da estratégia em si.


O núcleo da estratégia é executado no método calculate_signals. Em primeiro lugar, definimos os horários e os preços corretos (conforme descrito acima). Em seguida, verificamos que temos os dois preços para TLT e IEI, quando podemos considerar novos sinais de negociação.


$ y $ é 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 marcador de posição de unidade para representar o intercepto na regressão linear. O Filtro de Kalman é subsequentemente atualizado com estes últimos preços. Finalmente, calculamos o erro de previsão $ e_t $ e o desvio padrão das previsões, $ \ sqrt $. Vamos percorrer este código passo a passo, pois parece um pouco complicado.


A primeira tarefa é formar o valor escalar y e a matriz de observação F, contendo os preços do IEI e do TLT, respectivamente. Calculamos a matriz de variância-covariância R ou configuramos para a matriz zero se ela ainda não foi inicializada. Subsequentemente, calculamos a nova previsão da observação, bem como o erro de previsão et.


Em seguida, 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 de hedge / inclinação entre os dois preços:


Por fim, geramos os sinais de negociação com base nos valores de $ e_t $ e $ \ sqrt $. Para fazer isso, precisamos verificar qual é o status "investido" - "longo", "curto" ou "Nenhum". Observe como precisamos ajustar a quantidade atual de hedge cur_hedge_qty quando formos longos ou curtos, pois a inclinação $ \ theta ^ 0_t $ está constantemente se ajustando no tempo:


Este é todo o código necessário para o objeto Strategy. Também precisamos criar um arquivo de backtest para encapsular toda a nossa lógica de negociação e as opções de classe. A versão específica é muito semelhante àquelas usadas no diretório de exemplos e substitui o patrimônio de 500.000 USD por 100.000 USD.


Ele também altera o FixedPositionSizer para o NaivePositionSizer. Este último é usado para "ingenuamente" aceitar 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 das metas de gerenciamento de risco do portfólio.


Aqui está o código completo para o kalman_qstrader_backtest. py:


Enquanto o QSTrader estiver instalado corretamente e os dados tiverem sido baixados do Yahoo Finance, o código poderá 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 dados de barras OHLCV e realiza o backtesting rapidamente.


Resultados da Estratégia.


Um dos recursos mais recentes a serem adicionados ao QSTrader é o da "ficha de rascunho" desenvolvida principalmente pela @nwillemse. Esse recurso ainda está em um estágio inicial de desenvolvimento, mas será demonstrado aqui.


Uma folha de rascunho é usada principalmente dentro de 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 do 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 capital e a porcentagem de redução, respectivamente. Abaixo estão os painéis de desempenho mensais e anuais. Por fim, são apresentadas as estatísticas da curva de capital, do nível de comércio e do tempo:


Clique na imagem para ampliar.


A curva de capital começa relativamente plana para o primeiro ano da estratégia, mas aumenta rapidamente durante 2011. Durante 2012, a estratégia torna-se significativamente mais volátil, permanecendo “submersa” até 2015 e alcançando um percentual máximo diário de rebaixamento de 15,79%. O desempenho aumenta gradualmente a partir do rebaixamento máximo no final de 2013 até 2016.


A estratégia tem um CAGR de 8,73% com um índice de Sharpe de 0,75. Ele também tem uma longa duração máxima de rebaixamento de 777 dias - mais de dois anos! Observe que essa estratégia é realizada com custos brutos de transação, portanto, o desempenho real provavelmente seria pior.


Próximos passos.


Há muito trabalho de pesquisa necessário para transformar isso em uma estratégia lucrativa que implantamos em um ambiente ao vivo. Possíveis avenidas de pesquisa incluem:


Otimização de Parâmetros - Variando os parâmetros do Filtro de Kalman através de pesquisa de grade de validação cruzada ou alguma forma de otimização de aprendizado de máquina. No entanto, isso introduz a possibilidade distinta de overfitting para dados históricos. Seleção de Ativos - A escolha de pares adicionais ou alternativos de ETFs ajudaria a adicionar diversificação à carteira, mas aumenta a complexidade da estratégia, bem como o número de negociações (e, portanto, os custos de transação).


Em artigos futuros, vamos considerar como realizar esses procedimentos para várias estratégias de negociação.


Referências.


A Quantcademy.


Participe do portal de associação da Quantcademy que atende à crescente comunidade de traders de quantificação de varejo e aprenda como aumentar a lucratividade de sua estratégia.


Negociação Algorítmica Bem Sucedida.


Como encontrar novas ideias de estratégia de negociação e avaliá-las objetivamente para o seu portfólio usando um mecanismo de backtesting personalizado no Python.


Comércio Algorítmico Avançado.


Como implementar estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas Bayesianas com R e Python.


Tutoriais


Veja também documentação, vídeos e chat.


Jing é um desenvolvedor quantitativo na QuantConnect. Ela tem um mestrado em Matemática Financeira da John Hopkins e trabalhou anteriormente na Northeast Securities fazendo pesquisas quantitativas.


Artigos recentes.


Pairs Trading & # 8211; Cópula vs Cointegração.


Em Tutoriais De Estratégia, Publicado em 13 de junho de 2017.


Investigamos dois métodos de negociação de pares e comparamos os resultados. O comércio de pares envolve investigar a estrutura de dependência entre dois ativos altamente correlacionados. Com a suposição de que ocorrerá reversão à média, posições longas ou curtas são inseridas na direção oposta quando há uma divergência de preços. Tipicamente, a distribuição do preço do ativo é modelada por uma distribuição Gaussiana de séries de retorno, mas a distribuição normal conjunta pode falhar em capturar algumas características-chave da dependência do preço dos pares de ações, como a dependência da cauda. Nós investigamos usando a teoria da cópula para identificar essas oportunidades de negociação.


Neste tutorial, discutiremos a estrutura básica da cópula a partir da perspectiva matemática e explicaremos como aplicar a abordagem em pares de negociação. A implementação do algoritmo baseia-se no papel Trading estratégias com copulas [1] Stander Y, Marais D, Botha I. Estratégias de negociação com cópulas [J]. Revista de Ciências Econômicas e Financeiras, 2013, 6 (1): 83-107. Cópia Online do Stander Y, Marais D, Botha I (2013). Comparamos o desempenho da estratégia de negociação de pares de cópulas com o método de negociação de pares de co-integração baseado no artigo Estratégias de negociação de arbitragem estatística e negociação de alta frequência da Hanson TA, Hall J R. (2012) [2] Hanson TA, Hall J R. Estratégias de negociação de arbitragem estatística e negociação de alta frequência [J]. 2012.. A técnica de cointegração assume uma relação de cointegração entre equidades pareadas para identificar oportunidades de negociação lucrativas. Os resultados empíricos sugerem que a estratégia baseada em cópulas é mais lucrativa do que as técnicas tradicionais de negociação de pares.


Estrutura do Copula.


1. Definição.


Dado um vetor aleatório, suas funções de distribuição cumulativa marginal (CDFs) são. Aplicando a transformada integral de probabilidade a cada componente, as distribuições marginais de são uniformes (da Wikipedia).


Então a cópula de é definida como a função de distribuição cumulativa da junção, para a qual a distribuição marginal de cada variável U é uniforme como.


A função de cópulas contém todas as características de dependência das distribuições marginais e descreverá melhor a relação linear e não linear entre variáveis, usando probabilidade. Eles permitem que as distribuições marginais sejam modeladas independentemente umas das outras, e nenhuma suposição sobre o comportamento conjunto dos marginais é necessária. [3] Rad H, Baixo R K Y, Faff R. A rentabilidade das estratégias de negociação de pares: métodos de distância, cointegração e cópula [J]. Financiamento Quantitativo, 2016, 16 (10): 1541-1558.cópia online.


2. Cópulas Bivariadas.


Uma vez que esta pesquisa se concentra em cópulas bivariadas (para a troca de pares, temos duas variáveis ​​aleatórias), algumas propriedades probabilísticas são especificadas.


Seja X e Y duas variáveis ​​aleatórias com função de probabilidade cumulativa e. que são uniformemente distribuídos. Então a função da cópula é. Tomando a derivada parcial da função cópula sobre U e V daria a função de distribuição condicional da seguinte forma:


3. Cópulas Arquimedianas.


Existem muitas funções de cópula que nos permitem descrever estruturas de dependência entre variáveis, além da hipótese gaussiana. Aqui vamos nos concentrar três destes; as fórmulas Clayton, Gumbel e Frank cópula da classe de Arquimedes.


Cópulas arquimedianas [4] Mahfoud M, Michael M. Cópulas arquimedianas bivariadas: uma aplicação a dois índices do mercado de ações [J]. BMI Paper, 2012. A cópia on-line é baseada nas transformações de Laplace de funções de distribuição univariadas. Eles são construídos por uma função geradora particular [5]. Os pares baseados em cópulas de alta frequência são negociados nos US Goldmine Stocks [J]. 2016.


A função de densidade de probabilidade é:


Onde é o inverso da segunda derivada da função geradora.


Genest e MacKay (1986) [6] Genest, C. e MacKay, J., 1986, A Alegria de Copulas: Distribuições Bivariadas com Marginais Uniformes, The American Statistician, 40, 280-283 provaram que a relação entre a função de gerador de cópula e a correlação de classificação de Kendall tau no caso bivariado pode ser dada por:


Assim, podemos estimar facilmente o parâmetro em cópulas arquimedianas se soubermos a medida de classificação tau de Kendall e a função geradora. Por favor, consulte o passo 3 para ver as fórmulas.


Parte I: Método Cópula.


Os ETFs têm muitos setores de ações e classes de ativos diferentes que nos fornecem uma ampla gama de pares que negociam candidatos. Nosso conjunto de dados consiste em dados diários dos ETFs negociados na NASDAQ ou na NYSE.


Utilizamos os primeiros 3 anos de dados para escolher o melhor par de cópula e ativo ("período de formação"). Em seguida, utilizamos um período de 5 anos, de 2011 a 2017 ("o período de negociação"), para executar a estratégia. Durante o período de negociação, usamos uma janela de dados de 12 meses para obter os parâmetros da cópula ("período de formação de rolamento").


Etapa 1: Selecionando os estoques pareados.


O método geral de seleção de pares é baseado na análise fundamental e estatística. [7] Jean Folger. Pares que negociam a cópia em linha do exemplo.


1) Monte uma lista de pares potencialmente relacionados.


Quaisquer pares aleatórios podem ser correlacionados. É possível que essas variáveis ​​não estejam causalmente relacionadas entre si, mas por causa de uma relação espúria devido à coincidência ou à presença de um certo terço, fator invisível. Assim, é importante começarmos com uma lista de títulos que têm algo em comum. Para esta demonstração, escolhemos alguns dos ETFs mais líquidos negociados na Nasdaq ou na NYSE. O relacionamento para esses pares potencialmente relacionados pode ser devido a uma sobreposição de índice, setor ou classe de ativos. por exemplo. QQQ e XLK são dois ETFs que rastreiam os índices líderes do mercado.


2) Filtrar o par de negociação com correlação estatística.


Para determinar quais pares de ações incluir na análise, as correlações entre os pares de ETF pré-selecionados são analisadas. Abaixo estão três tipos de medidas de correlação que costumamos usar nas estatísticas:


= número de concordantes.


= número de discordantes.


= a diferença entre as classificações dos valores correspondentes e.


Podemos obter esses coeficientes em Python usando funções da biblioteca de estatísticas do SciPy. As correlações foram calculadas usando os retornos diários dos preços das ações durante o período de formação. Encontramos que as 3 técnicas de correlação dão aos ETFs pareados o mesmo ranking de coeficientes de correlação. A correlação de Pearson assume que ambas as variáveis ​​devem ser distribuídas normalmente. Assim, aqui usamos o Kendall rank como medida de correlação e escolhemos os pares com a maior correlação de rank de Kendall para implementar a negociação de pares.


Obtemos o preço de fechamento histórico diário de nosso par de ETFs usando a função Histórico e convertendo os preços em uma série de devolução de registros. Indique e denote a série histórica de preços de ações para ações xe ações y. Os retornos de log para o par de ETFs são dados por:


t = 1,2. n onde n é o número de dados de preço.


Etapa 2: Estimando Distribuições Marginais de log-retorno.


Para construir a cópula, precisamos transformar a série log-return e dois valores uniformemente distribuídos uev. Isso pode ser feito estimando as funções de distribuição marginais de ee conectando os valores de retorno a uma função de distribuição. Como não fazemos suposições sobre a distribuição das duas séries de log-retorno, aqui usamos a função de distribuição empírica para abordar a distribuição marginal e. A função ECDF do Python da biblioteca statsmodel nos fornece o CDF empírico como uma função de etapa.


Etapa 3: Estimando os Parâmetros do Copula.


Como discutido acima, estimamos o parâmetro cópula teta pela relação entre a cópula e a medida de dependência tau de Kendall, para cada uma das cópulas de Arquimedes.


Etapa 4: Selecionando a melhor cópula de adaptação.


Uma vez que recebemos a estimativa de parâmetros para as funções da cópula, usamos os critérios da AIC para selecionar a cópula que fornece o melhor ajuste na inicialização do algoritmo.


onde é a função log-likelihood ek é o número de parâmetros, aqui k = 1.


As funções de densidade de cada função da cópula são as seguintes:


A cópula que fornece o melhor ajuste é aquela que corresponde ao menor valor do critério da AIC. O par escolhido é "QQQ" & amp; "XLK".


Etapa 5: Gerando os Sinais de Negociação.


As funções da cópula incluem todas as informações sobre as estruturas de dependência de duas séries de retorno. Segundo Stander Y, Marais D, Botha I (2013) [8] Stander Y, Marais D, Botha I. Estratégias de negociação com copulas [J]. Revista de Ciências Econômicas e Financeiras, 2013, 6 (1): 83-107. Cópia Online, a cópula ajustada é usada para derivar as faixas de confiança para a função de distribuição marginal condicional de, ou seja, os índices de preço errado. Quando as observações de mercado estão fora da faixa de confiança, é uma indicação de que a oportunidade de negociação de pares está disponível. Aqui escolhemos 95% como a faixa de confiança superior, 5% como a faixa de confiança mais baixa, conforme indicado no artigo. O nível de confiança foi selecionado com base em uma análise de backtest no artigo, que mostra que usar 95% parece levar a oportunidades comerciais apropriadas a serem identificadas.


Dados os retornos atuais do estoque X e o estoque Y, definimos os "índices de precificação incorreta" como:


Para mais provas matemáticas, consulte Xie W, Wu Y (2013) [9] Xie W, Wu Y. Estratégia de negociação de pares baseada em Copula [C] // Asian Finance Association (AsFA) Conferência de 2013. doi. 2013, 10.


As fórmulas de probabilidade condicional de cópulas bivariadas podem ser derivadas tomando derivadas parciais das funções da cópula mostradas na Tabela 1. Os resultados são os seguintes:


Após a seleção de pares de negociação e as cópulas melhor ajustadas, seguimos os seguintes passos para negociação. Por favor, note que implementamos os Passos 1, 2, 3 e 4 no primeiro dia de cada mês usando os dados diários dos últimos 12 meses, o que significa que nossas funções empíricas de distribuição e parâmetros de cópula são atualizadas uma vez por mês. Em resumo, a cada mês:


Durante o período de formação de 12 meses, os preços de fechamento diários são usados ​​para calcular os retornos diários de log para o par de ETFs e, em seguida, calcular a correlação de classificação de Kendall. Estime as funções de distribuição marginal dos retornos de log de X e Y, que são ecdf_x e ecdf_y separadamente. Plugue o tau de Kendall nas funções de estimativa de parâmetros da cópula para obter o valor de theta. Execute a regressão linear nas duas séries de preços. O coeficiente é usado para determinar quantas ações das ações X e Y comprar e vender. Por exemplo, se o coeficiente for 2, para cada X ação comprada ou vendida, 2 unidades de Y serão vendidas ou compradas.


Finalmente, durante o período de negociação, a cada dia convertemos os retornos atuais para uev usando as funções de distribuição empírica ecdf_x e ecdf_y. Depois disso, dois índices de precificação são calculados a cada dia de negociação usando a cópula estimada C. O algoritmo constrói posições curtas em X e posições longas em Y nos dias que e. Constrói posições curtas em Y e posições longas em X nos dias que e.


Parte II: Método de Cointegração.


Para o método de negociação de pares de cointegração, escolhemos o mesmo par de ETF "GLD" & amp; "DGL". Não há necessidade de escolher uma função de cópula, portanto há apenas um período de formação de 12 meses. O período de negociação é de 5 anos, de janeiro de 2011 a maio de 2017.


Etapa 1: gere a série de propagação.


No início de cada mês, geramos a série de preços de log de dois ETFs com o fechamento diário. Em seguida, a série de spread é estimada usando a análise de regressão com base nos dados da série de preços de log.


Para as ações X e Y, executamos a regressão linear sobre a série de preços de log e obtemos o coeficiente β.


Etapa 2: calcular o limite.


Usando o desvio padrão do spread durante o período de formação, um limite de dois desvios-padrão é definido para a estratégia de negociação, conforme indicado no documento.


Etapa 3: configurar os sinais de negociação.


Em cada dia de negociação, entramos em uma negociação sempre que o spread se move a mais de dois desvios padrão de sua média. Em outras palavras, construímos posições curtas em X e posições longas em Y no dia em que se espalhou & gt; significa + 2 * std. Construímos posições curtas em Y e posições compradas em X no dia em que se espalhou & lt; mean-2 * std. O comércio é encerrado se o spread reverter para o seu equilíbrio (definido como menos de metade de um desvio padrão do spread zero).


O valor da média e do desvio padrão é calculado a partir do período de formação contínua e será atualizado uma vez por mês.


Conclusão.


Em última análise, a negociação em pares pretende capturar a divergência de preços de dois ativos correlacionados por meio da reversão da média. Nossos resultados demonstram que a abordagem da cópula para a troca de pares é superior ao método de cointegração convencional, porque é baseada na probabilidade da estrutura de dependência, versus cointegração, que depende da variação de regressão linear simples da precificação normal. Encontramos através do teste do desempenho do método da cópula menos sensível aos parâmetros iniciais. Como o método de cointegração depende da distribuição padrão e os pares de ETFs tinham baixa volatilidade, havia poucas oportunidades de negociação.


Geralmente, os ETFs não são muito voláteis e, portanto, a reversão à média não oferece muitas oportunidades de negociação. Existem apenas 39 negociações durante 5 anos para o método de cointegração.


Observa-se que o uso de cópula em pares de negociação proporciona mais oportunidades de negociação, uma vez que não requer quaisquer pressupostos rígidos [10] Liew R Q, Wu Y. Pares de negociação: A abordagem da cópula [J]. Journal of Derivatives & amp; Hedge Funds, 2013, 19 (1): 12-30. .


Backtest para o método copula.


Colaboradores


Referências.


`Oi Jing Wu. Obrigado por um excelente artigo. Eu tenho uma pergunta, mas pode ser porque eu estou entendendo mal o seu código Python (meu fundo é em C #). A teoria afirma que a série de retorno de log é dada por ln (P_x, t / P_x, t-1), porém em seu código parece que você está retornando apenas ln (P_x, t), na seguinte linha de código: np. log ([float (z) para z em close_price]). Por favor, deixe-me saber o que estou perdendo. Obrigado.


Você está falando sobre a cointegração? Teoricamente, ln (Pt) deve ser usado em vez disso, se o log retornar.


Desculpe, um erro de digitação para minha última resposta:


Por favor, ignore meu comentário / pergunta anterior, eu percebo que o & # 8220; diff & # 8221; função cuida disso & # 8211; Matemática 101


Oi Jing Wu, eu tenho backtested sua estratégia do período de 2010-01-01 a 2017-09-11. No entanto, a partir de setembro de 2012, beta, liquidez e alavancagem parecem ser constantes. Existe alguma intuição para isso? Eu não acho que o código está quebrado, mas estou apenas curioso para ver qual seria a intuição de causar tal resultado.


Isso pode porque não há novo comércio naquele momento. Para negociação de pares, isso significa que a condição de negociação não é acionada.


Muito obrigado por este post muito interessante. É muito útil ter todo o raciocínio e fórmula tão claramente explicados e sintetizados.


Eu tenho 2 observações sobre o algoritmo embora:


+ o ajuste de Gumbel feito no conjunto de calibração [2006 - 2009] não funciona. Isso não impede o algoritmo, e o último escolhe a cópula de Frank no final, mas só decide usar o AIC para Frank e Clayton. A razão pela qual o ajuste em Gumbel não funciona vem de 2 divisões por 0, devido aos valores u ou v.


+ um post acima menciona o beta muito alto do algoritmo e eu concordo que é surpreendente para uma estratégia de par. Este beta alto é particularmente interessante quando se compara simplesmente os resultados do algoritmo e o S & amp; P. Correções locais dos estoques dos EUA no 3T15 e no 1T16 são visíveis na cópula como se fossem ações de longo prazo. Tomei a liberdade de calcular a posição líquida diária em cada componente do par selecionado [isto é, XLK e QQQ]. Parece que a partir do final de 2010 até o final o algoritmo é LONG BOTH ETFs e quase não altera a posição. Eu posso estar totalmente errado, mas eu acho que isso explica o beta, as liquidações e o tamanho repentino dos negócios.


Oi, Jing Wu, eu tenho backtested sua estratégia, mas eu não pareço entender exatamente como as posições são feitas. De acordo com a guia Comércio, apenas pequenas quantidades de ativos subjacentes são negociadas.


Meu raciocínio é esse. Suponha que eu tenha $ 100.000 e que haja um sinal das cópulas para comprar A (atualmente os preços são de $ 10) e o de curto B (atualmente custa $ 20). Eu compro 10 000 ações de A e curto 5 000 ações de B?


Quanto tempo estarei nesta posição? Até o final do dia / dia seguinte ou até que outro sinal ocorra? Obrigado.


Oi Fraty, sim, aqui eu alocar 40% de capital em cada ação. Mas a razão entre as ações A e B baseia-se no coeficiente de regressão do preço histórico de dois ativos, e não apenas no preço no dia de negociação. A posição é alterada até que outro sinal ocorra.


Olá Jing, Muito obrigado por seu excelente artigo e por apresentar o método aplicando Copula para parear o comércio 🙂


Com relação aos sinais de negociação que você mencionou, "construímos posições curtas em X e posições longas em Y no dia em que o spread for & gt; significa + 2 * std. Construímos posições curtas em Y e posições compradas em X no dia em que spread & lt; mean-2 * std. & Quot;


Como estamos regredindo Y em X, então, se o spread "normalizado", (spread-mean) / sd, for maior do que dois desvios-padrão, isso significa que Y está com desempenho superior a X e, portanto, gostaríamos de reduzir o spread , o que significa que vamos curto em Y (que é o estoque de alto desempenho) e Long X (que é o estoque de baixo desempenho).


Olá eu sou um par de estudantes de negociação, e eu sou apenas iniciante,


Eu quero executar seu código e entender a lógica, mas não consigo ver.


todo o seu código .. se você se importar peça que você envie para mim código completo.


Eu não sou tão bom em inglês porque eu sou coreano Me desculpe por isso!


Espero que sua resposta. obrigado.


O código está no final da página. Basta clicar no código & # 8216; & # 8217; guia do backtest anexado ou clone o algoritmo você verá o código.


Bom trabalho. Às vezes, podemos estar interessados ​​em saber quando e por que a suposição de reversão à média prevalece. Seria tentador introduzir novas ideias para confirmar a propriedade de reversão à média nos momentos de negociação. Seu trabalho é incrível, espero que seja melhor.


Ótimo post. Eu não sou um programador python, então estou puxando meu cabelo convertendo isso para o MATLAB. Mas, nas linhas de código a seguir, parece-me que a ordem de calcular os retornos de log é diferente:


1. logreturn [self. ticker [j]] = np. diff (np. log ([float (z) para z em close]))


2. return_x = np. log (flutuante (self. price_list [self. syl [0]] [- 1] /self. price_list [self. syl [0]] [- 2]))


Em (1) o log do preço é diferenciado, mas em (2) a diferença é registrada?


(1) e (2) são os mesmos porque log (A / B) = log (A) & # 8211; log (B)


Você pode por favor explicar o que as seguintes linhas fazem?


% Converte os dois retornos para valores uniformes uev usando as funções de distribuição empírica.


Presumivelmente, não é simplesmente: ecdf_x, ecdf_y = ECDF (x), ECDF (y)?


Por que o algoritmo coupla só comercializa o QQQ / XLK? Eu fiz um backtest a partir de 01/01/2006 e só este par é negociado.


Levando a discussão para o uso de Cópula em outras áreas (eu sou um comerciante de opções) & # 8230;.wikipedia diz: "Enquanto a aplicação de cópulas em crédito passou por popularidade, bem como infelicidade durante o crise financeira global de 2008-2009, [29] é indiscutivelmente um modelo padrão do setor para preços de CDOs. Copulas também foram aplicadas a outras classes de ativos como uma ferramenta flexível na análise de produtos derivativos de múltiplos ativos. A primeira aplicação desse tipo fora do crédito foi usar uma cópula para construir uma superfície de volatilidade de cesta implícita, [30] levando em conta o sorriso de volatilidade dos componentes da cesta. Copulas, desde então, ganhou popularidade em preços e gestão de risco [31] de opções em multi-ativos, na presença de volatilidade sorriso / skew, & # 8221; Isso significa construir um sorriso de volatilidade para as opções da SPX usando os sorrisos de volatilidade de seus componentes? Este é um problema que enfrentei inúmeras vezes como gerente de posição. Obrigado.


Pode esta abordagem da cópula emparelhar o trabalho de negociação em um período de tempo muito mais curto & # 8230; .. dizer gráfico de 3 a 5 minutos onde você está procurando por uma frequência muito maior de negociações?


Obrigado pelo seu trabalho e parece bom. No entanto, ainda tenho uma preocupação com o resultado do teste de volta. Suponho que você calcule o sinal com base no preço de fechamento de cada dia das ações. Quando há um sinal, você entra na posição com o mesmo preço de ação ou preço do dia seguinte? Se você usar o preço de fechamento do mesmo dia, talvez não consiga obter a negociação. Eu realmente aprecio você pode deixar mais claro. Obrigado novamente pelo excelente trabalho.


O sinal é decidido por ontem, mas a posição é inserida com base no preço atual. O LEAN cuidará disso para evitar o viés de antecipação.


Graças Jing! Isso torna o teste de retorno mais confiável. Ótimo trabalho!


Estratégia de negociação em pares [EXCEL MODEL]


Introdução.


Pair trading é uma estratégia de negociação que corresponde a uma posição longa em uma ação / ativo com uma posição de compensação em outra ação / ativo que é estatisticamente relacionada. Pair trading é uma estratégia de reversão à média, em que apostamos que os preços reverterão para suas tendências históricas.


Quem pode usar este modelo do Excel?


Pessoas interessadas em negociação algorítmica e Quant, aquelas 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 Compreensão da negociação em pares Otimize os parâmetros de negociação Entenda 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 planilha, você pode entender melhor baixando e analisando os arquivos conforme sua conveniência. Não apenas isso, você pode brincar com os números para obter melhores resultados. Você pode encontrar parâmetros adequados que proporcionem lucros maiores do que o especificado no artigo.


Explicação do modelo.


Neste exemplo, consideramos o par MSCI e Nifty como ambos são índices do mercado de ações. Nós implementamos a estratégia de reversão da média neste par. A reversão à média é uma propriedade de séries temporais estacionárias. Como afirmamos que o par que escolhemos é a reversão, devemos testar se ele segue a estacionariedade.


O diagrama a seguir mostra a plotagem da proporção logarítmica de Nifty para MSCI. No início, isso parece ser revertendo com um valor médio de 2.088, mas usamos o Teste Dicky Fuller para testar se ele é estacionário com significância estatística. Os resultados da tabela de saída Cointegration mostram que a série de preços é estacionária e, portanto, significa reversão. A estatística de Teste de Dicky Fuller e um valor de p significativamente baixo (& lt; 0,05) confirma nossa suposição. Tendo determinado que a reversão da média é verdadeira 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 bid-ask. Os preços estão disponíveis em intervalos de 5 minutos e nós negociamos apenas com o preço de fechamento de 5 minutos. Uma vez que isto é um dado discreto, a quadratura 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 negociação é de $ 990 (aproximada de $ 1000).


Parâmetros de entrada.


Por favor, note que todos os valores para os parâmetros de entrada mencionados abaixo são configuráveis.


Média de 10 velas (uma vela = a cada 5 minutos) é considerada Uma pontuação “z” de +2 é considerada para compra e -2 para venda Um stop loss de $ 100 e limite de lucro de $ 200 é definido O tamanho do pedido para negociação MSCI é 50 (1 lote) e para Nifty é 6 (3 lotes)


Os dados de mercado e parâmetros de negociação são incluídos na planilha a partir da 12ª linha. Portanto, quando a referência é feita à coluna D, deve ficar óbvio que a referência começa 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 razã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 cálculos médios, não há valores de F12 a F22. A fórmula = SE (A23 & gt; $ C $ 3, MÉDIA (ÍNDICE ($ E $ 13: $ E $ 1358, A23- $ C $ 3): E22), & # 8220; & # 8221;) significa que a média deve ser calculada apenas se a amostra de dados disponível for maior que 10 (ou seja, o valor especificado na célula C3), caso contrário, a célula deve ficar em branco. Considere a célula F22. Sua 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 desde A23 & gt; $ C $ 3 é verdadeira. O próximo pedaço da fórmula.


MÉDIA (ÍNDICE ($ E $ 13: $ E $ 1358, A23 - $ C $ 3): E22) calcula o valor médio das últimas 10 (como mencionado na célula C3) das velas dos dados da coluna E. Lógica semelhante é válida para a coluna G, onde o desvio padrão é calculado. A pontuação “z” é calculada na coluna H. A fórmula para calcular a pontuação “z” é z = (x -) / (σ). Aqui x é a amostra (coluna E), é o valor médio (coluna F) e σ é o desvio padrão (coluna G).


Coluna I representa o sinal de negociação. Como mencionado nos parâmetros de entrada, se a pontuação de "z" for inferior a -2, compramos e se ultrapassar +2, 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 vender, temos uma posição comprada em 1 lote de MSCI e temos uma posição vendida em 3 lotes de Nifty, assim alinhando a posição. Nós temos uma posição aberta o tempo todo.


Para entender o que isso significa, considere dois sinais de negociação "comprar" e "vender". Para o sinal de “compra”, como explicado anteriormente, compramos 3 lotes de futuro Nifty e um lote de 1 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 linha enquanto a posição continua, verificamos se o stop loss (como mencionado na célula C6) ou take profit (como mencionado na célula) C7) é atingido. O stop loss é dado o valor de USD -100, ou seja, a perda de USD 100 e o lucro é dado o valor de USD 200 nas células C6 e C7, respectivamente. Embora a posição não atinja qualquer stop loss ou take profit, continuamos com essa negociação e ignoramos todos os sinais que aparecem na coluna I. Quando a negociação atinge o stop loss ou o take profit, voltamos a analisar os sinais na coluna Eu e abrir uma nova posição de negociação assim que tivermos um sinal Comprar ou Vender na coluna I.


A coluna M representa os sinais de negociação com base nos parâmetros de entrada especificados. A coluna I já tem sinais de negociação e M informa-nos sobre o estado da nossa posição de negociação, ou seja, somos comprados ou baixos ou contabilizamos os lucros ou saímos no stop loss. Se a negociação não for concluída, 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 tal forma que ele viole o TP ou SL dado, então nós ajustamos a nossa posição, denotando-a por “TP” e “SL”, respectivamente.


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. Portanto, quando negociamos nossa posição, é a diferença de preço apropriada (dependendo se somos comprados ou vendidos) multiplicada pelo número de lotes.


A coluna N representa o status de lucro / perda do negócio. P / L é calculado apenas quando tivermos quadrados nossa posição. A coluna O calcula o lucro acumulado.


A tabela de saída tem algumas métricas de desempenho tabuladas. A perda de todos os negócios deficitários é de $ 3699 e o lucro de negócios que atingem o TP é $ 9280. Assim, o total de P / L é $ 9280- $ 3699 = $ 5581. Negociações com prejuízo são as negociações que resultaram na perda de dinheiro nas posições de negociação. Comércios rentáveis ​​são os comércios de sucesso que terminam em ganhar causa. O lucro médio é a razão entre o lucro total e o número total de negócios. O lucro médio líquido é calculado após a subtração dos custos de transação, que equivalem a US $ 91,77.

No comments:

Post a Comment