Sunday 11 March 2018

Estratégia de negociação quantmod



Obter através da App Store Leia esta publicação em nosso aplicativo!
R: Backtesting uma estratégia de negociação. Iniciantes para quantmod e R.
Eu sou muito novo para a R e tentando testar 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 consigo os Close Prices muito bem em um vetor. ou algum tipo de vetor, mas ele começa com a 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 (series) também não funciona, mas eu preciso disso para o Loop.
Então, acho que se eu receber essas 2 perguntas respondidas, minha estratégia deveria funcionar. Estou muito agradecido por qualquer ajuda ... R parece bastante complicado mesmo com a experiência de programação em outras línguas.
Começando com a segunda pergunta.
Então, se você quiser trabalhar no objeto xts real, você precisa usar get.
Sobre sua primeira pergunta - eu não acho que você realmente precisa puxar os dados como um vetor - o objeto xts é uma matriz indexada por data e é fácil de trabalhar. Se você ainda deseja obter os dados que você pode usar.
Agora, para que você comece com um simples teste de respostas de estratégias, sugerirei trabalhar nas seguintes etapas.
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 por muito tempo, 0 para nenhuma posição e -1 para breve (mais tarde você pode jogar com o número de alavancagem). 3. multiplique cada dia retorna com a posição e você obterá seu vetor de retorno de estratégia. 4. examine os resultados - minha recomendação é PerformanceAnalytics.
Estratégia simples - compre quando estiver perto da SMA20, venda abaixo.

