Hoje vamos dar inicio à uma estratégia muito interessante que é muito utilizada no exterior mas que vem crescendo cada vez mais em popularidade no Brasil: Long & Short (L&S) pelo método da cointegração. Mas antes de começarmos, é importante esclarecer o que significa cada uma dessas palavras.

O que é Long & Short?

Quando você está comprado em um determinado ativo A na sua carteira que você acredita que vai se valorizar com o tempo, você está long (comprado) nesse ativo.

O oposto disso é estar short (vendido). Nesse caso, você ganha dinheiro quando um determinado ativo B se desvaloriza.

Essas duas operações podem ser performadas separadamente: você pode só estar comprado no ativo A ou apenas vendido no ativo B. Contudo, existe também a possibilidade de se aproveitar as relações entre dois ativos e, com o dinheiro recebido por vender o ativo B, comprar o ativo A. Nesse caso, a operação recebe o nome de Long & Short.

Séries Estacionárias e Não-Estacionárias

Tradicionalmente, as operações de L&S se baseiam no método da correlação. Esse método busca algum tipo de dependência linear entra duas variáveis independentes. Por exemplo, se dois ativos estão correlacionados, uma variação em um ativo A corresponde a uma variação na mesma direção do ativo B (caso a correlação seja positiva), ou em sentidos opostos (caso a correlação seja negativa).

No entanto, a correlação não leva em consideração a variação dos dados (também chamadas de séries) com o tempo. Para que uma estratégia de Long & Short possa ser aplicada, é preciso determinar se a série é estacionária no tempo.

Uma série estacionária é toda série cujas propriedades estatísticas como média, variância ou covariância não variam com o tempo. Logo, o oposto disso é chamado de série não-estacionária, ou seja, séries que possuem média, variância e covariância dependentes do tempo.

Para entender melhor o conceito de estacionariedade, vamos considerar o simples exemplo abaixo, onde pegamos do Google Trends o número de vezes que a palavra cupcake foi pesquisada no Google durante os anos de 2004 e 2007.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('../data/cup-cake.csv', header=0,index_col=0)
mean = data['Cupcake:(Worldwide)'].mean()
data.plot(figsize=(10,6))

plt.axhline(y=mean, color="red", linestyle='-')
plt.show()

Para facilitar a interpretação, adicionamos a média (em vermelho). Nesse exemplo, vemos que a série não oscila em torno da média e que ela parecer ter uma tendência de crescimento linear com o tempo. À medida que formos adicionando valores a essa série, a sua média (e, consequentemente seu desvio padrão, variâcia, etc) vai mudando de valor. Essa série então é definida como uma série não-estacionária.

Uma forma de remover a tendência do gráfico é através do método da diferenciação. Esse método consiste em simplemente subtrair do valor atual o valor anterior.

data_diff = data.diff()
mean_diff = data_diff['Cupcake:(Worldwide)'].mean()

data_diff.plot(figsize=(10, 6))

plt.axhline(y=mean_diff, color='red', linestyle='-')
plt.show()

Comparando as duas séries, podemos perceber que os valores oscilam em torno de zero independentemente do tempo.

À medida que mais valores forem adicionados à série, a média e outras propriedades estatísticas continuarão constantes. Com isso, conseguimos transformar a nossa série em uma série estacionária.

Obviamente, nem sempre as tendências existentes em séries não-estacionárias serão facilmente removidas como no exemplo acima (muitas vezes não sendo nem possível). Portanto, o processo de identificação e limpeza dos dados constitui uma grande (e importante) parte da análise.

Estacionariedade de preços

Agora que já entendemos a definição de uma série estacionária, é simples perceber que os preços dos ativos são fortemente dependentes do tempo e, portanto, são não-estacionárias. Por conta disso, um erro clássico em estratégias de L&S é assumir que um par de ativos irá regredir à média. Ora, mas isso só poderia ser assumido se a série fosse estacionária, o que nós já entendemos que não é!

Você pode estar então se perguntando: "se os ativos sempre variam com o tempo, como podemos tirar essa dependência para aplicarmos modelos estatisticamente consistentes?" Ótima pergunta! É aí que entra o conceito de cointegração.

A cointegração consistem em analisar o resíduo de uma regressão linear entre os ativos e procurar por estacionariedade nele. "Mas o que é resíduo? Como eu faço essa regressão linear? Como eu vou saber se uma série é estacionária ou não?"

Calma, que vamos explicar todos esses conceitos iniciais de uma maneira simples com o exemplo prático a seguir.

Calculando a cointegração entre dois ativos

Vamos começar importando as bibliotecas que estão faltando para usar no nosso exemplo. Adicionamos uma biblioteca para o cálculo da regressão linear (sklearn) e uma biblioteca de análise estatística chamada adfuller (vamos explicá-la em instantes).

%%capture

from sklearn.linear_model import LinearRegression
from statsmodels.tsa.stattools import adfuller
 
!pip install yfinance
import yfinance as yf

Como nessa estratégia nós buscamos a relação entre dois ativos, vamos escolher as ações ordinárias e preferencial da Petrobras, PETR3 e PETR4. Contudo, essa estratégia por ser testada com qualquer par.

start_date = "2018-02-27"
end_date = "2019-03-02"
stock1 = "PETR3.SA"
stock2 = "PETR4.SA"

df = yf.download([stock1, stock2], start = start_date, end = end_date)["Adj Close"]
df.columns=['PETR3','PETR4']
df
[*********************100%***********************] 2 of 2 completed
PETR3 PETR4
Date
2018-02-27 20.966679 19.296848
2018-02-28 20.993887 19.260950
2018-03-01 20.649277 18.875013
2018-03-02 21.021090 19.305826
2018-03-05 21.619623 19.853317
... ... ...
2019-02-25 27.929766 24.999256
2019-02-26 27.938923 24.886902
2019-02-27 28.085442 25.355051
2019-02-28 27.343700 25.336321
2019-03-01 26.739319 24.999256

250 rows × 2 columns

Vamos agora plotar os pares junto com as médias para visualmente analisarmos se existe alguma relação entre eles e se os dados em si são estacionários no tempo.

mean_PETR3 = df['PETR3'].mean()
mean_PETR4 = df['PETR4'].mean()


df[['PETR3', 'PETR4']].plot(linewidth=1)
plt.axhline(y=mean_PETR3, color='#49ce8b', linestyle='--', linewidth=0.5)
plt.axhline(y=mean_PETR4, color='#033660', linestyle='--', linewidth=0.5)

plt.title("PETR3 & PETR4")
Text(0.5, 1.0, 'PETR3 & PETR4')