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