Wednesday 7 March 2018

Pair trading python


Pares comerciais com Python.
19 de maio de 2015.
A arbitragem de valor relativo ou mais comumente denominada "negociação de pares" refere-se a estratégias de negociação que envolvem a convergência esperada de preços de ativos (ações, títulos, divisas ...) para um estado de equilíbrio. Essa estratégia neutra de mercado permite, assim, (teoricamente) obter lucros constantes, independentemente do que o mercado global faz. Especialmente na década de 1980, esses tipos de esquemas de comércio de convergência foram muito populares entre hedgefunds e continuaram sendo, embora de maneira mais sofisticada.
Como parte de um seminário sobre econometria financeira na minha universidade, implementei uma simples troca de pares em Python. A base do meu trabalho foi o artigo de Gatev et. al (2006) 1. O documento descreve sua estratégia, bem como sua execução, que conseguiu obter uma média de retornos anualizados de 11%. Enviei os scripts que escrevi com o Python neste Notebook IPython, que permite que você passe por cada etapa (sinta-se à vontade para melhorar!)
Por trás da troca de pares está a idéia de que existe uma relação oculta entre um par de ações. Este par tende a se mover juntos a maior parte do tempo e, portanto, mostra uma certa correlação histórica.
Um exemplo clássico para um par de parceiros comerciais é Coca-Cola (KO) e Pepsi Co. (PEP), veja o gráfico abaixo.
Preços das ações normalizadas da Pepsi Co. (PEP) e da Coca Cola (KO) entre fevereiro de 1997 e junho de 1998.
Ambas as empresas produzem uma linha semelhante de bebidas e operam nos mesmos mercados em todo o mundo, assim seus preços de ações são afetados pelos mesmos choques específicos do setor. Quando alguém encontrou tal par, uma transação é registrada assim que as ações se afastaram o suficiente (Gatev e al. Recomendam um spread de dois desvios padrão dos preços das ações normalizadas). O comerciante de pares espera que esse estado de desbalanceamento seja apenas temporário e, assim, aposta na convergência dos preços ao mesmo tempo em que ultrapassa o estoque superestimado e prolonga o subvalorizado. Se os preços das ações convergirem para os níveis históricos, ambas as posições serão encerradas com lucro (pelo menos essa é a teoria!).
A parte complicada deste tipo de esquemas de negociação é, obviamente, encontrar uma maneira adequada de encontrar tais pares. Baseando-se apenas em correlações históricas pode ser um pouco simples demais para esse propósito, métodos mais sofisticados incluem testes de co-integração.
Melhorias.
Os retornos anualizados de 1,04% que consegui obter com o meu portfólio de amostras foram bastante decepcionantes, mas ainda tenho ideias para melhorar ainda mais.
escolha os mesmos pares de setores expandir universo de ações tente diferentes limites de entrada / saída.
Sinta-se à vontade para deixar um comentário se você tiver alguma idéia sobre este projeto.
Pairs trading: desempenho de uma regra de arbitragem de valor relativo, E Gatev, WN Goetzmann, KG Rouwenhorst - Review of Financial Studies, 2006 & # 8617;

