18/01/2023

Relatório Focus em Python

O Relatório Focus resume as estatísticas calculadas considerando as expectativas de mercado coletadas até a sexta-feira anterior à sua divulgação. Ele é divulgado toda segunda-feira. O relatório traz a evolução gráfica e o comportamento semanal das projeções para índices de preços, atividade econômica, câmbio, taxa Selic, entre outros indicadores. As projeções são do mercado, não do BC.



Expectativas de mercado

As famílias e as empresas tomam suas decisões com base na situação atual e no que acreditam que pode acontecer. Quanto será cobrado pelo aluguel em sua renovação? Nos próximos meses, o preço dos alimentos cairá ou não? A mensalidade da escola particular será reajustada? O custo dos financiamentos irá diminuir ou aumentar?

Para responder a essas dúvidas, é importante que a sociedade tenha conhecimento do que se espera na economia. Grandes agentes de mercado, como bancos, consultorias, corretoras e distribuidoras possuem em suas instituições áreas dedicadas à pesquisa macroeconômica, que dentre outras coisas elaboram projeções sobre o cenário que esperam para a economia. A essas projeções chamamos expectativas econômicas.

É a partir das expectativas que as famílias tomam decisões de gastar ou poupar, que as empresas resolvem investir ou não e que os mercados, de uma forma geral, definem seus preços.

O monitoramento sistemático das expectativas que o mercado tem sobre preços e atividade econômica é de grande relevância para as decisões de política monetária. Para tanto, o BC coleta diariamente projeções de cerca de 140 bancos, gestores de recursos e outras instituições (empresas do setor real, distribuidoras, corretoras, consultorias etc.) e publica semanalmente o Relatório Focus, um resumo das estatísticas calculadas com base nas informações prestadas nos 30 dias anteriores à data a que se refere.

Além de serem utilizadas pelo Banco Central para as decisões de política monetária, as expectativas econômicas da Pesquisa Focus são úteis para que empresas e cidadãos possam planejar suas ações de curto, médio e longo prazos.

Exemplo usando python-bcb

python-bcb é uma interface em Python estruturada para obter informações da API de dados abertos do Banco Central do Brasil. Com esta biblioteca vamos gerar os mesmos gráficos de expectativa de mercado apresentados no relatório. Nestes exemplos vamos trabalhar com os dados de SELIC e IPCA.

# Instalando e importando as bibliotecas necessárias

!pip install python-bcb

from bcb import Expectativas
from matplotlib import pyplot as plt

import seaborn as sns
import plotly.graph_objects as go
import plotly.express as px
import pandas as pd

# Iniciando a API Expectativas...
# Documentaçao em https://wilsonfreitas.github.io/python-bcb/expectativas.html#bcb.Expectativas

em = Expectativas()
em.describe()

# EntitySets:
#   ExpectativasMercadoTop5Anuais
#   ExpectativasMercadoInstituicoes
#   ExpectativaMercadoMensais
#   ExpectativasMercadoInflacao12Meses
#   ExpectativasMercadoSelic
#   ExpectativasMercadoTop5Selic
#   ExpectativasMercadoTop5Mensais
#   ExpectativasMercadoTrimestrais
#   ExpectativasMercadoAnuais

# Mostras as informações da ExpectativasMercadoAnuais

em.describe('ExpectativasMercadoAnuais')
# EntitySet (Endpoint): ExpectativasMercadoAnuais
# EntityType: br.gov.bcb.olinda.servico.Expectativas.ExpectativaMercadoAnual
# Properties: Indicador, IndicadorDetalhe, Data, DataReferencia, Media, Mediana, DesvioPadrao, Minimo, Maximo, numeroRespondentes, baseCalculo

# Obtem o endpoint
ep = em.get_endpoint('ExpectativasMercadoAnuais')


Focus - Relatório de Mercado - SELIC - Mediana

Criando um gráfico sobre a expectativa da taxa SELIC.

# Buscando os dados da SELIC para os anos de 2023, 2024, 2025, 2026

# A partir do endpoint, executa uma consulta com o método query()

