Estratégia de negociação quantmod
Sou muito novo em R e estou tentando fazer backtest de uma estratégia que já programei no WealthLab.
Várias coisas que eu não entendo (e isso não funciona, obviamente :)
Eu não obtenho os Preços Fechar bem em um vetor. ou algum tipo de vetor, mas começa com estrutura e eu realmente não entendo o que essa função faz. É por isso que a minha série [1] provavelmente não funciona.
n & lt; - nrow (série) também não funciona, mas eu preciso disso para o Loop.
Então eu acho que se eu obtiver essas 2 perguntas respondidas, minha estratégia deve funcionar. Eu sou muito grato por qualquer ajuda .. R parece bastante complicado, mesmo com a experiência de programação em outras línguas.
Começando com a segunda questão.
Então, se você quer trabalhar no objeto xts real, você precisa usar get.
Sobre sua primeira pergunta - eu não acho que você realmente precise puxar os dados como um vetor - o objeto xts é uma matriz indexada por data e é fácil trabalhar com ela. Se você ainda deseja obter os dados que você pode usar.
Agora, para começar com simples back testing de estratégias, sugiro trabalhar nas etapas a seguir.
defina sua estratégia. 2. crie uma matriz ou adicione uma coluna ao seu objeto xts que representará sua posição para cada dia. 1 para long, 0 para no position e -1 para short (mais tarde você pode jogar com o número de alavancagem). 3. multiplique cada dia de retorno com a posição e você obterá o seu vetor de retorno da estratégia. 4. examinar os resultados - minha recomendação é PerformanceAnalytics.
estratégia simples - compre quando estiver perto da SMA20, venda abaixo.
Estratégia de negociação quantmod
Vamos explorar as capacidades de backtesting de R.
Em um post anterior, desenvolvemos algumas oportunidades de entrada simples para o USD / CAD usando um algoritmo de aprendizado de máquina e técnicas de um subconjunto de mineração de dados chamado aprendizado de regra de associação. Neste post, vamos explorar como fazer um backtest completo em R; usando nossas regras do post anterior e implementando os lucros e as perdas.
Vamos mergulhar em: Observação: o backtest é construído a partir das barras de 4 horas em nosso conjunto de dados e não tem uma visualização mais granular.
O CAGR (taxa composta de crescimento anual) é o ganho / perda percentual anualizado, o que significa que suaviza o crescimento em prestações iguais a cada ano. Desde que o nosso teste acabou, vamos ver se podemos melhorar o desempenho adicionando um stop loss e tendo lucro.
Com apenas um stop loss, o desempenho caiu. Parece que estamos sendo retirados de nossos negócios antes que eles possam se recuperar. A fim de garantir nossos lucros, vamos em frente e implementar um take profit.
Bloquear nossos ganhos com um take profit melhorou um pouco o desempenho, mas não drasticamente. Vamos incorporar um stop loss e um take profit.
Agora vamos comparar a linha de base da estratégia Long Short, com apenas um stop loss, apenas um take profit, e tanto um take stop loss quanto um take profit.
Agora você sabe como adicionar um take profit e stop loss, eu recomendo que você brinque com os dados e teste valores diferentes com base em seus próprios parâmetros de risco pessoal e usando suas próprias regras.
Mesmo com algoritmos poderosos e ferramentas sofisticadas, é difícil construir uma estratégia bem-sucedida. Para cada boa ideia, tendemos a ter muitos mais ruins. Armado com as ferramentas e os conhecimentos certos, você pode testar suas ideias com eficiência até chegar às boas. Nós simplificamos esse processo no TRAIDE. Desenvolvemos uma infraestrutura de testes que permite ver onde os padrões estão em seus dados e, em tempo real, ver como eles teriam se comportado com seus dados históricos.
Nós estaremos liberando o TRAIDE para 7 pares principais no mercado de FX com indicadores técnicos em duas semanas. Se você estiver interessado em testar o software e fornecer feedback, envie um email para info @ inovancetech. Temos 50 vagas disponíveis.
Um exemplo de estratégia de negociação codificada em R.
O back-testing de uma estratégia de negociação pode ser implementado em quatro etapas.
Obtendo os dados históricos Formule a estratégia de negociação e especifique as regras Execute a estratégia nos dados históricos Avalie as métricas de desempenho.
Neste post, vamos voltar a testar a nossa estratégia de negociação em R. O pacote quantmod tornou muito fácil extrair dados históricos do Yahoo Finance. O código de uma linha abaixo busca dados NSE (Nifty).
O Quantmod fornece vários recursos para visualizar dados. O comando abaixo cria um gráfico para os dados do NSE.
TA = "Nulo" indica não usar nenhum indicador técnico. Veremos em breve a aplicação de um indicador técnico em um gráfico. O próximo passo é escolher uma estratégia de negociação. Vamos escolher o MACD (Moving Average Convergence Divergence) para este exemplo. Em uma estratégia de cruzamentos médios móveis, duas médias são computadas, uma média móvel lenta e uma média móvel rápida. A diferença entre a média móvel rápida e a média móvel lenta é chamada de linha MACD. Uma terceira média chamada linha de sinal; uma média móvel exponencial de 9 dias do sinal MACD, também é calculada. Se a linha MACD cruza acima da linha de sinal, então é um sinal de alta e nós vamos longo. Se a linha MACD cruzar abaixo da linha de sinal, então é um sinal de baixa e nós ficamos em falta. Nós escolhemos o preço de fechamento dos dados da NSE para calcular as médias. O comando a seguir cumpre essa tarefa.
O comando abaixo calcula o MACD para o preço de fechamento.
Pode-se escolher parâmetros variáveis para médias rápidas, lentas e de sinal, dependendo dos requisitos de negociação. Aqui nós nos mantemos com os parâmetros padrão. MACD é a função em quantmod que calcula a divergência de convergência da média móvel, dados são o preço de fechamento para NSE, nFast é a média móvel rápida, nSlow é a média móvel lenta, maType = SMA indica que escolhemos média móvel simples, percentual = FALSE Isso implica que estamos calculando a diferença entre a média móvel rápida e a média móvel lenta. Definir como TRUE retornaria a diferença percentual entre a média móvel rápida e a média móvel lenta.
O comando a seguir plota o gráfico para o preço de fechamento do NSE juntamente com os parâmetros MACD.
Como discutido antes, definimos nosso sinal de negociação da seguinte forma:
Se o sinal MACD cruzou acima da linha de sinal, ficamos muito tempo no NSE. Se o sinal MACD cruzou abaixo da linha de sinal, ficamos sem NSE.
O comando a seguir gera o sinal de negociação de acordo. Usamos o operador lag para eliminar o viés antecipado.
Aplicaremos essa estratégia nos dados históricos da NSE de 2007-09-17 a 2015-09-22. O sinal de negociação é aplicado ao preço de fechamento para obter os retornos de nossa estratégia.
A função ROC fornece a diferença percentual entre os dois preços de fechamento. Podemos escolher a duração para a qual queremos ver os retornos. O seguinte comando escolhe os retornos entre 2008-06-02 e 2015-09-22.
Devoluções cumulativas podem ser calculadas e plotadas usando os seguintes comandos:
A quarta etapa do teste de retorno está avaliando as métricas de desempenho. O pacote de análise de desempenho em R fornece uma plataforma consolidada para observar os parâmetros relacionados ao desempenho. Várias métricas como draw-downs, downside risk, podem ser observadas em R.
O seguinte comando fornece um resumo dos parâmetros acima mencionados e muito mais!
Aqui está a versão sucinta do código.
Depois de seguir esse exemplo, você aprendeu noções básicas de como projetar uma estratégia de negociação de quant usando R. Agora você pode começar a aprender sobre como começar a usar o pacote quantmod em R. Depois de aprender com sucesso essas noções básicas, você pode testar habilidades em nosso curso de datacamp interativo de 10 horas de duração individualizada 'Modele uma Estratégia de Negociação Quantitativa em R'
Backtesting uma estratégia simples de negociação de ações.
Nota: Este post não é conselho financeiro! Essa é apenas uma maneira divertida de explorar alguns dos recursos que o R tem para importar e manipular dados.
Recentemente li um post sobre o ETF Prophet que explorou uma interessante estratégia de negociação de ações no Excel. A estratégia é simples: encontre o ponto alto do estoque nos últimos 200 dias e conte o número de dias decorridos desde aquela alta. Se for mais de 100 dias, possua o estoque. Se já passaram mais de 100 dias, não é o dono. Essa estratégia é muito simples, mas produz alguns resultados impressionantes. (Observe que, no entanto, este exemplo usa dados que não foram ajustados de divisões ou dividendos e podem conter outros erros. Além disso, estamos ignorando os custos de negociação e os atrasos de execução, os quais afetam o desempenho da estratégia.)
A implementação dessa estratégia em R é simples e oferece inúmeras vantagens sobre o Excel, a principal delas é que é fácil transferir dados do mercado de ações para o R, e podemos testar essa estratégia em uma ampla variedade de índices com relativamente pouco esforço.
Primeiramente, baixamos os dados para GSPC usando quantmod. (GSPC significa o índice S & amp; P 500). Em seguida, construímos uma função para calcular o número de dias desde a máxima de n-dia em uma série temporal e uma função para implementar nossa estratégia de negociação. A última função leva 2 parâmetros: a máxima de n-dia que você deseja usar, e o número de dias depois daquela alta você manterá o estoque. O exemplo é 200 e 100, mas você pode facilmente mudar isso para a máxima de 500 dias e ver o que acontece se você mantiver o estoque 300 dias depois disso antes de resgatá-lo. Como esta função é parametrizada, podemos facilmente testar muitas outras versões de nossa estratégia. Nós preenchemos o início da nossa estratégia com zeros, de modo que será o mesmo comprimento que os dados de entrada. (Se você deseja uma explicação mais detalhada da função daysSighHigh, consulte a discussão sobre cross-validated).
Nós multiplicamos nosso vetor de posição (0,1) pelos retornos do índice para obter os retornos de nossa estratégia. Agora, construímos uma função para retornar algumas estatísticas sobre uma estratégia de negociação e comparamos nossa estratégia com o benchmark. Um pouco arbitrariamente, decidi analisar o retorno acumulado, o retorno médio anual, a taxa de sharpe, a porcentagem de vencedores, a volatilidade média anual, o rebaixamento máximo e o rebaixamento do tamanho máximo. Outras estatísticas seriam fáceis de implementar.
Como você pode ver, essa estratégia se compara favoravelmente à abordagem padrão de “comprar e manter”.
Finalmente, testamos nossa estratégia em outros três índices: FTSE, que representa a Irlanda e o Reino Unido, o Dow Jones Industrial Index, que remonta a 1896, e o N225, que representa o Japão. Eu funcionalizei todo o processo, para que você possa testar cada nova estratégia com uma linha de código:
Estratégia de Negociação ARIMA + GARCH no Índice S & amp; P500 Stock Market Usando R.
Estratégia de Negociação ARIMA + GARCH no Índice S & amp; P500 Stock Market Usando R.
Neste artigo, quero mostrar a você como aplicar todo o conhecimento adquirido nos posts de análise de séries temporais anteriores a uma estratégia de negociação no índice do mercado de ações S & amp; P500 nos EUA.
Veremos que, combinando os modelos ARIMA e GARCH, podemos superar significativamente a abordagem "Buy-and-Hold" em longo prazo.
Visão Geral da Estratégia.
A ideia da estratégia é relativamente simples, mas se você quiser experimentar, sugiro ler os posts anteriores sobre análise de séries temporais para entender o que você estaria modificando!
A estratégia é executada de forma "rotativa":
Para cada dia, $ n $, os $ k $ dias anteriores dos retornos logarítmicos diferenciados de um índice do mercado de ações são usados como uma janela para ajustar um modelo ARIMA e GARCH ideal. O modelo combinado é usado para fazer uma previsão para os retornos do dia seguinte. Se a previsão for negativa, o estoque está em curto no fechamento anterior, enquanto, se for positivo, ele é esperado. Se a previsão for a mesma direção do dia anterior, nada será alterado.
Para essa estratégia, usei o máximo de dados disponíveis do Yahoo Finance para o S & amp; P500. Tomei $ k = 500 $, mas este é um parâmetro que pode ser otimizado para melhorar o desempenho ou reduzir o rebaixamento.
O backtest é realizado de maneira direta e vetorializada usando R. Ele ainda não foi implementado no backtester orientado a eventos do Python. Portanto, o desempenho alcançado em um sistema de negociação real provavelmente seria um pouco menor do que o que você poderia alcançar aqui, devido a comissões e derrapagens.
Implementação estratégica.
Para implementar a estratégia, vamos usar alguns dos códigos que criamos anteriormente na série de artigos de análise de séries temporais, bem como algumas novas bibliotecas, incluindo rugarch, que me foram sugeridas por Ilya Kipnis no QuantStrat Trader.
Vou percorrer a sintaxe passo-a-passo e, em seguida, apresentar a implementação completa no final, bem como um link para o meu conjunto de dados para o indicador ARIMA + GARCH. Eu incluí o último porque demorei alguns dias no meu PC dekstop para gerar os sinais!
Você deve ser capaz de replicar meus resultados na íntegra, já que o código em si não é muito complexo, embora demore algum tempo para simulá-lo se você o executar na íntegra.
A primeira tarefa é instalar e importar as bibliotecas necessárias em R:
Se você já tem as bibliotecas instaladas, pode simplesmente importá-las:
Com isso feito, aplicaremos a estratégia ao S & amp; P500. Podemos usar quantmod para obter dados desde 1950 para o índice. O Yahoo Finance usa o símbolo "^ GPSC".
Podemos, então, criar os retornos logarítmicos diferenciados do "Preço de fechamento" do S & amp; P500 e retirar o valor inicial de NA:
Precisamos criar um vetor, previsões para armazenar nossos valores de previsão em datas específicas. Nós definimos o comprimento foreLength para ser igual ao comprimento dos dados de negociação que temos menos $ k $, o tamanho da janela:
Neste estágio, precisamos percorrer todos os dias nos dados de negociação e ajustar um modelo ARIMA e GARCH apropriado à janela de rolagem de comprimento $ k $. Dado que nós tentamos 24 ajustes ARIMA separados e ajustamos um modelo GARCH, para cada dia, o indicador pode levar muito tempo para ser gerado.
Usamos o índice d como uma variável de loop e o loop de $ k $ para o tamanho dos dados de negociação:
Em seguida, criamos a janela contínua pegando os retornos do S & P500 e selecionando os valores entre $ 1 + d $ e $ k + d $, onde $ k = 500 $ para essa estratégia:
Usamos o mesmo procedimento do artigo ARIMA para pesquisar em todos os modelos ARMA com $ p \ in \ $ e $ q \ in \ $, com exceção de $ p, q = 0 $.
Envolvemos a chamada arimaFit em um bloco de tratamento de exceção R tryCatch para garantir que, se não obtivermos um ajuste para um valor específico de $ p $ e $ q $, a ignoramos e passamos para a próxima combinação de $ p $ e $ q $.
Observe que definimos o valor "integrado" de $ d = 0 $ (este é um $ d $ diferente para nosso parâmetro de indexação!) E, como tal, estamos realmente ajustando um modelo ARMA, em vez de um ARIMA.
O procedimento de looping nos fornecerá o "melhor" modelo de ARMA adequado, em termos do Critério de Informações de Akaike, que podemos usar para alimentar nosso modelo GARCH:
No próximo bloco de código, vamos usar a biblioteca rugarch, com o modelo GARCH (1,1). A sintaxe para isso requer que configuremos um objeto de especificação ugarchspec que usa um modelo para a variância e a média. A variação recebe o modelo GARCH (1,1), enquanto a média aceita um modelo ARMA (p, q), onde $ p $ e $ q $ são escolhidos acima. Também escolhemos a distribuição sged pelos erros.
Uma vez escolhida a especificação, realizamos o ajuste real do ARMA + GARCH usando o comando ugarchfit, que recebe o objeto de especificação, os retornos $ k $ do S & amp; P500 e um solucionador de otimização numérica. Escolhemos usar o híbrido, que tenta resolvedores diferentes para aumentar a probabilidade de convergência:
Se o modelo GARCH não convergir, basta definir o dia para produzir uma previsão "longa", que é claramente um palpite. No entanto, se o modelo convergir, então nós damos a saída e a direção de previsão de amanhã (+1 ou -1) como uma string, ponto no qual o loop é fechado.
Para preparar a saída para o arquivo CSV, criei uma string que contém os dados separados por uma vírgula com a direção da previsão para o dia subseqüente:
A penúltima etapa é a saída do arquivo CSV para o disco. Isso nos permite pegar o indicador e usá-lo em um software de backtesting alternativo para análise posterior, se assim for desejado:
No entanto, há um pequeno problema com o arquivo CSV como está agora. O arquivo contém uma lista de datas e uma previsão para a direção de amanhã. Se fôssemos carregar isso no código de backtest abaixo como está, estaríamos introduzindo um viés de look-ahead, porque o valor de predição representaria dados não conhecidos no momento da previsão.
Para explicar isso, precisamos simplesmente mover o valor previsto um dia à frente. Eu descobri que isso é mais simples usando o Python. Como não quero supor que você instalou nenhuma biblioteca especial (como pandas), mantive-a em Python puro.
Aqui está o pequeno script que leva esse procedimento para fora. Certifique-se de executá-lo no mesmo diretório que o arquivo forecasts. csv:
Neste ponto, agora temos o arquivo do indicador corrigido armazenado em forecast_new. csv. Como isso leva um tempo considerável para calcular, forneci o arquivo completo para você fazer o download:
Resultados da Estratégia.
Agora que geramos nosso arquivo CSV de indicador, precisamos comparar seu desempenho com "Comprar e reter".
Primeiro, lemos no indicador do arquivo CSV e o armazenamos como spArimaGarch:
Em seguida, criamos uma interseção das datas para as previsões ARIMA + GARCH e o conjunto original de retornos do S & amp; P500. Podemos então calcular os retornos para a estratégia ARIMA + GARCH multiplicando o sinal de previsão (+ ou -) pelo próprio retorno:
Quando tivermos os retornos da estratégia ARIMA + GARCH, podemos criar curvas de patrimônio para o modelo ARIMA + GARCH e para "Comprar e manter". Finalmente, nós os combinamos em uma única estrutura de dados:
Finalmente, podemos usar o comando xyplot para plotar ambas as curvas de equidade no mesmo enredo:
A curva de capital próprio até 6 de outubro de 2015 é a seguinte:
Curva de capital da estratégia ARIMA + GARCH vs "Buy & amp; Hold" para o S & amp; P500 de 1952.
Como você pode ver, ao longo de um período de 65 anos, a estratégia ARIMA + GARCH superou significativamente o "Buy & amp; Hold". No entanto, você também pode ver que a maior parte do ganho ocorreu entre 1970 e 1980. Observe que a volatilidade da curva é bastante mínima até o início dos anos 80, quando a volatilidade aumenta significativamente e os retornos médios são menos impressionantes.
Claramente, a curva de patrimônio promete um ótimo desempenho durante todo o período. No entanto, esta estratégia teria realmente sido negociável?
Primeiro de tudo, vamos considerar o fato de que o modelo ARMA só foi publicado em 1951. Não foi realmente amplamente utilizado até a década de 1970, quando Box & amp; Jenkins discutiu isso em seu livro.
Em segundo lugar, o modelo ARCH não foi descoberto (publicamente!) Até o início dos anos 80, por Engle, e o próprio GARCH foi publicado pela Bollerslev em 1986.
Em terceiro lugar, este "backtest" foi realmente realizado em um índice do mercado de ações e não um instrumento comercializável fisicamente. Para obter acesso a um índice como este, teria sido necessário negociar futuros S & P500 ou uma réplica do Exchange Traded Fund (ETF), como o SPDR.
Por isso, é realmente apropriado aplicar tais modelos a uma série histórica anterior à sua invenção? Uma alternativa é começar a aplicar os modelos a dados mais recentes. De fato, podemos considerar o desempenho nos últimos dez anos, de 1º de janeiro de 2005 até hoje:
Curva de capital da estratégia ARIMA + GARCH vs "Buy & amp; Hold" para o S & amp; P500 de 2005 até hoje.
Como você pode ver, a curva de patrimônio permanece abaixo de um Buy & amp; Segure a estratégia por quase 3 anos, mas durante a quebra do mercado de ações de 2008/2009 ela se sai muito bem. Isto faz sentido porque provavelmente haverá uma correlação serial significativa neste período e será bem capturado pelos modelos ARIMA e GARCH. Uma vez que o mercado se recuperou após 2009 e entrou no que parece ser uma tendência mais estocástica, o desempenho do modelo começa a sofrer mais uma vez.
Observe que essa estratégia pode ser facilmente aplicada a diferentes índices do mercado de ações, ações ou outras classes de ativos. Eu recomendo fortemente que você tente pesquisar outros instrumentos, pois você pode obter melhorias substanciais nos resultados aqui apresentados.
Próximos passos.
Agora que terminamos de discutir a família de modelos ARIMA e GARCH, desejo continuar a discussão sobre análise de séries temporais considerando processos de memória longa, modelos de espaço de estados e séries temporais cointegradas.
Essas áreas subseqüentes de séries temporais nos apresentarão modelos que podem melhorar nossas previsões além das que apresentamos aqui, o que aumentará significativamente nossa rentabilidade comercial e / ou reduzirá o risco.
Aqui está a lista completa para a geração de indicadores, backtesting e plotagem:
E o código Python para aplicar a forecasts. csv antes de reimportar:
A Quantcademy.
Participe do portal de associação da Quantcademy que atende à crescente comunidade de traders de quantificação de varejo e aprenda como aumentar a lucratividade de sua estratégia.
Negociação Algorítmica Bem Sucedida.
Como encontrar novas ideias de estratégia de negociação e avaliá-las objetivamente para o seu portfólio usando um mecanismo de backtesting personalizado no Python.
Comércio Algorítmico Avançado.
Como implementar estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas Bayesianas com R e Python.
Vamos explorar as capacidades de backtesting de R.
Em um post anterior, desenvolvemos algumas oportunidades de entrada simples para o USD / CAD usando um algoritmo de aprendizado de máquina e técnicas de um subconjunto de mineração de dados chamado aprendizado de regra de associação. Neste post, vamos explorar como fazer um backtest completo em R; usando nossas regras do post anterior e implementando os lucros e as perdas.
Vamos mergulhar em: Observação: o backtest é construído a partir das barras de 4 horas em nosso conjunto de dados e não tem uma visualização mais granular.
O CAGR (taxa composta de crescimento anual) é o ganho / perda percentual anualizado, o que significa que suaviza o crescimento em prestações iguais a cada ano. Desde que o nosso teste acabou, vamos ver se podemos melhorar o desempenho adicionando um stop loss e tendo lucro.
Com apenas um stop loss, o desempenho caiu. Parece que estamos sendo retirados de nossos negócios antes que eles possam se recuperar. A fim de garantir nossos lucros, vamos em frente e implementar um take profit.
Bloquear nossos ganhos com um take profit melhorou um pouco o desempenho, mas não drasticamente. Vamos incorporar um stop loss e um take profit.
Agora vamos comparar a linha de base da estratégia Long Short, com apenas um stop loss, apenas um take profit, e tanto um take stop loss quanto um take profit.
Agora você sabe como adicionar um take profit e stop loss, eu recomendo que você brinque com os dados e teste valores diferentes com base em seus próprios parâmetros de risco pessoal e usando suas próprias regras.
Mesmo com algoritmos poderosos e ferramentas sofisticadas, é difícil construir uma estratégia bem-sucedida. Para cada boa ideia, tendemos a ter muitos mais ruins. Armado com as ferramentas e os conhecimentos certos, você pode testar suas ideias com eficiência até chegar às boas. Nós simplificamos esse processo no TRAIDE. Desenvolvemos uma infraestrutura de testes que permite ver onde os padrões estão em seus dados e, em tempo real, ver como eles teriam se comportado com seus dados históricos.
Nós estaremos liberando o TRAIDE para 7 pares principais no mercado de FX com indicadores técnicos em duas semanas. Se você estiver interessado em testar o software e fornecer feedback, envie um email para info @ inovancetech. Temos 50 vagas disponíveis.
Um exemplo de estratégia de negociação codificada em R.
O back-testing de uma estratégia de negociação pode ser implementado em quatro etapas.
Obtendo os dados históricos Formule a estratégia de negociação e especifique as regras Execute a estratégia nos dados históricos Avalie as métricas de desempenho.
Neste post, vamos voltar a testar a nossa estratégia de negociação em R. O pacote quantmod tornou muito fácil extrair dados históricos do Yahoo Finance. O código de uma linha abaixo busca dados NSE (Nifty).
O Quantmod fornece vários recursos para visualizar dados. O comando abaixo cria um gráfico para os dados do NSE.
TA = "Nulo" indica não usar nenhum indicador técnico. Veremos em breve a aplicação de um indicador técnico em um gráfico. O próximo passo é escolher uma estratégia de negociação. Vamos escolher o MACD (Moving Average Convergence Divergence) para este exemplo. Em uma estratégia de cruzamentos médios móveis, duas médias são computadas, uma média móvel lenta e uma média móvel rápida. A diferença entre a média móvel rápida e a média móvel lenta é chamada de linha MACD. Uma terceira média chamada linha de sinal; uma média móvel exponencial de 9 dias do sinal MACD, também é calculada. Se a linha MACD cruza acima da linha de sinal, então é um sinal de alta e nós vamos longo. Se a linha MACD cruzar abaixo da linha de sinal, então é um sinal de baixa e nós ficamos em falta. Nós escolhemos o preço de fechamento dos dados da NSE para calcular as médias. O comando a seguir cumpre essa tarefa.
O comando abaixo calcula o MACD para o preço de fechamento.
Pode-se escolher parâmetros variáveis para médias rápidas, lentas e de sinal, dependendo dos requisitos de negociação. Aqui nós nos mantemos com os parâmetros padrão. MACD é a função em quantmod que calcula a divergência de convergência da média móvel, dados são o preço de fechamento para NSE, nFast é a média móvel rápida, nSlow é a média móvel lenta, maType = SMA indica que escolhemos média móvel simples, percentual = FALSE Isso implica que estamos calculando a diferença entre a média móvel rápida e a média móvel lenta. Definir como TRUE retornaria a diferença percentual entre a média móvel rápida e a média móvel lenta.
O comando a seguir plota o gráfico para o preço de fechamento do NSE juntamente com os parâmetros MACD.
Como discutido antes, definimos nosso sinal de negociação da seguinte forma:
Se o sinal MACD cruzou acima da linha de sinal, ficamos muito tempo no NSE. Se o sinal MACD cruzou abaixo da linha de sinal, ficamos sem NSE.
O comando a seguir gera o sinal de negociação de acordo. Usamos o operador lag para eliminar o viés antecipado.
Aplicaremos essa estratégia nos dados históricos da NSE de 2007-09-17 a 2015-09-22. O sinal de negociação é aplicado ao preço de fechamento para obter os retornos de nossa estratégia.
A função ROC fornece a diferença percentual entre os dois preços de fechamento. Podemos escolher a duração para a qual queremos ver os retornos. O seguinte comando escolhe os retornos entre 2008-06-02 e 2015-09-22.
Devoluções cumulativas podem ser calculadas e plotadas usando os seguintes comandos:
A quarta etapa do teste de retorno está avaliando as métricas de desempenho. O pacote de análise de desempenho em R fornece uma plataforma consolidada para observar os parâmetros relacionados ao desempenho. Várias métricas como draw-downs, downside risk, podem ser observadas em R.
O seguinte comando fornece um resumo dos parâmetros acima mencionados e muito mais!
Aqui está a versão sucinta do código.
Depois de seguir esse exemplo, você aprendeu noções básicas de como projetar uma estratégia de negociação de quant usando R. Agora você pode começar a aprender sobre como começar a usar o pacote quantmod em R. Depois de aprender com sucesso essas noções básicas, você pode testar habilidades em nosso curso de datacamp interativo de 10 horas de duração individualizada 'Modele uma Estratégia de Negociação Quantitativa em R'
Backtesting uma estratégia simples de negociação de ações.
Nota: Este post não é conselho financeiro! Essa é apenas uma maneira divertida de explorar alguns dos recursos que o R tem para importar e manipular dados.
Recentemente li um post sobre o ETF Prophet que explorou uma interessante estratégia de negociação de ações no Excel. A estratégia é simples: encontre o ponto alto do estoque nos últimos 200 dias e conte o número de dias decorridos desde aquela alta. Se for mais de 100 dias, possua o estoque. Se já passaram mais de 100 dias, não é o dono. Essa estratégia é muito simples, mas produz alguns resultados impressionantes. (Observe que, no entanto, este exemplo usa dados que não foram ajustados de divisões ou dividendos e podem conter outros erros. Além disso, estamos ignorando os custos de negociação e os atrasos de execução, os quais afetam o desempenho da estratégia.)
A implementação dessa estratégia em R é simples e oferece inúmeras vantagens sobre o Excel, a principal delas é que é fácil transferir dados do mercado de ações para o R, e podemos testar essa estratégia em uma ampla variedade de índices com relativamente pouco esforço.
Primeiramente, baixamos os dados para GSPC usando quantmod. (GSPC significa o índice S & amp; P 500). Em seguida, construímos uma função para calcular o número de dias desde a máxima de n-dia em uma série temporal e uma função para implementar nossa estratégia de negociação. A última função leva 2 parâmetros: a máxima de n-dia que você deseja usar, e o número de dias depois daquela alta você manterá o estoque. O exemplo é 200 e 100, mas você pode facilmente mudar isso para a máxima de 500 dias e ver o que acontece se você mantiver o estoque 300 dias depois disso antes de resgatá-lo. Como esta função é parametrizada, podemos facilmente testar muitas outras versões de nossa estratégia. Nós preenchemos o início da nossa estratégia com zeros, de modo que será o mesmo comprimento que os dados de entrada. (Se você deseja uma explicação mais detalhada da função daysSighHigh, consulte a discussão sobre cross-validated).
Nós multiplicamos nosso vetor de posição (0,1) pelos retornos do índice para obter os retornos de nossa estratégia. Agora, construímos uma função para retornar algumas estatísticas sobre uma estratégia de negociação e comparamos nossa estratégia com o benchmark. Um pouco arbitrariamente, decidi analisar o retorno acumulado, o retorno médio anual, a taxa de sharpe, a porcentagem de vencedores, a volatilidade média anual, o rebaixamento máximo e o rebaixamento do tamanho máximo. Outras estatísticas seriam fáceis de implementar.
Como você pode ver, essa estratégia se compara favoravelmente à abordagem padrão de “comprar e manter”.
Finalmente, testamos nossa estratégia em outros três índices: FTSE, que representa a Irlanda e o Reino Unido, o Dow Jones Industrial Index, que remonta a 1896, e o N225, que representa o Japão. Eu funcionalizei todo o processo, para que você possa testar cada nova estratégia com uma linha de código:
Estratégia de Negociação ARIMA + GARCH no Índice S & amp; P500 Stock Market Usando R.
Estratégia de Negociação ARIMA + GARCH no Índice S & amp; P500 Stock Market Usando R.
Neste artigo, quero mostrar a você como aplicar todo o conhecimento adquirido nos posts de análise de séries temporais anteriores a uma estratégia de negociação no índice do mercado de ações S & amp; P500 nos EUA.
Veremos que, combinando os modelos ARIMA e GARCH, podemos superar significativamente a abordagem "Buy-and-Hold" em longo prazo.
Visão Geral da Estratégia.
A ideia da estratégia é relativamente simples, mas se você quiser experimentar, sugiro ler os posts anteriores sobre análise de séries temporais para entender o que você estaria modificando!
A estratégia é executada de forma "rotativa":
Para cada dia, $ n $, os $ k $ dias anteriores dos retornos logarítmicos diferenciados de um índice do mercado de ações são usados como uma janela para ajustar um modelo ARIMA e GARCH ideal. O modelo combinado é usado para fazer uma previsão para os retornos do dia seguinte. Se a previsão for negativa, o estoque está em curto no fechamento anterior, enquanto, se for positivo, ele é esperado. Se a previsão for a mesma direção do dia anterior, nada será alterado.
Para essa estratégia, usei o máximo de dados disponíveis do Yahoo Finance para o S & amp; P500. Tomei $ k = 500 $, mas este é um parâmetro que pode ser otimizado para melhorar o desempenho ou reduzir o rebaixamento.
O backtest é realizado de maneira direta e vetorializada usando R. Ele ainda não foi implementado no backtester orientado a eventos do Python. Portanto, o desempenho alcançado em um sistema de negociação real provavelmente seria um pouco menor do que o que você poderia alcançar aqui, devido a comissões e derrapagens.
Implementação estratégica.
Para implementar a estratégia, vamos usar alguns dos códigos que criamos anteriormente na série de artigos de análise de séries temporais, bem como algumas novas bibliotecas, incluindo rugarch, que me foram sugeridas por Ilya Kipnis no QuantStrat Trader.
Vou percorrer a sintaxe passo-a-passo e, em seguida, apresentar a implementação completa no final, bem como um link para o meu conjunto de dados para o indicador ARIMA + GARCH. Eu incluí o último porque demorei alguns dias no meu PC dekstop para gerar os sinais!
Você deve ser capaz de replicar meus resultados na íntegra, já que o código em si não é muito complexo, embora demore algum tempo para simulá-lo se você o executar na íntegra.
A primeira tarefa é instalar e importar as bibliotecas necessárias em R:
Se você já tem as bibliotecas instaladas, pode simplesmente importá-las:
Com isso feito, aplicaremos a estratégia ao S & amp; P500. Podemos usar quantmod para obter dados desde 1950 para o índice. O Yahoo Finance usa o símbolo "^ GPSC".
Podemos, então, criar os retornos logarítmicos diferenciados do "Preço de fechamento" do S & amp; P500 e retirar o valor inicial de NA:
Precisamos criar um vetor, previsões para armazenar nossos valores de previsão em datas específicas. Nós definimos o comprimento foreLength para ser igual ao comprimento dos dados de negociação que temos menos $ k $, o tamanho da janela:
Neste estágio, precisamos percorrer todos os dias nos dados de negociação e ajustar um modelo ARIMA e GARCH apropriado à janela de rolagem de comprimento $ k $. Dado que nós tentamos 24 ajustes ARIMA separados e ajustamos um modelo GARCH, para cada dia, o indicador pode levar muito tempo para ser gerado.
Usamos o índice d como uma variável de loop e o loop de $ k $ para o tamanho dos dados de negociação:
Em seguida, criamos a janela contínua pegando os retornos do S & P500 e selecionando os valores entre $ 1 + d $ e $ k + d $, onde $ k = 500 $ para essa estratégia:
Usamos o mesmo procedimento do artigo ARIMA para pesquisar em todos os modelos ARMA com $ p \ in \ $ e $ q \ in \ $, com exceção de $ p, q = 0 $.
Envolvemos a chamada arimaFit em um bloco de tratamento de exceção R tryCatch para garantir que, se não obtivermos um ajuste para um valor específico de $ p $ e $ q $, a ignoramos e passamos para a próxima combinação de $ p $ e $ q $.
Observe que definimos o valor "integrado" de $ d = 0 $ (este é um $ d $ diferente para nosso parâmetro de indexação!) E, como tal, estamos realmente ajustando um modelo ARMA, em vez de um ARIMA.
O procedimento de looping nos fornecerá o "melhor" modelo de ARMA adequado, em termos do Critério de Informações de Akaike, que podemos usar para alimentar nosso modelo GARCH:
No próximo bloco de código, vamos usar a biblioteca rugarch, com o modelo GARCH (1,1). A sintaxe para isso requer que configuremos um objeto de especificação ugarchspec que usa um modelo para a variância e a média. A variação recebe o modelo GARCH (1,1), enquanto a média aceita um modelo ARMA (p, q), onde $ p $ e $ q $ são escolhidos acima. Também escolhemos a distribuição sged pelos erros.
Uma vez escolhida a especificação, realizamos o ajuste real do ARMA + GARCH usando o comando ugarchfit, que recebe o objeto de especificação, os retornos $ k $ do S & amp; P500 e um solucionador de otimização numérica. Escolhemos usar o híbrido, que tenta resolvedores diferentes para aumentar a probabilidade de convergência:
Se o modelo GARCH não convergir, basta definir o dia para produzir uma previsão "longa", que é claramente um palpite. No entanto, se o modelo convergir, então nós damos a saída e a direção de previsão de amanhã (+1 ou -1) como uma string, ponto no qual o loop é fechado.
Para preparar a saída para o arquivo CSV, criei uma string que contém os dados separados por uma vírgula com a direção da previsão para o dia subseqüente:
A penúltima etapa é a saída do arquivo CSV para o disco. Isso nos permite pegar o indicador e usá-lo em um software de backtesting alternativo para análise posterior, se assim for desejado:
No entanto, há um pequeno problema com o arquivo CSV como está agora. O arquivo contém uma lista de datas e uma previsão para a direção de amanhã. Se fôssemos carregar isso no código de backtest abaixo como está, estaríamos introduzindo um viés de look-ahead, porque o valor de predição representaria dados não conhecidos no momento da previsão.
Para explicar isso, precisamos simplesmente mover o valor previsto um dia à frente. Eu descobri que isso é mais simples usando o Python. Como não quero supor que você instalou nenhuma biblioteca especial (como pandas), mantive-a em Python puro.
Aqui está o pequeno script que leva esse procedimento para fora. Certifique-se de executá-lo no mesmo diretório que o arquivo forecasts. csv:
Neste ponto, agora temos o arquivo do indicador corrigido armazenado em forecast_new. csv. Como isso leva um tempo considerável para calcular, forneci o arquivo completo para você fazer o download:
Resultados da Estratégia.
Agora que geramos nosso arquivo CSV de indicador, precisamos comparar seu desempenho com "Comprar e reter".
Primeiro, lemos no indicador do arquivo CSV e o armazenamos como spArimaGarch:
Em seguida, criamos uma interseção das datas para as previsões ARIMA + GARCH e o conjunto original de retornos do S & amp; P500. Podemos então calcular os retornos para a estratégia ARIMA + GARCH multiplicando o sinal de previsão (+ ou -) pelo próprio retorno:
Quando tivermos os retornos da estratégia ARIMA + GARCH, podemos criar curvas de patrimônio para o modelo ARIMA + GARCH e para "Comprar e manter". Finalmente, nós os combinamos em uma única estrutura de dados:
Finalmente, podemos usar o comando xyplot para plotar ambas as curvas de equidade no mesmo enredo:
A curva de capital próprio até 6 de outubro de 2015 é a seguinte:
Curva de capital da estratégia ARIMA + GARCH vs "Buy & amp; Hold" para o S & amp; P500 de 1952.
Como você pode ver, ao longo de um período de 65 anos, a estratégia ARIMA + GARCH superou significativamente o "Buy & amp; Hold". No entanto, você também pode ver que a maior parte do ganho ocorreu entre 1970 e 1980. Observe que a volatilidade da curva é bastante mínima até o início dos anos 80, quando a volatilidade aumenta significativamente e os retornos médios são menos impressionantes.
Claramente, a curva de patrimônio promete um ótimo desempenho durante todo o período. No entanto, esta estratégia teria realmente sido negociável?
Primeiro de tudo, vamos considerar o fato de que o modelo ARMA só foi publicado em 1951. Não foi realmente amplamente utilizado até a década de 1970, quando Box & amp; Jenkins discutiu isso em seu livro.
Em segundo lugar, o modelo ARCH não foi descoberto (publicamente!) Até o início dos anos 80, por Engle, e o próprio GARCH foi publicado pela Bollerslev em 1986.
Em terceiro lugar, este "backtest" foi realmente realizado em um índice do mercado de ações e não um instrumento comercializável fisicamente. Para obter acesso a um índice como este, teria sido necessário negociar futuros S & P500 ou uma réplica do Exchange Traded Fund (ETF), como o SPDR.
Por isso, é realmente apropriado aplicar tais modelos a uma série histórica anterior à sua invenção? Uma alternativa é começar a aplicar os modelos a dados mais recentes. De fato, podemos considerar o desempenho nos últimos dez anos, de 1º de janeiro de 2005 até hoje:
Curva de capital da estratégia ARIMA + GARCH vs "Buy & amp; Hold" para o S & amp; P500 de 2005 até hoje.
Como você pode ver, a curva de patrimônio permanece abaixo de um Buy & amp; Segure a estratégia por quase 3 anos, mas durante a quebra do mercado de ações de 2008/2009 ela se sai muito bem. Isto faz sentido porque provavelmente haverá uma correlação serial significativa neste período e será bem capturado pelos modelos ARIMA e GARCH. Uma vez que o mercado se recuperou após 2009 e entrou no que parece ser uma tendência mais estocástica, o desempenho do modelo começa a sofrer mais uma vez.
Observe que essa estratégia pode ser facilmente aplicada a diferentes índices do mercado de ações, ações ou outras classes de ativos. Eu recomendo fortemente que você tente pesquisar outros instrumentos, pois você pode obter melhorias substanciais nos resultados aqui apresentados.
Próximos passos.
Agora que terminamos de discutir a família de modelos ARIMA e GARCH, desejo continuar a discussão sobre análise de séries temporais considerando processos de memória longa, modelos de espaço de estados e séries temporais cointegradas.
Essas áreas subseqüentes de séries temporais nos apresentarão modelos que podem melhorar nossas previsões além das que apresentamos aqui, o que aumentará significativamente nossa rentabilidade comercial e / ou reduzirá o risco.
Aqui está a lista completa para a geração de indicadores, backtesting e plotagem:
E o código Python para aplicar a forecasts. csv antes de reimportar:
A Quantcademy.
Participe do portal de associação da Quantcademy que atende à crescente comunidade de traders de quantificação de varejo e aprenda como aumentar a lucratividade de sua estratégia.
Negociação Algorítmica Bem Sucedida.
Como encontrar novas ideias de estratégia de negociação e avaliá-las objetivamente para o seu portfólio usando um mecanismo de backtesting personalizado no Python.
Comércio Algorítmico Avançado.
Como implementar estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas Bayesianas com R e Python.
Комментарии
Отправить комментарий