QuantStart.
Junte-se ao portal de membros privados da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento. Você encontrará um grupo bem informado de mentalistas quant pronto para responder suas perguntas comerciais mais importantes.
Confira meu ebook sobre o comércio de quant, onde eu ensino você como criar estratégias de negociação sistemáticas lucrativas com ferramentas Python, desde o início.
Dê uma olhada no meu novo ebook sobre estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas bayesianas, com Python e R.
Por Michael Halls-Moore em 20 de fevereiro de 2014.
Neste artigo, vamos considerar nossa primeira estratégia de negociação intradiária. Será usando uma idéia comercial clássica, a de "pares comerciais". Neste caso, vamos fazer uso de dois Exchange Traded Funds (ETFs), SPY e IWM, que são negociados na Bolsa de Valores de Nova York (NYSE) e tentam representar os índices do mercado de ações dos EUA, os S & P500 e Russell 2000, respectivamente.
A estratégia cria, em termos gerais, uma "propagação" entre o par de ETFs saudade de um e curto um montante do outro. A proporção de longo a curto pode ser definida de muitas maneiras, como a utilização de técnicas de coesão estatística de séries temporais. Nesse cenário, vamos calcular uma relação de cobertura entre SPY e IWM através de uma regressão linear rotativa. Isso nos permitirá criar uma "propagação" entre o SPY eo IWM, que é normalizado para um escore z. Os sinais de negociação serão gerados quando o escore z exceder certos limiares sob a crença de que a propagação reverterá para a média.
O raciocínio para a estratégia é que a SPY e a IWM caracterizam aproximadamente a mesma situação, a da economia de um grupo de corporações de grandes capitais e de capitais pequenos. A premissa é que, se alguém adotar a propagação dos preços, isso deve ser reverso, já que os eventos "locais" (no tempo) podem afetar separadamente os índices S & P500 ou Russell 2000 (como small-cap / large - diferenças de limite, datas de reequilíbrio ou negociações de bloco), a série de preços de longo prazo dos dois provavelmente será cointegrada.
A estratégia.
A estratégia é realizada nas seguintes etapas:
Dados - barras de 1 minuto de SPY e IWM são obtidas de abril de 2007 até fevereiro de 2014. Processamento - Os dados estão corretamente alinhados e as barras ausentes são mutuamente descartadas. Spread - A relação de cobertura entre os dois ETFs é calculada tomando uma regressão linear rotativa. Isso é definido como o coeficiente de regressão $ \ beta $ usando uma janela de lookback que se desloca para a frente em 1 barra e recalcula os coeficientes de regressão. Assim, a taxa de cobertura $ \ beta_i $, para o bar $ b_i $ é calculada entre os pontos $ b_ $ a $ b_ $ para um lookback de $ k $ bars. Z-Score - O escore padrão do spread é calculado da maneira usual. Isso significa subtrair a média (amostra) da propagação e dividir pelo desvio padrão (amostra) da propagação. O raciocínio para isso é tornar os parâmetros de limiar mais simples para interpet, uma vez que o z-score é uma quantidade sem dimensão. Eu deliberadamente introduzi uma polarização de lookahead nos cálculos, a fim de mostrar quão sutil pode ser. Tente e cuide disso! Operações - Os sinais longos são gerados quando o escore z negativo cai abaixo de um limite pré-determinado (ou pós-otimizado), enquanto os sinais curtos são o inverso disso. Os sinais de saída são gerados quando o escore z absoluto cai abaixo de um limite adicional. Para essa estratégia, eu (um pouco arbitrariamente) escolhei um limite de entrada absoluto de $ | z | = 2 $ e um limite de saída de $ | z | = 1 $. Supondo um comportamento de reversão médio na propagação, espero que capture esse relacionamento e ofereça um desempenho positivo.
Talvez a melhor maneira de entender a estratégia em profundidade é implementá-la. A seção a seguir descreve um código Python completo (arquivo único) para implementar esta estratégia de reversão média. Eu comande o código de forma liberal para ajudar a entender.
Implementação do Python.
Tal como acontece com todos os tutoriais Python / pandas, é necessário configurar um ambiente de pesquisa Python como descrito neste tutorial. Uma vez configurada, a primeira tarefa é importar as bibliotecas Python necessárias. Para este backtest, matplotlib e pandas são obrigatórios.
As versões específicas da biblioteca que estou usando são as seguintes:
Vamos continuar e importar os bibliotecários:
A seguinte função create_pairs_dataframe importa dois arquivos CSV contendo as barras intradias de dois símbolos. No nosso caso, isso será SPY e IWM. Em seguida, ele cria um conjunto de quadros de dados separados, que usa os índices de ambos os arquivos originais. Como os seus timestamps são susceptíveis de serem diferentes devido a negociações e erros perdidos, isso garante que teremos dados correspondentes. Este é um dos principais benefícios de usar uma biblioteca de análise de dados como pandas. O código "boilerplate" é tratado de maneira muito eficiente.
O próximo passo é realizar a regressão linear de rolamento entre SPY e IWM. Nessa instância, IWM é o preditor ('x') e SPY é a resposta ('y'). Define uma janela de lookback padrão de 100 barras. Conforme discutido acima, este é um parâmetro da estratégia. Para que a estratégia seja considerada robusta, idealmente queremos ver um perfil de retorno (ou outra medida de desempenho) como uma função convexa do período de lookback. Assim, em uma fase posterior do código, realizaremos uma análise de sensibilidade ao variar o período de lookback em um intervalo.
Uma vez que o coeficiente de rolamento beta é calculado no modelo de regressão linear para SPY-IWM, nós o adicionamos aos pares DataFrame e soltamos as linhas vazias. Isso constitui o primeiro conjunto de barras igual ao tamanho do lookback como medida de corte. Em seguida, criamos o spread dos dois ETFs como uma unidade de SPY e $ - \ beta_i $ unidades de IWM. Claramente, esta não é uma situação realista, pois estamos tomando quantidades fracionárias de IWM, o que não é possível em uma implementação real.
Finalmente, criamos a pontuação z da propagação, que é calculada subtraindo a média da propagação e normalizando pelo desvio padrão da propagação. Note-se que há um viés bastante parecido com a aparência aqui. Eu deliberadamente deixei isso no código, pois queria enfatizar o quão fácil é cometer um erro na pesquisa. A média eo desvio padrão são calculados para toda a série de tempo de propagação. Se isso for para refletir a verdadeira precisão histórica, essa informação não estaria disponível, pois isso implicitamente faz uso de informações futuras. Assim, devemos usar um meio de rolamento e stdev para calcular o escore z.
Em create_long_short_market_signals, os sinais de negociação são criados. Estes são calculados ao longo do spread quando o escore z excede negativamente um escore z negativo e diminui o spread quando o escore z excede positivamente um escore z positivo. O sinal de saída é dado quando o valor absoluto do escore z é menor ou igual a outro (menor em magnitude).
Para alcançar essa situação, é necessário saber, para cada barra, se a estratégia está "dentro" ou "fora" do mercado. long_market e short_market são duas variáveis ​​definidas para acompanhar as posições de mercado longo e curto. Infelizmente, isso é muito mais simples de codificar de forma iterativa em oposição a uma abordagem vetorializada e, portanto, é lento para calcular. Apesar dos bares de 1 minuto que exigem.
700.000 pontos de dados por arquivo CSV ainda é relativamente rápido para calcular em minha máquina de desktop mais antiga!
Para iterar sobre um pandas DataFrame (que é verdade que NÃO é uma operação comum) é necessário usar o método iterrows, que fornece um gerador sobre o qual iterar:
Nesta fase, atualizamos pares para conter os sinais longos / curtos reais, o que nos permite determinar se precisamos estar no mercado. Agora, precisamos criar um portfólio para acompanhar o valor de mercado das posições. A primeira tarefa é criar uma coluna de posições que combine os sinais longos e curtos. Isso conterá uma lista de elementos de $ (1,0, -1) $, com $ 1 $ representando uma posição longa / de mercado, US $ 0 $ que não representa nenhuma posição (deve ser encerrado) e $ -1 $ representando uma posição de curto / mercado . As colunas sym1 e sym2 representam os valores de mercado das posições SPY e IWM no final de cada barra.
Uma vez que os valores de mercado da ETF foram criados, os somamos para produzir um valor de mercado total no final de cada barra. Isso é transformado em um fluxo de devoluções pelo método pct_change para esse objeto da série. Linhas subsequentes de código eliminam as entradas incorretas (elementos NaN e inf) e, finalmente, calculam a curva de capital integral.
A função __main__ junta tudo. Os arquivos CSV intradiários estão localizados no caminho do datadir. Certifique-se de modificar o código abaixo para apontar para o seu diretório particular.
Para determinar quão sensível é a estratégia para o período de lookback, é necessário calcular uma métrica de desempenho para uma variedade de lookbacks. Eu escolhi a porcentagem total final de retorno do portfólio como a medida de desempenho e a faixa de lookback em $ [50,200] $ com incrementos de 10. Você pode ver no código a seguir que as funções anteriores estão envolvidas em um loop para este intervalo , com outros limiares mantidos fixos. A tarefa final é usar matplotlib para criar um gráfico de linha de lookbacks vs returns:
O gráfico do período de lookback versus retornos agora pode ser visto. Observe que existe um máximo "global" em torno de um lookback igual a 110 barras. Se tivéssemos visto uma situação em que o lookback fosse independente dos retornos, isso teria sido motivo de preocupação:
Análise de sensibilidade do período de lookback de regressão linear SPY-IWM.
Nenhum artigo de backtesting seria completo sem uma curva de equidade inclinada para cima! Assim, se você deseja traçar uma curva dos retornos cumulados versus tempo, você pode usar o seguinte código. Ele irá traçar o portfólio final gerado a partir do estudo de parâmetros de lookback. Assim, será necessário escolher o lookback dependendo do gráfico que deseja visualizar. O gráfico também traça os retornos de SPY no mesmo período para facilitar a comparação:
O gráfico de curva de equidade a seguir é para um período de lookback de 100 dias:
Análise de sensibilidade do período de lookback de regressão linear SPY-IWM.
Note-se que a redução da SPY é significativa em 2009 durante o período da crise financeira. A estratégia também teve um período volátil nesta fase. Observe também que o desempenho deteriorou-se um pouco no último ano devido à natureza fortemente tendencial da SPY neste período, o que reflete o índice S & P500.
Note que ainda temos que levar em consideração o viés de lookahead ao calcular o escore z do spread. Além disso, todos esses cálculos foram realizados sem custos de transação. Esta estratégia certamente funcionaria muito mal quando esses fatores forem levados em consideração. As taxas, a propagação / desistência de lance / pedido são todas atualmente desaparecidas. Além disso, a estratégia é negociada em unidades fracionárias de ETFs, o que também é muito pouco realista.
Em artigos posteriores, criaremos um backtester muito mais sofisticado baseado em eventos que levará esses fatores em consideração e nos dará uma confiança significativa na nossa curva de equidade e métricas de desempenho.
Apenas iniciando o comércio quantitativo?
3 razões para se inscrever 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.

