Saturday, 9 June 2018

Investidor sistemático


Correspondência de séries temporais com dinâmica de distorção temporal


ESTE NÃO É CONSELHO DE INVESTIMENTO. As informações são fornecidas apenas para fins informativos.


No post de correspondência de séries temporais, eu usei um para um mapeamento para a distância de cálculo entre a consulta (padrão atual) ea referência (séries temporais históricas). O gráfico a seguir visualiza esse conceito. A distância é a soma de linhas verticais.


Uma maneira alternativa de mapear uma série temporal para outra é Dynamic Time Warping (DTW). O algoritmo DTW procura um mapeamento de distância mínima entre consulta e referência. O gráfico a seguir visualiza um a muitos mapeamentos possíveis com DTW.


Para verificar se há uma diferença entre um simples mapeamento e DTW, vou procurar por séries de tempo correspondências que são semelhantes aos mais recentes 90 dias de SPY nos últimos 10 anos de história. O código a seguir carrega os preços históricos do Yahoo Fiance, configura o problema e calcula a distância euclidiana para a janela de rolagem histórica usando a caixa de ferramentas Systematic Investor Toolbox:


Em seguida, vamos analisar os 10 melhores jogos usando a distância dinâmica Time Warping. Vou usar a implementação Dynamic Time Warping do pacote dtw.


Ambos os algoritmos produziram correspondências muito semelhantes e previsões muito semelhantes. Gostaria de usar essas previsões como uma suposição educada para a ação do mercado para a frente. Até agora, parece que o mercado não vai subir em plena aceleração nos próximos 22 dias.


Para ver o código-fonte completo para este exemplo, dê uma olhada na função bt. matching. dtw. test () em bt. test. r no github.


Multi-Asset Backtest. Estratégias de Negociação Rotacional


Quero discutir a implementação de Rotational Trading Strategies usando a biblioteca de backtesting na Systematic Investor Toolbox. A estratégia Rotational Trading muda as alocações de investimento ao longo do tempo, apostando em poucos ativos de topo. Por exemplo, o ranking pode ser baseado na força relativa ou momentum. Alguns exemplos das Estratégias de Negociação Rotacional (ou Atribuição Táctica de Activos) são:


Quero ilustrar o Rotational Trading usando a estratégia introduzida no ETF Screen no post Estratégia do Setor ETF. A cada mês, esta estratégia investe nos dois primeiros dos 21 ETFs classificados por seus retornos de 6 meses. Para reduzir o volume de negócios, nos meses subsequentes as posições da ETF são mantidas desde que estes ETFs estejam entre os 6 primeiros.


Antes que possamos implementar essa estratégia, precisamos criar duas rotinas auxiliares. Primeiro, vamos criar uma função que irá selecionar as posições N superior para cada período:


Em seguida, vamos criar uma função que irá selecionar as posições N superior para cada período e mantê-los até que eles caem abaixo KeepN rank:


Agora estamos prontos para implementar essa estratégia usando a biblioteca de backtesting na Caixa de Ferramentas do Systematic Investor:


Há muitas maneiras de melhorar essa estratégia. Aqui está uma lista de exemplos de maneiras adicionais a considerar:


Considere uma variedade de métodos de classificação. I. e. Retornos 1/2/3/6/12 meses e suas combinações, classificação ajustada pelo risco.


Para controlar os levantamentos e aumentar o desempenho, considere o mecanismo de cronometragem apresentado em A Approach Quantitative to Tactical Asset Allocation by M. Faber (2006).


Considere um universo de ativos diferente. Incluir os ETFs que estão menos correlacionados aos outros ativos, como Commodities, Fixed Income e International Equity Markets. Por exemplo, dê uma olhada no post de Estratégia Internacional de País Único.


A única fronteira é a sua imaginação. Eu recomendaria também para fazer a análise da sensibilidade durante seu desenvolvimento da estratégia para certificar-se que seus não estão overfitting os dados.


Para ver o código-fonte completo para este exemplo, por favor, dê uma olhada na função bt. rotational. trading. test () em bt. test. r no github.


Negociação usando a Previsão de Volatilidade do Garch