Estratégia de negociação quantmod
Obter através da App Store Leia esta publicação em nosso aplicativo!
Backtesting Trading Strategy em R usando quantmod: Function e for loop dentro de uma Função.
Estou usando os pacotes R, quantmod e Performanceanalystics. Como parte de uma estratégia de backtesting, estou tentando criar um vetor de sinal / participação que me diz se devo comprar / vender / manter uma ação, com base no valor do RSI. Se RSI & lt; 30, compre (então as participações aumentam em 1), se RSI estiver entre 30 e amp; 50, não faça nada (então as participações permanecem as mesmas que ontem). Se RSI> = 50, vende tudo (então as participações tornam-se zero). Posteriormente, use a função dailyReturn () do Performanceanalytics para calcular e gerar um gráfico de retornos.
Observe que RSI () é uma função que leva "preço" e "dia", e a função dailyReturn () também leva "preço"
Eu consegui perfeitamente bem com o seguinte código abaixo.
Mas é necessário criar uma função chamada "tamanho1 ()" que leva "preço" e "dia" (o professor diz, e eu não faço a computação). Quando eu tento isso, RStudio me diz "Erro no lag (rsi, 1): objeto 'rsi' não encontrado". Por que é que? Não é legal criar uma função ou um vetor em uma função? Ou devo estruturar meu código de uma maneira diferente da primeira acima? O código com função (preço, dia) está abaixo:
dia + 2: comprimento (preço) não é o que você espera. : tem precedência acima de + (veja? Sintaxe). Ele avalia até o dia + (2: comprimento (preço)). Você quer (dia + 2): comprimento (preço). Observe também que os objetos xts são uma matriz com um atributo de índice e uma matriz é apenas um vetor com um atributo fraco. O comprimento da chamada em uma matriz retorna o número total de observações (o comprimento do vetor). Você deve usar nrow em vez disso.
Também é uma boa prática pré-alocar todo o vetor de resultados antes do loop for. O seu código atual anexa às participações sempre que você chama as participações [i] & lt; - quando eu for maior do que o comprimento atual das explorações.
Além disso, sua função atualmente não retorna nada. Parece que você pretende retornar o objeto de tamanho. Observe que você não precisa recriar esse objeto em cada iteração de loop.

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 7 de outubro de 2015.
Neste artigo, quero mostrar-lhe como aplicar todo o conhecimento adquirido nas postagens anteriores da análise de séries temporais para uma estratégia de negociação no índice de mercado de ações S & amp; P500.
Veremos que, ao combinar os modelos ARIMA e GARCH, podemos superar de forma significativa uma abordagem "Buy-and-Hold" a longo prazo.
Visão geral da estratégia.
A idéia da estratégia é relativamente simples, mas se você quiser experimentar com isso, eu sugiro muito ler as postagens anteriores na análise de séries temporais para entender o que você está modificando!
A estratégia é realizada de forma contínua:
Para cada dia, $ n $, os dias anteriores de $ k $ dos retornos logarítmicos diferenciados de um índice de mercado de ações são usados ​​como uma janela para ajustar um ótimo modelo ARIMA e GARCH. O modelo combinado é usado para fazer uma previsão para os retornos do dia seguinte. Se a previsão é negativa, o estoque é curto no fechamento anterior, enquanto que se for positivo é desejado. Se a predição é a mesma direção que o 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. Eu peguei $ k = 500 $, mas este é um parâmetro que pode ser otimizado para melhorar o desempenho ou reduzir a redução.
O backtest é realizado de forma direta e vetorial usando R. Ele não foi implementado no backtester baseado em eventos Python até o momento. Assim, o desempenho alcançado em um sistema de comércio real seria provavelmente um pouco menor do que você poderia alcançar aqui, devido à comissão e derrapagem.
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 da série temporal, bem como algumas novas bibliotecas, incluindo o rugarch, que me foi sugerido por Ilya Kipnis no QuantStrat Trader.
Passarei pela sintaxe de uma forma passo a passo e apresentarei 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 me levou alguns dias no meu PC dekstop para gerar os sinais!
Você deve ser capaz de replicar meus resultados na íntegra, pois o código em si não é muito complexo, embora leve algum tempo para simular se você executá-lo na íntegra.
A primeira tarefa é instalar e importar bibliotecas necessárias em R:
Se você já possui as bibliotecas instaladas, basta importá-las:
Com isso feito, vamos aplicar a estratégia ao S & amp; P500. Podemos usar quantmod para obter dados que datam de 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. Definimos o comprimento do comprimento anterior para ser igual ao comprimento dos dados de negociação que temos menos $ k $, o comprimento da janela:
Nesta fase, precisamos fazer um ciclo todos os dias nos dados de negociação e ajustar um modelo adequado ARIMA e GARCH para a janela de rolamento de comprimento $ k $. Dado que tentamos 24 ajustes ARIMA separados e ajustamos um modelo GARCH, para cada dia, o indicador pode levar muito tempo para gerar.
Usamos o índice d como uma variável de loop e loop de $ k $ para o comprimento dos dados de negociação:
Em seguida, criamos a janela de rolagem, levando os retornos S & P500 e selecionando os valores entre $ 1 + d $ e $ k + d $, onde $ k = 500 $ para esta estratégia:
Usamos o mesmo procedimento que no artigo ARIMA para pesquisar todos os modelos ARMA com $ p \ in \ $ e $ q \ in \ $, com a exceção de $ p, q = 0 $.
Nós envolvemos a chamada arimaFit em um bloco de tratamento de exceção R tryCatch para garantir que, se não conseguirmos um ajuste para um valor particular de $ p $ e $ q $, ignoramos e seguimos para a próxima combinação de $ p $ e $ q $.
Tenha em atenção que definimos o valor "integrado" de $ d = 0 $ (este é um $ d $ diferente para o nosso parâmetro de indexação!) E, como tal, nós somos realmente um modelo ARMA, em vez de um ARIMA.
O procedimento de looping nos fornecerá o modelo ARMA "melhor", em termos do Critério de Informação Akaike, que podemos usar para alimentar nosso modelo GARCH:
No próximo bloco de código, vamos usar a biblioteca do rugarch, com o modelo GARCH (1,1). A sintaxe para isso exige que configuremos um objeto de especificação ugarchspec que leve um modelo para a variância e a média. A variância recebe o modelo GARCH (1,1) enquanto a média leva um modelo ARMA (p, q), onde $ p $ e $ q $ são escolhidos acima. Também escolhemos a distribuição sged para os erros.
Uma vez que escolhemos a especificação, realizamos o ajuste real do ARMA + GARCH usando o comando ugarchfit, que leva o objeto de especificação, os retornos $ k $ do S & amp; P500 e um solucionador numérico de otimização. Escolhemos usar o híbrido, que tenta diferentes solucionadores para aumentar a probabilidade de convergência:
Se o modelo GARCH não converge, simplesmente estabelecemos o dia para produzir uma previsão "longa", o que é claramente um palpite. No entanto, se o modelo converge, então emitimos a data e a direção de previsão de amanhã (+1 ou -1) como uma seqüência de caracteres em que ponto o ciclo está fechado.
Para preparar a saída para o arquivo CSV, criei uma seqüência de caracteres que contém os dados separados por uma vírgula com a direção de previsão para o dia seguinte:
O penúltimo passo é a saída do arquivo CSV para o disco. Isso nos permite levar o indicador e usá-lo em software de backtesting alternativo para análise posterior, se assim desejar:
No entanto, há um pequeno problema com o arquivo CSV como está no momento. O arquivo contém uma lista de datas e uma previsão para a direção de amanhã. Se nós estivéssemos a carregar isso no código de backtest abaixo, como seria o caso, nós realmente estaríamos apresentando um viés avançado porque o valor de previsão representaria dados não conhecidos no momento da predição.
Para explicar isso, precisamos simplesmente mover o valor previsto um dia antes. Descobriu que isso era mais direto usando o Python. Como não quero assumir que você tenha instalado bibliotecas especiais (como os pandas), eu mantive o Python puro.
Aqui está o pequeno script que traz esse procedimento. Certifique-se de executá-lo no mesmo diretório que o arquivo forecast. csv:
Neste ponto, agora temos o arquivo de indicador corrigido armazenado em forecast_new. csv. Uma vez que isso leva uma quantidade substancial de tempo para calcular, forneci o arquivo completo aqui para você se baixar:
Resultados da Estratégia.
Agora que geramos o nosso arquivo CSV indicador, precisamos comparar seu desempenho com "Comprar e aguardar".
Em primeiro lugar, lemos o 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 da S & P500. Podemos então calcular os retornos para a estratégia ARIMA + GARCH multiplicando o sinal de previsão (+ ou -) pelo próprio retorno:
Uma vez que temos os retornos da estratégia ARIMA + GARCH, podemos criar curvas de equidade para o modelo ARIMA + GARCH e "Comprar e aguardar". Finalmente, nós os combinamos em uma única estrutura de dados:
Finalmente, podemos usar o comando xyplot para traçar as duas curvas de equidade no mesmo gráfico:
A curva patrimonial até 6 de outubro de 2015 é a seguinte:
Curva de capital da estratégia ARIMA + GARCH vs "Comprar e manter" para o S & P500 a partir de 1952.
Como você pode ver, ao longo de um período de 65 anos, a estratégia ARIMA + GARCH superou significativamente "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, altura em que a volatilidade aumenta significativamente e os retornos médios são menos impressionantes.
Claramente, a curva de equidade promete ótimo desempenho durante todo o período. No entanto, essa estratégia realmente teria sido negociável?
Em primeiro lugar, consideremos o fato de que o modelo ARMA só foi publicado em 1951. Não foi 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, pela Engle, e o próprio GARCH foi publicado por Bollerslev em 1986.
Em terceiro lugar, este "backtest" realmente foi realizado em um índice de mercado de ações e não um instrumento fisicamente negociável. Para obter acesso a um índice como este, teria sido necessário negociar futuros S & P500 ou uma réplica Exchange Traded Fund (ETF), como SPDR.
Por isso, é realmente apropriado aplicar esses modelos a uma série histórica antes da invenção? Uma alternativa é começar a aplicar os modelos a dados mais recentes. Na verdade, podemos considerar o desempenho nos últimos dez anos, de 1 de janeiro de 2005 a hoje:
Curva de capital da estratégia ARIMA + GARCH vs "Comprar e manter" para o S & P500 de 2005 até hoje.
Como você pode ver, a curva de equidade permanece abaixo de um Buy & amp; Mantenha a estratégia por quase 3 anos, mas durante a queda no mercado de ações de 2008/2009, ela supera demais. Isso faz sentido porque é provável que haja uma correlação serial significativa nesse período e será bem capturada pelos modelos ARIMA e GARCH. Uma vez que o mercado se recuperou após 2009 e entra no que parece ser mais uma tendência estocástica, a performance do modelo começa a sofrer mais uma vez.
Note-se que esta estratégia pode ser facilmente aplicada a diferentes índices do mercado de ações, ações ou outras classes de ativos. Eu o encorajo a tentar 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, quero continuar a discussão da análise de séries temporais considerando processos de memória longa, modelos de espaço estadual e séries temporais cointegradas.
Estas áreas subsequentes de séries temporais nos apresentarão modelos que podem melhorar nossas previsões além das que eu mostrei aqui, o que aumentará significativamente nossa lucratividade comercial e / ou reduzirá o risco.
Aqui está a listagem completa para geração de indicadores, backtesting e traçado:
E o código Python para aplicar a forecast. csv antes de reimportar:
Apenas iniciando o comércio quantitativo?
3 razões para se inscrever na QuantStart List:
1. Quant Trading Lessons.
Você terá acesso instantâneo a um curso gratuito de 10 partes, com 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.

