No artigo de hoje, vamos abordar um tema que é muito falado e poucas vezes compreendido pelas pessoas: sazonalidade. Antes de tudo, porém, vamos entender o que sazonalidade significa e como ela pode ser aplicada no mercado financeiro.
O que é sazonalidade?
A palavra sazonal deriva-se do latim satio, que por sua vez vem do verbo serere, que significa semear. Não à toa o conceito de sazonalidade está muito atrelado à agricultura. Em outras palavras, sazonalidade é uma caracterista que se repete sempre em uma determinada época do ano.
Por exemplo, durante períodos festivos como Natal, dia das crianças ou até mesmo Black Friday, um aumento nas vendas de varejo é esperada. E esse fato se repete todos os anos.
Efeitos práticos da sazonalidade
No exemplo anterior, vimos um caso específico onde a sazonalidade possui um efeito positivo, ou seja, onde esperamos lucrar com o aumento das vendas no varejo. Contudo, esse nem sempre é o caso. Um clássico exemplo onde a sazonalidade pode interferir negativamente é no caso de uma empresa de sorvetes. Durante o inverno, devido ao clima frio, provavelmente essa venda vai ser baixa. Nesse caso, a sazonalidade implica em uma redução da receita da empresa.
Sazonalidade aplicada ao mercado financeiro
Alguns papéis da bolsa podem possuir "sazonalidade", ou seja, eles podem tender a performar melhor ou pior em determiados períodos do ano. Além dos papéis de varejo, que podem possuir uma sazonalidade durante períodos festivos, outro exemplo são as petroleiras, que são conhecidas por performarem bem no período de inverno do hemisfério norte.
No artigo de hoje, vamos colocar essa sazonalidade à prova e analisar se empresas de varejo performam melhor no último trimestre do ano. Para isso, escolhemos as lojas Renner (LREN3) e o Mercado Livre (MELI) como proxies representando o varejo físico e eletrônico respectivamente.
Definindo nossa hipótese
Existem diversas maneiras de se realizar esse estudo. Um ponto-chave é escolha do período de tempo que vamos utilizar para comparar os resultados. Aqui, vamos tentar provar a hipótese de um melhor último trimestre nas empresas de varejo comparando-o com a variação dos preços das ações no trimestre anterior.
Em outras palavras: vamos comparar as variações de preço dos ativos no 3º e 4º trimestres e observar se há alguma diferença significativa.
Para fortalecer ainda mais o nosso estudo, vamos comparar o retorno obtido pelas Lojas Renner no último trimestre com o índice Bovespa. Isso é importante uma vez que queremos capturar uma possível discrepância do varejo. Ou seja, se LREN3 tiver subido 5% e o IBOV tiver subido 15%, mesmo o ativo de varejo tendo um desempenho positivo, relativamente a performance foi pior.
Durante esse artigo, vamos tentar automatizar o código ao máximo possível. Dessa forma, se você quiser aplicar esse estudo para diferentes ativos em diferentes períodos de tempo, pequenas modificações serão necessárias.
E aí? Será que vamos encontrar alguma sazonalidade interessante no nosso estudo de hoje? Vamos conferir!
Importando as bibliotecas necessárias
Antes de começarmos, vamos importar todas as bibliotecas que iremos usar nese artigo.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Estudo de caso: sazonalidade de Lojas Renner
Vamos iniciar nossa análise no varejo importando os dados dos últimos 15 anos de Lojas Renner (LREN3). O arquivo .csv estará disponível no nosso grupo do Telegram.
Para auxiliar nossa análise, vamos criar duas colunas no nosso dataframe. A primeira, chamada month, vai nos retornar o mês e ano de cada linha. Com essa informação, conseguimos identificar se estamos no último dia de cada mês comparando os valores com a linha posterior.
Podemos agora reduzir o nosso dataframe selecionando apenas as colunas que tem o valor diferente de zero, ou seja, só estamos interessados no último dia de cada mês.
Repare que podemos facilmente adicionar uma nova condição e filtrar apenas as variações em períodos de interesse. Por exemplo:
# example with 2 months for analysis
months = ["2007-09", "2007-10"]
pct_per_month = asset_filtered[asset_filtered["month"].isin(months)]
pct_per_month
close
month
last of month
value
variation
datetime
2007-09-28 00:00:00
5.18
2007-09
True
5.18
0.079167
2007-10-31 00:00:00
6.06
2007-10
True
6.06
0.169884
E por fim, podemos calcular a média desses resultados:
pct_per_month["variation"].mean()
0.12452541827541819
Para facilitar a nossa vida, já que vamos repetir a análise para diferentes ativos, vamos colocar todos os passos anteriores em uma função.
Definindo a nossa função
A função que retorna a média da variação mensal no período que escolhermos está programada abaixo.
def mean_return_per_months(df, months):
# creating a month column
df["month"] = pd.to_datetime(df.index).strftime('%Y-%m')
# defining the last day of the month
df["last of month"] = df["month"] != df["month"].shift(-1)
# if last day of the month, get the close price, else 0
df["value"] = np.where(
(df["last of month"] == True),
df["close"],
0
)
# get the non-zero values
df_filtered = df[df["value"] != 0].copy()
# calculate the difference in percentage between the last day of the months
df_filtered["variation"] = df_filtered["value"].pct_change()
# filter the df to get only the list of months we are interrested on
pct_per_month = df_filtered[df_filtered["month"].isin(months)]
# return the mean of the results
return pct_per_month["variation"].mean()
Lojas Renner (LREN3)
Com os dados das Lojas Renner já carregados em nosso DataFrame e a função de cálculo da média de variação criada, podemos facilmente calcular os resultados.
Para isso, vamos criar uma lista: mean_of_semesters, onde vamos armazenar a média do terceiro e quarto trimestre desse ativo. Lembre-se, estamos interessados no último trimestre do ano, pois nele temos o Black Friday e o Natal. Como métrica, escolhemos para esse artigo comparar o último trimestre com o trimestre anterior.
Já que os nossos dados vão de 2006 até 2020, podemos criar um loop para alimentarmos a lista com as médias do período escolhido. Para cada ano, adicionamos a média do trimestre que estamos interessados na lista mean_of_semesters. Por fim, criamos um DataFrame a partir dessa lista.
Importante notar que é computacionalmente mais eficiente criar uma lista, adicionar itens à ela dentro do loop e após o processo transformar a lista num DataFrame, do que criar um DataFrame vazio ou com NaN e ir adicionando linhas a cada iteração.
Algumas observações podem ser tiradas dessa análise.
Primeiramente, vimos que nos últimos 3 anos, a variação no quarto trimestre foi sempre positiva e maior do que a variação média do terceiro trimestre.
Outro ponto importante é que, quando houve um terceiro trimestre ruim com variação média negativa, o quarto trimestre fechou melhor (ou menos pior).
Contudo, podemos observar que historicamente existe um equilíbrio entre os trimestres. Enquanto que o quarto trimestre fechou 5 vezes acima do terceiro, em 6 oportunidades o oposto aconteceu.
Comparando com o IBOV
Para fortalecermos a nossa análise, vamos comparar os resultados de LREN3 com o nosso índice, IBOV, para o último trimestre do ano.
Para isso, vamos primeiramente baixar os dados pertinentes do IBOV (novamente, disponível no nosso grupo do Telegram.)
Uma vez que já temos nossa função programada, só precisamos repetir o último passo da análise anterior e criarmos o loop para o período escolhido. Vamos também usar o comando pd.merge para juntarmos o DataFrame do IBOV com o DataFrame contendo os resultados de LREN3. Escolhemos a opção on='year' para juntarmos os resultados pelo ano.
Novamente podemos plotar facilmente os resultados:
diff = df.copy().set_index('year')['diff_4th_quarter_LREN_IBOV']
diff.plot(
kind="bar",
color=(diff > 0).map({True: '#49ce8b',False: '#d64242'}),
title='Diferença de Retorno LREN3 vs IBOV (4º Tri)',
);
Nos últimos 6 anos, apenas em 2018 as Lojas Renner tiveram uma variação significativamente maior que o IBOV. Na nossa amostragem de 15 anos, LREN3 obteve uma variação média maior que o IBOV no último trimestre em 6 oportunidades.
No entanto, as maiores diferenças estão quando LREN3 bate o IBOV, chegando a quase 8% de diferença em 2018.
Estudo de caso: sazonalidade de Mercado Livre
Vamos finalizar a nossa análise analisando um ativo de varejo eletrônico, MELI. Os dados são os preços listados na NASDAQ, não a BDR, e também estarão disponíveis no nosso grupo do Telegram.
Aqui também vemos um equilíbro, sendo que em 8 vezes a média do último trimestre foi maior que a do terceiro.
Contudo, a média de retorno do quarto trimestre foi positiva e maior que a do terceiro trimestre em 5 dos último 7 anos. Destaque para o ano passado, onde o retorno médio do último trimestre foi o segundo maior da série analisada.
Conclusão
Para esse nosso primeiro estudo de sazonalidade, analisamos o mercado de varejo onde escolhemos Lojas Renner (LREN3) e Mercado Livre (MELI) como os nossos ativos.
Para LREN3, observamos uma pequena vantagem do último trimestre em cima do terceiro, mais especificamente nos últimos 3 anos.
Contudo, vimos também que a média de retorno do índice Bovespa no último trimestre do ano foi positiva nos últimos 5 anos, e melhor que o retorno dos ativos LREN3 em 4 dos últimos 6 anos, perdendo em 2018 e 2019.
Já MELI mostrou uma média de retorno positiva no quarto trimestre e maior que o trimestre anterior em 5 dos últimos 7 anos, sinalizando um possível período positivo para esse papel no último trimestre.
Será que algum outro ativo de varejo performaria melhor que esses dois analisados hoje nesse período? Você consegue pensar em algum outro período melhor para comparar os resultados? Fique à vontade para brincar com o código, escolhendo seu ativo e período de preferência para fazer sua própria análise!
Para um próximo artigo, vamos analisar a hipótese de um aumento nas ações de petróleo durante o inverno do hemisfério norte. Por isso, não se esqueça de entrar no nosso grupo do Telegram e se inscrever na nossa newsletter abaixo para receber notificações sobre artigos novos!