Estratégia de negociação de par python
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.
Uma implementação simples de uma estratégia de negociação de pares.
Este roteiro fazia parte de um trabalho de seminário que fiz para um curso de econometria financeira na minha universidade. Precisa de muita melhoria, mas continuarei a atualizá-la.
&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.

Conteúdo.
O curso foca tanto quanto possível em exemplos práticos de problemas reais envolvidos no comércio quantitativo. Vamos começar com a criação de ambientes de desenvolvimento e obter dados históricos de preços. Depois disso, faremos backtest de algumas estratégias típicas de negociação. Uma parte final do curso se concentra no comércio automatizado através da Interactive Brokers API. A parte teórica (matemática e ciência da computação) será reduzida ao mínimo e somente tratada quando necessário.
Parte 1: princípios básicos.
Antes de fazer o curso, você configurará seu próprio ambiente em Python e terá uma noção básica do idioma. Esta parte do curso está disponível gratuitamente. Vamos pular direto e usar dois estudos de caso para nos acostumarmos a trabalhar com ferramentas científicas.
Por que Python Configurando o ambiente Python Fundamentos do Python Escrevendo, executando e depurando código. Introdução ao Numpy Plotting com o matplotlib.
Simulação Monte-carlo de etfs alavancados.
Parte 2: Manipulação dos dados.
Antes de começar com a parte divertida do desenvolvimento da estratégia, precisamos coletar e classificar os dados de preços. Esta semana é sobre como obter os dados de várias fontes. Para apimentá-lo com uma caixa de teste, vamos baixar todos os preços diários do universo S & amp; P500 da base de dados do Yahoo.
Introdução às Pandas Trabalhando com horários e datas. Leitura e escrita de arquivos CSV Leitura de arquivos excel Leitura de arquivos HDF5 Obtendo dados da web (Yahoo finance, CBOE, etc.)
Sazonalidade de SPY: existe uma vantagem com base no dia da semana? Obtenha todo o histórico do universo S & amp; P500 e guarde-o em um banco de dados.
Parte 3: estratégias de backtesting.
Esta é a parte divertida, que é apenas limitada pela sua própria criatividade. Passaremos por vários casos de teste estratégico.
Calculando pnl e métricas de desempenho: sharpe en drawdown Estratégia de impulso simples usando médias móveis Estratégia de portfólio permanente Estratégia XLP Estratégia de negociação de pares (construção de um spread neutro e backtesting) Estratégias de volatilidade Estratégia de ETFs alavancadas.
Parte 4: Indo ao vivo!
A última coisa que você precisa para construir um sistema comercial automatizado é uma conexão com um corretor. Nesta semana, vamos nos concentrar no uso da Interactive Brokers API para receber dados em tempo real e enviar pedidos.
Conectando-se a intermediários interativos com ibpy Fazendo o download de dados históricos intraday Obtendo dados de estoque em tempo real Fazendo pedidos.

