Explorando dados financeiros com Python - introdução
Tags: python, datascience, finance, introducao
Published: 2020-05-18 09:45:40


Este é o primeiro post da série "Ciência de Dados aplicada a Finanças" e é uma introdução de como usar Python para análises financeiras.

## Por que usar Python para análises financeiras?

Python é uma linguagem fácil de aprender, se integra bem com outras linguagens e é open source, o que a torna acessível para quem quiser utilizá-la.

No setor financeiro é usada em análises quantitativas para:

- Compilar relatórios de vendas mensais;
- Otimizar performances de estratégias de investimento;
- Visualizar dados de tendências de ações.

Se você quer aprender a programar em Python, sugiro que veja [esta playlist](https://www.youtube.com/playlist?list=PLHz_AreHm4dlKP6QQCekuIPky1CiwmdI6) do professor Guanabara. São mais de 10h de curso em vídeo gratuito e em português. Aqui irei apresentar apenas alguns conceitos básicos para serem aplicados em análises de dados financeiros.

## Conhecendo a linguagem

Podemos utilizar Python para realizar operações matemáticas comuns como adição, subtração, multiplicação, divisão, resto da divisão e potenciação.

    #Adição:
    print(10 + 5)
    
    #Subtração:
    print(10 - 5)
    
    #Multiplicação:
    print(10 * 5)
    
    #Divisão:
    print(10 / 5)
    
    #Módulo:
    print(10 % 5)
    
    #Potenciação:
    print(10 ** 5)
    
### Variáveis

As variáveis são compostas de duas partes: o nome e o valor, e guardam informações que podem ser utilizadas posteriormente no código.

O nome da variável pode conter letras maiúsculas e minúsculas, números e sublinhados, porém não pode iniciar com um número. Existem palavras que não devem ser usadas como nome de uma variável, pois definem as regras de sintaxe e estrutura da linguagem, estas são chamadas palavras reservadas.

Para atribuir um valor a uma variável digite o nome da variável, o sinal de igual (=) e então atribua o valor da variável.

    nome = "Luíza"
    idade = 27
    ama_chocolate_branco = True

### Tipos

É possível atribuir tipos de dados às variáveis. São eles:

- String: dado do tipo texto. Deve ser escrito entre aspas;
- Integer: dado do tipo número inteiro;
- Float: dado do tipo número real;
- Boolean: dado do tipo booleano. Pode receber True (verdadeiro) ou False (falso). Normalmente são o resultado de um teste condicional envolvendo operadores de comparação ou operadores lógicos.
 
Para identificar o tipo da variável  use:

    type(nome_da_variavel)

### Listas

Uma lista em python pode ser identificada quando vemos elementos separados por vírgula dentro de colchetes. Cada elemento em uma lista assume uma posição ordenada chamada _index_ que inicia em zero.

Para acessar um elemento usamos um número inteiro que representa o index deste entre colchetes. Por exemplo, para acessar o segundo elemento de uma lista usamos [1], já que a contagem se inicia em zero:

    #Acessar o elemento "vermelho":
    
    lista_cores = ["azul", "vermelho", "roxo", "amarelo", "verde"]
    lista_cores[1]

Para acessar múltiplos elementos em uma lista, usamos o fatiamento. Para isso, dentro do colchete passamos o index inicial e o index final separados por ":", sendo que este não será exibido. Na lista do exemplo acima, para acessarmos os três elementos do meio fazemos:

    #Acessar "vermelho", "roxo", "amarelo":
    lista_cores[1:4]

Podemos usar também o fatiamento estendido. Se precisamos acessar todos os elementos da posição x até o final da lista ou do início da lista até a posição x fazemos, respectivamente:

    #Acessar "roxo", "amarelo", "verde":
    lista_cores[2:]
    
    #Acessar "azul", "vermelho", "roxo", "amarelo":
    lista_cores[:4]

Se for preciso saltar elementos, basta incluir um _step_ na sintaxe. O _step_ é um número inteiro que determina o incremento entre cada index. Usando ainda a lista de cores como exemplo:

    # Acessar "azul", "roxo", "verde"
	lista_cores[::2]

### Métodos e Funções

Em Python, todo método é uma função, mas nem toda função é um método. A diferença entre eles é que uma função recebe um objeto, enquanto um método age sobre um objeto. Alguns exemplos de métodos são:

- .append(): adiciona um único elemento a uma lista;
- .extend(): adiciona mais de um elemento a uma lista;
- .index(): retorna o índice do elemento. Se o elemento aparece mais de uma vez na lista, o retorno é o menor índice onde o elemento aparece;
- .min(): retorna o menor elemento de uma lista;
- .max(): retorna o maior elemento de uma lista.

#### Pacote

É uma coleção de vários scripts ou módulos em python que introduzem novas funções, métodos e tipos de dados. Para instalar um pacote use "_pip install nome_do_pacote_" e para importar o pacote para usar no código use "_import nome_do_pacote_".

### Matriz

No pacote NumPy podemos criar novos tipos de dados chamados matrizes. Para criar uma matriz basta chamar a função "array()" que recebe uma lista como entrada. Para acessar a função usamos numpy.array().

Podemos usar alias para tornar o código menos verboso. O alias possibilita a substituição de uma palavra por outra cadeia de caracteres e com isso é possível resumir o nome dos pacotes importados. Para isso fazemos, por exemplo:

    import numpy as np

Matrizes são mais compactas que uma lista, portanto são mais eficientes para lidar com conjuntos de dados muito grandes. Além de serem mais compactas, só guardam um tipo de dado, por isso, se forem atribuídos mais de um tipo de dado, o próprio NumPy irá converter automaticamente todos os elementos para o  tipo mais compatível.

No caso das matrizes, ao usar o sinal de "+" a operação funciona diferente de quando usado em listas. Se fizermos lista_a + lista_b, as listas serão concatenadas, mas se fizermos  matriz_a + matriz_b os elementos da matriz são somados de acordo com seus _index_.

Para acessar os elementos ou fazer fatiamento, a sintaxe é a mesma da utilizada em listas.

### Matriz 2D

É uma lista de listas onde cada linha é representada por uma lista e cada coluna é representa pelos elementos.

#### Métodos aplicados a matrizes 2D 

- .shape: retorna as dimensões da matriz dentro de uma tupla com dois elementos, onde o primeiro número é o número de listas e o segundo o número de elementos em cada lista;
- .size: retorna a quantidade de elementos existentes na matriz.

#### Funções aplicadas a matrizes 2D

- np.mean(nome_da_matriz): calcula a média da matriz;
- np.std(nome_da_matriz): calcula o desvio padrão da matriz;
- np.arrange(): cria uma matriz com início, fim e incremento;
- np.transpose(): inverte linhas e colunas da matriz NumPy.

#### Acessando _index_

Usamos a mesma sintaxe da usada para acessar elementos em uma lista, mas precisamos passar o _index_ da linha e o _index_ da coluna onde está o elemento.

    matriz_alunos = [['Ana', 'Beto'],[26, 23],[1.63,1.79]]
    
    #Acessar o segundo elemento da segunda lista da matriz
    matriz_alunos[1,1]

#### Fatiamento 

Assim como para acessar os elementos pelo _index_, usamos a mesma sintaxe da usada para listas, mas precisamos passar o _index_ da linha e o _index_ da coluna.

    #Selecionar todas as linhas da terceira coluna:
    matriz_alunos[:,2]

<center><img src="https://dev-to-uploads.s3.amazonaws.com/i/jsiija2cwaxgcd9sdzxu.jpg" alt = "Visualizando dados" width="600"></center>

## Visualizando dados com Python

Quanto melhor estiver a visualização dos dados, maior será a possibilidade de obter informações valiosas deles. Além disso, visualizações são importantes para comunicar suas descobertas a outras pessoas.

Veremos aqui a interface [_PyPlot_](https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.pyplot.html) da biblioteca de visualização de dados _Matplotlib_. Para importá-la usamos:

    import matplotlib.pyplot as plt

### Funções

- plt.plot(): recebe argumentos que descrevem os dados a serem plotados e cria um gráfico de linha;
- plt.scatter(): cria um gráfico de dispersão;
- plt.show(): exibe o gráfico na tela;

Podemos fornecer mais argumentos à função plot() para personalizar o gráfico. Uma boa prática é fornecer o argumento "label" para dar nome aos eixos dos gráficos.

 - plt.xlable(): adiciona um título para o eixo x;
 - plt.ylabel(): adiciona um título para o eixo y;
 - plt.title(): adiciona um título para o seu gráfico.

Um exemplo seria:

    import matplotlib.pyplot as plt
    
    # Plotar preço em função do tempo
    plt.plot(days, prices, clor='red', linestyle='--')
    
    # Adicionar títulos dos eixos
    plt.xlabel('Days')
    plt.ylabel('Prices, $')
    
    # Adicionar título do gráfico e plotar
    plt.title('Company Stock Prices Over Time')
    plt.show()

<center><img src="https://dev-to-uploads.s3.amazonaws.com/i/qdj16ret0787m23jdphl.PNG" alt = "Gráfico de linhas da variação dos preços das ações das companhias ao longo do tempo" width="600"></center>

#### Histogramas:

Ao plotar um histograma podemos visualizar com facilidade a distribuição dos dados. Em finanças, os histogramas são utilizados para visualizar indicadores econômicos, retornos de ações e preços de commodities, por exemplo. Para plotar usamos:

    plt.hist()

**Vantagens**: 

- Visualizar o formato e distribuição dos dados (a distribuição é simétrica?);
- Visualizar se existe muita variabilidade nos dados (os dados estão centrados em torno da média?);
- Identificar pontos com grande afastamento dos demais (existem outliers?).

Para saber a frequência relativa ou o percentual da observação ao invés da contagem de frequências, usamos o argumento "normed = 1".

Para adicionar legendas ao histograma usamos o argumento labels na função hist() e para plotar as legendas usamos plt.legend(). Veja o exemplo abaixo:

    # Plotar os histogramas de stock_A e stock_B:
    plt.hist(stock_A, bins=100, alpha=0.4, label='Stock A')
    plt.hist(stock_B, bins=100, alpha=0.4, label='Stock B')
    
    # Adicionar a legenda
    plt.legend()
    
    # Mostrar o gráfico
    plt.show()

<center><img src="https://dev-to-uploads.s3.amazonaws.com/i/iympnv1dz4c3b8x3dril.PNG" alt = "Histograma da variação dos preços das ações das companhias ao longo do tempo" width="600"></center>

Com isso já conseguimos fazer nossas primeiras análises de dados financeiros. Veja [aqui](https://dev.to/luizabizoni/s-p-100-estudo-de-caso-2oc1) o estudo de caso do *S&P 100 Stock* onde aplico o que aprendemos nesta leitura.

*Este post foi escrito baseado em meu aprendizado com o curso "Introduction to Python for Finance" ministrado por Adina Howe disponível [neste link](https://campus.datacamp.com/courses/introduction-to-python-for-finance).*