selic_expec_2023 = ( ep.query()
 .filter(ep.Indicador == 'Selic', ep.DataReferencia == 2023)
 .filter(ep.Data >= '2022-01-01')
 .filter(ep.baseCalculo == '0')
 .select(ep.Indicador, ep.Data, ep.Media, ep.Mediana, ep.DataReferencia)
 .collect()
)

selic_expec_2024 = ( ep.query()
 .filter(ep.Indicador == 'Selic', ep.DataReferencia == 2024)
 .filter(ep.Data >= '2022-01-01')
 .filter(ep.baseCalculo == '0')
 .select(ep.Indicador, ep.Data, ep.Media, ep.Mediana, ep.DataReferencia)
 .collect()
)

selic_expec_2025 = ( ep.query()
 .filter(ep.Indicador == 'Selic', ep.DataReferencia == 2025)
 .filter(ep.Data >= '2022-01-01')
 .filter(ep.baseCalculo == '0')
 .select(ep.Indicador, ep.Data, ep.Media, ep.Mediana, ep.DataReferencia)
 .collect()
)

selic_expec_2026 = ( ep.query()
 .filter(ep.Indicador == 'Selic', ep.DataReferencia == 2026)
 .filter(ep.Data >= '2022-01-01')
 .filter(ep.baseCalculo == '0')
 .select(ep.Indicador, ep.Data, ep.Media, ep.Mediana, ep.DataReferencia)
 .collect()
)

# Formata a coluna de Data para formato datetime

selic_expec_2023['Data'] = pd.to_datetime(selic_expec_2023['Data'], format = '%Y-%m-%d')
selic_expec_2024['Data'] = pd.to_datetime(selic_expec_2024['Data'], format = '%Y-%m-%d')
selic_expec_2025['Data'] = pd.to_datetime(selic_expec_2025['Data'], format = '%Y-%m-%d')
selic_expec_2026['Data'] = pd.to_datetime(selic_expec_2026['Data'], format = '%Y-%m-%d')

# Plotando o gráfico da SELIC com a biblioteca Plotly.

fig = go.Figure()
fig = fig.add_trace(go.Scatter(x = selic_expec_2023['Data'],
                               y = selic_expec_2023['Mediana'], name="Selic 2023"))

fig = fig.add_trace(go.Scatter(x = selic_expec_2024['Data'],
                               y = selic_expec_2024['Mediana'], name="Selic 2024"))

fig = fig.add_trace(go.Scatter(x = selic_expec_2025['Data'],
                               y = selic_expec_2025['Mediana'], name="Selic 2025"))

fig = fig.add_trace(go.Scatter(x = selic_expec_2026['Data'],
                               y = selic_expec_2026['Mediana'], name="Selic 2026"))

fig.update_layout(title='Focus - Relatório de Mercado - SELIC', title_x=0.5)
fig.show()


Focus - Relatório de Mercado - IPCA - Mediana

Criando um gráfico sobre a expectativa do IPCA.

# Buscando os dados do IPCA para os anos de 2023, 2024, 2025, 2026

ipca_expec_2023 = ( ep.query()
 .filter(ep.Indicador == 'IPCA', ep.DataReferencia == 2023)
 .filter(ep.Data >= '2022-01-01')
 .filter(ep.baseCalculo == '0')
 .select(ep.Indicador, ep.Data, ep.Media, ep.Mediana, ep.DataReferencia)
 .collect()
)

ipca_expec_2024 = ( ep.query()
 .filter(ep.Indicador == 'IPCA', ep.DataReferencia == 2024)
 .filter(ep.Data >= '2022-01-01')
 .filter(ep.baseCalculo == '0')
 .select(ep.Indicador, ep.Data, ep.Media, ep.Mediana, ep.DataReferencia)
 .collect()
)

ipca_expec_2025 = ( ep.query()
 .filter(ep.Indicador == 'IPCA', ep.DataReferencia == 2025)
 .filter(ep.Data >= '2022-01-01')
 .filter(ep.baseCalculo == '0')
 .select(ep.Indicador, ep.Data, ep.Media, ep.Mediana, ep.DataReferencia)
 .collect()
)

