Pair trading Itau vs Bradesco

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:

  1. 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;

  2. Criar uma estratégia de curto prazo para operar as ações;

  3. Long-Short através de Cointegração: um exemplo usando o pacote PairTrading.


Análise exploratória: Bradesco e Itaú

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))

Modelo básico de curto prazo para operar ações: bandas de Bollinger

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()") 


Long-Short através de Cointegração: um exemplo usando o pacote PairTrading

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

Quais são os passos para operar com pares de ações?

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))

Materiais de Apoio

  1. 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;

  2. 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;

  3. Khan Academy: ideal para aprender conceitos básicos de matemática e estatística;

  4. 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)
  1. Forecasting using R: este é um excelente curso do Rob Hyndman que poderá lhe ajudar a compreender um pouco mais o mundo de séries temporais.

Prof. Dr. Pedro Costa Ferreira


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