1) Leitura dos dados disponibilizados pela B3
2) Formatação dos dados para uso
3) Grid search para o GARCH utilizado
4.1) Observações; 4.2) Modelos de precificação de opção; 4.3) Resultados dos Modelos de precificação de opção.
5.1) Resultados; 5.2) Indicadores; 5.3) Value at Risk; 5.4) Expected Shortfall; 5.5) Performance e drawdown.
6) Backtesting com mais periodos
6.1) Resultados Janelas separadas; 6.1.1) Indicadores de Risco; 6.1.2) Value at Risk; 6.1.3) Expected Shortfall; 6.1.4) Performance e drawdown.
6.2) Resultados média das janelas; 6.2.1) Retorno-Risco; 6.2.2) Value at Risk; 6.2.3) Expected Shortfall; 6.2.4) Performance e drawdown.
A ídeia para esse projeto era de criar uma ferramenta onde eu pudesse testar estratégias de ações e opções na bolsa de valores. Não considero o projeto terminado, ainda quero fazer mudanças - adcionar mais ações, melhorar os modelos de precificação de opção, criar um teste no estilo alpha lens para os sinais gerados por cada estratégia, gerar mais estratégias, melhorar o Grid Search do GARCH, usar um GARCH multivariado, , criar uma etapa de simulações de cenários e melhora a eficiência de cálculo ( paralelizar alguns processos ). Abaixo descrevo o que foi feito em cada etapa.
1) Leitura dos dados disponibilizados pela B3: A primeira etapa dele é a coleta de dados . Os dados são baixados diretamente do site da B3, onde para cada ano tem um arquivo com todas as operações cadastradas na bolsa de valores. No código compila_dados_arquivos_B3.R eu defino algumas empresas do índice bovespa que negociam opções para separar os dados de ações e opções negociados por dia. obs.:demora perto de 6 horas
2) Formatação dos dados para uso: Uma vez coletados os dados eu uso o arquivo 'carrega_acaoes_opcoes.R' e 'le div e split.R' para formatar e calcular o preço ajustado de uma ação. Embora separei diversas ações, no presente estado do trabalho apenas utilizo os preços da ação da PETR4 e suas opções. Pretendo adcionar as outras ações.
3) Grid search para o GARCH utilizado: Nessa etapa eu faço um grid search para encontrar os melhores modelos GARCH para os preços das ações. O script 'selecionando_garch_para_cada_acao.R' testa diversos modelos variando:
a ordem dos parametros arma(n,n) | n = {1,2,...,6} ; a ordem dos parametros GARCH(n,n) | n = {1,2,...,6} ; distribuição do modelo , student (std), student com viés (sstd), distribuição generalizada de erros (ged), distribuição generalizada de erros com viés (sged) ; inclusão de média )
nos arquivos 'dados_modelos_acoes_*_*.RData da pasta Finanças/Grid search Garch/ têm os resultados encontrados para 13 ações. Embora eu utilize o GARCH como um modelo de previsão rolling windows no trabalho, o grid search foi feito sob toda a amostra. Na pasta inclui um esboço para paralelização do Grid Search, pretendo implementar isso em algum momento. obs.:demora perto de 1 hora por ação
4) Preparação do Backtesting: As diferentes estratégias utilizam dados gerados pelo modelo GARCH e também depende de cálculos de preço para opções sem liquidez. Para tornar o projeto modular decidi separar essa etapa do backtesting em si. Isso foi feito por que essa etapa por si só é demorada ( 6 horas para rodar de 2004 a 2020 ) se fosse combinado os cálculos feitos no próprio backtesting ( demorado também ) esse tempo ia ser ainda maior. Tendo em vista isso, no código 'salva_os_dados_das_simulacoes_para_becktesting.R' gero as previsões do modelo GARCH para preço, volatilidade e probabilidade de exercício de uma opção, além dos preços para opções sem liquidez (ALL_CALLS , ALL_PUTS , Zigmas_forcasted_todos e retornos_simulados). Um desafio encontrado no projeto foi de ajustar os preços (e os strikes) das opções isso foi feito criando uma função que ajustava o preço das ações, opções e simulações para tudo ficar coerente. Como o foco principal do projeto não era a precisão dos modelos de precificação, não foquei muito nessa parte. Para os métodos de precificação eu não estimo a superfíce( e/ou o 'sorriso' ) de volatilidade da ímplicita, apenas utilizo a voltalidade prevista do modelo. Isso têm implicação direta na presição dos modelos. Pretendo melhorar isso. Na pasta 4) Preparação do Backtesting é possível visualizar os resultados econtrado para cada modelo utilizado. obs.:demora perto de 6 horas
5) Backtesting: Aqui faço o teste de para 100 estratégias em um periodo de 2006-2010. São 1000 dias de trade para cada estratégia, não fiz mais tempo pois esse cálculo demora em torno de 6 horas. Disponíbilizo o resultado de cada estratégia além de algumas medidas de risco. Também testei diferentes modelos para estimação do Value at Risk e Expected Shortfall não condicional. Aproveitei os resultados encontrados aqui para separar as estratégias para o backtesting em um tempo maior. Na 'backtesting/dados testes/' disponibilizo a informações dos testes. Nos arquivos 'historico_final_estrategia_*estrategia*.RData' é possível ver a posição dia a dia de cada estratégia , e nos arquivos logs_das_estrategias_final_estrategia_*estrategia*.RData é salvo todas as ordens e exercícios de opções de uma estratégia. obs.:demora perto de 6 horas
6) Backtesting com mais periodos: Nesse teste eu separo 23 estratégias de melhor performance no periodo de 2006-2010 e faço o backtesting para varias janelas diferentes entre 2008-2020. Porém é feito duas avaliações diferentes, uma onde só avalio a performance janela a janela de cada opção ( ex.: 2008-2012, 2010-2014 , etc ) e outra onde eu agrupo as janelas tirando a média dos log retornos (são 6 colunas de retorno, eu faço a soma dos retornos por dia e divido pelo número de observações no dia. obs.: se fosse retornos percentuais sem log ia dar problema). Sei que isso não é a mesma coisa que testar uma estratégia para todo o periodo, mas é como se uma estratégia tivesse um aporte a cada dois anos. O motivo de fazer isso é que eu queria testar as medidas de erro condicionais( ou dinámica ) ( Value at Risk e Expected Shortfall - sei que em algumas literaturas o expected Shortfall é chamado de Value at Risk condicional, porém sigo as nomeclaturas do livro Quantitive Risk Management - McNeil, Frey e Embrechts (2005)). Os VaR e ES são calculados por 8 modelos diferentes. Para todas as estratégias realizo testes estátiscos em cada modelo do VaR e ES para verificar se os resultados são corretos ,i.e., número experado de violações do VaR são corretos ,e/ou independentes ( para o ES testo se a média das violações do VaR são de fato o valor do ES ). Esses resultados são disponibilizados para todas as estratégias nas pastas ( backtesting varios anos/imagens/violacoes_var/ e ./backtesting varios anos/imagens/testes_ES/. obs.:demora perto de 6 horas
-
Eu procurei criar o projeto de maneira modular, pois tem algumas etapas que demoram muito para rodar ( 6 horas ou mais ) e isso facilitaria a vida de alguem que quer rodar apenas uma parte do código. Salvei nas pastas de cada etapa o arquivo de saída utilizada na próxima etapa, isso só não foi possível para 1) Leitura dos dados disponibilizados pela B3 pois o arquivo é maior que o permitido pelo github para upload. Ou seja, para 1) é necessário rodar os códigos de 1) e 2) em sequência.
-
Esse é meu primeiro projeto grande em programação ( varias dependencias e linhas de código ). Procurei colocar no github os códigos de maneira que seja possível baixar e rodar de uma vez . Porém essa não era a maneira como produzi código originalmente, logo é possível encontrar alguns errors. Caso encontre envie um 'Issue' ou um email (marcoaurelioguerrap@gmail.com).
"xts 0.11-2" , "tidyverse 1.2.1", "BatchGetSymbols 2.5.2", "rjson 0.2.20", "ggplot2 3.3.3", "fOptions 3042.86" , "rbcb 0.1.6", "bizdays 1.0.6", "qrmtools 0.0-10", "rugarch 1.4-1" , "combinat 0.0-8", "nvmix 0.0-3" "fBasics 3042.89.1" , "plyr 1.8.4" , "PerformanceAnalytics 2.0.4" , "knitr 1.23", "kableExtra 1.3.4", "gridExtra 2.3", "grid 3.6.1", "lattice 0.20-38", "ggalt 0.4.0", "ggrepel 0.9.1", "dplyr 0.8.3", "timeSeries 3042.102" , "MASS 7.3-51.4", "reshape2 1.4.3"