Wednesday 25 October 2017

Trading Strategy Quantmod


Este é o terceiro post no Backtesting no Excel e série R e ele vai mostrar como backtest uma estratégia simples em R. Ele vai seguir os 4 passos Damian esboçado em seu post sobre como backtest uma estratégia simples no Excel. Etapa 1: Obter os dados A função getSymbols no quantmod torna esta etapa fácil se você puder usar dados diários do Yahoo Finance. Existem também métodos (não no sentido estrito) para extrair dados de outras fontes (FRED, Google, Oanda, R guardar ficheiros, bases de dados, etc.). Você também pode usá-los como um modelo para escrever uma função personalizada para um fornecedor específico que você usa. Execute o comando abaixo se o quantmod já não estiver instalado use o pacote quantmod (carrega TTR, xts e zoo) puxa os dados SPX do Yahoo (getSymbols retorna um objeto xts) Etapa 2: Crie seu indicador O pacote TTR contém uma infinidade de indicadores. Os indicadores são escritos para facilitar a combinação de formas criativas e não convencionais. Começando com a revisão 106 no R-forge, o TTR tem um indicador DVI. Calcula a regra de negociação Dado que esta regra de negociação é simples - temos uma duração de 100 se o DVI estiver abaixo de 0,5 e, em seguida, 100 de curta duração - - pode ser escrito em uma única linha. Regras mais elaboradas e / ou posicionamentos também podem ser feitas, mas requerem mais código (RSI (2) com Position Sizing é um exemplo de regras de dimensionamento de posição mais complexas). Observe também que o vetor de sinal é retardado, o que evita o viés prospectivo. Criar sinal: (longo (curto) se DVI está abaixo (acima) 0.5) lag assim ontem sinal s é aplicado para hoje s retornos sig 0,5, 1, -1)) Etapa 4: As regras de negociação / equidade curva Como em Damian s Por exemplo, o código abaixo é uma abordagem simplificada, sem fricção e que não explica o deslizamento. O código abaixo toma o retorno de porcentagem de hoje e o multiplica pelo tamanho de sinal / posição de ontem (sempre / - 100 neste exemplo). Eu também subconjunto o sistema retorna para coincidir com os resultados no arquivo do Excel. Calcular retornos baseados em sinal ret - ROC (Cl (GSPC)) sig subset retorna para coincidir com dados no arquivo Excel ret - ret 2009-06-02 / 2010-09-07 Passo 5: Avaliar o desempenho da estratégia Damian mencionou a importância de avaliar o seu estratégia. Felizmente para os usuários R, o pacote PerformanceAnalytics torna isso fácil. Com algumas linhas de código, podemos ver os levantamentos, os riscos de desvantagem e um resumo de desempenho. Use o pacote PerformanceAnalytics criar tabela mostrando estatísticas drawdown criar tabela de estimativas de risco downside gráfico equidade curva, desempenho diário e drawdowns Isso é tudo o que há para backtesting uma estratégia simples em R. Não foi isso intimidador, foi Por favor, deixe comentários se você Re mover o seu backtesting do Excel para R e há algo que você está pendurado em ou você tem uma dica incrível que você gostaria de compartilhar. Aqui está uma versão sucinta do código no post acima se você quiser ser capaz de copiar / colar tudo em um bloco: Deixe-me começar dizendo que eu tenho sido gentil o suficiente para me ajudar a aprender a usar R para testes. Com tudo isso em mente, eu pensei que eu d percorrer o que eu considero os quatro passos básicos na produção de um backtest no Excel. Observe que o arquivo de núcleo do Excel não foi criado por mim - ele foi criado por Jared em CondorOptions (outro deve ler se você não está seguindo ele). Etapa 1: Obter os dados O primeiro passo é obter seus dados de mercado no Excel. Existem duas abordagens básicas para isso precisará baixar novamente os dados históricos e copiar e colar o conjunto de dados inteiro ou um subconjunto para atualizar sua estratégia. A segunda abordagem é usar o código para ir pegar dados automaticamente do Yahoo Finance. Muitas pessoas escreveram VBA para fazer apenas este d recomendar AnalyzerXL como ele fornece a maior flexibilidade e opções. Como você armazena esses dados no Excel é até você vai querer tê-los em uma planilha separada para minimizar a rolagem e torná-lo fácil de atualizar. Etapa 2: Crie seu indicador Agora que cada um de nós faz parte do cálculo. Uma coisa agradável sobre como trabalhar com o Excel é que realmente faz você pensar sobre como um indicador é construído. Pode ser muito simples, nestes dias, para jogar para baixo e indicador sem entender como ele realmente funciona. A coluna de indicador final, DVI, é uma soma ponderada das colunas de extensão DVI e DVI. Eu também notar que AnalyzerXL também contém um grande número de indicadores predefinidos para fazer backtesting mais fácil, e existem outros add-ons para o Excel que fornecem funcionalidade semelhante. Etapa 3: Construa sua regra de negociação Agora que você tem um indicador, você precisa construir suas regras de negociação. Neste exemplo (o cálculo é no re não longo ou curto, ou dimensionamento variável da posição em oposição a apenas all-in longo ou curto Passo 4: As regras de negociação / curva de equidade Existem muitas abordagens diferentes aqui, mas o que você pode ver Neste exemplo é uma maneira simples de fazê-lo. Consumir um valor inicial de caixa de 10.000 e, em seguida, incrementar ou diminuir que, se ou não estamos muito ou curto no encerramento do dia anterior, e se estávamos corretos ou não. Função, nós representamos isso dizendo: se longo, em seguida, múltiplo o dia anterior re usando dinheiro aqui, mas você poderia facilmente fazer percentagens em bruto em lugar de um valor em dinheiro. O que eles assumem não há custo / comissão para o comércio. Os sistemas de balanço de alta freqüência como este, as comissões poderiam ter um grande impacto sobre a viabilidade de uma determinada estratégia. Em segundo lugar, nós don e novamente, AnalyzerXL fornece um grande número de opções de relatórios como parte do pacote. Essa é uma visão geral básica de backtesting No Excel - espero que todos vocês acham útil ARIMA GARCH Estratégia de Negociação no S P500 Índice de Mercado de Capitais Usando R Por Michael Halls-Moore em 7 de outubro de 2015 Neste artigo eu quero mostrar-lhe como aplicar todo o conhecimento adquirido em A análise da série de tempo anterior posts para uma estratégia de negociação no índice S P500 US mercado de ações. Veremos que, combinando os modelos ARIMA e GARCH, podemos superar significativamente 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 ela, eu sugiro que você leia os posts anteriores sobre a análise de séries temporais para entender o que você estaria modificando. A estratégia é feita de forma contínua: Dia, n, os dias k anteriores dos retornos logarítmicos diferenciados de um índice de mercado de ações são usados ​​como uma janela para ajustar um modelo ideal de ARIMA e GARCH. O modelo combinado é usado para fazer uma previsão para o dia seguinte retorna. Se a previsão é negativa, o estoque é curto no fechamento anterior, enquanto que se for positivo, é desejado. Se a previsão é a mesma direção que o dia anterior, então nada é alterado. Para esta estratégia usei o máximo de dados disponíveis do Yahoo Finance para o S P500. Tenho tomado k 500, mas este é um parâmetro que pode ser otimizado, a fim de melhorar o desempenho ou reduzir drawdown. O backtest é realizado de uma forma direta vetorizada usando R. Ele não foi implementado no backtestter evento-driven Python até agora. Daí o desempenho alcançado em um sistema de comércio real seria provavelmente um pouco menos do que você pode conseguir aqui, devido à comissão e derrapagem. Implementação da Estratégia Para implementar a estratégia, vamos usar um pouco do código que criamos anteriormente na série de artigos de análise de séries temporais, bem como algumas novas bibliotecas, incluindo o rugarch. Que foi sugerido para mim por Ilya Kipnis sobre a QuantStrat Trader. Vou passar a sintaxe de uma forma passo a passo e, em seguida, apresentar a implementação completa no final, bem como um link para o meu dataset para o indicador ARIGA GARCH. Eu incluí o último porque ele me levou um par de dias no meu PC dekstop para gerar os sinais Você deve ser capaz de replicar meus resultados na íntegra como o próprio código não é muito complexo, embora leve algum tempo para simular se Você executá-lo totalmente. A primeira tarefa é instalar e importar as bibliotecas necessárias em R: Se você já tem as bibliotecas instaladas você pode simplesmente importá-los: Com isso feito vai aplicar a estratégia para o S P500. Podemos usar o quantmod para obter dados que remontam a 1950 para o índice. Yahoo Finance usa o símbolo GPSC. Podemos então criar os retornos logarítmicos diferenciados do Preço de Encerramento do S 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 foreLength para ser igual ao comprimento de dados de negociação que temos menos k, o comprimento da janela: Nesta fase, precisamos de loop através de todos os dias nos dados de negociação e ajustar um ARIMA apropriado e modelo GARCH para a janela de rolamento de Comprimento k. Dado que tentamos 24 ajustes separados ARIMA e encaixar um modelo GARCH, para cada dia, o indicador pode levar muito tempo para gerar. Usamos o índice d como uma variável de loop eo laço de k para o comprimento dos dados de negociação: Então, criamos a janela de rolamento tomando os retornos S P500 e selecionando os valores entre 1 d e kd, onde k 500 para esta estratégia: Utilizamos o mesmo procedimento que no artigo ARIMA para pesquisar 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ções de tryCatch R para garantir que, se não obtivermos um ajuste para um valor específico de p e q, ignorá-lo e passar para a próxima combinação de p e q. Observe que definimos o valor integrado de d 0 (este é um d diferente do 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 ARMA, 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 GARCH (1,1) modelo. A sintaxe para isso requer que configuremos um objeto de especificação ugarchspec que leva um modelo para a variância ea média. A variância recebe o modelo GARCH (1,1) enquanto a média toma um modelo ARMA (p, q), onde p e q são escolhidos acima. Nós também escolhemos a distribuição sged para os erros. Uma vez escolhida a especificação, realizamos o ajuste real do ARMA GARCH usando o comando ugarchfit, que leva o objeto de especificação, o k retorna do S P500 e um solucionador de otimização numérica. Optamos por usar híbrido. Que tenta solucionadores diferentes, a fim de aumentar a probabilidade de convergência: Se o modelo GARCH não converge, então simplesmente definir o dia para produzir uma longa previsão, que é claramente um palpite. No entanto, se o modelo não converge, em seguida, a saída da data e amanhã s previsão direção (1 ou -1) como uma seqüência de caracteres em que ponto o loop é 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: A etapa penúltimo é 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 tal 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 para o código de backtest abaixo como ele está, nós realmente estaria introduzindo um viés look-ahead porque o valor de predição representaria dados não conhecidos no momento da previsão. A fim de explicar isso, precisamos simplesmente mover o valor previsto um dia antes. Eu encontrei este para ser mais direto usando Python. Desde que eu não quero assumir que você instalou quaisquer bibliotecas especiais (como pandas), eu mantive-o para puro Python. Aqui está o script curto que leva este procedimento para fora. Certifique-se de executá-lo no mesmo diretório que o arquivo forecast. csv: Neste ponto, agora temos o arquivo indicador corrigido armazenado nas previsões new. csv. Uma vez que isso leva uma quantidade substancial de tempo para calcular, eu provei o arquivo completo aqui para você baixar: Resultados da Estratégia Agora que geramos nosso arquivo CSV indicador, precisamos comparar seu desempenho com Buy Hold. Em primeiro lugar, lemos no indicador a partir do arquivo CSV e armazená-lo como spArimaGarch: Criamos então uma interseção das datas para as previsões ARIMA GARCH eo conjunto original de retornos do S P500. Podemos então calcular os retornos para a estratégia ARIMA GARCH multiplicando o sinal de previsão (ou -) com o próprio retorno: uma vez que temos os retornos da estratégia ARIGA GARCH podemos criar curvas de equidade tanto para o modelo ARIMA GARCH quanto para Buy Hold. Finalmente, podemos combiná-los em uma única estrutura de dados: Finalmente, podemos usar o comando xyplot para traçar as duas curvas patrimoniais na mesma parcela: A curva de equidade até 6 de outubro de 2015 é a seguinte: Como você pode ver, Período, a estratégia ARIMA GARCH superou significativamente o Buy Hold. No entanto, você também pode ver que a maioria do ganho ocorreu entre 1970 e 1980. Observe que a volatilidade da curva é bastante mínima até o início dos anos 80, momento em que a volatilidade aumenta significativamente e os retornos médios são menos impressionantes. Claramente a curva de equidade promete grande desempenho ao longo de todo o período. No entanto, seria esta estratégia realmente foram negociáveis ​​Primeiro de tudo, vamos considerar o fato de que o modelo ARMA só foi publicado em 1951. Não foi realmente amplamente utilizado até 1970, quando Box Jenkins discutiu 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 por Bollerslev em 1986. Em terceiro lugar, este backtest foi efectivamente realizado num índice bursátil e não num instrumento fisicamente transaccionável. A fim de obter acesso a um índice como este, teria sido necessário para o comércio de futuros S P500 ou uma réplica Exchange Traded Fund (ETF), como SPDR. Portanto, é 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 a hoje: Como você pode ver a curva de equidade permanece abaixo de uma estratégia de Buy Hold por quase 3 anos, mas durante o crash da bolsa de 2008/2009 Faz muito bem. Isto faz sentido porque é provável que haja uma correlação serial significativa neste período e será bem capturado pelos modelos ARIMA e GARCH. Uma vez que o mercado recuperou pós-2009 e entra o que parece ser mais uma tendência 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 de ações, ações ou outras classes de ativos. Eu recomendo fortemente que você tente pesquisar outros instrumentos, como você pode obter melhorias substanciais sobre os resultados apresentados aqui. Próximas Etapas Agora que terminamos de discutir a família de modelos ARIMA e GARCH, eu quero continuar a discussão da análise de séries temporais considerando processos de longa memória, modelos de estados-espaço e séries temporais co-integradas. Essas áreas subseqüentes de séries temporais nos apresentarão modelos que podem melhorar nossas previsões para além daquelas apresentadas aqui, o que aumentará significativamente nossa rentabilidade comercial e / ou reduzirá o risco. Código completo Aqui está a listagem completa para a geração de indicadores, backtesting e plotagem: E o código Python para aplicar a forecast. csv antes de reimportar: Michael Halls-Moore Mike é o fundador da QuantStart e tem estado envolvido na indústria financeira quantitativa para a Últimos cinco anos, principalmente como um desenvolvedor quant e mais tarde como um consultor de comerciante quant para hedge funds. Artigos relacionados

No comments:

Post a Comment