top of page
  • Foto do escritorGabriel Quintella

Python, Analisando Mercado Financeiro

Fala meu amigo, tudo bem com você? Trago no post de hoje um assunto do nosso dia-a-dia para que seja possível acompanhar a aplicação do Python.


Confesso que é um assunto que a muito tempo quero aqui, mais preferi primeiro abordar alguns tópicos mais básicos para que você possa ter pelo menos uma base de Python.


Que tal parar de ladainha e ir direto ao ponto? Mais antes de avançarmos, preciso que você responda uma pergunta, é bem simples, apenas SIM ou NÃO.


Enquete no ar.


Nos últimos 30 dias você realizou algum investimento? Seja ele em bolsa de valores, criptomoedas, dólar, ouro etc.


Se você respondeu sim, você tem acompanhando o seu rendimento diário? Seu investimento tem valorizado ou desvalorizado?? Caso tenha respondido não, esse post irá ajudar você no futuro a fazer esse acompanhamento, analisa aqui comigo.


Para o estudo de hoje estarei realizando uma combinação bastante interessante. Nosso source será o site Yahoo Finance (https://finance.yahoo.com/), para desenvolvimento vou usar o Jupyter Notebook e do lado do Python, usarei a biblioteca pandas_datareader (link da documentação no final desse post).


Aqui vai a nossa primeira dica!


Quando iniciei os estudos dessa biblioteca, precisei realizar a instalação do padas_datareader.


Caso você também precise realizar a instalação, basta executar o script abaixo em seu Jupyter ou em outra ferramenta de desenvolvimento favorita.



# Instalação do Pandas DataReader
pip install pandas_datareader

Vamos começar analisando a trajetória da criptomoeda Bitcoin e a ação da Petrobras PETR4.SA para o ano de 2021.


Para facilitar nosso estudo, vou criar um arquivo xlsx chamado de ativos.xlsx e irei usar ele como se fosse a nossa carteira de investimentos, ou seja, os ativos que pretendemos acompanhar.


Para facilitar o entendimento, criei uma estrutura de diretório C:\Temp\Python\Ativos\ativos.xlsx e salvei a nossa carteira nesse diretorio. Mais fique a vontade do seu lado para criar a estrutura que achar melhor, só não esqueça de alterar no seu script!


Feito isso vamos ver como que fica o nosso script.


for ativo in list(nomeArquivo['Ativo']):
    # Nome do ativo
    nomeAtivo = ativo
    # Período Inicial
    dataInicio = '01-01-2021'
    # Período Final
    data_e_hora_atuais = datetime.now()
    dataFim = data_e_hora_atuais.strftime('%m-%d-%Y')
    # Captura das Informações do Yahoo e informação de periodo inicial e final
    df = web.DataReader(f'{nomeAtivo}', data_source='yahoo', start=f'{dataInicio}', end=f'{dataFim}')
    # Inclusão de Colunas Data da Extração e Ativo
    df = df.assign(DataExtracao=data_e_hora_atuais.strftime('%Y-%m-%d %H:%M:%S.%f'),AcaoMoeda=nomeAtivo)
    # Impressão do dataframe
    display(df)

Após a execução, possuímos o seguinte retorno para cada um dos ativos.


Bitcoin (BTC-USD)


Petrobras (PETR4.SA)


Que tal realizar uma simples alteração em nosso código para fazer com que ele gere para cada ativo um arquivo? Observe como que é simples. Destaquei de verde as linhas que foram inseridas.


for ativo in list(nomeArquivo['Ativo']):
    # Nome do ativo
    nomeAtivo = ativo
    # Período Inicial
    dataInicio = '01-01-2021'
    # Período Final
    data_e_hora_atuais = datetime.now()
    dataFim = data_e_hora_atuais.strftime('%m-%d-%Y')
    # Captura das Informações do Yahoo e informação de periodo inicial e final
    df = web.DataReader(f'{nomeAtivo}', data_source='yahoo', start=f'{dataInicio}', end=f'{dataFim}')
    # Inclusão de Colunas Data da Extração e Ativo
    df = df.assign(DataExtracao=data_e_hora_atuais.strftime('%Y-%m-%d %H:%M:%S.%f'),AcaoMoeda=nomeAtivo)
    # Diretório onde será salvo o arquivo 
    diretorioArquivoAtivo = 'C:\\Temp\\Python\\AcompanhamentoAtivo'
    # Extensão do Arquivo
    extensao  = 'csv'
    # Comando para salvar o arquivo
    df.to_csv(diretorioArquivoAtivo+'\\'+nomeAtivo+'.'+extensao)

Vamos analisar o output.




Arquivos gerados com sucesso, vamos seguir!


Agora começa a ficar melhor nosso estudo. Quando analisamos o retorno do nosso DataFrame, é possível observar que a coluna Date é o índice do DataFrame.


Essa visualização fica mais simples ao executarmos o script abaixo.


df.index

DatetimeIndex(['2021-01-04', '2021-01-05', '2021-01-06', '2021-01-07',
               '2021-01-08', '2021-01-11', '2021-01-12', '2021-01-13',
               '2021-01-14', '2021-01-15',
               ...
               '2021-07-29', '2021-07-30', '2021-08-02', '2021-08-03',
               '2021-08-04', '2021-08-05', '2021-08-06', '2021-08-09',
               '2021-08-10', '2021-08-11'],
              dtype='datetime64[ns]', name='Date', length=150, freq=None)

Para o nosso estudo, vamos precisar retirar a coluna Date do índice.


Fique tranquilo, isso é bem simples! O Python possui o método reset_index(), que permite redefinir o índice de um DataFrame. Executa ai do seu lado o código abaixo.


# Recriação do índice do DataFrame
df.reset_index(inplace=True,drop=False)

Em seguida, execute o comando a seguir para visualizar agora como que ficou o índice do nosso DataFrame.


df.index
RangeIndex(start=0, stop=150, step=1)

Muito bem! Acabou de ganhar uma estrelinha e com isso conseguimos avançar mais um nível!


O próximo passo será realizar a renomeação das colunas do DataFrame, uma vez que os nomes não estão bem claros.


Outra ação bem simples também! O Python possui o método rename() que permite realizar a renomeação de colunas. Bora ai agora, executa o comando abaixo e analisa o resultado! Veja como é simples!


# Renomeação de colunas
df.rename(columns={'High':'VlrMaiorNegociacao', \
                   'Low':'VlrMenorNegociacao', \
                   'Open':'VlrAbertura', \
                   'Close':'VlrFechamento', \
                   'Volume':'VolNegociado', \
                   'Adj Close':'VlrEncerramento', \
                    'Date':'NumAnoMesDia'},inplace=True)

Ai vem mais uma dica!


Observem que em ambos os métodos reset_index() e rename() eu fiz uso do parâmetro inplace=True. Toda vez que você se deparar com esse parâmetro em algum método, isso significa que você está forçando que aquela alteração seja persistida dentro do seu DataFrame.


Avançando mais um pouco, no próximo passo, estarei aplicando um tratamento referente a quantidade de casas decimais, deixando todas as colunas decimais com 4 casas, e pegando um gancho nessa alteração, vou aproveitar para criar outras duas colunas, onde conseguiremos analisar a variação da valorização diária em dinheiro, ou seja, quanto rendeu ou desvalorizou, e uma outra também para variação em percentual. Analise comigo!



# Tratativa de casas decimais
df['VlrMaiorNegociacao'] = round(df['VlrMaiorNegociacao'],4)
df['VlrMenorNegociacao'] = round(df['VlrMenorNegociacao'],4)
df['VlrAbertura'] = round(df['VlrAbertura'],4)
df['VlrFechamento'] = round(df['VlrFechamento'],4)
df['VolNegociado'] = round(df['VolNegociado'],4)
df['VlrEncerramento'] = round(df['VlrEncerramento'],4)

# Cálculo de variação
df['VlrVariacao'] = df['VlrFechamento'] - df['VlrAbertura']
df['PercVariacao'] = 1-(df['VlrAbertura'] / df['VlrFechamento'])

Acabou que esqueci de outro detalhe, preciso de uma coluna que identifique o dia, o mês, o ano e uma para ano e mês junto.


Para isso vou desmembrar a coluna NumAnoMesDia para outras quatro. Analisem o script e o output.


df['NumAnoMesDia'] = df['NumAnoMesDia'].astype(str)
df['NumMes'] = df.NumAnoMesDia.str[5:7]
df['NumDia'] = df.NumAnoMesDia.str[8:10]
df['NumAno'] = df.NumAnoMesDia.str[0:4]
df['NumAnoMes'] = df.NumAnoMesDia.str[0:7]

Bem estamos quase terminando o processo de tratamento do nosso DataFrame.


O passo seguinte é refinar o DataFrame onde vamos definir somente quais colunas vamos precisar para manipular nossa informação.


Após essa análise, cheguei no que preciso. Observem aqui comigo!

dfInvestimento = df.loc[:, ['NumAno'\
           ,'NumMes'\
           ,'NumDia'\
           ,'NumAnoMes'\
           ,'NumAnoMesDia'\
           ,'AcaoMoeda'\
           ,'VlrAbertura'\
           ,'VlrMaiorNegociacao'\
           ,'VlrMenorNegociacao'\
           ,'VlrFechamento'\
           ,'VlrVariacao'\
           ,'PercVariacao']\
      ]

Com o auxilio do método loc, filtrei essas informações e para não modificar o DataFrame inicial, no nosso caso df, associei esses valores a um novo DataFrame e nomeie ele de dfInvestimento.



Mais uma dica! Se você nunca ouviu falar do método loc, deixo aqui um post que preparei exclusivamente para você. Nele eu explico passo a passo de como utiliza-lo. Curte ai!






Pois bem, feito isso, vou trabalhar analisando apenas os valores do Bitcoint. Como o nosso processo de busca de dados do Yahoo Finance buscou informações de dois ativos, o primeiro tratamento é aplicar um filtro para trazer apenas esse ativo. É bem simples, olha ai o código.


Primeiro preciso saber quais informações existem na coluna AcaoMoeda para que em seguida seja possível passar no filtro o valor correto.


# Comando para verificar os valores distintos na coluna AcaoMoeda
dfInvestimento['AcaoMoeda'].unique()

# Comando usado para filtra somente registros do tipo Bitcoin 
dfInvestimento = dfInvestimento[dfInvestimento['AcaoMoeda']=='BTC-USD']

Está ficando bacana hein!


Nesse momento vamos identificar qual foi o dia do ano de 2021 que sofreu a maior e a menor valorização.


Para simplificar a análise e seu entendimento, vou fazer bem passo a passo.


1º - Recuperar a menor valorização:


# Recupera a menor valorização e associa para outro DataFrame
dfInvestimentoMenorVariacao = dfInvestimento.groupby(['AcaoMoeda','NumAnoMesDia'], \
                                                     as_index=False).agg({'VlrVariacao':'min'}) \
                                                    .sort_values(by=['VlrVariacao'],ascending=True)

dfInvestimentoMenorVariacao = dfInvestimentoMenorVariacao.head(1)

2º - Recuperar a maior valorização:


# Recupera a maior valorização e associa para outro DataFrame 
dfInvestimentoMaiorVariacao = dfInvestimento.groupby(['AcaoMoeda','NumAnoMesDia'], \
                                                     as_index=False).agg({'VlrVariacao':'max'}) \
                                                    .sort_values(by=['VlrVariacao'],ascending=False)

dfInvestimentoMaiorVariacao = dfInvestimentoMaiorVariacao.head(1)

3º - Unificar os dois DataFrames:


# Unificação dos DataFrames criados
dfMaiorMenorVariacaoInvestimento = dfInvestimentoMaiorVariacao.append(dfInvestimentoMenorVariacao)

4º- Aplico a técnica de PIVOT, para transformar linhas em colunas:


# Pivot dos dados
grid_dfMaiorMenorVariacaoInvestimento = dfMaiorMenorVariacaoInvestimento.pivot(index=['AcaoMoeda'], \
                                                                               columns='NumAnoMesDia', \
                                                                               values='VlrVariacao')

5º - Por fim, o resultado!



Que lindoooooooooooo! Fantástico! Com isso podemos dizer que o dia 11/05/2021 foi o dia em que a moeda sofreu a sua maior desvalorização e no dia 08/02/2021 foi onde ela foi mais valorizada.


Estamos chegando perto do término desse post. Nesse momento vamos avaliar como que foi o rendimento mensal do Bitcoin. Será que ele valorizou ou desvalorizou todos os meses de 2021? Bora pra análise.


Para esse momento, vou aplicar um cálculo de média simples para todos os meses. Acompanha aqui!


dfInvestimento_graph = dfInvestimento[dfInvestimento['AcaoMoeda']=='BTC-USD'] \ 
                            .groupby(['NumAnoMes'],as_index=False)\
                            .agg({'VlrVariacao':'mean'})

No comando acima, faço um processo bem simples onde agrupo os valores pela coluna NumAnoMes e aplico a média sobre a coluna VlrVariacao. Vamos analisar o output.



Analise comigo o resultado!


Conclusão: Diante das informações, podemos concluir que no primeiro trimestre de 2021 ela teve em média uma boa valorização, em seguida, no segundo trimestre de 2021 ela sofreu com desvalorização e no terceiro trimestre está conseguindo melhorar.


Vamos agora jogar essas informações em um gráfico de barras e ver como que fica?



Pronto! Top demais! Agora vamos para o código que monta esse gráfico.


Para o gráfico, eu faço a utilização da biblioteca matplotlib.pyplot e ao término do post deixo um link da documentação oficial.


dfInvestimento_graph['VlrVariacao'] = round(dfInvestimento_graph['VlrVariacao'],3)

# Comando para definir o tamanho do gráfico (width, height)
plt.figure(figsize = (20,8))

# Declaração dos eixos x e y
vNumAnoMes = dfInvestimento_graph['NumAnoMes']
vVlrVariacao = dfInvestimento_graph['VlrVariacao']

# Comando usado para definir os parametros do gráfico
plt.bar(vNumAnoMes, vVlrVariacao, width= 0.7, align='center',color='green',edgecolor = 'black')

# Comando para definir a posção no gráfico 
i = 0
j = 13

# Comando para colocar o valor em cada barra
for i in range(len(vNumAnoMes)):
    plt.annotate(vVlrVariacao[i], (-0.1 + i, vVlrVariacao[i] + j))

# Comando para criar uma legenda para as barras do gráfico
plt.legend(labels = ['Valora Variação Mensal'])

# Comando para criar um título para o Gráfico
plt.title("Média da Variação Mensal do Bitcoin")

# Comando para nomear os eixos x e y
plt.xlabel('AnoMes')
plt.ylabel('Valor Variação Mensal')

# Comando para Salvar uma cópia do Gráfico 
plt.savefig('Grafico_Variacao_Mensal_Bitcoin.png')

# Apresentação do Gráfico
plt.show()

Bem meu amigo! Infelizmente nosso post chegou ao fim. Espero que tenha gostado. Tentei trazer para você hoje uma análise de um caso real para que fique claro como podemos aplicar o Python e seus amigos em nosso dia-a-dia.


Espero vocês no próximo! Grande abraço e fique com Deus!


Abaixo o notebook completo usado hoje!




37 visualizações0 comentário

Posts recentes

Ver tudo

Comments


bottom of page