Um exemplo de estratégia comercial 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.
Nesta publicação, voltaremos 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 obtém dados NSE (Nifty).
O Quantmod fornece vários recursos para visualizar dados. O comando abaixo cria um gráfico para os dados NSE.
TA = "Nulo" indica não usar nenhum indicador técnico. Veremos logo a aplicação de um indicador técnico em um gráfico. O próximo passo é escolher uma estratégia de negociação. Nós escolheremos MACD (Divergência de Convergência Médica em Movimento) para este exemplo. Em uma estratégia de cruzamento média móvel, duas médias são calculadas, uma média lenta e uma média móvel rápida. A diferença entre a média móvel rápida e a média lenta média é 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 ficamos longos. Se a linha MACD cruza abaixo da linha de sinal, então é um sinal de baixa e ficamos curtos. Escolhemos o preço de fechamento dos dados NSE para calcular as médias. O comando seguinte cumpre esta 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 ficamos com os parâmetros padrão. MACD é a função em quantmod que calcula a divergência de convergência média móvel, os dados são o preço de fechamento para NSE, nFast é a média em movimento rápido, nSlow é a média lenta, maType = SMA indica que escolhemos média móvel simples, percentagem = FALSO implica que estamos calculando a diferença entre média em movimento rápido e média lenta. Defini-lo VERDADEIRO retornaria a diferença percentual entre a média móvel rápida e a média lenta.
O comando a seguir traça o gráfico para o preço de fechamento da NSE, juntamente com os parâmetros do MACD.
Conforme discutido anteriormente, definimos nosso sinal de negociação da seguinte forma:
Se o sinal MACD se cruzou acima da linha de sinal, vamos longamente NSE Se o sinal MACD cruzado abaixo da linha de sinal, ficamos curtos em NSE.
O comando seguinte gera o sinal de negociação de acordo. Utilizamos o operador de desfasamento para eliminar o viés de avanço.
Vamos aplicar 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.
Os retornos cumulativos podem ser calculados e plotados usando os seguintes comandos: -
O 4º passo do back-testing é avaliar 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 retrabalhos, risco de queda podem ser observadas em R.
O comando seguinte fornece um resumo dos parâmetros acima mencionados e muito mais!
Aqui está a versão sucinta do código.
Depois de passar por esse exemplo, você aprendeu conceitos básicos sobre como projetar uma estratégia de negociação de quantos usando R. Agora, você pode começar a aprender sobre como começar com o pacote quantmod em R. Depois de ter aprendido com sucesso estes conceitos básicos, você pode testar seu habilidades em nosso curso interativo de 10 horas de duração do caminho de dados "Modelar uma Estratégia de Negociação Quantitativa em R"
Comentários estão fechados.
Posts populares recentes.
Artigos mais visitados da semana.
Empregos para usuários R.
É alimentado pelo WordPress usando um design bavotasan.
Direitos autorais e cópia; 2017 R-bloggers. Todos os direitos reservados. Termos e Condições para este site.

No comments:

Post a Comment