Sunday 4 February 2018

Kalman estratégia de negociação


Arbitragem Estatística Usando o Filtro de Kalman Um dos desafios com a abordagem de cointegração para arbitragem estatística que eu discuti em meu post anterior. É que os relacionamentos de cointegração são raramente estáticos: eles mudam muito freqüentemente e muitas vezes quebram completamente. Em 2009, comecei a experimentar uma abordagem mais dinâmica para a negociação de pares, baseada no filtro de Kalman. Em sua forma mais simples, modelamos a relação entre um par de títulos da seguinte maneira: beta (t) beta (t-1) w beta (t), a variável de estado não observada, que segue uma caminhada aleatória Y (t) beta (T) X (t) v Os processos observados dos preços das ações Y (t) e X (t) N (0, Q) significando w é ruído gaussiano com média zero e variância QN (0, R) significando v é ruído gaussiano Com variância R Então isto é exatamente como a relação de pares usual Y beta X v, onde a abordagem típica é estimar beta usando regressão de mínimos quadrados ou algum tipo de regressão em rotação (para tentar levar em conta o fato de que beta pode mudar mais Tempo). Nessa estrutura tradicional, o beta é estático ou está mudando lentamente. Na estrutura de Kalman, beta é em si um processo aleatório que evolui continuamente ao longo do tempo, como uma caminhada aleatória. Como é aleatório e contaminado pelo ruído, não podemos observar beta diretamente, mas devemos inferir o seu valor (em mutação) a partir dos preços observáveis ​​das ações X e Y. (Nota: no que segue, usarei X e Y para referir-se aos preços das ações. Você também pode usar log preços, ou retorna). Desconhecido para mim naquela época, vários outros pesquisadores estavam pensando na mesma linha e depois publicaram suas pesquisas. Um exemplo é o Statistical Arbitrage e High-Frequency Data com uma Aplicação para Eurostoxx 50 Equities. Rudy, Dunis, Giorgioni e Leis, 2018. Outro estudo estreitamente relacionado é Análise de Desempenho da Estratégia de Negociação de Pares Utilizando Dados de Alta Freqüência com uma Aplicação para KOSPI 100 Equities. Kim, 2017. Ambos os estudos seguem um caminho muito semelhante, rejeitando a estimativa beta usando regressão linear ou suavização exponencial em favor da abordagem de Kalman e aplicando um modelo de Ornstein-Uhlenbeck para estimar a meia-vida de reversão média das carteiras de pares. Os estudos relatam índices muito altos de informação fora da amostra que em alguns casos ultrapassam 3. Eu já fiz o ponto que tal desempenho excepcionalmente alto é tipicamente o resultado de ignorar o fato de que o PnL líquido por ação pode estar dentro da região de O spread médio de oferta / oferta, tornando a implementação altamente problemática. Neste post quero me debruçar sobre outra questão crítica que é particular à abordagem de Kalman: a relação sinal: ruído, QR, que expressa a relação entre a variância do processo beta e a do processo de preços. (Curiosamente, ambos os documentos cometem o mesmo erro de rotular Q e R como desvios-padrão. Na verdade, eles são variâncias). Beta, sendo um processo aleatório, obviamente contém algum ruído: mas a esperança é que ele é menos barulhento do que o processo de preço. A idéia é que a relação entre dois estoques seja mais estável do que os próprios processos de estocagem. Em sua face, essa suposição parece razoável, de um ponto de vista empírico. A questão é: quão estável é o processo beta, em relação ao processo de preço Se a variação no processo beta é baixa em relação ao processo de preço, podemos determinar o beta bastante precisamente ao longo do tempo e assim obter estimativas precisas do verdadeiro preço Y T), com base em X (t). Então, se observarmos uma saída suficientemente grande no preço cotado Y (t) do preço verdadeiro no tempo t, temos um potencial comércio. Em outras palavras, estamos interessados ​​em: () onde Y (t) e X (t) são os preços das ações observados E beta (t) é o valor estimado de beta no tempo t. Como de costume, padronizaríamos o alfa usando uma estimativa do desvio padrão alfa, que é sqrt (R). (Alternativamente, você pode estimar o desvio padrão do alfa diretamente, usando um período de lookback baseado na meia-vida alfa). Se o alfa padronizado for suficientemente grande, o modelo sugere que o preço Y (t) é cotado significativamente acima do valor real. Assim, nós queríamos estocar Y e comprar ações X. (Neste contexto, onde X e Y representam preços brutos, você manteria um número igual e oposto de ações em Y e X. Se X e Y representavam retornos, você manteria igual E valor de mercado oposto em cada ação). O sucesso de tal estratégia depende criticamente da qualidade de nossas estimativas de alfa, que por sua vez descansam na precisão de nossas estimativas de beta. Isso depende do ruído do processo beta, ou seja, sua variância, Q. Se o processo beta é muito ruidoso, ou seja, se Q é grande, nossas estimativas de alfa vão ser muito ruidoso para ser útil como base para uma estratégia de reversão . Então, a questão chave que eu quero abordar neste post é: para que a abordagem de Kalman seja eficaz na modelagem de uma relação de pares, o que seria um intervalo aceitável para a variância do processo beta Q. (Costuma-se dizer que o que importa Na estrutura de Kalman não é a variância Q, per se, mas sim a relação sinal: ruído QR. Acontece que isso não é estritamente verdadeiro, como veremos). Para obter um identificador do problema, tomei a seguinte abordagem: (i) Simular um processo de estoque X (t) como um processo de movimento browniano geométrico com deriva e volatilidade especificadas (usei 0, 5 e 10 para a deriva anual, E 10, 30 e 60 para a volatilidade anual correspondente). (Ii) simular um processo beta (t) como uma caminhada aleatória com variância Q na faixa de 1E-10 a 1E-1. (Iv) Simular um processo de preço observado Y (t), adicionando ruído aleatório com variância R a Y (t), com R no (T) e Yest (t) (vi) Ajustar o modelo do filtro de Kalman aos processos simulados e estimar o beta (t) e Yest (t) . Daí produzir estimativas kfalpha (t) Yobs (t) 8211 Yest (t) e compará-las com a alfa conhecida, verdadeira (t). Os gráficos na Fig. 1 abaixo ilustram o procedimento para um processo de estocagem X (t) com deriva anual de 10, volatilidade anual 40, variância do processo beta Q de 8.65E-9 e variância do processo de preço R de 5.62E-2 (razão QR de 1.54E-7 ). FIG. 1 Verdadeiro e Estimado Beta e Alfa Usando o Filtro de Kalman Como você pode ver, o Filtro de Kalman faz um bom trabalho de atualização de sua estimativa beta para rastrear o beta subjacente, verdadeiro (que, nesta experiência, é conhecido). Como a razão de ruído QR é pequena, as estimativas de Kalman Filter do processo alfa, kfalpha (t), correspondem estreitamente ao verdadeiro alfa (t), que novamente são conhecidos neste cenário experimental. Você pode examinar a relação entre o verdadeiro alfa (t) e as estimativas Kalman Filter kfalpha (t) é o gráfico no quadrante esquerdo mais alto da figura. A correlação entre os dois é de cerca de 89. Com um nível de precisão este bom para as nossas estimativas alfa, o par de ações simuladas faria um candidato ideal para uma estratégia de negociação de pares. Naturalmente, o resultado é altamente dependente dos valores que assumimos para Q e R (e também em certa medida nas suposições feitas sobre a deriva e volatilidade do processo de preço X (t)). A próxima etapa da análise é, portanto, gerar um grande número de simulações de preços e observações beta e examinar o impacto de diferentes níveis de Q e R, as variações do processo beta e preço. Os resultados estão resumidos na tabela na Fig. 2 abaixo. A correlação entre a verdadeira alfa (t) e as estimativas produzidas pelo filtro de Kalman é muito alta quando a relação sinal / ruído É pequeno, ou seja, da ordem de 1E-6, ou menos. As correlações médias começam a cair muito rapidamente quando QR excede este nível, caindo para tão baixo quanto 30 quando a relação de ruído excede 1E-3. Com uma razão QR de 1E-2 ou superior, as estimativas alfa tornam-se demasiado ruidosas para serem úteis. Eu acho bastante fortuito, até mesmo improvável, que em seu estudo Rudy, et al, se sintam capazes de assumir uma razão de ruído de 3E-7 para todos os pares de ações em seu estudo, o que apenas acontece de estar no ponto doce para alfa estimativa. De minha própria pesquisa, um valor muito maior na região de 1E-3 a 1E-5 é mais típico. Além disso, a razão de ruído varia significativamente de par para par, e ao longo do tempo. Na verdade, eu iria até recomendar a aplicação de um filtro de relação de ruído para a estratégia, o que significa que os sinais de negociação são ignorados quando a taxa de ruído excede um determinado nível especificado. O take-away é o seguinte: a abordagem do Filtro de Kalman pode ser aplicada com muito sucesso no desenvolvimento de estratégias de arbitragem estatística, mas apenas para processos em que a taxa de ruído não é muito grande. Uma sugestão é usar uma regra de filtro para suprimir os sinais de comércio gerados em momentos em que a relação de ruído é muito grande, ou para aumentar as alocações para os pares em que a relação de ruído é relativamente baixa. Kalman filtro e moedas força Juntado 2017 Status: Member 1,132 Posts Ultimamente Estou jogando com estimadores Bayesianos Recursive (en. wikipedia. orgwikiRecursi. Ianestimation) para o qual o filtro Kalman é um caso especial. Eu não vou entrar nos detalhes gory ver Bayesian Previsão e Modelos Dinâmicos por West e Harrison. No início eu estava tentando estimar a tendência ea volatilidade do mercado. Mas isso não é o que este post é sobre. Trata-se de saber por que é melhor que você fique muito tempo no Dragão hoje. O retorno do mercado não é Normalmente distribuído, mas algures entre Cauchy e Student distribuídos. Os desempenhos do filtro de Kalman degradam-se rapidamente para inovações não-normais. É por isso que eu uso outro filtro Kalman que estima o erro do primeiro e eu feedback esta informação para o primeiro modelo como uma modulação da variância permitida do estado. Um tipo de cursor dinâmico quotlag lt-gt smoothnessquot. Este primeiro modelo é uma estimativa polinomial local de segunda ordem. Eu escolhi um polinômio de 2a ordem porque pode aproximar (Taylor) qualquer função suave como uma onda senoidal para um mercado com um componente cíclico (faixa ou tendência valiosa) ou uma tendência exponencial (para índice e ações). Também o fator accelaration ajuda a recuperar o preço em caso de um movimento repentino. O segundo filtro usa apenas um modelo constante. Eu uso H4 para medir a tendência diária. Aqui está uma captura de tela do EURUSD H4. A linha azul é o filtro sinc (en. wikipedia. orgwikiSincfilter), ideal, mas não causal, usado com 41 amostras. Dá-lhe uma idéia do lag. O filtro é verde quando a tendência é mais provável e vermelho de outra forma. O envelope dash é o intervalo de confiança de 95 da estimativa de preço médio. Abaixo está o erro entre o preço ea estimativa (preto) e este valor é filtrado com o 2º filtro (vermelho). Ele não segue o erro muito para não fazer o filtro principal sobre-reagir. Imagem anexa (clique para ampliar) Nenhuma ganância. Sem medo. Apenas matemática. Registrado em Ago 2017 Status: Member 1,132 Posts Agora eu tenho uma estimativa da tendência mais provável. É importante ter em mente que é uma probabilidade não é uma certeza que eu posso usar essa informação para definir se EURUSD é provavelmente para cima ou para baixo. OK, eu ouço você, eu também posso olhar para o gráfico e ver se ele está subindo ou caindo :-). Você está certo. Mas a idéia que eu tive era repetir isto com cada um dos majores, não só para saber se eles estão para cima ou para baixo, mas o quanto eles estão para cima ou para baixo. Se GBPUSD está indo para baixo significa USD é mais forte do que Libra. Se o EUR / USD estiver em baixa também o EUR é mais fraco do que o USD também. Mas qual dos GBP ou EUR é o mais fraco? Não é possível simplesmente usar o valor pip da tendência porque o valor de um pip não é o mesmo para todos os pares. Por esta razão eu uso a porcentagem de variação. Ao dividir uma diferença de preço por um preço, obtém-se um valor sem unidade. Desta forma eu me livrar da unitscale e eu posso comparar EURNZD e USDJPY diretamente. Como EURGBP é (EURUSD) (GBPUSD) não é necessário filtrar todos os pares. A estimativa de preço ea estimativa de tendência das maiores são suficientes para linearizar com uma precisão bastante boa. Se você encontrar GBP é mais fraco do que EUR que você pode encomendar as três moedas: GBP lt EUR lt USD. Faz sentido pesquisar uma boa entrada curta em GBPUSD porque é onde temos uma boa chance de pegar uma tendência. Agora, para cada par eu ordeno as moedas par-wise, forte - gt mais fraco. Cada moeda é recompensada uma pontuação cada vez que é mais forte do que outro. Esse escore é o crescimento percentual estimado. No final cada moeda tem uma pontuação ea lista das moedas mais fortes do que ele. Posso organizar isso em um gráfico. Supõe-se que representa uma estimativa do fluxo de dinheiro. Não me pergunte por um indi personalizado como eu não posso programa MQL. Se você está interessado em codificar um indi baseado nesta idéia eu posso ajudá-lo se o tempo permitir. Pergunta aberta: se houver um ciclo no gráfico, faz sentido para o comércio de cesta as moedas envolvidas em um anel muito interessante, vai olhar para os links que você postou, atualmente eu uso as alterações de valor para Bias e exploração de comércios e add ons, eu havnt encontrei qualquer coisa que vem perto da informação que eu recebo destes pares. Embora eu vendo a mudança de valor em pip valor e porcentagem geral. havnt bastante got it perfeito em excel, mas ainda em andamento. Você menciona negociação em uma cesta, isso pode ser muito gratificante. Um bom exemplo deste tipo de negociação foi hoje, eu predominantemente comércio de cabo que, como todos os pares relacionados estava sendo empurrado para baixo. 60 plus pips, enquanto as outras cruzes doller não tinha se movido. Os pares de ienes também tinha parado, mas neste momento nenhum sinal de mudança de direção. A força no cabo foi o clue. i colocou comércios em 4 pares de ienes, o doller chf, doller cad E euro. including meu ive longo longo do cabo começ perto de 400 pips. As correlações são descartadas muito neste fórum, porque não entendeu. A maneira como você descreveu e pesquisou mostra a maneira como as correlações em relação a lá relacionamentos são muito lá, compensado por há valor pip juntamente com as condições de mudança dentro de lá próprio indivíduo Mas esses ciclos estão lá e podem ser usados. Parece que uma moeda pode ser forte, quer porque está recebendo muito de algumas outras moedas ou porque está recebendo de todos os outros. Normalmente, as duas condições correspondem. Qual é o USD mais forte com a maior pontuação ou EUR recebendo de todos os outros (a pontuação é a soma das inclinações de tendência) Também note que há um ciclo JPY-gtAUD-gtUSD. Nenhuma ganância. Sem medo. Apenas matemática. Cadastrado em Dez 2018 Status: Foook Bollinger-dr. Kegel sabe 9,292 Posts Agora eu tenho uma estimativa da tendência mais provável. É importante ter em mente que é uma probabilidade não é uma certeza. No final cada moeda tem uma pontuação ea lista das moedas mais fortes do que ele. Posso organizar isso em um gráfico. Supõe-se que representa uma estimativa do fluxo de dinheiro. Não me pergunte por um indi personalizado como eu não posso programa MQL. Se você está interessado em codificar um indi baseado nesta idéia eu posso ajudá-lo se o tempo permitir. Estou fazendo algo semelhante. Estou jogando com os índices. 7 moedas 21 pares de moedas. Estou marcando-os com algum reconhecimento estatístico uma vez por dia. Dando a cada par de moedas um número sequencial de (quotup dayquot1 e quotdown dayquot 0). Poderia ser apresentado como um fluxo de dinheiro. Mas é difícil de dizer. Definitivamente têm algumas fraquezas. Definately seu mais fácil negociar mas um necessita ser disciplinado quando nós estivermos na tendência e quando nós temos uma correção. Coisas difíceis. Como eu vejo, ele me apresenta que é as moedas mais quentes lá fora. Significado de uma forma negativa e positiva. Top 2 in e - Lower 2. O problema com este sistema é sempre o intervalo de tempo do movimento em correção, mais tarde em um estágio mais profundo corrigido e eventualmente apresentação de uma nova tendência. Difícil de programar isso. É por isso que é tão importante que um é definitivamente está tentando descobrir diariamente o que está acontecendo um. Estou usando 4 diferentes velocidades de índices. Forte tendência queridos estão definately dando-me uma apresentação da direção de fluxo de dinheiro (Figura 1). Eu obedecê-lo e eu tento jogar apenas este jogo direcional. Nas últimas semanas, estamos fortemente adorando o GBP eo EUR, enquanto estamos tentando nos livrar do CAD e do JPY. Coisas muito simples de uma forma, mas se você não está negociando gráficos mensais e um não usa paradas superiores a 300 pippers ainda não é uma tarefa fácil quando entrar e como chamar um fim de correções. Speed ​​Trend chart (Figura 2) é onde se pode encontrar alguma evidência onde o jogo vai acabar. Pelo menos suspeite o que vai ocorrer em uma correção. Coisas muito difíceis de fazer como volatilidade neste extremos vai ficar maior. Especialmente se desvanece o movimento de tendência inicial que representa em uma muito forte contra tendência vela diária. Moeda Par (Figura 3) gráfico vê as moedas GBP como um dos mais fortes e AUD um dos mais fracos. No mês passado, após algumas semanas fortes de taxa mais alta, poderíamos ver alguma pausa no aumento. Isso também é visto no gráfico diário, com facilidade. Mas, como visto no gráfico, podemos ver que já em 6 de dezembro se podia ver que estamos prestes a entrar em uma pausa de dias de correção. Por que os índices AUDL (longo) e AUDs (curto) cruzaram em 4 de dezembro, Ainda na zona negativa. O mesmo vale para ambos os índices GBP. Eles cruzaram em fraqueza em 6 de dezembro, então temos uma forte sugestão de uma correção mais profunda. Pelo menos um deve ser agora muito carefull sobre a compra dos mergulhos, definitivamente um deve nos últimos dias se livrar da posição uma realizada dias antes. Poderíamos facilmente mover em um HH diariamente, mas deve ser limitado. Agora venho às minhas perguntas. Você ainda trabalha nesta questão Você pode compartilhar quais foram suas conclusões gerais sobre a negociação de índices. Ciclos Você teve alguns resultados em encontrar fatores promissores à borda probabitity em seu favor a respeito quotonly retracementquot. Parece que uma moeda pode ser forte, quer porque está recebendo muito de algumas outras moedas ou porque está recebendo de todos os outros. Normalmente, as duas condições correspondem. Qual é o USD mais forte com a maior pontuação ou EUR recebendo de todos os outros (a pontuação é a soma das inclinações de tendência) Também note que há um ciclo JPY-gtAUD-gtUSD. Registrado em Ago 2017 Status: Member 1,132 Posts Eu não investiguei sobre os ciclos. Eu encontrei este poderia ser interresing para comerciantes da cesta. O atraso é um assassino com este indicador. Muitas vezes é. Quando ele encontra um par é fortemente tendência o movimento já é feito. Mas desvanecer este movimento é mortal. Então você precisa esperar por um retracement. Indo multi-timeframe foi o que eu achei o próximo passo lógico. Você fez isso também. Por exemplo, AN está atualmente na minha lista de baixa para todos os dias. Claro que ninguém precisa de um filtro de Kalman para ver AN é bearish em diariamente. Mas ele se tornou otimista no H4. Gostaria de traduzir isso por: tempo para os ursos para ter lucro. Também é otimista em H1. Quando se torna bearish em H1 eu tentaria encontrar uma oportunidade técnica para curto contra H4 para entrar no balanço seguinte em D1. Claro que vou estar atrasado no H1 e certamente muito cedo no H4. Mas é melhor do que um 300 pip SL em D1 dado que eu não posso saber se este movimento não é a primeira etapa de uma inversão. Infelizmente, é muito difícil estimar objetivamente a validade dessa abordagem para estimar a força do fluxo monetário. Como com qualquer indicador, você não pode estimar sua potência fora do escopo de um sistema comercial usando-o. Se você obtiver resultados pobres é por causa do indi, do sistema, do comerciante falha em usar o sistema Se os resultados são bons você não sabe se é porque o indi é uma boa ferramenta ou se você só teve sorte de ser Em condições favoráveis ​​de mercado para o sistema durante o período de teste. Se os resultados forem bons você não sabe se é porque o indi é uma ferramenta boa ou se você teve apenas sorte para estar em uma condição de mercado favorável para o sistema durante o período de teste. Isso é exatamente certo. Estou testando isso a partir de 13 de agosto e estou ficando muito bons resultados. Deleitado. Mas ainda não posso ver se isso foi realmente favorável últimos quatro meses ou isso poderia realmente funcionar por um longo período. O que eu tenho certeza é que, com entradas de filtragem para fora e encontrar um bom controle de gestão das posições abertas. Tudo o que poderia fornecer alguma curva de rendimento relativamente bom. Indo pelo trabalho estatístico onde Im que concentra principalmente em ganhos por EA6 por cada regra. Encontrar o melhor R: R que é o melhor sem qualquer filtragem adicional. Depois disso, eu vou tentar encontrar a parte calçada lá em cima. Estou na quarta fase atm, e eu estou pensando que eu já encontrei algumas configurações muito interessantes, que foram positivas através desta gama de testes. Eu matei um monte de sementes ruins, mas mantidos apenas alguns e Im ainda estreitando-lo para baixo .. faz o tempo. Eu não posso backtest este sistema como ele leva todo o mercado de uma vez. Eu tentei fazê-lo em excel, mas levaria muito tempo. Im workaholic, mas que levaria meses para estabelecer, então meses. Etc Eu estou construindo bem comportado pigz .. Gostaria de saber se você já pensou em usar suas medidas KF como parte de uma entrada para um sistema de aprendizagem de máquina para obter sinais de negociação Alguns dos sistemas que eu uso tirar proveito de medidas semelhantes de strengthweakness moeda e ter Habilidades de previsão decente. Eu geralmente faço a aprendizagem de máquina usando R ou algum C baseado na máquina que aprende bibliotecas (libs como waffles ou tubarão). Eu vejo que você poderia potencialmente construir um sistema aqui onde o KF atua como uma entrada e você pode obter previsões de evolução de tendência para uma cesta de moedas. A idéia era selecionar um cesto de três pares quotprobably tendendo por emparelhar as três mais fortes e as três moedas mais fracas. O emparelhamento é feito cuidando de suas correlações. Usando este método eu obter pesos para aplicar ao MM: eles são os três pares ea porcentagem nas capturas de tela. O par feito das duas moedas restantes está variando provavelmente e deve talvez ser dado a um sistema baseado reversão médio. Sobre o uso de um KF para estimar a tendência do mercado eu fiz um usando gráficos de barra de intervalo. Até agora ele classifica 9 tendências de mercado: extremamente acima, muito acima, acima, um pouco acima, liso. Extremamente para baixo. Eles são codificados por cores. A partir disto, dividi os dados para cada classe para obter a probabilidade da distância do preço da média dada a classe: O resultado é bem linear e eu posso melhorar a estimativa da média. Essa é a linha verde e as bandas vermelhas e azuis. Imagem anexa (clique para ampliar) Meu problema agora é usar isso para atualizar a exposição do sistema. Aqui estou completamente bloqueado por agora. A idéia era selecionar um cesto de três pares quotprobably tendendo por emparelhar as três mais fortes e as três moedas mais fracas. O emparelhamento é feito cuidando de suas correlações. Usando este método eu obter pesos para aplicar ao MM: eles são os três pares ea porcentagem nas capturas de tela. No entanto, se eu entendo corretamente o que você está fazendo com isso parece ser para obter uma estimativa da tendência atual do mercado do mercado, isso pode não ser tão útil, uma vez que você está interessado no futuro e não no estado que tem desenvolvido até agora (O que é bom saber que o mercado está tendendo se quando você entra em um comércio que vai parar). Gostaria de saber se você tentou usar métodos de aprendizagem de máquina - usando seus valores de KF como entradas - para estimar qual o estado de tendência futuro do mercado será. O que seria mais útil não seria uma medição do atual estado de tendência do mercado, mas uma estimativa de probabilidade de qual seria o futuro estado tendencial do mercado. Eu me pergunto se suas medidas baseadas em KF têm capacidade de previsão em relação aos futuros estados de tendências de mercado. Uma vez que você está avaliando uma matriz complexa de interações no mercado, parece plausível que isso possa ser o caso. O que você acha Perdoe-me se estou mal-entendido alguma coisa, talvez você já está recebendo previsões futuras e estou um pouco faltando esta informação. Eu nunca tentei prever o estado além de uma extrapolação polinomial que não tem absolutamente nenhum poder preditivo. O estado de tendência futuro será o mesmo que o atual, mais um desvio aleatório: variação linearmente crescente. A tendência é a linha vermelha abaixo do gráfico. O azul é a taxa de mudança da tendência. Ambos osciallte em torno de sua média (0). Observe que a unidade de escala é um desvio padrão de seus próprios valores (orange2 sigma). A tendência é reverter médio, mas eu nunca tentei encaixar um processo O-U. ESTÁ BEM. Mais uma linha sobre o TODO :-) Não ganância. Sem medo. Apenas matemática. Os membros devem ter pelo menos 0 vouchers para postar neste tópico. 1 comerciante que vê agora Forex Factoryreg é uma marca registada. Agust 18, 2017 October 6, 2017 O filtro de Kalman e pares que negociam Imagine este scenario. Você é um comerciante de arbitragem estatística em uma mesa de hélices ou HF. Como tal, você rotineiramente realizar um inventário de exposição ETF que você deve hedge. A 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 a 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 Pairs Trading Quer aprender a minar fontes de dados sociais como Google Trends, StockTwits, Twitter e Estimar Certifique-se de baixar o nosso livro Introdução aos dados sociais para os comerciantes Siga o blog via e-mail Mensagem navegação Recent Posts Comentários recentes CategoriesKalman Filter - Estratégia de negociação de pares baseados em QSTrader Anteriormente em 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 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. Hence we can go long the spread if the forecast error drops below the negative standard deviation of the spread. Respectively we can go short the spread if the forecast error exceeds the positive standard deviation of the spread. The exit rules are simply the opposite of the entry rules. The dynamic hedge ratio is represented by one component of the hidden state vector at time t, thetat, which we will denote as theta0t. This is the beta slope value that is well known from linear regression. Longing the spread here means purchasing (longing) N units of TLT and selling (shorting) lfloor , where lfloor is the floor representing the highest integer less than x. The latter is necessary as we must transact a whole number of units of the ETFs. Shorting the spread is the opposite of this. N controls the overall size of the position. et represents the forecast error or residual error of the prediction at time t, while Qt represents the variance of this prediction at time t. For completeness, the rules are specified here: et lt - sqrt - Long the spread: Go long N shares of TLT and go short lfloor units of IEI et ge - sqrt - Exit long: Close all long positions of TLT and IEI et gt sqrt - Short the spread: Go short N shares of TLT and go long lfloor units of IEI et le sqrt - Exit short: Close all short positions of TLT and IEI The role of the Kalman filter is to help us calculate thetat, as well et and Qt. thetat represents the vector of the intercept and slope values in the linear regression between TLT and IEI at time t. It is estimated by the Kalman filter. The forecast errorresidual et yt - hat t is the difference between the predicted value of TLT today and the Kalman filters estimate of TLT today . Qt is the variance of the predictions and hence sqrt is the standard deviation of the prediction. The implementation of the strategy involves the following steps: Receive daily market OHLCV bars for both TLT and IEI Use the recursive online Kalman filter to estimate the price of TLT today based on yesterdays observations of IEI Take the difference between the Kalman estimate of TLT and the actual value, often called the forecast error or residual error . which is a measure of how much the spread of TLT and IEI moves away from its expected value Long the spread when the movement is negatively far from the expected value and correspondingly short the spread when the movement is positively far from the expected value Exit the long and short positions when the series reverts to its expected value In order to carry out this strategy it is necessary to have OHLCV pricing data for the period covered by this backtest. In particular it is necessary to download the following: TLT - For the period 3rd August 2009 to 1st August 2017 (link here ) IEI For the period 3rd August 2009 to 1st August 2017 (link here ). This data will need to placed in the directory specified by the QSTrader settings file if you wish to replicate the results. Python QSTrader Implementation Since QSTrader handles the position tracking, portfolio management, data ingestion and order management the only code we need to write involves the Strategy object itself. The Strategy communicates with the PortfolioHandler via the event queue, making use of SignalEvent objects to do so. In addition we must import the base abstract strategy class, AbstractStrategy . Note that in the current alpha version of QSTrader we must also import the PriceParser class. This is used to multiply all prices on input by a large multiple (108) and perform integer arithmetic when tracking positions. This avoids floating point rounding issues that can accumulate over the long period of a backtest. We must divide all the prices by PriceParser. PRICEMULTIPLIER to obtain the correct values: The next step is to create the KalmanPairsTradingStrategy class. The job of this class is to determine when to create SignalEvent objects based on received BarEvent s from the daily OHLCV bars of TLT and IEI from Yahoo Finance. There are many different ways to organise this class. Ive opted to hardcode all of the parameters in the class for clarity of the explanation. Notably Ive fixed the value of delta10 and vt10 . They represent the system noise and measurement noise variance in the Kalman Filter model. This could also be implemented as a keyword argument in the init constructor of the class. Such an approach would allow straightforward parameter optimisation. The first task is to set the time and invested members to be equal to None. as they will be updated as market data is accepted and trade signals generated. latestprices is a two-array of the current prices of TLT and IEI, used for convenience through the class. The next set of parameters all relate to the Kalman Filter and are explained in depth in the previous two articles here and here . The final set of parameters include days. used to track how many days have passed as well as qty and curhedgeqty. used to track the absolute quantities of ETFs to purchase for both the long and short side. I have set this to be 2,000 units on an account equity of 100,000 USD. The next method setcorrecttimeandprice is a helper method utilised to ensure that the Kalman Filter has all of the correct pricing information available at the right point. This is necessary because in an event-driven backtest system such as QSTrader market information arrives sequentially. We might be in a situation on day K where weve received a price for IEI, but not TFT. Hence we must wait until both TFT and IEI market events have arrived from the backtest loop, through the events queue. In live trading this is not an issue since they will arrive almost instantaneously compared to the trading period of a few days. However, in an event-driven backtest we must wait for both prices to arrive before calculating the new Kalman filter update. The code essentially checks if the subsequent event is for the current day. If it is, then the correct price is added to the latestprice list of TLT and IEI. If it is a new day then the latest prices are reset and the correct prices are once again added. This type of housekeeping method will likely be absorbed into the QSTrader codebase in the future, reducing the necessity to write boilerplate code, but for now it must form part of the strategy itself. The core of the strategy is carried out in the calculatesignals method. Firstly we set the correct times and prices (as described above). Then we check that we have both prices for TLT and IEI, at which point we can consider new trading signals. y is set equal to the latest price for IEI, while F is the observation matrix containing the latest price for TLT, as well as a unity placeholder to represent the intercept in the linear regression. The Kalman Filter is subsequently updated with these latest prices. Finally we calculate the forecast error et and the standard deviation of the predictions, sqrt . Lets run through this code step-by-step, as it looks a little complicated. The first task is to form the scalar value y and the observation matrix F. containing the prices of IEI and and TLT respectively. We calculate the variance-covariance matrix R or set it to the zero-matrix if it has not yet been initialised. Subsequently we calculate the new prediction of the observation yhat as well as the forecast error et . We then calculate the variance of the observation predictions Qt as well as the standard deviation sqrtQt. We use the update rules derived here to obtain the posterior distribution of the states theta. which contains the hedge ratioslope between the two prices: Finally we generate the trading signals based on the values of et and sqrt . To do this we need to check what the invested status is - either long, short or None. Notice how we need to adjust the curhedgeqty current hedge quantity when we go long or short as the slope theta0t is constantly adjusting in time: This is all of the code necessary for the Strategy object. We also need to create a backtest file to encapsulate all of our trading logic and class choices. The particular version is very similar to those used in the examples directory and replaces the equity of 500,000 USD with 100,000 USD. It also changes the FixedPositionSizer to the NaivePositionSizer. The latter is used to naively accept the suggestions of absolute quantities of ETF units to trade as determined in the KalmanPairsTradingStrategy class. In a production environment it would be necessary to adjust this depending upon the risk management goals of the portfolio. Here is the full code for the kalmanqstraderbacktest. py : As long as QSTrader is correctly installed and the data has been downloaded from Yahoo Finance the code can be executed via the following command in the terminal: Thanks to the efforts of many volunteer developers, particularly ryankennedyio and femtotrader. the code is well-optimised for OHLCV bar data and carries out the backtesting rapidly. Strategy Results One of the latest features to be added to QSTrader is that of the tearsheet developed primarily by nwillemse. This feature is still in an early stage of development but will be demonstrated here. A tearsheet is primarily used within institutional settings as a one pager description of a trading strategy. The TearsheetStatistics class in the QSTrader codebase replicates many of the statistics found in a typical strategy performance report. The top two graphs represent the equity curve and drawdown percentage, respectively. Beneath this are the monthly and yearly performance panels. Finally the equity curve, trade-level and time-based statistics are presented: Click the image for a larger view. The equity curve begins relatively flat for the first year of the strategy but rapidly escalates during 2017. During 2017 the strategy becomes significantly more volatile remaining underwater until 2017 and reaching a maximum daily drawdown percentage of 15.79. The performance gradually increases from the maximum drawdown in late 2017 through to 2017. The strategy has a CAGR of 8.73 with a Sharpe Ratio of 0.75. It also has a long maximum drawdown duration of 777 days - over two years Note that this strategy is carried out gross of transaction costs so the true performance would likely be worse. Next Steps There is a lot of research work necessary to turn this into a profitable strategy that we would deploy in a live setting. Potential avenues of research include: Parameter Optimisation - Varying the parameters of the Kalman Filter via cross-validation grid search or some form of machine learning optimisation. However, this introduces the distinct possibility of overfitting to historical data. Asset Selection - Choosing additional, or alternative, pairs of ETFs would help to add diversification to the portfolio, but increases the complexity of the strategy as well as the number of trades (and thus transaction costs). 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 Trading

No comments:

Post a Comment