ipca_expec_2026 = ( ep.query()
 .filter(ep.Indicador == 'IPCA', ep.DataReferencia == 2026)
 .filter(ep.Data >= '2022-01-01')
 .filter(ep.baseCalculo == '0')
 .select(ep.Indicador, ep.Data, ep.Media, ep.Mediana, ep.DataReferencia)
 .collect()
)

# Formata a coluna de Data para formato datetime

ipca_expec_2023['Data'] = pd.to_datetime(ipca_expec_2023['Data'], format = '%Y-%m-%d')
ipca_expec_2024['Data'] = pd.to_datetime(ipca_expec_2024['Data'], format = '%Y-%m-%d')
ipca_expec_2025['Data'] = pd.to_datetime(ipca_expec_2025['Data'], format = '%Y-%m-%d')
ipca_expec_2026['Data'] = pd.to_datetime(ipca_expec_2026['Data'], format = '%Y-%m-%d')

Plotando o gráfico do IPCA com a biblioteca Seaborn.

Configura o tema do gráfico

## Cores
colors = ['#282f6b', '#b22200', '#eace3f', '#224f20', '#b35c1e', '#419391', '#839c56','#3b89bc']

## Tamanho
theme = {'figure.figsize' : (12, 10)}

## Aplica o tema (https://seaborn.pydata.org/generated/seaborn.set_theme.html)
sns.set_theme(rc = theme, palette = colors)

# Lineplot
sns.lineplot(x = 'Data',
             y = 'Mediana',
             data = ipca_expec_2023, color="orange", label="IPCA 2023", linestyle="-").set(
             title = 'Expectativas de Mercado para a IPCA',
             xlabel = '', ylabel = '% a.a.')

# Lineplot
sns.lineplot(x = 'Data',
             y = 'Mediana',
             data = ipca_expec_2024, color="red", label="IPCA 2024", linestyle="-").set(
             title = 'Expectativas de Mercado para a IPCA',
             xlabel = '', ylabel = '% a.a.')

# Lineplot
sns.lineplot(x = 'Data',
             y = 'Mediana',
             data = ipca_expec_2025, color="green", label="IPCA 2025", linestyle="-").set(
             title = 'Expectativas de Mercado para a IPCA',
             xlabel = '', ylabel = '% a.a.')

# Lineplot
sns.lineplot(x = 'Data',
             y = 'Mediana',
             data = ipca_expec_2026, color="blue", label="IPCA 2026", linestyle="-").set(
             title = 'Expectativas de Mercado para a IPCA',
             xlabel = '', ylabel = '% a.a.')

# Adiciona a fonte no gráfico           
plt.annotate('Fonte: dados do BCB/SGS',
            xy = (1.0, -0.07),
            xycoords='axes fraction',
            ha='right',
            va="center",
            fontsize=10)



Plotando o mesmo gráfico do IPCA com a biblioteca Plotly.

fig = go.Figure()
fig = fig.add_trace(go.Scatter(x = ipca_expec_2023['Data'],
                               y = ipca_expec_2023['Mediana'], 
                               name="IPCA 2023"))

fig = fig.add_trace(go.Scatter(x = ipca_expec_2024['Data'],
                               y = ipca_expec_2024['Mediana'], 
                               name="IPCA 2024"))

fig = fig.add_trace(go.Scatter(x = ipca_expec_2025['Data'],
                               y = ipca_expec_2025['Mediana'], 
                               name="IPCA 2025"))

fig = fig.add_trace(go.Scatter(x = ipca_expec_2026['Data'],
                               y = ipca_expec_2026['Mediana'], 
                               name="IPCA 2026"))

fig.update_layout(title='Focus - Relatório de Mercado - IPCA', title_x=0.5)
fig.show()


Links relacionados

Código fonte

Problemas com o código?

Em caso de problema com o código, por favor, me avise no comentários.

Nenhum comentário:

Postar um comentário