Thursday 8 March 2018

Estratégia de negociação de filtro de kalman


Filtro de Kalman e Pairs Trading 1.
Para determinar os índices de cobertura para um par de séries de preços cointegradas é bastante simples: usando seus dados históricos e executando o OLS para um ajuste de regressão ou o teste de Johansen para encontrar os modelos.
Minha preocupação aqui é a mesma encontrada nos últimos dois experimentos (1,2), alta MMD e volatilidade, devido à base de nossa estratégia e gostaria de encontrar uma maneira de melhorá-la, resolvendo o problema da estacionararia. Em todas as estratégias que utilizamos até agora, nós apenas tomamos um período de retrocesso em movimento e encontramos o coeficiente de regressão ao longo de um período de tempo específico. Mas se o período de look-back for curto, a omissão do primeiro bar e a inclusão da última barra com o passar do tempo podem causar erros na relação de hedge. Este problema também existe no caso de usar uma média móvel ou desvios padrão em movimento para calcular a média atual e o desvio padrão. Quanto à solução, devemos melhorar nosso modelo adicionando mais peso ao conjunto de dados mais recente e menos peso aos dados anteriores sem um ponto de corte arbitrário. Aqui eu escolho Kalman Filters como o esquema para atualizar a taxa de cobertura ao longo do tempo.
O Filtro Kalman é um algoritmo que usa observações baratas (incluindo outliers) de um sistema ao longo do tempo para estimar os parâmetros do sistema e prever futuras observações. Em cada passo de tempo, faz uma predição, toma uma medida e atualiza-se de acordo com a comparação da comparação. Ao fazer o ajuste por si só, realmente geramos um modelo de aprendizado preditivo que pode aprender e atualizar-se através dos dados que o alimentamos. O pressuposto por trás desse modelo é que a variável oculta no tempo t é uma função linear de si mesma no tempo t -1 com ruído e o ruído obedece às distribuições de caminhada aleatórias.
Neste caso, escolho o 'WWAV' (WhiteWave Foods Co) uma das empresas de alimentos orgânicos como o objeto. Eu uso trama de dispersão colorida para mostrar a correlação entre WWAV e SPY (S & amp; P500) ao longo de 2 anos (de 2018-01-01 a 2018-01-01) com cada ponto colorido por data. A partir do gráfico, podemos dizer que as mudanças desses dois não podem ser descritas com precisão por regressão linear simples com inclinação constante e interceptação.
Na verdade, podemos encontrar melhores estimativas de α e β ao longo do tempo. Além disso, podemos ver o quanto os parâmetros flutuam em longos períodos de tempo. Se estamos usando estratégia de hedging beta, é cada vez mais importante estimar beta com precisão.
Agora, podemos traçar a forma como o sistema evolui através do tempo usando os Filtros Kalman; traçamos cada quinto estado (modelo linear) abaixo, a linha preta é aquela quando usamos regressão OLS ordinária no conjunto de dados completo.
Todos os gráficos que postei antes utilizam o preço de fechamento como medida. Mas usamos retornos em vez de preços para fazer a regressão em geral. O próximo passo mostraria a mesma estrutura de regressão linear nos dados de retorno pelo método de filtro de Kalman.
Como o filtro de Kalman atualiza suas estimativas a cada passo e tende a pesar as observações recentes mais do que as mais velhas, outra aplicação útil é a estimativa dos parâmetros de rolamento dos dados. Por exemplo, se já calculamos a relação Sharpe em movimento, podemos suavize-o usando um filtro de Kalman.
No próximo artigo, vou adicionar Filtros Kalman no meu modelo de negociação de pares e tentar usá-lo para alisar a relação de cobertura da estratégia.
Sinta-se à vontade para comentar sobre ineficiências sobre qualquer coisa que eu expliquei aqui como de costume. Estou sempre aberto aos erros e disposto a aprender com eles como iniciante nesta área.
Ao bater palmas mais ou menos, você pode nos indicar quais são as histórias que realmente se destacam.

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

