World Markets Map – Oscilação das Bolsas Mundiais (Python)

Passo a passo para a criação um mapa mundi interativo em Python, mostrando a variação das principais bolsas mundiais em tempo real, com dados do Yahoo Finance

Olá!

Gostaria de compartilhar este pequeno projeto em Python, o qual tem o objetivo de criar um mapa mundi colorido e interativo, mostrando a variação das principais bolsas mundiais em tempo real:

performance das bolsas mundiais

1. Bibliotecas utilizadas neste projeto

  • Pandas: armazenamento e manipulação dos dados
  • Datetime: data de consulta
  • Pandas Datareader: obter histórico dos ativos do Yahoo Finance
  • Plotly: gerar a visualização gráfica
import pandas as pd

import datetime
from datetime import timedelta

from pandas_datareader import DataReader as data_reader

!pip install plotly
import plotly.express as px


2. Carregar a lista de países/índices

Criei um arquivo CSV, no qual adicionei os principais países e seus respectivos índices de bolsa. Tentei adicionar o índice oficial de cada país, sempre que possível. Porém em alguns casos percebi que o Yahoo Finance não mantém histórico de diversos instrumentos, sendo um caso notável o índice do Reino Unido FTSE (^FTSE). Para estas situações fiz a substituição por outro índice semelhante, ou ainda algum ETF negociado em NYC, como os da série iShares da BlackRock.

Um ponto que vale um bom debate é se seria mais interessante que todos os ativos da lista sejam ETFs negociados na bolsa de NY. Assim estaríamos “padronizando” a conversão de todos em USD e também evitando problemas com relação ao fuso horário e feriados, pois assim e todos os ativos estariam sendo negociados no mesmo horário e dias.

Você pode customizar esta lista conforme a sua necessidade, substituindo os tickers e também adicionando novos países. Para isso basta adicionar corretamente o código ISO de cada país, e o ticker (Symbol) do ativo desejado, do Yahoo Finance:

Lista de ISOs: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes

Lista de ativos mundiais: https://finance.yahoo.com/world-indices

# carregando o csv em um dataframe e visualizando as primeiras linhas, para entender a estrutura da tabela

df = pd.read_csv('lista_paises.csv')
df.head()
mercados mundiais



3. Obter a cotação dos ativos

A função DataReader do pandas_datareader retorna o histórico de cotação do ativo através da fonte de dados escolhida (no caso o Yahoo Finance). Para obter o retorno (variação), é necessário efetuar o cálculo após a obtenção destes dados.

Neste código buscamos o histórico dos 10 últimos dias (timedelta 10), para garantir que pelo menos 2 cotações retornem e seja reaizado o cálculo da variação. Isto é devido a datas que caem em fim de semana ou longos períodos de feriados em que a bolsa pode ficar fechada.

Com um loop for fazemos o download de cada item da lista de países, e calculamos o retorno através da função pct_change() do pandas. Pegamos o registro mais atual desta coluna e adicionamos no dataframe principal, criando uma nova coluna chamada Variação %:

for i, row in df.iterrows():
    
    print('processando',row['Country'],':',row['Symbol'])
    
    # dataframe temporario, para salvar o histórico de cotação do ativo e realizar o cálculo do retorno
    df_temp = data_reader(row['Symbol'], data_source='yahoo', start=str(datetime.date.today() - timedelta(10)))

    # calcular o retorno em numa nova coluna
    df_temp['Variação %'] = df_temp['Adj Close'].pct_change() * 100
    
    # salvar o valor de retorno mais atual no dataframe principal (df) na nova coluna criada (Variação %),
    # na linha respectiva do país (i)
    df.at[i,'Variação %'] = round(df_temp.iloc[-1]['Variação %'],2)  
    #df.at[i,'Variação %'] = df_temp.iloc[-1]['Variação %']
    
    # Avisar se houve algum erro na obtenção dos dados. Se sim, não será exibido no mapa
    if pd.isna(df.at[i,'Variação %']):
        print('---->   erro em',row['Symbol'],':', df.at[i,'Variação %'],'(Não será exibido no mapa)')
        


Dataframe atualizado com a nova coluna com os valores de variação de cada país:

variação dos mercados internacionais

4.Criar o Mapa Mundi (Plotly Cloropleth Map)

Um mapa coroplético representa uma superfície estatística por meio de áreas simbolizadas com cores, sombreamentos ou padrões de acordo com uma escala que representa a proporcionalidade da variável estatística em causa, como por exemplo a densidade populacional ou o rendimento per capita. Os símbolos criados a partir desta primitiva coincidem com as regiões onde foram coletados os dados, o que dá a impressão de que há uniformidade de dados dentro de cada uma das regiões e que as quebras ocorrem sempre nos limites destas áreas. (Wikipedia)

A biblioteca Plotly nos fornece uma forma muito prática de criar um Cloropleth Map, bastando informar a região (ISO-code) e o respectivo valor (Retorno), para que ele faça o preenchimento dos dados. Além disso, é possível customizar o elemento de diversas formas, conforme mostra o código abaixo:

# definindo a fonte dos dados e coloração da escala
fig = px.choropleth(df, 
                    locations="ISO-code",    # identificação das regiões (países)
                    color="Variação %",      # coluna do df para popular os valores 
                    hover_name="Country",
                    range_color=[-5,5],      # limite de cores da escala. valores além deste numero terão a mesma cor do limite
                    color_continuous_scale = ["maroon","red","lightcoral","white","lightgreen","green","darkgreen"], 
                    color_continuous_midpoint=0)


# configurações de layout, título e fontes
fig.update_layout(
    width=1000,
    height=620,
    geo=dict(
        showframe=True,
        showcoastlines=True,
        landcolor = 'white',
        showocean=True, 
        oceancolor="azure",
        showlakes=True, 
        lakecolor="azure",
        projection_type='equirectangular'
    ),
    title={
        'text': 'Performance das Bolsas Mundiais',
        'y':0.9,
        'x':0.5,
        'xanchor': 'center',
        'yanchor': 'top',
    },
    title_font_color='#525252',
    title_font_size=22,
        showlegend=False,
    font=dict(
        family='Sans-serif', 
        size=15, 
        color='#525252'
    ),
    annotations = [dict(
        x=0.5,
        y=0.25,
        xref='paper',
        yref='paper',
        text='<a href="https://scannerdabolsa.com.br/?utm_source=plots">@scannerdabolsa</a>',
        showarrow = False
    )]
)

# para mais customizações veja documentação: https://plotly.github.io/plotly.py-docs/generated/plotly.express.choropleth.html


fig.show()


E o resultado final:

performance das bolsas mundiais

GitHub


Acesse este projeto no nosso GitHub para baixar o código completo junto com o arquivo CSV da lista de países, e se quiser fique à vontade para contribuir com este projeto!


Espero que tenha gostado deste artigo e que possa te ajudar a criar o seu próprio mapa! Se tiver alguma dúvida, sugestão ou crítica, deixe um comentário ou entre em contato pelo nosso formulário.

Um abraço!

Eduardo Teixeira
Scanner da Bolsa

Deixe uma resposta

Seu email não será publicado.