Neste exercício vamos aplicar a teoria da cointegração para definir uma estratégia de operação na bolsa de valores. A ideia é simples: se duas séries tem dependência de longo prazo e, no curto prazo uma série temporal se descola da outra, espera-se que, após algum tempo, haverá uma reversão para a outra série temporal.
Para alcançar nosso objetivo, as seguintes atividades serão desenvolvidas:
Vamos trabalhar com as séries de ações de dois dos principais bancos privados brasileiros: Bradesco e Itaú. Antes de iniciar nossa estratégia de operação, vamos fazer uma análise exploratória dessas duas séries temporais;
Criar uma estratégia de curto prazo para operar as ações;
Long-Short através de Cointegração: um exemplo usando o pacote PairTrading.
Primeiramente, vamos consultar o valor das ações desses dois bancos e observa-las graficamente.
# install.packages("quantmod")
require(quantmod)
## Banco Bradesco S.A.
getSymbols('BBDC4.SA',src='yahoo')
## [1] "BBDC4.SA"
chartSeries(BBDC4.SA)
## Itaúsa - Investimentos Itaú S.A.
getSymbols('ITUB4.SA',src='yahoo')
## [1] "ITUB4.SA"
chartSeries(ITUB4.SA)
Que tal agora observarmos algum período da série?
## últimos 4 meses
chartSeries(BBDC4.SA,subset = 'last 4 months')
chartSeries(ITUB4.SA,subset = 'last 4 months')
## podemos também observar os gráficos das duas ST ao mesmo tempo
head(as.xts(merge(BBDC4.SA,ITUB4.SA)))
## BBDC4.SA.Open BBDC4.SA.High BBDC4.SA.Low BBDC4.SA.Close
## 2007-01-02 NA NA NA NA
## 2007-01-03 NA NA NA NA
## 2007-01-04 NA NA NA NA
## 2007-01-05 NA NA NA NA
## 2007-01-08 NA NA NA NA
## 2007-01-09 NA NA NA NA
## BBDC4.SA.Volume BBDC4.SA.Adjusted ITUB4.SA.Open ITUB4.SA.High
## 2007-01-02 NA NA 19.1740 19.5863
## 2007-01-03 NA NA 19.3454 19.6708
## 2007-01-04 NA NA 19.4473 19.5988
## 2007-01-05 NA NA 19.3603 19.5069
## 2007-01-08 NA NA 18.7990 19.0300
## 2007-01-09 NA NA 18.9505 19.1418
## ITUB4.SA.Low ITUB4.SA.Close ITUB4.SA.Volume ITUB4.SA.Adjusted
## 2007-01-02 19.1269 19.4423 5921845 16.24736
## 2007-01-03 19.2063 19.5590 7301247 16.34487
## 2007-01-04 19.2858 19.3727 6424324 16.18920
## 2007-01-05 18.6276 18.6276 8512351 15.56653
## 2007-01-08 18.6997 19.0300 8683065 15.90281
## 2007-01-09 18.0266 18.6227 10453820 15.56243
chartSeries(c(BBDC4.SA, ITUB4.SA))
Outra ferramenta interessante do quantmod são das bandas de Bollinger (https://en.wikipedia.org/wiki/Bollinger_Bands).
O conceito é simples, mas lógico. Procura usar uma ideia clássica e sólida. A ideia de que os preços não se afastam por muito tempo de uma média de valores, procurando retornar a essa média de tempos em tempos. Logo, a banda é construída projetando uma quantidade de desvios padrões acima e abaixo desta média.
Com isso, conseguimos observar situações de sobrevenda e de sobrecompra, conseguimos estabelecer suportes e resistencias, conseguimos estabelecer tendência de alta ou de baixa e ainda observar a expansão ou retração da volatilidade do ativo (http://lseducacao.com.br/como-operar-bandas-de-bollinger/).
Bollinger Bands consist of:
a. an N-period moving average (MA)
b. an upper band at K times an N-period standard deviation above the moving average (MA + Kσ)
c. a lower band at K times an N-period standard deviation below the moving average (MA − Kσ)
Typical values for N and K are 20 and 2, respectively.
Conforme observado, o default é 20,2, mas o quantmod me permite escolher as bandas. Foi isso que eu fiz para as ações do Bradesco.
chartSeries(BBDC4.SA, subset = 'last 12 months', theme="white",TA="addVo();addBBands(30,2);addCCI()")
chartSeries(ITUB4.SA, subset = 'last 12 months', theme="white",TA="addVo();addBBands();addCCI()")
Estratégias de arbitragem estatística são baseadas em encontrar uma série temporal que possua a característica de estacionariedade ou reversão à média. Isto significa que é possível identificar situações em que a série divergiu de seu comportamento histórico e prever com alguma segurança que a série convergirá ou reverterá para um comportamento “médio”. O conceito de cointegração formaliza matematicamente este comportamento e permite a realização de testes estatísticos para detectar séries com este comportamento.
No contexto de operações com pares de ativos (pairs trading), a existência de uma relação de cointegração entre as séries de preços de dois ativos significa que pode ser possível realizar operações lucrativas de arbitragem. Por outro lado, se o par não for cointegrado, será impossível encontrar uma relação consistente para operar o par.
É necessário termos um teste para identificar quais pares de ações são cointegrados. Mesmo dentro do universos dos pares que são cointegrados, não há garantia de sucesso. É preciso que o par possua algumas características específicas para que uma estratégia de arbitragem seja consistentemente lucrativa:
a. Relação de cointegração estável ao longo do tempo
b. Reversão frequente do spread à média
c. Variabilidade razoavelmente grande nas divergências
Para operar com pares de ações, os seguintes passos devem ser seguidos:
a - selecionar duas ações que movem similarmente;
b - ideia básica: vamos vender as ações com preço elevado e comprar as ações com preço baixo;
c - Monitorar as diferenças entre as duas ações (isso no curto prazo);
d - No longo prazo eu posso usar a teoria da cointegração para fazer esse monitoramento;
e - Regra de Decisão:
\[ spread = log(Y_t) - (alpha + beta*log(X_t))\], onde \(Y_t\) e \(X_t\) são ações.
| Se \(spread\) > muito alto: compra-se \(X_t\) e vende-se \(Y_t\) |
| Se \(spread\) < muito baixo: compra-se \(Y_t\) e vende-se \(X_t\) |
a - Selecionar duas ações que movem similarmente
BBDC4.SA_2013 <- BBDC4.SA['2013::']
ITUB4.SA_2013 <- ITUB4.SA['2013::']
pairs <- cbind(BBDC4.SA_2013$BBDC4.SA.High,ITUB4.SA_2013$ITUB4.SA.High)
ts.plot(pairs)
b - Estimar o spread
O pacote PairTrading não está mais disponível na versão mais nova do R, dessa forma, para trabalharmos com o pacote iremos utilizar o pacote que está disponível no Github. Utilizando este pacote vamos estimar o spread entra as ações do Itaú e do Bradesco. A primeira coisa que precisamos fazer é estimar a regressão abaixo:
\[ log(Y_t) = alpha + beta*log(X_t) + u_t\]
# install.packages("devtools")
# require(devtools)
# install_github("cran/PairTrading")
require(PairTrading)
## Estimando o spread
reg <- EstimateParameters(pairs, method = lm)
c - Estimar os parâmetros para o back-test
Para rodar o back-test nós precisamos estimar os parâmetros historicamente usando a função “EstimateParametersHistorically”. Esse função faz algo como uma “rolling regression” para estimar os parâmetros. Por isso ela é diferente da função “EstimateParameter”.
#estimate parameters for back test
params <- EstimateParametersHistorically(pairs, period = 180)
d - Criar o sinal para a operação
Agora, nós vamos criar o sinal para a operação usando o “spread”. A função “Simple” nos dá uma estratégia de operação bem simples: se o spread é maior (menor) que um valor específico, nós iremos comprar (vender).
Neste nosso caso, nós fixamos nosso “valor específico” em \(0.05\), então, baseado na nossa regressão:
\[ log(ITAU_t) = alpha + beta*log(BRAD_t) + u_t\]
onde o spread é igual ao erro (\(u_t = spread\))
\[ spread_t = log(ITAU_t) - (alpha + beta*log(BRAD_t))\]
Então, iremos comprar Bradesco, se o spread for maior que \(0.05\) e comprar Itaú, se o spread for menor que \(-0.05\). O gráfico abaixo mostra os pontos em que devemos comprar uma ou outra ação.
manchas azuis na margem inferior (spread maior que \(0.05\)) -> compro Itaú manchas azuis na margem superior (spread menor que \(-0.05\)) -> compro Bradesco
#create & plot trading signals
signal <- Simple(params$spread, 0.05)
barplot(signal,col="blue",space = 0, border = "blue",xaxt="n",yaxt="n",xlab="",ylab="")
par(new=TRUE)
plot(params$spread)
e - Back-test performance
A questão é a seguinte: fiquei rico?!!
#Performance of pair trading
return.pairtrading <- Return(pairs, lag(signal), lag(params$hedge.ratio))
plot(100 * cumprod(1 + return.pairtrading))
Introduction to R for Data Science: este é um curso introdutório e irá ajuda-lo a entender conceitos básicos de programação em R;
Vídeos sobre o R (FGV/IBRE | NMEC): vídeos em português produzidos pelo nosso time da FGV que facilitarão o entendimento de conceitos básicos de programação em R;
Khan Academy: ideal para aprender conceitos básicos de matemática e estatística;
BETS (Brazilian Economic Time Series package) – este é o pacote R que estamos desenvolvendo, fiquem à vontade para instala-lo. Iremos utiliza-lo no nosso curso;
# Instalação do pacote pelo CRAN
install.package("BETS")
# Para obter sempre a versão em desenvolvimento e acompanhar o precessod de criação:
install.packages("devtools")
require(devtools)
install_github("pedrocostaferreira/BETS")
require(BETS)
Doutor em Engenharia Elétrica - (Decision Support Methods) e Mestre em Economia. Co-autor dos livros “Planejamento da Operação de Sistemas Hidrotérmicos no Brasil” e “Análise de Séries Temporais em R: curso introdutório”. É o primeiro e único pesquisador da América Latina a ser recomendado pela empresa RStudio Inc.
Atuou em projetos de Pesquisa e Desenvolvimento (P&D) no setor elétrico nas empresas Light S.A. (e.g. estudo de contingências judiciais), Cemig S.A, Duke Energy S.A, entre outras. Atuou como consultor em Big Data e Data Science nas empresas, Coca-Cola Brasil, Light SA, Duratex, ONS, entre outras. Ministrou cursos de estatística e séries temporais na PUC-Rio e IBMEC e em empresas como o Operador Nacional do Setor Elétrico (ONS), Petrobras e CPFL S.A.
Atualmente é professor de Econometria de Séries Temporais e Estatística, cientista chefe do Núcleo de Métodos Estatísticos e Computacionais (FGV|IBRE), coordenador do curso Big Data e Data Science (FGV|IDE) e sócio-diretor da empresa Model Thinking Br (MTBr). É também revisor de importantes journals, como Energy Policy e Journal of Applied Statistics. Principais estudos são em modelos Econométricos, Incerteza Econômica, Preços, R software e Business Analytics [e.g detecção de fraudes; HR analytics].
contatos:
email: pedro.guilherme@fgv.br
website: pedrocostaferreira.github.io
GitHub: github.com/pedrocostaferreira
Linkedin: linkedin.com/pedro-costa-ferreira