Tag: Filtro Kalman.
Arbitragem estatística bem sucedida.
Eu tendem a não me envolver na Q & amp; A com os leitores do meu blog, ou com os investidores. Estou em um ponto da minha vida, onde gasto o tempo principalmente fazendo o que eu quero fazer, e não o que outras pessoas gostariam que eu fizesse. E desde que eu gosto de fazer pesquisas e negociação, & # 8230;
ETF Pairs Trading com o Filtro Kalman.
O leitor me perguntou se eu poderia ilustrar a aplicação da técnica de filtro de Kalman descrita na minha publicação anterior com um exemplo. Deixe-se levar o par ETF AGG IEF, usando dados diários de janeiro de 2006 a fevereiro de 2018 para estimar o modelo. Como você pode ver no gráfico da Fig. 1, o & # 8230;
Arbitragem estatística usando o filtro Kalman.
Um dos desafios com a abordagem de cointegração à arbitragem estatística que eu discuti na minha publicação anterior é que as relações de cointegração raramente são estáticas: elas mudam com bastante freqüência e muitas vezes se quebram completamente. Em 2009, comecei a experimentar uma abordagem mais dinâmica para o comércio de pares, com base no Filtro Kalman. Em & # 8230;
Uma Aplicação Prática de Modelos de Mudança de Regime para Pairs Trading.
Na publicação anterior, delineei algumas das técnicas disponíveis utilizadas para modelar estados de mercado. O seguinte é uma ilustração de como essas técnicas podem ser aplicadas na prática. Você pode baixar esta publicação em formato pdf aqui. O gráfico abaixo mostra os retornos compostos diariamente para um único par em uma arbitragem estatística ETF e # 8230;
Aprendendo o Filtro Kalman.
Muitas pessoas ouviram falar da filtragem de Kalman, mas consideram o assunto tão misterioso. Embora seja verdade que derivar o filtro de Kalman e provar matematicamente que é & # 8220; óptimo & # 8221; Em uma variedade de circunstâncias pode ser bastante intenso, aplicar o filtro em um sistema linear básico é realmente muito fácil. Este arquivo Matlab pretende demonstrar isso.