Quantum Financier escreveu um interessante artigo Regime Switching System Using Volatility Forecast. O artigo apresenta um algoritmo elegante para alternar entre as estratégias de reversão média e tendência de seguir com base na volatilidade do mercado. Dois modelos são examinados: um usando a volatilidade histórica e outro usando o Garch (1,1) Previsão de Volatilidade. A estratégia de reversão média é modelada com RSI (2): Long quando RSI (2) e Curto em contrário. A estratégia de tendência seguinte é modelada com o crossover SMA 50/200: Long quando SMA (50) & gt; SMA (200), e Curto em contrário.


Eu quero mostrar como implementar essas idéias usando a biblioteca backtesting na caixa de ferramentas Systematic Investor Toolbox.


O código a seguir carrega preços históricos do Yahoo Fiance e compara o desempenho das estratégias Buy e Hold, Mean-Reversion e Trend-Following usando a biblioteca de backtesting na Systematic Investor Toolbox:


Em seguida, vamos criar uma estratégia que alterne entre as estratégias de reversão média e de tendências seguindo a volatilidade histórica do mercado.


Em seguida, vamos criar uma Previsão de Volatilidade GARCH (1,1). Gostaria de recomendar a leitura seguintes artigos para quem quer encontrar o que GARCH é tudo ou para atualizar seu conhecimento:


GARCH (1,1) por por David Harper um artigo introdutório muito bom com lotes de diagramas visuais.


Questões Práticas na Modelação Univariada de GARCH por Y. Chalabi, D. Wurtz passo a passo exemplo de ajuste do modelo GARCH (1,1) com código R completo.


Introdução básica ao GARCH por Quantum Financier é uma série de posts que vai para os detalhes e suposições de GARCH e EGARCH.


Há alguns pacotes de R para caber modelos de GARCH. Vou considerar a função garch do pacote tseries e função garchFit do pacote fGarch. A função garch do pacote tseries é rápida, mas nem sempre encontra solução. A função garchFit do pacote fGarch é mais lenta, mas converge de forma mais consistente. Para demonstrar a diferença de velocidade entre a função garch ea função garchFit, criei um benchmark simples:


A função garchFit é em média 6 vezes mais lenta do que a função garch. Então, para prever a volatilidade vou tentar usar a função garch sempre que ele pode encontrar uma solução e função garchFit caso contrário.


Agora, vamos criar uma estratégia que alterne entre as estratégias de reversão média e tendência de seguir com base na previsão de volatilidade GARCH (1,1).


A estratégia de comutação que utiliza a previsão de volatilidade GARCH (1,1) apresentou um desempenho ligeiramente superior ao que utiliza a volatilidade histórica.


Há muitas abordagens diferentes que você pode tomar para incorporar a previsão em seus modelos e estratégias de negociação. R tem um conjunto muito rico de pacotes para modelar e prever séries temporais. Aqui estão alguns exemplos que eu achei interessante:


As previsões de mercado para os anos 2017 e 2017 por Pat Burns usa GARCH (1,1) para calibrar o significado das previsões de mercado de outras pessoas.


Modelos ARMA para Negociação pelo Investidor Médio é uma série de postagens que mostra como prever retornos no dia seguinte usando modelos ARIMA e GARCH.


Maravilhoso novo blog TimeSeriesIreland em Timely Portfolio usa EGRACH para criar modelo de negociação.


Previsão em R: O maior atalho que falhou A Ljung-Box usa modelos ARIMA para prever o PIB.


Para visualizar o código-fonte completo para este exemplo, consulte a função bt. volatility. garch () em bt. test. r no github.


Estratégia do Calendário: Fim do mês


Estratégia de calendário é uma estratégia muito simples que compra uma venda nos dias predeterminados, conhecida com antecedência. Hoje eu quero mostrar como podemos facilmente investigar o desempenho em e em torno de dias de fim de mês.


Primeiro permite carregar os preços históricos para o SPY do Yahoo Fiance e calcular a performance do SPY nos fins do mês. I. e. Estratégia vai abrir posição longa no fechamento no dia 30 e vender posição no fechamento no dia 31.