QuantStart.
Junte-se ao portal de membros privados da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento. Você encontrará um grupo bem informado de mentalistas quant pronto para responder suas perguntas comerciais mais importantes.
Confira meu ebook sobre o comércio de quant, onde eu ensino você como criar estratégias de negociação sistemáticas lucrativas com ferramentas Python, desde o início.
Dê uma olhada no meu novo ebook sobre estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas bayesianas, com Python e R.
Por Michael Halls-Moore em 21 de setembro de 2016.
Anteriormente, no QuantStart, consideramos os fundamentos matemáticos de State Space Models e Kalman Filters, bem como a aplicação da biblioteca pykalman a um par de ETFs para ajustar dinamicamente uma relação de hedge como base para uma estratégia de negociação de reversão média.
Neste artigo, vamos discutir uma estratégia de negociação originalmente devido a Ernest Chan (2012) [1] e testada por Aidan O'Mahony em Quantopian [2]. Usaremos a estrutura de teste de QSTrader de código aberto baseada em Python para implementar a estratégia. O QSTrader realizará o "levantamento pesado" do rastreamento de posição, o manuseio de portfólio e a ingestão de dados, enquanto nos concentramos exclusivamente no código que gera os sinais de negociação.
A Estratégia de Negociação.
A estratégia de negociação de pares é aplicada a um par de fundos negociados em bolsa (ETF) que acompanham o desempenho de diferentes títulos do Tesouro dos EUA. Eles são:
O objetivo é construir uma estratégia de reversão média desse par de ETFs.
O "spread" sintético entre TLT e IEI é a série temporal em que estamos realmente interessados ​​em saudades ou em curto. 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 do spread. As regras de saída são simplesmente o oposto das regras de entrada.
A relação de hedge dinâmica é representada por um componente do vetor de estado oculto no tempo $ t $, $ \ theta_t $, que será denotado como $ \ theta ^ 0_t $. Este é o valor 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. "Reduzir o 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 momento $ 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 de TLT hoje e a estimativa de TLT do filtro de Kalman hoje. $ Q_t $ é a variância das previsões e, portanto, $ \ sqrt $ é o desvio padrão da previsão.
A implementação da estratégia envolve 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 executar esta estratégia, é necessário ter dados de preços do OHLCV para o período coberto por este backtest. Em particular, é necessário fazer o download do seguinte:
TLT - Para o período de 3 de agosto de 2009 a 1º de agosto de 2016 (link aqui) IEI Para o período de 3 de agosto de 2009 a 1º de agosto de 2016 (link aqui).
Esses dados precisarão ser colocados no diretório especificado pelo arquivo de configurações do QSTrader se você quiser replicar os resultados.
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 por meio da fila de eventos, fazendo uso dos objetos SignalEvent para fazer isso. Além disso, devemos importar a classe de estratégia abstrata base, AbstractStrategy.
Observe que na versão alfa atual do QSTrader também devemos importar a classe PriceParser. Isso é usado para multiplicar todos os preços na entrada por um 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. Optei por codificar todos os parâmetros da classe para maior clareza da explicação. Notavelmente eu fixei 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 é uma matriz de dois dos preços atuais de TLT e IEI, usados ​​por conveniência através da classe.
O próximo conjunto de parâmetros está relacionado ao Filtro 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 "auxiliar" utilizado para garantir que o Filtro de Kalman tenha todas as informações de preço corretas disponíveis no ponto certo. Isso é necessário porque, em um sistema de backtest baseado em eventos, como as informações de mercado do QSTrader, chegam sequencialmente.
Podemos estar em uma situação no dia em que recebemos um preço por IEI, mas não por TFT. Portanto, devemos aguardar até que os eventos de mercado TFT e IEI tenham chegado do loop de backtest, através da fila de eventos. Na negociação ao vivo, isso não é um problema, uma vez que eles chegarão quase instantaneamente em comparação com o período de negociação de alguns dias. No entanto, em um backtest baseado em eventos, devemos aguardar a chegada dos dois preços antes de calcular a nova atualização do filtro de Kalman.
O código 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 de Kalman é subsequentemente atualizado com estes últimos preços. Finalmente, calculamos o erro de previsão $ e_t $ e o desvio padrão das previsões, $ \ sqrt $. Vamos 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 variância-covariância R ou definimos para a matriz zero se ela ainda não foi inicializada. Subsequentemente, calculamos a nova previsão da observação, bem como o erro de previsão et.
Em seguida, calculamos a variância das previsões de observação Qt, bem como o desvio padrão sqrt_Qt. Usamos as regras de atualização derivadas aqui para obter a distribuição posterior dos estados theta, que contém a relação hedge / declive entre os dois preços:
Por fim, geramos os sinais de negociação com base nos valores de $ e_t $ e $ \ sqrt $. Para fazer isso, precisamos verificar qual o status "investido" - quer "longo", "curto" ou "Nenhum". Observe como precisamos ajustar a quantidade atual de hedge cur_hedge_qty quando formos longos ou curtos, pois a inclinação $ \ theta ^ 0_t $ está constantemente se ajustando no tempo:
Este é 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 àquelas usadas no diretório de exemplos e substitui o patrimônio de 500.000 USD por 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 dados de barras do OHLCV e realiza 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 folha de rascunho é usada principalmente dentro de configurações institucionais como uma descrição de "um pager" de uma estratégia de negociação. A classe TearsheetStatistics na base de código 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. Abaixo estão os painéis de desempenho mensais e anuais. Finalmente, a curva de equidade, estatísticas de nível comercial e tempo são apresentadas:
Clique na imagem para ampliar.
A curva de equidade começa relativamente estável para o primeiro ano da estratégia, mas rapidamente se intensifica durante 2011. Durante o ano de 2012, a estratégia se torna significativamente mais volátil permanecendo "subaquática" até 2015 e atingindo uma porcentagem diária máxima de redução de 15,79%. O desempenho aumenta gradualmente a partir da redução máxima no final de 2013 até 2016.
A estratégia tem um CAGR de 8,73% com uma Ratio Sharpe de 0,75. Ele também tem uma longa duração máxima de remoção de 777 dias - em dois anos! Note-se que esta estratégia é realizada de forma bruta de custos de transação, de modo que a verdadeira performance provavelmente seria pior.
Próximos passos.
Há um grande trabalho de pesquisa necessário para transformar isso em uma estratégia rentável que nós implantaremos em uma configuração ao vivo. As possíveis avenidas de pesquisa incluem:
Otimização de parâmetros - Variando os parâmetros do Filtro de Kalman através de busca de grade de validação cruzada ou alguma forma de otimização de aprendizagem de máquina. No entanto, isso introduz a possibilidade distinta de superação de dados históricos. Seleção de ativos - A escolha de pares de ETFs adicionais ou alternativos ajudaria a agregar diversificação ao portfólio, mas aumenta a complexidade da estratégia, bem como a quantidade de negócios (e, portanto, custos de transação).
Em futuros artigos, consideraremos como realizar esses procedimentos para várias estratégias de negociação.
Referências.
Apenas iniciando o comércio quantitativo?
3 razões para se inscrever 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.