estratégia de comércio de filtros de Kalman
Esta estratégia é tirada do Exemplo 3.3 no livro de Ernie Chan, Algorithmic Trading: Winning Strategies and Their Rationale. Ele foi postado aqui anteriormente, mas que usou constantes para os coeficientes de regressão linear.
Neste caso, um filtro de Kalman é usado para atualizar dinamicamente os coeficientes de regressão linear entre os ETF EWA e EWC. Ele funciona bem até 2009, mas depois disso o desempenho se degrada.
legal, obrigado por este exemplo.
O filtro Kalman é muito poderoso, uma vez que você compreende como funciona. Se você estiver fazendo o trabalho off-line, confira o módulo pykalman. A idéia de ponderação da ordem é legal, eu não pensei nisso.
Existe um motivo pelo qual você apenas reequilibra semanalmente? Você pode reduzir a freqüência de negociação reduzindo a covariância de transição (delta) e aumentando a covariância de observação (Ve). Isso tem o efeito de diminuir a velocidade na qual os coeficientes de regressão mudam.
Alguém sabe se o filtro kalman pode ser estendido para mais de dois títulos onde as variáveis ​​dependentes e independentes não são tão claras?
@Simon, é fácil expandir a regressão linear n-dimensional aumentando as dimensões da matriz de observação para o filtro de Kalman (variável x no algoritmo). Este backtest faz uma regressão entre o SPY eo XLE, XLF e XLI do setor ETF.
Primeiro, obrigado pelo seu excelente trabalho. Eu ia explorar esse algoritmo de filtro de Kalman antes de você publicar. Você me ajudou e muitas pessoas aqui.
Em segundo lugar, para a maioria dos algos de comércio de par, precisamos testar a cointegração do par utilizando principalmente o teste ADF ou Johansen. Neste exemplo, o par EWA-EWC é testado com o teste de Johansen e mostrou que o par possui um eigenvector bom. Existe alguma maneira de que um par trading algo inclua um desses testes e nos dá uma confirmação se o par for bom ou não antes que ele seja executado?
Em terceiro lugar, um pouco mais longe, existe alguma maneira de um algoritmo pesquisar o melhor par usando esses testes, escolher o (s) par (s) certo (s) e executar com Kalman Filter algo?
Por fim, eu me pergunto por que o modelo de par EWA-EWC ordena as mesmas ações por longas e curtas. Isso já inclui fatores ajustados ao risco? E se eu definir um par que tenha os melhores autovetores, mas a relação preço e beta é muito alta? Nesse caso, ordenar as mesmas ações por longo / curto não faz nenhum sentido. Como o modelo de par de Kalman Filter funciona em relação ao ajuste de risco?
Existe alguma maneira de que um par trading algo inclua um desses testes e nos dá uma confirmação se o par for bom ou não antes que ele seja executado?
Você poderia usar a função adfuller no pacote statsmodels para testar a cointegração. Na minha experiência, uma boa estatística de teste Dickey-Fuller não implica necessariamente um par lucrativo para negociação. AFAIK, o teste de Johansen não está disponível em nenhuma biblioteca pública de python, mas há um problema aberto para incluí-lo em statsmodels.
Existe alguma maneira de um algoritmo pesquisar o melhor par usando esses testes, escolher o (s) par (s) certo (s) e executar com Kalman Filter algo?
Encontrar bons pares para negociação é um problema difícil e computacionalmente caro. Dê uma olhada no tópico de Simon, Grid-searching for rentable cointegrating portefeitos, para uma boa discussão sobre isso.
Me pergunto por que o modelo de pares EWA-EWC ordena as mesmas partes por longas e curtas.
Ele não classifica o mesmo número de ações por longo e curto. Se nós estamos indo "longos" no spread EWA / EWC, compramos X quantidade de ações na EWC e vendemos beta * X de ações na EWA. Esta é uma posição coberta e nunca mais é longa e curta na propagação ao mesmo tempo.
Oooops. Certo, não eram as mesmas ações.
Obrigado. Eu irei procurar a função aderente e o fio de Simon.
Sim, encontrar pares certos é muito difícil. Mesmo este filtro de filtro de Kalman não funciona com alguns outros pares. Eu acho que precisamos trabalhar mais e mais.
Mais uma vez, obrigado pelo excelente trabalho.
Aidan - meu ponto é que, mesmo com um filtro de Kalman, é preciso decidir a priori qual variável é a variável dependente e quais são regressores independentes. Em uma situação de cesta, isso parece sem sentido?
O filtro de Kalman funciona de acordo com os pressupostos de que você tem uma função de predição boa ao aproximar o comportamento do fenômeno que está tentando rastrear e que o erro na saída dessa função é normalmente distribuído. Em simulações de fenômenos físicos, isso funciona bem, porque você sabe que um míssil que você está tentando atirar com um laser, por exemplo, não irá de repente virar 90 graus de volta. As leis físicas limitam os possíveis estados seguintes desse míssil a uma pequena gama de valores.
Os mercados, por outro lado, podem girar 180 graus sem aviso prévio e não há impulso físico para torná-los rastreáveis. Talvez eu esqueça alguma coisa, mas não vejo por que um filtro de Kalman deve funcionar bem.
Um filtro de partículas, pelo menos, melhoraria a situação, eliminando a suposição sobre o comportamento linear. Pensamentos?
Embora eu não me considere um cientista de dados, eu fiz a modelagem (programação) para alguns. Em relação ao sucesso aparente deste exemplo, para mim, isto parece ser apenas uma caixa preta "& quot; O resultado final é a média das tendências e dar-lhe um preditor do próximo timestep. Eu não estou dizendo que é tudo, mas para aqueles (como eu) que não entendem completamente a matemática por trás do algoritmo, é o que é isso.
Ah, também, você não precisa de um "dependente" separado variável. apenas um fluxo de entrada, aquilo que prevê o próximo valor de si mesmo.
Edite: pelo menos, isso é o que o filtro kalman como descrito na wikipedia é sobre. Eu não vi a implementação que Aidan deu.
@Simon, você está certo, isto não é um experimento científico e não é óbvio qual o recurso a ser utilizado como variável dependente. A questão importante é que realmente importa qual o bem que escolhemos para ser dependente? Em meus próprios testes, eu descobri que não faz muita diferença para o resultado final. Como regra geral, escolho a variável dependente que dá o maior valor do coeficiente de cointegração, o que implica que o ativo com menor volatilidade é independente.
@Eric e @Jason, há um raciocínio por trás do uso de um filtro Kalman para esta aplicação!
Primeiro, vamos ver o que estamos tentando alcançar. Queremos construir uma série de tempo estacionária (spread) a partir de duas séries temporais não estacionárias, individualmente (EWA e EWC). Vamos assumir que existe um parâmetro (coeficiente beta ou cointegração), de modo que o residual da combinação linear das séries temporais não estacionárias seja estacionário e podemos usar as séries estacionárias resultantes para gerar sinais comerciais. Em um mundo perfeito, beta seria constante e nosso trabalho seria feito.
Nosso problema agora é que o beta não é constante e muda gradualmente (supondo que a série permaneça cointegrada) ao longo do tempo. Para usar um filtro de Kalman, precisamos formular uma equação de observação e transição. A equação de observação é a combinação linear da série temporária não estacionária mais o ruído branco gaussiano. Isso é realmente apenas uma regressão linear de EWA e EWC. A equação de transição assume que beta é igual ao beta anterior mais o ruído branco gaussiano. Esta é uma caminhada aleatória.
O uso de modelos não-lineares mais complexos provavelmente não melhorou as coisas, como disse Ernie Chan em modelos não-lineares, as experiências me mostraram que os modelos não-lineares foram principalmente desastres não-mitigados em termos de lucros de negociação & quot; e "One é quase certo para superar um modelo não-linear para ruído não recorrente".
haha, obrigado, amigo :)
Acabei de receber uma cópia do livro de Ernie Chan, então ansioso por ler sobre isso em detalhes :)
Obrigado por publicar isso. Ainda não achei o segundo livro de Ernie, mas eu tenho curiosidade por que alguém use essa estratégia, dado que isso ocorre horrivelmente assim que você fator em derrapagens e comissões. Mesmo com 10 vezes mais capital, ele ainda perde dinheiro.
Eu sou novo na negociação, então é provável que eu não tenha entendido algo aqui. Alguém pode explicar quando essa estratégia (ou estratégias de negociação de pares similares) fariam sentido?
Usando a configuração atual do algo, ele troca freqüentemente, quase todos os dias, e o lucro de cada comércio não é suficiente para cobrir os custos de transação. Comporta frequentemente porque o filtro de Kalman responde rapidamente às mudanças no spread EWA / EWC. Reduzir a sensibilidade do filtro de Kalman diminuirá a freqüência comercial e somente trocará desvios maiores no spread, o que aumentará o retorno esperado. Para responder a sua pergunta, só faz sentido usar essa estratégia, ou qualquer outra estratégia, quando o retorno esperado de uma negociação for maior do que os custos de transação.
Aqui está uma facada completa no escuro:
Queria perguntar qual é o significado desta linha:
Por que não quer traçar valores onde o spread é & gt; = 5?
Eu não consigo lembrar exatamente por que eu fiz isso. Era algo a ver com manter a escala y na saída do gráfico de registro pequena, então é mais fácil de ver. Não ganhou nenhum efeito nos resultados se você o remover.
Sim, clonou o algoritmo e descobriu já. É apenas lá para filtrar os extremos iniciais da saída do gráfico. Obrigado.
Posso ver um problema ao tentar usar o filtro de Kalman para negociação - a memória infinita. Eu apenas tentei incluir mais amostras antes da data de início do backtest - ainda afeta a previsão de beta / alpha, mesmo quando uso milhares de amostras (sem convergência). Eu acho que para o aplicativo comercial, a implementação real do filtro Kalman deve ser mais tendenciosa em dados recentes e ser capaz de "esquecer" sobre dados do passado antigo. Claro, você pode configurar o & quot; pre-train & quot; comprimento de fase para algum valor arbitrário, mas para qual?
Existem algumas implementações como esta discutidas (por exemplo, procure Filtro Adaptive Fading Kalman). Alguém tem experiências com essas modificações?
Como eu mudaria o algoritmo para negociação diária?
Existe um motivo pelo qual as ordens só ocorrem nos últimos 5 minutos do dia de negociação?
Além disso, quando você executa um backtest completo e olha os detalhes da transação, há algumas vezes pedidos múltiplos no mesmo dia. Por exemplo, em 5-03-06, houve a seguinte ordem: -1137 EWA, -1125 EWA, +1000 EWC e +1000 EWC. Por que há vários pedidos no mesmo dia?
Em 4-26-06, havia apenas uma ordem: -1000 EWC. Por que houve apenas um pedido e nenhum comércio de pares correspondente, ou seja, + EWA?
Obrigado por compartilhar o algoritmo e responder perguntas.
Existe um motivo pelo qual as ordens só ocorrem nos últimos 5 minutos do dia de negociação?
O original original de Ernie Chan é executado em dados de fechamento diários para replicar isso no Quantopian, usei o preço de fechamento às 3.55PM para atualizar o filtro de Kalman e permitir 5 minutos antes do fechamento do mercado para qualquer pedido a ser preenchido.
Muito obrigado pela sua resposta.
Alterar o tempo que as ordens ocorrem por 15 a 30 minutos podem alterar significativamente os resultados de um backtest (por exemplo, mudando de 3:55 pm a 3:30 pm). Por que isso acontece? Existe um momento ideal para executar negócios? Obrigado.
Por que isso acontece? Existe um momento ideal para executar negócios?
Não tenho certeza do motivo, mas se eu tivesse que adivinhar, diria que a arbitragem altera melhor com o aumento da volatilidade e, em geral, a volatilidade é maior em relação ao mercado aberto e ao mercado próximo. Não tenho certeza se houver um "tempo ideal" para executar negócios, isso realmente depende do que você está tentando explorar.
Como os pontos de entrada e saída são escolhidos? Uma posição curta é aberta quando e & gt; sqrt (Q). Então, devemos esperar que e diminua. Mas nós simplesmente saímos quando voltar a sqrt (Q) novamente. Por que é isso?
Como a transação sempre começa com uma perna em vez de duas pernas?
Por que isso acontece? Existe um momento ideal para executar negócios?
Não há tempo ideal específico para executar negócios, no entanto sua tese / análise é baseada em dados diários de preços fechados. Portanto, você deve tentar minimizar o deslizamento contra o próximo preço de fechamento em cada dia. A execução de negociações de 15 minutos antes do fechamento do mercado ainda o sujeita à probabilidade de derrapagem em relação ao preço fechado naquele dia, mas como você decide o tempo ideal. talvez 5 minutos antes do fechamento. ou 2 minutos? Definir a execução / ordem o mais próximo possível para o fechar aumenta a probabilidade de o seu pedido não ser preenchido, então você precisará avaliar o trade off entre o preço próximo - o deslizamento / probabilidade de execução.
Obrigado por compartilhar Aidan. Isso foi tão útil junto com seu caderno de filtro Kalman.
Tenho uma dúvida sobre a configuração de inicialização que você tem aqui. In the notebook, you assumed the measurement error to be 10, or Ve to be 100, but here you set Ve to something dramatically smaller, 0.001. Is there a reason behind such huge discrepancy? This number can obviously change the results dramatically.
When I rerun the numbers, I can get negative value for Q which result in errors when I calculate sqrt(Q). How do you manage negative Qs?
problem solved for only one leg in the beginning.
However, mean reversion quality for bond product is very bad.
Better try on other equity or FX spreads.
If we are using a Kalman filter as in the the example above, would we still need to reblanace any open positions periodically to reflect the position in the latest spread as it is getting updated by the Kalman Filter?
(sorry but i dont seem to be able to see any rebalancing in the algorithm?)
hi thx aidan for the nice post. It certainly helps to enlightened more about Kalman filter application. Just wonder what will be the best practice in using this Kalman filter to find the cointegrated pairs. Will following two approaches both reasonable?
Testing cointegration based on simple OLS residual (spread) analysis.
I've found option 2 wasn't really appropriate since it makes an assumption on evolving state of beta which might impact the regression residual of the actual price measurement. Let me know what others think as well. Obrigado.
Agree with your analysis. Approach 1 is reasonable but you'll find most of the time the conitegration relationship will break down and will never revert to the mean. Approach 2 doesn't make a lot of sense as the relationship is constantly evolving.
thx aidan. Guess i will try to combine both analysis (i. e. in sample cointegration analysis based on simple OLS to find the pairs and out sample forecast based on Kalman filter for trading signal). Do you think this approach makes sense?
Are there any leverage used in this algo?
Hi, I'm seeking help here. While I'm understanding Kalman Filter and trying to apply this algorithm in real trades, there are something I don't quite understand.
In the sample algorithm, the kalman filter takes one price for each symbol, and get hedge ratio, mean, standard deviation etc. So that it further decides if we can enter long/short at a moment. However, in real trades, for every tick/bar, there are bid price and short price for every symbol, so they are two values of each symbol, four values for pair trading. Then how should we use the four values to calculate trading signal?
Actually this question is not only about Kalman Filter, but general to any backtest program. Back test data has only one value for each time (which might be OPEN or CLOSE), but in real trades, there are lowest ask, highest bid and other order prices. Which values should we use to decide trading signal?
Appreciate any help!
Desculpe, algo deu errado. Tente novamente ou contate-nos enviando comentários.
Você enviou um ticket de suporte com sucesso.
Nossa equipe de suporte estará em contato em breve.
O material deste site é fornecido apenas para fins informativos e não constitui uma oferta de venda, uma solicitação de compra ou uma recomendação ou endosso para qualquer segurança ou estratégia, nem constitui uma oferta de prestação de serviços de consultoria de investimento pela Quantopian.
Além disso, o material não oferece nenhuma opinião em relação à adequação de qualquer segurança ou investimento específico. Nenhuma informação contida neste documento deve ser considerada como uma sugestão para se envolver ou abster-se de qualquer curso de ação relacionado ao investimento, já que nenhuma das empresas atacadas ou nenhuma das suas afiliadas está a comprometer-se a fornecer conselhos de investimento, atuar como conselheiro de qualquer plano ou entidade sujeito a A Lei de Segurança de Renda de Aposentadoria do Empregado de 1974, conforme alterada, conta de aposentadoria individual ou anuidade de aposentadoria individual, ou dar conselhos em capacidade fiduciária em relação aos materiais aqui apresentados. Se você é um aposentadorio individual ou outro investidor, entre em contato com seu consultor financeiro ou outro fiduciário não relacionado a Quantopian sobre se qualquer idéia, estratégia, produto ou serviço de investimento descrito aqui pode ser apropriado para suas circunstâncias. Todos os investimentos envolvem risco, incluindo perda de principal. A Quantopian não oferece garantias sobre a precisão ou integridade das opiniões expressas no site. Os pontos de vista estão sujeitos a alterações e podem ter se tornado pouco confiáveis ​​por vários motivos, incluindo mudanças nas condições do mercado ou nas circunstâncias econômicas.
O material deste site é fornecido apenas para fins informativos e não constitui uma oferta de venda, uma solicitação de compra ou uma recomendação ou endosso para qualquer segurança ou estratégia, nem constitui uma oferta de prestação de serviços de consultoria de investimento pela Quantopian.
Além disso, o material não oferece nenhuma opinião em relação à adequação de qualquer segurança ou investimento específico. Nenhuma informação contida neste documento deve ser considerada como uma sugestão para se envolver ou abster-se de qualquer curso de ação relacionado ao investimento, já que nenhuma das empresas atacadas ou nenhuma das suas afiliadas está a comprometer-se a fornecer conselhos de investimento, atuar como conselheiro de qualquer plano ou entidade sujeito a A Lei de Segurança de Renda de Aposentadoria do Empregado de 1974, conforme alterada, conta de aposentadoria individual ou anuidade de aposentadoria individual, ou dar conselhos em capacidade fiduciária em relação aos materiais aqui apresentados. Se você é um aposentadorio individual ou outro investidor, entre em contato com seu consultor financeiro ou outro fiduciário não relacionado a Quantopian sobre se qualquer idéia, estratégia, produto ou serviço de investimento descrito aqui pode ser apropriado para suas circunstâncias. Todos os investimentos envolvem risco, incluindo perda de principal. A Quantopian não oferece garantias sobre a precisão ou integridade das opiniões expressas no site. Os pontos de vista estão sujeitos a alterações e podem ter se tornado pouco confiáveis ​​por vários motivos, incluindo mudanças nas condições do mercado ou nas circunstâncias econômicas.

