Estratégias de Backtesting com R.
2018-05-06.
Capítulo 1 Introdução.
Este livro foi concebido para não apenas produzir estatísticas em muitos dos padrões técnicos mais comuns no mercado de ações, mas para mostrar trades reais em tais cenários.
Teste uma estratégia; rejeitar se os resultados não são promissores.
Aplique uma série de parâmetros para estratégias de otimização.
Tentativa de matar qualquer estratégia que pareça promissora.
Deixe-me explicar esse último um pouco. Só porque você pode encontrar uma estratégia que parece superar o mercado, ter bons lucros e baixa redução, isso não significa que você tenha encontrado uma estratégia para trabalhar. Pelo contrário, você deve trabalhar para refutá-lo. Nada é pior do que colocar uma estratégia não lucrativa para o trabalho, porque não foi testado rigorosamente. Vamos abordar isso mais tarde.
1.1 R Resources.
Este livro supõe que você tenha pelo menos um conhecimento básico de trabalho da plataforma R. Se você é novo em R ou precisa de uma atualização, o seguinte site deve ser benéfico:
Além disso, os pacotes utilizados neste livro podem ser encontrados no TradeAnalytics projetado no R-Forge. Você encontrará fóruns e código-fonte que ajudaram a inspirar este livro.
Eu também recomendo que você leia as apresentações de Guy Yollin no backtesting, bem como a apresentação do Quantstrat usando Jan Humme e Brian Peterson.
Este livro não se destina a substituir nenhum dos recursos existentes em estratégias de backtesting em R. Em vez disso, a intenção é aprimorar e agilizar esses recursos. Se algo não for abordado neste livro, leia as apresentações acima.
Além disso, este livro é de código aberto. Qualquer pessoa é bem-vinda a contribuir. Você pode encontrar o código fonte disponível na minha conta do Github.
1.2 Bibliotecas.
A única biblioteca necessária necessária para executar estratégias de teste é quantstrat. Quantstrat irá carregar todas as bibliotecas adicionais necessárias.
Esta versão do quantstrat inclui os seguintes pacotes, entre outros:
Com essas bibliotecas, teremos tudo o que precisamos para testar completamente as estratégias e medir o desempenho. Consulte 1.3 SessionInfo para obter mais detalhes.
Bibliotecas adicionais que podemos usar para análise ou apresentação de livros:
Estratégias de Backtesting com R.
Vamos começar com uma variação da estratégia de negociação de Luxor. Esta estratégia usa dois indicadores SMA: SMA (10) e SMA (30).
Se o indicador SMA (10) for maior ou igual ao indicador SMA (30), enviaremos uma ordem longa stoplimit para abrir e fechar quaisquer posições curtas que possam estar abertas. Se o SMA (10) for menor que o SMA (30), enviaremos uma ordem curta stoplimit para abrir e fechar quaisquer posições longas abertas.
Nota: Lembre-se de que já estabelecemos algumas variáveis no início do livro. Se você copiar e colar o código abaixo por si mesmo, você receberá erros. Haverá tutoriais completos listados mais tarde no livro.
5.1 Configuração de Estratégia.
Carregamos nossos símbolos em símbolos.
Depois de carregarmos nossos símbolos, usamos o FinancialInstrument :: stock () para definir os meta-dados para nossos símbolos. Neste caso, estamos definindo a moeda em USD (dólares americanos) com um multiplicador de 1. O multiplicador é aplicado ao preço. Isso variará de acordo com o instrumento financeiro em que você está trabalhando, mas para ações deve ser sempre 1.
Em seguida, vamos atribuir nomes próprios para nossos objetos de portfólio, conta e estratégia. Estes podem ser qualquer nome que você deseja e deve ser baseado em como você pretende registrar os dados mais tarde.
Removemos os resíduos das corridas anteriores, eliminando os valores da carteira e da conta. Neste ponto, o que fizemos até agora é desnecessário. No entanto, é um bom hábito incluir isso com todos os seus scripts, pois os dados armazenados na memória podem afetar os resultados ou gerar erros.
Agora, inicializamos nosso portfólio, conta e pedidos. Também armazenamos nossa estratégia para economizar para mais tarde.
5.2 Adicionar indicadores.
Os indicadores são funções usadas para medir uma variável. Um SMA é apenas uma média dos preços anteriores; tipicamente preço de fechamento. Portanto, a SMA (10) é apenas uma média dos últimos 10 preços de fechamento.
Este é o lugar onde a biblioteca TTR entra; abreviação de Regras de Negociação Técnicas. SMA () é uma função da TTR, assim como muitos outros indicadores. Se você quer MACD, RSI, Bollinger Bands, etc., você usará a biblioteca TTR.
add. indicator é uma função do quantstrat e adiciona nossos indicadores ao nosso objeto de estratégia. Por enquanto, usaremos os seguintes parâmetros:
estratégia: ao armazenar nosso nome de estratégia na variável strategy. st tudo o que precisamos fazer é passar essa variável. Caso contrário, forneceríamos uma string. Use variáveis quando isso se tornará redundante à medida que nos movemos.
Nome: função de indicador; para este exemplo, SMA. Nós apenas passamos o nome da função como uma seqüência de caracteres. Parâmetros para a função são passados para o parâmetro de argumentos ...
argumentos: se olharmos? SMA, vemos os parâmetros necessários são x e n com o n padrão sendo 10. x é o objeto de preço. No nosso exemplo, estamos usando preços de fechamento.
etiqueta: rótulo da variável que será adicionada ao nosso conjunto de dados. Isso deve ser exclusivo para cada indicador que adicionamos.
Vamos pausar por um momento e examinar os argumentos. Observe que estamos passando uma série de funções para x. Se você quisesse acessar a variável Fechar do conjunto de dados IWM, você normalmente faria isso, ligando para IWM $ Close ou IWM [, 4]. Aqui estamos acessando um objeto de dados mktdata.
mktdata é um conjunto de dados especial criado para cada símbolo que irá armazenar todos os nossos indicadores e sinais. Quando a estratégia é executada, você verá o objeto mktdata em seu ambiente. Só existirá para o último símbolo, a estratégia executada.
A função add. indicator () (juntamente com add. signal e add. rules que discutiremos momentaneamente) não é avaliada até que executem nossa estratégia. Tudo o que faz é adicionar nossas especificações ao objeto de estratégia. Quando executamos nossa estratégia, o objeto mktdata é criado para cada iteração de símbolos em que nossos dados serão adicionados.
Cl é realmente curto para Close como você pode ter adivinhado. Na verdade, temos várias funções de mão curta para nossas variáveis:
OpCl (): Abrir e fechar (conjunto de dados n x 2)
HLC (): alto, baixo e fechado (conjunto de dados n x 3)
Veja a ajuda para qualquer um desses símbolos acima para uma listagem mais detalhada.
quote () é uma função R que simplesmente envolve o parâmetro fornecido entre aspas.
Então, adicionamos dois indicadores ao nosso objeto mktdata, nFast (SMA (10)) e nSlow (SMA (30)). Vamos agora adicionar sinais.
5.3 Adicionar sinais.
Os sinais são um valor dado quando as condições são atendidas por nossos indicadores. Por exemplo, nesta estratégia, queremos um sinal sempre que nFast seja maior ou igual a nSlow. Nós também queremos outro sinal onde nFast é menor do que nSlow. Vamos nomear estes sinais longos e curtos, respectivamente.
Mais uma vez, estamos passando strategy. st para o parâmetro de estratégia. O nome toma uma função assim como ocorreu no add. indicator. Aqui vamos usar algumas funções de Quantstrat embutidas. Vamos dar uma olhada no que está disponível:
sigComparison: booleano, compare duas variáveis por relação gt maior que lt inferior a eq igual a gte maior ou igual a lte menor ou igual a.
sigCrossover: booleano, VERDADEIRO quando um sinal cruza outro. Usa os mesmos relacionamentos como sigComparison.
sigFormula: aplique uma fórmula para múltiplas variáveis.
sigPeak: identifique mínimos locais ou máximos de um indicador.
sigThreshold: booleano, quando um indicador cruza um valor. Usa relacionamentos como identificados acima.
sigTimestamp: gera um sinal com base em um timestamp.
Nós tentaremos usar cada um desses sinais ao longo do livro quando possível.
5.4 Adicionar regras.
Nós construímos agora nossos indicadores nFast e nSlow e geramos sinais baseados nesses indicadores. Agora, temos que adicionar regras para esses sinais.
add. rules determinará as posições que tomamos, dependendo dos nossos sinais, que tipo de ordem vamos colocar e quantos compartilhamentos compraremos.
Sempre que nossa variável longa (sigcol) é TRUE (sigval), queremos colocar uma ordem stoplimit (tipo de ordem). Nossa preferência está no limite superior (preferir) mais. Queremos comprar 100 ações (orderqty). Uma nova variável EnterLONG será adicionada ao mktdata. Quando entramos (digitar), uma posição EnterLONG será VERDADEIRA, caso contrário FALSO. Este pedido não substituirá quaisquer outras ordens abertas.
Se a nossa variável curta (sigcol) for TRUE (sigval), colocamos outra ordem stoplimit (tipo de ordem) com uma preferência no Low (preferir). Vamos vender 100 ações (orderqty). Este pedido não substituirá nenhuma ordem aberta (substituir).
Agora temos regras configuradas para inserir posições com base nos nossos sinais. No entanto, não temos regras para sair de posições abertas. Vamos criar esses agora.
Nossa próxima regra, Exit2SHORT, é uma ordem de mercado simples para sair (tipo) quando breve é VERDADEIRO (sigcol, sigval). Isso encerra todas as posições longas (orderside, orderqty). Este pedido irá substituir (substituir) quaisquer ordens abertas.
Por fim, fechamos as posições curtas (ordens) quando há tempo é VERDADEIRO (sigcol, sigval). Nós sairemos (tipo) ao preço de mercado (tipo de ordem) todas as posições abertas (orderqty). Este pedido irá substituir quaisquer ordens abertas que possamos (substituir).
TxnFees são taxas de transação associadas a um pedido. Isso pode ser qualquer valor que você escolher, mas deve refletir com precisão as taxas cobradas pelo corretor selecionado. Além disso, mostramos apenas aqui as saídas. Alguns corretores cobram taxas em posições de entrada também. TxnFees pode ser adicionado a qualquer conjunto de regras.
Se você não tem certeza de quais taxas o corretor selecionado cobra - o que há de errado com você? Vá descobrir agora. Alguns corretores de varejo (TD Ameritrade, ETrade) cobrará menos de US $ 10 por posição em ações ilimitadas; alguns como Interactive Brokers ou TradeStation cobrará ainda menos dependendo do número de ações. $ 10 é um bom ponto de partida.
5.5 Aplicar estratégia.
Agora chegamos à parte divertida! Faz ou morre. Aqui vamos descobrir se nós construímos nossa estratégia corretamente ou se temos algum erro em nosso código. Cruze seus dedos. Vamos!
Impressionante! Sabemos que pelo menos o nosso código é bom.
applyStrategy () é a função que vamos executar quando tivermos uma estratégia direta. O que quero dizer com isso é uma estratégia que não testa parâmetros diferentes. Chegaremos a esse tipo de teste mais tarde.
Você pode ver que é uma chamada muito simples; Nós apenas passamos nossa variável strategy. st como o primeiro parâmetro e nosso portfólio como o segundo parâmetro. Não há necessidade de entrar em parâmetros adicionais no momento.
Não mostraremos os resultados de mais corridas de applyStrategy para economizar espaço. Basta saber que, se você obtiver saída de comércio, você deveria estar bem.
Em seguida, atualizamos nosso portfólio e objetos de conta. Fazemos isso com as funções updatePortf (), updateAcct () e updateEndEq (). updatePortf calcula o P & amp; L para cada símbolo nos símbolos. updateAcct calcula o patrimônio dos dados do portfólio. E updateEndEq atualiza o patrimônio final para a conta. Eles devem ser chamados em ordem.
Backtesting uma Estratégia de Negociação.
Entretanto, encontrei uma estratégia comercial ao ler um artigo no serviço "Over My Shoulder" de John Mauldin (que eu recomendo). O ponto crucial disso foi que, no mercado do osso que começou com o choque da tecnologia, uma estratégia de apostar na reversão média do S & P500 gerou retornos significativos. Naturalmente, queria testar.
Por favor, note que não estou recomendando nada a seguir. Faça sua lição de casa e fale com um profissional de investimento se tiver dúvidas.
A estratégia é prolongar o S & P500 quando o mercado se fecha ao máximo nos últimos 3 dias. Inverta o comércio e vá muito tempo quando o mercado fecha ao mínimo durante os 3 dias anteriores. Os ETFs tornam essa estratégia relativamente fácil de negociar. A SPY será o nosso veículo para ser longo o S & amp; P500 e SH será nosso veículo para ficar curto.
A SH começou a negociar em 21/06/2006. Concentramos nosso backtesting nesse ponto até agora.
Usando a função importSeries () que criamos anteriormente, obtenha todos os valores para SPY e SH.
Precisamos criar algumas horas adicionais para segurar.
Backtesting estratégias de negociação com R.
Poucas semanas atrás, dei uma palestra sobre as estratégias de negociação de Backtesting com R, recebi alguns pedidos para os slides, então aqui estão:
Você pode gostar também:
Pairs Trading Issues Algumas palavras para aqueles que não estão familiarizados com o & # 8220; pares trading & # 8221; conceito. Primeiro você deve entender que o movimento de todos. O preço está certo, segunda parte e # 8211; Estratégia de negociação. Tendo em mente o mercado de ações, na postagem anterior: "O preço está certo, parte um." # 8221 ;, afirmei que não devemos pensar em termos de & # 8220; o. Estilo de fundo de hedge mais rentável Este não é um conselho de investimento! Algumas semanas atrás, durante o amst-R-dam, grupo de usuários, conversando sobre as estratégias de negociação de backtesting usando R, eu mencionei o máximo. Padrão de volatilidade intra-dia Quando falamos de volatilidade, geralmente nos referimos ao movimento relativo de um instrumento, digamos estoque, do centro, digamos média. Tão alta volatilidade.
Repetição de uma estratégia simples de negociação de ações.
Nota: Esta publicação NÃO é um conselho financeiro! Esta é apenas uma maneira divertida de explorar alguns dos recursos que R tem para importar e manipular dados.
Recentemente, li uma publicação no ETF Prophet que explorou uma estratégia de negociação de ações interessante 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 tiver sido mais de 100 dias, possui o estoque. Se tiverem decorrido mais de 100 dias, não seja o próprio. Esta estratégia é muito simples, mas produz alguns resultados impressionantes. (Nota, no entanto, que este exemplo usa dados que não foram ajustados de divisões ou dividendos e podem conter outros erros. Além disso, estamos ignorando custos de negociação e atrasos de execução, que afetam o desempenho da estratégia.)
Implementar esta estratégia em R é simples e oferece inúmeras vantagens sobre o Excel, cujo principal é que tirar dados do mercado de ações em R é fácil e podemos testar essa estratégia em uma ampla gama de índices com relativamente pouco esforço.
Em primeiro lugar, baixamos dados para GSPC usando quantmod. (GSPC representa o índice S & amp; P 500). Em seguida, construímos uma função para calcular o número de dias desde a alta de n-dia em uma série de tempo e uma função para implementar nossa estratégia de negociação. A última função leva 2 parâmetros: o máximo de n-dia que você deseja usar, e os números de dias depois dessa altura você segurará o estoque. O exemplo é 200 e 100, mas você poderia facilmente mudar isso para o máximo de 500 dias e ver o que acontece se você armazenar o estoque 300 dias depois antes de sair. Uma vez que esta função está parametrizada, podemos testar facilmente muitas outras versões da nossa estratégia. Assumimos o início da nossa estratégia com zeros, por isso será o mesmo comprimento que os nossos dados de entrada. (Se desejar uma explicação mais detalhada da função daysSinceHigh, veja a discussão sobre validação cruzada).
Multiplicamos nosso vetor de posição (0,1) pelos retornos do índice para obter os retornos da nossa estratégia. Agora, construímos uma função para retornar algumas estatísticas sobre uma estratégia comercial e comparamos nossa estratégia com o benchmark. Um pouco arbitrariamente, eu decidi olhar para o retorno cumulativo, o retorno anual médio, a proporção de sharpe, o% vencedor, a volatilidade anual média, a redução máxima e a redução do comprimento máximo. Outras estatísticas seriam fáceis de implementar.
Como você pode ver, esta estratégia se compara favoravelmente à abordagem padrão "buy and hold".
Finalmente, testamos nossa estratégia em 3 outros índices: FTSE que representa a Irlanda e o Reino Unido, o Dow Jones Industrial Index, que se remonta a 1896, e o N225, que representa o Japão. Eu funcionei todo o processo, então você pode testar cada nova estratégia com 1 linha de código:
Comments
Post a Comment