Wallstreetbets.
3 207 & # 32; пользователей находятся здесь.
МОДЕРАТОРЫ.
Bem-vindo ao Reddit,
a primeira página da internet.
e inscreva-se em uma das milhares de comunidades.
Это архивированный пост. Você está interessado em иолосовать или комментировать.
Quer adicionar à discussão?
[-] bigpersonguy Produz dinheiro para seu bolso, mothafucka & # 32; 0 очков 1 очко 2 очка & # 32; 2 horas (1 dia)
[-] CHAINSAW_VASECTOMY RAAAAAAIINBOOOOOOOOWWWW PEEEEEEEEENRAAAAAAIINBOOOOOOOOWWWW PEEEE & # 32; 0 очков 1 очко 2 очка & # 32; 2 anos (2 dias)
[-] CHAINSAW_VASECTOMY RAAAAAAIINBOOOOOOOOWWWW PEEEEEEEEENRAAAAAAIINBOOOOOOOOWWWW PEEEE & # 32; 0 очков 1 очко 2 очка & # 32; 2 года назад (0 дочерних комментарев)
помощь правила сайта центр поддержки вики реддикет mod guidelines связаться с нами.
приложенияи инструменты Reddit para iPhone Reddit para o site móvel Android кнопки.
Использование данного сайта означает, что вы принимаете & # 32; пользовательского соглашения & # 32; и & # 32; Политика конфиденциальности. &cópia de; 2018 reddit инкорпорейтед. Все права защищены.
REDDIT e o logotipo ALIEN são marcas registradas da reddit inc.
& pi; Renderizado por PID 100442 em & # 32; app-325 & # 32; em 2018-01-30 22: 02: 11.020028 + 00: 00 executando o código do país b249508: UA.

No comments:

Post a Comment