Observe que acima, na chamada bt. run. share, eu defino o parâmetro do. lag igual a zero (o valor padrão para o parâmetro do. lag é um). A razão para a configuração padrão igual a um é devido ao sinal (decisão de comércio) é derivado usando todas as informações disponíveis hoje, então a posição só pode ser implementada no dia seguinte. I. e.


No entanto, no caso da estratégia de calendário não há necessidade de sinal de atraso porque o dia de negociação é conhecido antecipadamente. I. e.


Em seguida, criei duas funções para ajudar na criação de sinais e testes de estratégia:


Acima, T0 é uma estratégia de calendário que compra no dia 30 e vende no dia 31. I. e. Posição só é realizada em um mês fim dia. P1 e P2 são duas estratégias que compram um dia antes e dois dias antes correspondentemente. N1 e N2 são duas estratégias que compram um dia depois e dois dias após correspondentemente.


A estratégia N1, comprar no dia 31 e vender no 1º no próximo mês parece estar funcionando melhor para o SPY.


Finalmente, vamos olhar para o real comércios:


A estratégia P2 entra na posição no fechamento 3 dias antes do final do mês e sai das posições no fechamento 2 dias antes do final do mês. I. e. O desempenho é devido a retorna apenas 2 dias antes do final do mês.


Com este post eu queria mostrar como podemos facilmente estudar o desempenho da estratégia de calendário usando a Systematic Investor Toolbox.


Em seguida, vou demonstrar aplicativos de estratégia de calendário para várias datas importantes.


Para ver o código-fonte completo para este exemplo, consulte a função bt. calendar. strategy. month. end. test () em bt. test. r no github.


Oscilador Estocástico


Encontrei o link para o artigo de John Ehlers: Predictive Indicators for Effective Trading Strategies. Enquanto lia o Dekalog Blog. John Ehlers oferece uma maneira diferente de alisar os preços e incorporar o novo filtro na construção do oscilador. Felizmente, o código EasyLanguage também foi fornecido e eu era capaz de traduzi-lo em R.


Correspondência de séries temporais


ESTE NÃO É CONSELHO DE INVESTIMENTO. As informações são fornecidas apenas para fins informativos.


Você quer saber o que o SP 500 fará na próxima semana, mês, trimestre? Uma maneira de fazer uma suposição educada é encontrar períodos históricos semelhantes ao ambiente de mercado atual e examinar o que aconteceu. Vou chamar este processo de correspondência de séries de tempo, mas você poderia encontrar técnicas semelhantes, referidos como padrões técnicos e fractals. Para obter algum sabor sobre os fractals, seguem são dois artigos que eu li recentemente sobre fractals:


Eu recomendo ler o artigo seguinte sobre a série de tempo correspondente para entender diferentes abordagens:


Vou usar um método simples descrito no How to Accelerate Model Deployment usando Rook pelo artigo de Jean-Robert Avettand-Fenoel para encontrar séries temporais correspondências que são semelhantes aos mais recentes 90 dias de SPY.


O código a seguir carrega os preços históricos do Yahoo Fiance, configura o problema e calcula a distância euclidiana para a janela de rolagem histórica usando a caixa de ferramentas Systematic Investor Toolbox:


Em seguida, vamos selecionar as 10 melhores correspondências para o padrão de consulta no histórico SPY:


Em seguida, vamos sobrepor todas as correspondências com o padrão de consulta e examinar seu desempenho histórico após a partida ter ocorrido:


Em seguida, vamos resumir todas as correspondências de desempenho em uma tabela:


A análise de correspondência de séries temporais pode ser usada para fazer uma suposição educada sobre o que o SP 500 fará na próxima semana, mês, trimestre. Esta suposição educada é baseada em dados históricos e não há garantias de que a história vai se repetir.


No próximo post eu vou examinar outras medidas de distância para Time Series Matching e vou mostrar um exemplo de dinâmica de tempo deformação.


Para visualizar o código-fonte completo para este exemplo, por favor, dê uma olhada na função bt. matching. test () em bt. test. r no github.

No comments:

Post a comment