18 de agosto de 2017 6 de outubro de 2017 The Kalman Filter e Pairs Trading Imagine este cenário. Você é um comerciante de arbitragem estatística em uma mesa de hélice ou HF. Como tal, você rotineiramente realizar um inventário de exposição ETF que você deve hedge. Na noite anterior, você instruiu seus comerciantes overnight para calcular os índices de hedge para uma matriz de ETF8217s. Na manhã seguinte, antes do início do mercado, seus comerciantes júnior ansiosamente apresentar seus resultados para sua inspeção. Gostando do que você vê, você carrega os índices de hedge em sua plataforma de negociação e espera pela abertura. Quando o mercado abre pela primeira vez para negociação, você reequilibrar suas sebes de acordo com os novos rácios. Depois, você assiste com horror como suas cercas não funcionam como esperado. O que deu errado Cada bom comerciante sabe que eles têm de se adaptar quando as condições no mercado mudar, então por que exigimos de outra forma de nossos modelos de negociação Os comerciantes em nosso exemplo baseavam-se em relações de hedge estático para impulsionar sua lógica de negociação. Como resultado, eles se abriram para o que é conhecido como risco de parâmetro. Atualizar seus parâmetros à medida que novas informações se tornam disponíveis é uma maneira de se proteger deste risco de negociação subestimado. De longe o modelo mais onipresente para realizar isso em um cenário de negociação é o Filtro Kalman. Isso é útil quando você está lidando com um modelo linear, como a negociação de pares, que em sua forma mais simples reduz para baixo a negociação do residual de uma regressão linear: Onde é o preço atual da primeira ação, é o preço atual da segunda ação , É a nossa taxa de hedge atual e é o preço do spread atual que estamos negociando. Podemos também estimar a razão de hedge usando as mudanças log em X e Y, em vez de seus níveis. Isso seria mais provável ser o caso em um cenário de negociação de alta freqüência, onde tudo o que nos importa são as mudanças de preços. O Filtro de Kalman nos permite variar a relação de cobertura ao longo do tempo. Por exemplo, suponha que assumimos que a razão de hedge segue uma caminhada aleatória, ou seja, onde está o estado atual da razão de hedge, é o último estado e é um ruído branco aleatório com média de zero e volatilidade. O filtro de Kalman foi projetado para estimar o 8220hidden state8221 de um modelo linear Gaussian como Pairs Trading. O filtro é baseado fora de um sistema de equações: é o atual estado oculto (por exemplo, nossa relação de hedge), é a matriz de transição (por exemplo, a matriz de identidade) é o último vetor de observação A última matriz de observação (por exemplo, a mudança de registro de estoque X) são Ruído Branco Gaussiano com média zero e variâncias. As Let8217s examinam um exemplo concreto do Filtro de Kalman em ação para obter uma melhor compreensão de suas partes móveis. Em particular, queríamos destacar a importância de sua escolha de e. A relação destes dois parâmetros é chamada de relação sinal-ruído. Se for pequeno em relação a, o filtro colocará a maior parte de seu peso para a próxima estimativa sobre o estado da última estimativa (ou seja, o filtro irá favorecer seu estado atual sobre novas informações). Se o inverso for verdadeiro, o filtro se adaptará muito rapidamente a novas informações à custa de seu estado anterior. O gráfico a seguir ilustra bem o efeito. Cada linha representa a estimativa atual do modelo 8217s da relação de hedge entre ETF8217s SPY e EEM usando valores diferentes para manter constante. Quanto maior a relação sinal / ruído, mais rápido o modelo se adapta a novas informações: Python tem uma implementação simples e eficaz do Filtro Kalman chamado pykalman. Nós baixamos dados de estoque intraday grátis para o SPY e EEM usando a função getgoogledata que compartilhamos anteriormente. Para implementar isso para si mesmo, você pode seguir abaixo. A primeira etapa é importar os módulos necessários: Em seguida, podemos baixar os preços das ações e transformá-los em mudanças de log: Agora let8217s separar o conjunto de dados em amostras inout para estimar o estado inicial do filtro: Agora podemos executar cada filtro usando um diferente Relação sinal / ruído: Esta é uma sequela frouxamente acoplada ao nosso post anterior, Construindo um comércio de pares arbitrais Para um exemplo bem escrito sobre como usar um modelo de propagação com um intercepto, bem como uma relação de hedge, confira TheAlgoEngineer. Interessado em recursos para o Pairs Trading Quer aprender como extrair fontes de dados sociais como Google Trends, StockTwits, Twitter e Estimar Certifique-se de fazer o download do nosso livro Introdução aos dados sociais para os comerciantes Siga o blog via e-mail Post navigation Recent Posts Comentários recentes CategoriesState Space Models E o Filtro de Kalman Até à data, em nossos posts de análise de séries temporais, consideramos modelos de séries temporais lineares, incluindo ARMA. ARIMA, bem como o modelo GARCH para heterocedasticidade condicional. Neste artigo vamos considerar a base teórica de modelos espaciais de estados. O principal benefício é que seus parâmetros podem se adaptar ao longo do tempo. Os modelos de espaço de estado são muito gerais e é possível colocar os modelos que consideramos até à data em uma formulação de espaço de estado. No entanto, a fim de manter a análise simples, muitas vezes é melhor usar a representação mais simples. A premissa geral de um modelo de espaço de estado é que temos um conjunto de estados que evoluem no tempo (como a razão de hedge entre dois pares de ações cointegrados), mas nossas observações desses estados contêm ruído estatístico (como o ruído da microestrutura do mercado) E, portanto, somos incapazes de observar diretamente os estados verdadeiros. O objetivo do modelo de espaço de estado é inferir informações sobre os estados, dadas as observações, à medida que novas informações chegam. Um algoritmo famoso para realizar este procedimento é o Filtro de Kalman. Que também discutiremos neste artigo. O filtro de Kalman é onipresente em problemas de controle de engenharia, incluindo navegação de amplificação de orientação, análise de trajetória espacial e fabricação, mas também é amplamente utilizado em finanças quantitativas. Na engenharia, por exemplo, um filtro de Kalman será usado para estimar os valores do estado, que são então usados para controlar o sistema em estudo. Isso introduz um loop de realimentação, muitas vezes em tempo real. Para uma aplicação extremamente interessante de Kalman Filtering, pode-se considerar a recente tentativa bem-sucedida da empresa de espaço privado, Space Exploration Technologies. Para retornar e pousar o primeiro estágio de seu foguete Falcon 9 de volta em seu local de lançamento original. O reforço do primeiro estágio estava sujeito a um problema de controle dinâmico extremamente preciso, envolvendo massa assimétrica variando no tempo (movimentação de combustível) em velocidades hipersônicas até subsônicas: Talvez o uso mais comum de um filtro Kalman na negociação quantitativa seja atualizar os rácios de cobertura entre ativos Em um comércio de pares de arbitragem estatística. Mas o algoritmo é muito mais geral do que isso e vamos olhar para outros casos de uso. Geralmente, existem três tipos de inferência que nos interessam ao considerar modelos espaciais de estados: Previsão - Previsão de valores subseqüentes do estado Filtragem - Estimativa dos valores atuais do estado de observações passadas e atuais Alisamento - Estimativa dos valores passados do estado Dado as observações Filtragem e suavização são semelhantes, mas não o mesmo. Talvez a melhor maneira de pensar na diferença é que com suavização estamos realmente querendo entender o que aconteceu com os estados no passado dado o nosso conhecimento atual, enquanto que com a filtragem realmente queremos saber o que está acontecendo com o estado agora. Neste artigo vamos discutir a teoria do modelo de espaço de estado e como podemos usar o filtro de Kalman para realizar os vários tipos de inferência descritos acima. Em artigos subseqüentes aplicaremos o Filtro de Kalman a situações de negociação, tais como pares cointegrados, bem como previsão de preço de ativos. Usaremos uma abordagem bayesiana do problema, pois este é um quadro estatístico natural que nos permite atualizar prontamente nossas crenças à luz de novas informações, que é precisamente o comportamento desejado do Filtro de Kalman. Quero adverti-lo de que os modelos de espaço de estados e os Filtros de Kalman sofrem com uma abundância de notação matemática, mesmo que as idéias conceituais por trás deles sejam relativamente diretas. Vou tentar explicar toda essa notação em profundidade, pois pode ser confuso para os novos problemas de controle de engenharia ou modelos de espaço de estados em geral. Modelo Linear Estado-Espaço Esta seção segue de perto a notação utilizada tanto em Cowpertwait et al 1 e Pole et al 2. Eu decidi que não era particularmente útil para inventar a minha própria notação para o Filtro Kalman, como eu quero que você seja capaz de relacioná-lo A outros trabalhos ou textos de pesquisa. Vamos começar por discutir todos os elementos do modelo de espaço-estado linear. Uma vez que os estados do sistema são dependentes do tempo, precisamos subscrito-los com t. Usaremos otat para representar um vetor de coluna dos estados. Em um modelo de espaço de estados linear dizemos que esses estados são uma combinação linear do estado anterior no tempo t-1, bem como ruído do sistema (variação aleatória). Para simplificar a análise vamos sugerir que este ruído é extraído de uma distribuição normal multivariada, mas é claro que outras distribuições podem ser usadas. A dependência linear do estado do estado anterior teta é dada pela matriz Gt, que também pode ser variável no tempo (daí o índice t). O ruído multivariado dependente do tempo é dado por wt. A relação é resumida abaixo no que é freqüentemente chamado de equação de estado: begin thetat Gt theta wt end No entanto, esta é apenas metade da história. Também precisamos discutir as observações. Isto é, o que realmente vemos. Uma vez que os estados estão escondidos para nós pelo ruído do sistema. Podemos denotar as observações (dependentes do tempo) por yt. As observações são uma combinação linear do estado atual e alguma variação aleatória adicional conhecida como ruído de medição. Também de uma distribuição normal multivariada. Se denotarmos a matriz de dependência linear dotat em yt por Ft (também dependente do tempo) eo ruído de medida por vt temos a equação de observação: begin yt F t thetat vt end Onde F é a transposição de F. A fim de Especificar completamente o modelo que precisamos para fornecer o primeiro estado theta0, bem como as matrizes de variância-covariância para o ruído do sistema e ruído de medição. Estes termos são distribuídos como: begin theta0 sim mathcal (m0, C0) vt sim matemática (0, Vt) wt sim matemática (0, Wt) end Claramente isso é um monte de notação para especificar o modelo. Para concluir, Ill resumirá todos os termos aqui para ajudá-lo a entender o modelo: thetat - O estado do modelo no tempo t yt - A observação do modelo no tempo t Gt - A matriz de transição de estado entre corrente e Os estados anteriores no tempo t e t-1 respectivamente Ft - A matriz de observação entre a observação atual eo estado atual no tempo t wt - O ruído do sistema obtido a partir de uma distribuição normal multivariada vt - O ruído de medição obtido a partir de uma distribuição normal multivariada m0 - Valor médio da distribuição normal multivariada do estado inicial, theta0 C0 - A matriz de variância-covariância da distribuição normal multivariada do estado inicial, theta0 Wt - A matriz de variância-covariância para a distribuição normal multivariada a partir da qual o ruído do sistema é desenhado Vt - A matriz de variância-covariância para a distribuição normal multivariada a partir da qual o ruído de medição é desenhado Agora que especificamos o modelo de espaço-estado linear, precisamos Um algoritmo para realmente resolvê-lo. É aqui que entra o Filtro de Kalman. Podemos usar a Regra de Bayes e os priores conjugados para nos ajudar a derivar o algoritmo. O Filtro de Kalman Uma Abordagem Bayesiana Se lembrarmos do artigo sobre estatísticas bayesianas. Bayes Rule é dada por: Onde H se refere à nossa hipótese ou parâmetros e D se refere aos nossos dados. Evidências ou observações. Queremos aplicar a regra à idéia de atualizar a probabilidade de ver um estado dado todos os dados anteriores que temos e nossa observação atual. Mais uma vez, precisamos introduzir mais notação Se estamos no tempo t, então podemos representar todos os dados conhecidos sobre o sistema pela quantidade Dt. No entanto, nossas observações atuais são dadas por yt. Assim podemos dizer que Dt (D, yt). Ou seja, nosso conhecimento atual é uma mistura de nosso conhecimento prévio, mais nossa observação mais recente. Aplicando Bayes Rule a esta situação dá o seguinte: O que isso significa? Diz que a probabilidade posterior ou atualizada de obter um thetat estado, dada a nossa observação atual yt e dados anteriores D, é igual à probabilidade de ver uma observação yt, dado O estado atual thetat multiplicado pela crença anterior ou anterior do estado atual, dado apenas o dado anterior D, normalizado pela probabilidade de ver a observação yt independentemente. Embora a notação pode ser um pouco verbosa, é uma afirmação muito natural. Diz que podemos atualizar nossa visão sobre o estado, otat de uma forma racional dado o fato de que temos novas informações na forma da observação atual, yt. Um dos aspectos extremamente úteis da inferência Bayesiana é que, se o nosso prévio e a verossimilhança são normalmente distribuídos, podemos usar o conceito de priores conjugados para afirmar que nossa visão posterior (ou seja, atualizada do tat) também será normalmente distribuída. Utilizamos o mesmo conceito, embora com diferentes formas distributivas, na discussão sobre a inferência de proproções binomiais. Então, como isso nos ajuda a produzir um filtro de Kalman Bem, vamos especificar os termos que bem estar usando, de Bayes Rule acima. Em primeiro lugar, especificamos a forma distributiva do anterior: begin thetat D sim mathcal (at, Rt) end Isto é, a visão anterior de theta no tempo t, dado o nosso conhecimento no tempo t-1 é distribuído como uma distribuição normal multivariada, Com média e covariância de variância Rt. Os dois últimos parâmetros serão definidos abaixo. Isto é, a função de verossimilhança da observação atual y no instante t é distribuída como uma distribuição normal multivariada, com média Ft thetat e variância-covariância (ft thetat, Vt) Vt. Já esboçamos esses termos na nossa lista acima. Finalmente, temos a parte posterior do thetat: begin thetat Dt sim matemática (mt, Ct) end Isto é, a nossa visão posterior da teta do estado atual no tempo t, dado o nosso conhecimento atual no tempo t é distribuído como uma distribuição normal multivariada com a média Mt e variância-covariância Ct. O filtro de Kalman é o que liga todos estes termos junto para t1, ldots. Nós não obteremos de onde esses valores realmente vêm, mas simplesmente os declararemos. Felizmente, podemos usar as implementações da biblioteca em R para realizar o levantamento pesado para nós: começar em Gt m Rt Gt CG t Wt et yt - ft mt em At et ft F t em Qt F t Rt Ft Vt At Rt Ft Q t Ct Como é dito acima, não precisamos nos preocupar com a verbosidade excessiva do Filtro de Kalman, pois podemos simplesmente usar bibliotecas em R para calcular o algoritmo para nós. Então, como é que tudo se encaixam Bem, ft é o valor predito da observação no tempo t, onde fazemos essa predição no instante t-1. Desde et yt - ft, podemos ver facilmente que et é o erro associado à previsão (a diferença entre f e y). Importante, a média posterior é uma ponderação da média anterior e do erro de previsão. Desde mt em At et Gt m At et, onde Gt e At são nossas matrizes de ponderação. Agora que temos um procedimento algorítmico para atualizar nossas visões sobre as observações e estados, podemos usá-lo para fazer previsões, bem como suavizar os dados. Predição A aproximação Bayesiana ao Filtro de Kalman conduz naturalmente a um mecanismo para a predição. Uma vez que temos nossa estimativa posterior para o estado thetat, podemos prever os próximos dias valores, considerando o valor médio da observação. Vamos ter o valor esperado da observação amanhã. Dado o nosso conhecimento dos dados de hoje: De onde vem isso Vamos tentar e seguir através da análise: Uma vez que a função de verossimilhança para a observação de hoje, dada a condição de estado de hoje, é normalmente distribuída com média Ft thetat e variância-covariância Vt Acima), temos que a expectativa de observação de amanhã, dada a nossa data de hoje, Dt, é precisamente a expectativa do normal multivariado para a verossimilhança, a saber EF thetat v Dt. Uma vez feita essa conexão, ela simplesmente se reduz a aplicar regras sobre o operador de expectativa às matrizes e vetores remanescentes, levando-nos finalmente a f. No entanto, não é suficiente simplesmente calcular a média. Devemos também conhecer a variação da observação de amanhã dados dados de hoje, caso contrário, não podemos verdadeiramente caracterizar a distribuição sobre a qual desenhar amanhã previsão. Agora que temos a expectativa e a variação da observação de amanhã, dados os dados de hoje, podemos fornecer a previsão geral para os próximos passos, caracterizando completamente a distribuição na qual essas previsões são desenhadas: Note que eu usei alguma notação ímpar aqui - o que significa ter um subscrito de Realmente, nos permite escrever uma taquigrafia conveniente para o seguinte: Como Ive mencionado repetidamente neste artigo, não devemos nos preocupar muito com a verbosidade do Filtro de Kalman e sua notação, Em vez disso, devemos pensar sobre o procedimento geral e seus fundamentos bayesianos. Assim, temos agora os meios de prever novos valores da série. Esta é uma alternativa às previsões produzidas pela combinação de ARIMA e GARCH. Em artigos subseqüentes nós realmente realizaremos isso para alguns dados financeiros reais e aplicá-lo a um modelo de previsão de negociação. Também seremos capazes de usar o aspecto do filtro para nos fornecer visões continuamente atualizadas sobre uma relação de hedge linear entre dois pares de ativos de cointegrated, como pode ser encontrado em uma estratégia de arbitragem stastical. Referências Cowpertwait, P. S.P. E Metcalfe, A. V. (2009). Série temporal introdutória com R. Pole, A. West, M. e Harrison, J. (1994). Previsão Bayesiana Aplicada. Basta começar com Quantitative TradingKalman Filtro-Baseado Pairs Estratégia de negociação no QSTrader Anteriormente em QuantStart temos considerado 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 razã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 (2017) 1 e testado por Aidan OMahony em Quantopian 2. Vamos fazer uso da base de Python open-source QSTrader backtesting quadro, a fim de implementar a estratégia. QSTrader irá realizar o levantamento pesado do rastreamento de posição, manipulação de portfólio e 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 Troca (ETF) que acompanham o desempenho de títulos de dívida variável de US Treasury. Eles são: O objetivo é construir uma estratégia de reverter médio a partir deste par de ETFs. A propagação sintética entre TLT e IEI é a série de tempo que estamos realmente interessados em anseio ou shorting. O filtro de Kalman é usado para controlar dinamicamente a relação de cobertura entre os dois, a fim de manter a propagação estacionária (e, portanto, reverter média). Para criar as regras de negociação é necessário determinar quando o spread se moveu muito longe do seu valor esperado. Como podemos determinar o que está longe demais? Poderíamos utilizar um conjunto de valores absolutos fixos, mas estes teriam de ser determinados empiricamente. Isto introduziria um 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 da propagação e usá-los como os limites. Para simplificar, podemos definir o coeficiente do múltiplo como sendo igual a um. Daqui nós podemos ir por muito tempo a propagação se o erro da previsão cair abaixo do desvio padrão negativo do spread. Respectivamente, podemos reduzir 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âmico é representada por uma componente do vetor de estado oculto no tempo t, thetat, que iremos denotar como theta0t. Este é o valor da inclinação beta que é bem conhecido a partir da regressão linear. Longing o spread aqui significa compra (N) N unidades de TLT e venda (shorting) lfloor, onde lfloor é o piso representando o maior inteiro menos de x. Este último é necessário, uma vez que temos de transacionar um número inteiro de unidades dos ETFs. Shorting o spread é o oposto disso. N controla o tamanho total da posição. Et representa o erro de previsão ou erro residual da predição no instante t, enquanto Qt representa a variância desta predição no instante t. Para a integralidade, as regras são especificadas aqui: et lt - sqrt - Long o spread: Go longo N partes de TLT e ir unidades lfloor curto de IEI et ge - sqrt - Saída longa: Feche todas as posições longas de TLT e IEI et gt sqrt - Curta a propagação: Ir curto N partes de TLT e ir longas unidades lfloor de IEI et le sqrt - Saída curta: Fechar todas as posições curtas de TLT e IEI O papel do filtro de Kalman é para ajudar a calcular thetat, bem como e Qt. Otat representa o vetor dos valores de interceptação e declive na regressão linear entre TLT e IEI no instante t. É estimado pelo filtro de Kalman. A previsão errorresidual et yt - hat t é a diferença entre o valor previsto de TLT hoje e os filtros Kalman estimativa de TLT hoje. Qt é 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: Receber mercado diário OHLCV bares para TLT e IEI Use o recursivo online Kalman filtro para estimar o preço do TLT hoje com base em ontem observações de IEI Tomar a diferença entre a Kalman estimativa de TLT eo Valor real, muitas vezes chamado erro de previsão ou erro residual. Que é uma medida de quanto a propagação de TLT e IEI se afasta de seu valor esperado Long o spread quando o movimento é negativamente longe do valor esperado e correspondentemente curto o spread quando o movimento está positivamente longe do valor esperado Saia do longo E posições curtas quando a série reverte para o seu valor esperado. A fim de realizar esta estratégia, é necessário ter os 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 2017 (link aqui) IEI Para o período de 3 de Agosto de 2009 a 1 de Agosto de 2017 (link aqui). Esses dados precisarão ser colocados no diretório especificado pelo arquivo de configurações do QSTrader se você deseja replicar os resultados. Implementação do Python QSTrader Uma vez que o QSTrader lida com o rastreamento de posição, gerenciamento de portfólio, administração de dados e administração de pedidos, o único código que precisamos escrever envolve o objeto Estratégia propriamente dito. 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 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 (108) e realizar a aritmética de números inteiros 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. PRICEMULTIPLIER para obter os valores corretos: O próximo passo é criar a classe KalmanPairsTradingStrategy. O trabalho desta classe é determinar quando criar objetos de SignalEvent baseados em BarEvent recebido s das barras de OHLCV diárias de TLT e IEI de Finanças de Yahoo. Há muitas maneiras diferentes de organizar esta classe. Ive optou por codificar todos os parâmetros na classe para clareza da explicação. Notavelmente Ive fixado o valor de delta10 e vt10. Eles representam o ruído do sistema ea variância do 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 de parâmetros simples. A primeira tarefa é definir o tempo e os membros investidos para ser igual a Nenhum. Pois serão atualizados à medida que os dados de mercado forem aceitos e os sinais comerciais gerados. Latestprices é uma matriz de dois dos preços atuais de TLT e IEI, usado para a conveniência através da classe. O próximo conjunto de parâmetros todos se relacionam com o Filtro de Kalman e são explicados em profundidade nos dois artigos anteriores aqui e aqui. O conjunto final de parâmetros inclui dias. Usado para controlar quantos dias passaram, bem como qty e curhedgeqty. Usado para rastrear as quantidades absolutas de ETFs para comprar tanto para o lado longo e curto. Eu configurei isso para ser 2.000 unidades em uma conta de capital de 100.000 USD. O próximo método setcorrecttimeandprice é um método auxiliar utilizado para garantir que o Filtro Kalman tenha todas as informações de preço corretas disponíveis no ponto certo. Isso é necessário porque em um sistema backtest evento-driven como QSTrader informações sobre o mercado chega seqüencialmente. Podemos estar em uma situação no dia K onde weve recebeu um preço para IEI, mas não TFT. Portanto, devemos esperar até que os eventos do 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, uma vez que eles vão chegar quase instantaneamente em comparação com o período de negociação de alguns dias. No entanto, em um evento backtest-driven temos de esperar para ambos os preços para chegar antes de calcular a nova atualização do filtro Kalman. O código essencialmente verifica se o evento subseqüente é para o dia atual. Se for, então o preço correto é adicionado à lista latestprice de TLT e IEI. Se for um novo dia, então os preços mais recentes são redefinidos e os preços corretos são mais uma vez adicionados. Este tipo de método de limpeza provavelmente será absorvido na base de código do QSTrader no futuro, reduzindo a necessidade de escrever um código padronizado, mas por agora ele deve fazer parte da própria estratégia. O núcleo da estratégia é realizado no método calculatesignals. Em primeiro lugar, definimos os horários e preços corretos (conforme descrito acima). Então nós verificamos que nós temos ambos os preços para TLT e IEI, em que ponto nós podemos considerar sinais negociando novos. Y é definido igual ao último preço para IEI, enquanto F é a matriz de observação contendo o último preço para TLT, bem como um espaço reservado de unidade para representar a interceptação na regressão linear. O Filtro de Kalman é posteriormente atualizado com estes últimos preços. Finalmente, calculamos o erro de previsão et eo 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 ea matriz de observação F. contendo os preços de IEI e TLT, respectivamente. Calculamos a matriz de variância-covariância R ou a definimos como zero-matrix se ainda não foi inicializada. Subsequentemente, calculamos a nova previsão da observação yhat assim como o erro de previsão et. Calculamos então a variância das previsões de observação Qt bem como o desvio padrão sqrtQt. Utilizamos as regras de atualização derivadas aqui para obter a distribuição posterior dos estados teta. Que contém a razão de hedge entre os dois preços: Finalmente, geramos os sinais de negociação com base nos valores de et e sqrt. Para isso precisamos verificar qual é o status investido - longo, curto ou Nenhum. Observe como precisamos ajustar a quantidade de hedge atual curhedgeqty quando vamos longo ou curto como theta0t inclinação está constantemente ajustando no tempo: Este é todo o código necessário para o objeto Estratégia. Também precisamos criar um arquivo de backtest para encapsular todas as nossas opções de lógica e classe de negociação. A versão particular é muito semelhante àqueles utilizados no diretório de exemplos e substitui o patrimônio de 500.000 USD por 100.000 USD. Também altera o FixedPositionSizer para o NaivePositionSizer. Este último é usado para aceitar ingenuamente as sugestões de quantidades absolutas de ETF unidades para o comércio, conforme determinado na classe KalmanPairsTradingStrategy. Em um ambiente de produção, seria necessário ajustar isso dependendo dos objetivos de gerenciamento de risco da carteira. Aqui está o código completo para o kalmanqstraderbacktest. py: Desde que o QSTrader esteja instalado corretamente e os dados tenham sido baixados do Yahoo Finance o código pode ser executado através do seguinte comando no terminal: Graças aos esforços de muitos desenvolvedores voluntários, particularmente Ryankennedyio e femtotrader. O código é bem otimizado para dados de barra OHLCV e realiza o backtesting rapidamente. Resultados da Estratégia Uma das características mais recentes a serem adicionadas ao QSTrader é a da tearsheet desenvolvida principalmente por nwillemse. Este recurso ainda está em estágio inicial de desenvolvimento, mas será demonstrado aqui. Uma tearsheet é usada primeiramente dentro das configurações institucionais como uma descrição de um pager de uma estratégia negociando. A classe TearsheetStatistics na base de código QSTrader reproduz muitas das estatísticas encontradas em um relatório de desempenho de estratégia típico. Os dois principais gráficos representam a curva de equidade e a porcentagem de redução, respectivamente. Abaixo estão os painéis mensais e anuais de desempenho. Finalmente, são apresentadas as estatísticas de equidade, comércio e tempo: Clique na imagem para ampliá-la. A curva de equidade começa relativamente plana para o primeiro ano da estratégia, mas cresce rapidamente durante 2017. Durante 2017, a estratégia torna-se significativamente mais volátil restante subaquática até 2017 e atingindo um percentual de redução diária máxima de 15,79. O desempenho aumenta gradualmente do rebaixamento máximo em 2017 atrasado até 2017. A estratégia tem um CAGR de 8.73 com uma relação de Sharpe de 0.75. Ele também tem uma longa duração de levantamento máximo de 777 dias - mais de dois anos Observe que esta estratégia é realizada bruto de custos de transação para o verdadeiro desempenho seria provavelmente pior. Próximas etapas Há um monte de trabalho de pesquisa necessário para transformar isso em uma estratégia rentável que iria implementar em um ambiente ao vivo. Vias potenciais da pesquisa incluem: Optimization do parâmetro - variando os parâmetros do filtro de Kalman através da busca da grade da validação cruzada ou alguma forma da optimização da aprendizagem da máquina. Entretanto, isto introduz a possibilidade distinta de overfitting aos dados históricos. Seleção de ativos - Escolher pares adicionais ou alternativos de ETFs ajudaria a agregar diversificação ao portfólio, mas aumenta a complexidade da estratégia, bem como o número de negócios (e, portanto, os custos de transação). In future articles we will consider how to carry out these procedures for various trading strategies. References 1 Chan, E. P. (2017) Algorithmic Trading: Winning Strategies and their Rationale . Wiley 2 OMahony, A. (2017) Ernie Chans EWAEWC pair trade with Kalman filter . quantopianpostsernie-chans-ewa-slash-ewc-pair-trade-with-kalman-filter Just Getting Started with Quantitative TradingStatistical Arbitrage Using the Kalman Filter One of the challenges with the cointegration approach to statistical arbitrage which I discussed in my previous post. is that cointegration relationships are seldom static: they change quite frequently and often break down completely. Back in 2009 I began experimenting with a more dynamic approach to pairs trading, based on the Kalman Filter. In its simplest form, we model the relationship between a pair of securities in the following way: beta(t) beta(t-1) w beta(t), the unobserved state variable, that follows a random walk Y(t) beta(t)X(t) v The observed processes of stock prices Y(t) and X(t) N(0,Q) meaning w is gaussian noise with zero mean and variance Q N(0,R) meaning v is gaussian noise with variance R So this is just like the usual pairs relationship Y beta X v, where the typical approach is to estimate beta using least squares regression, or some kind of rolling regression (to try to take account of the fact that beta may change over time). In this traditional framework, beta is static, or slowly changing. In the Kalman framework, beta is itself a random process that evolves continuously over time, as a random walk. Because it is random and contaminated by noise we cannot observe beta directly, but must infer its (changing) value from the observable stock prices X and Y. (Note: in what follows I shall use X and Y to refer to stock prices. But you could also use log prices, or returns). Unknown to me at that time, several other researchers were thinking along the same lines and later published their research. One such example is Statistical Arbitrage and High-Frequency Data with an Application to Eurostoxx 50 Equities . Rudy, Dunis, Giorgioni and Laws, 2010. Another closely related study is Performance Analysis of Pairs Trading Strategy Utilizing High Frequency Data with an Application to KOSPI 100 Equities . Kim, 2017. Both research studies follow a very similar path, rejecting beta estimation using rolling regression or exponential smoothing in favor of the Kalman approach and applying a Ornstein-Uhlenbeck model to estimate the half-life of mean reversion of the pairs portfolios. The studies report very high out-of-sample information ratios that in some cases exceed 3. I have already made the point that such unusually high performance is typically the result of ignoring the fact that the net PnL per share may lie within the region of the average bid-offer spread, making implementation highly problematic. In this post I want to dwell on another critical issue that is particular to the Kalman approach: the signal:noise ratio, QR, which expresses the ratio of the variance of the beta process to that of the price process. (Curiously, both papers make the same mistake of labelling Q and R as standard deviations. In fact, they are variances). Beta, being a random process, obviously contains some noise: but the hope is that it is less noisy than the price process. The idea is that the relationship between two stocks is more stable 8211 less volatile 8211 than the stock processes themselves. On its face, that assumption appears reasonable, from an empirical standpoint. The question is: how stable is the beta process, relative to the price process If the variance in the beta process is low relative to the price process, we can determine beta quite accurately over time and so obtain accurate estimates of the true price Y(t), based on X(t). Then, if we observe a big enough departure in the quoted price Y(t) from the true price at time t, we have a potential trade. In other words, we are interested in: alpha(t) Y(t) 8211 Y(t) Y(t) 8211 beta(t) X(t) where Y(t) and X(t) are the observed stock prices and beta(t) is the estimated value of beta at time t. As usual, we would standardize the alpha using an estimate of the alpha standard deviation, which is sqrt(R). (Alternatively, you can estimate the standard deviation of the alpha directly, using a lookback period based on the alpha half-life). If the standardized alpha is large enough, the model suggests that the price Y(t) is quoted significantly in excess of the true value. Hence we would short stock Y and buy stock X. (In this context, where X and Y represent raw prices, you would hold an equal and opposite number of shares in Y and X. If X and Y represented returns, you would hold equal and opposite market value in each stock). The success of such a strategy depends critically on the quality of our estimates of alpha, which in turn rest on the accuracy of our estimates of beta. This depends on the noisiness of the beta process, i. e. its variance, Q. If the beta process is very noisy, i. e. if Q is large, our estimates of alpha are going to be too noisy to be useful as the basis for a reversion strategy. So, the key question I want to address in this post is: in order for the Kalman approach to be effective in modeling a pairs relationship, what would be an acceptable range for the beta process variance Q. (It is often said that what matters in the Kalman framework is not the variance Q, per se, but rather the signal:noise ratio QR. It turns out that this is not strictly true, as we shall see). To get a handle on the problem, I have taken the following approach: (i) Simulate a stock process X(t) as a geometric brownian motion process with specified drift and volatility (I used 0, 5 and 10 for the annual drift, and 10, 30 and 60 for the corresponding annual volatility). (ii) simulate a beta(t) process as a random walk with variance Q in the range from 1E-10 to 1E-1. (iii) Generate the true price process Y(t) beta(t) X(t) (iv) Simulate an observed price process Yobs(t), by adding random noise with variance R to Y(t), with R in the range 1E-6 to 1.0 (v) Calculate the true, known alpha(t) Y(t) 8211 Yobs(t) (vi) Fit the Kalman Filter model to the simulated processes and estimate beta(t) and Yest(t). Hence produce estimates kfalpha(t) Yobs(t) 8211 Yest(t) and compare these with the known, true alpha(t). The charts in Fig. 1 below illustrate the procedure for a stock process X(t) with annual drift of 10, annual volatility 40, beta process variance Q of 8.65E-9 and price process variance R of 5.62E-2 (QR ratio of 1.54E-7). FIG. 1 True and Estimated Beta and Alpha Using the Kalman Filter As you can see, the Kalman Filter does a very good job of updating its beta estimate to track the underlying, true beta (which, in this experiment, is known). As the noise ratio QR is small, the Kalman Filter estimates of the process alpha, kfalpha(t), correspond closely to the true alpha(t), which again are known to us in this experimental setting. You can examine the relationship between the true alpha(t) and the Kalman Filter estimates kfalpha(t) is the chart in the upmost left quadrant of the figure. The correlation between the two is around 89. With a level of accuracy this good for our alpha estimates, the pair of simulated stocks would make an ideal candidate for a pairs trading strategy. Of course, the outcome is highly dependent on the values we assume for Q and R (and also to some degree on the assumptions made about the drift and volatility of the price process X(t)). The next stage of the analysis is therefore to generate a large number of simulated price and beta observations and examine the impact of different levels of Q and R, the variances of the beta and price process. The results are summarized in the table in Fig 2 below. Fig 2. Correlation between true alpha(t) and kfalpha(t) for values of Q and R As anticipated, the correlation between the true alpha(t) and the estimates produced by the Kalman Filter is very high when the signal:noise ratio is small, i. e. of the order of 1E-6, or less. Average correlations begin to tail off very quickly when QR exceeds this level, falling to as low as 30 when the noise ratio exceeds 1E-3. With a QR ratio of 1E-2 or higher, the alpha estimates become too noisy to be useful. I find it rather fortuitous, even implausible, that in their study Rudy, et al, feel able to assume a noise ratio of 3E-7 for all of the stock pairs in their study, which just happens to be in the sweet spot for alpha estimation. From my own research, a much larger value in the region of 1E-3 to 1E-5 is more typical. Furthermore, the noise ratio varies significantly from pair to pair, and over time. Indeed, I would go so far as to recommend applying a noise ratio filter to the strategy, meaning that trading signals are ignored when the noise ratio exceeds some specified level. The take-away is this: the Kalman Filter approach can be applied very successfully in developing statistical arbitrage strategies, but only for processes where the noise ratio is not too large. One suggestion is to use a filter rule to supress trade signals generated at times when the noise ratio is too large, andor to increase allocations to pairs in which the noise ratio is relatively low.
Comments
Post a Comment