Kalman filter trading strategy


Puxe pedidos 0.
Participe do GitHub hoje.
O GitHub é o lar de mais de 20 milhões de desenvolvedores que trabalham juntos para hospedar e rever o código, gerenciar projetos e criar software juntos.
Clone com HTTPS.
Use o Git ou o check-out com o SVN usando o URL da web.
This is a general purpose lightweight backtesting engine for stocks, written in modern Java 8.
Some advantages compared to other backtesting implementations are:
It uses a callback model and since it is implemented in java it should be pretty performant when running many backtests Implemented in a mature programming language Easily extensible Strategies are easily debuggable using a java IDE Lightweight and therefore the backtesting engine is easily verifiable No dependencies Backtesting results are further analyzable in R or Excel since it uses a CSV output format.
I've written this library primarily to try out this particular strategy.
The cointegration strategy, or also known as pairs trading strategy, tries to take two stocks and create a linear model to find a optimal hedge ratio between them in order create a stationary process.
Assume stocks A and B with prices Pa and Pb respectively, we set Pa = alpha + beta*Pb and try to find optimal alpha and beta . One method to find alpha and beta is using a so called Kalman Filter which is a dynamic bayesian model and we use it as an online linear regression model to get our values.
After we've found the values we look at the residuals given by residuals = Pa - alpha - beta*Pb , and if the last residual is greater than some threshold value you go short n A stocks and long n*beta B stocks, for some fixed n .
For further explanation and a formal definition of cointegration and the strategy you may want to look at:
A good introduction video series to the Kalman filter can be found at Udacity (https://udacity/wiki/cs373/unit-2).
Run a backtest skeleton:
Just create a class which implements org. lst. trading. lib. model. TradingStrategy , for example a simple buy and hold strategy might look like this:
The onTick() method is called for every price change, all relevant information (like historical prices, etc..) is available through TradingContext and also orders can be submitted through it.
Backtest: The core class which runs the backtest package org. lst. trading. lib. series : TimeSeries: A general purpose generic time series data structure implementation and which handles stuff like mapping, merging and filtering. DoubleSeries: A time series class which has doubles as values. (corresponds to a pandas. Series (python)) MultipleDoubleSeries: A time series class which has multiple doubles as values. (corresponds to a pandas. DataFrame or a R Dataframe) KalmanFilter: A general purpose and fast Kalman filter implementation. Cointegration: A cointegration model using a Kalman filter. CointegrationTradingStrategy: The cointegration strategy implementation.
To run a backtest, edit and then run the main class org. lst. trading. main. BacktestMain . By default the cointegration strategy is executed with the GLD vs. GDX ETF's and you might get a result like this:
To further investigate the results you can import the CSV files into some data analysis tool like R or Excel.
I've created a R script which does some rudimentary analysis (in src/main/r/report. r ).
The return curve of the above strategy plotted using R:
This is a plot of the implied residuals:
The cointegration can be quite profitable however the difficulty is to find some good cointegrated pairs.
You might want to try for example Coca-Cola (KO) and Pepsi (PEP), gold (GLD) and gold miners (GDX) or Austrialia stock index (EWA) and Canada stock index (EWC) (both Canada and Australia are commodity based economies).
I'm generally interested in algorithmic trading and I read about the cointegration trading strategy in Ernest Chans Book and wanted to try it out. I know many people prefer using tools like Matlab and R to try out their strategies, and I also agree with them you can't get a prototype running faster using these technologies, however after the prototyping phase I prefer to implement my strategies in a "full blown" programming language where I have a mature IDE, good debugging tools and less 'magic' where I know exactly what is going on under the hood.
This is a side project and I'm not planning to extend this further.
It is thought as a educational project, if you want to do something similar, this may be a good starting point or if you just want to try out different strategies. I thought it might be useful for someone so I decided to make this open source. Feel free to do anything what you want with the code.
My name is Lukas Steinbrecher, I'm currently in the last year of the business informatics (Economics and Computer Science) master at Vienna University of Technology. I'm interested in financial markets, (algorithmic) trading, computer science and also bayesian statistics (especially MCMC methods).
If you have any questions or comments feel free to contact me via lukas@lukstei or on lukstei.
&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.

No comments:

Post a Comment