A correlação é uma estatística muito comum e muito utilizada. Desconsiderando casos de falsas correlações, como o exemplo de Gustav Fischer que provou, na década de 30, a existência de uma correlação positiva entre o tamanho da população da cidade de Oldenburg e o número de cegonhas. Ele fez isso não porque acreditasse no mito infantil, mas exatamente para alertar para um erro muito comum quando o assunto é economia: confundir correlação com causa. Fischer provou que a população e o número de cegonhas aumentaram ao longo do período de estudo. O resultado não significa que o crescente número de cegonhas causou o aumento observado na população, obviamente.
Feitas estas considerações iniciais, vamos mostrar como plotar uma matriz de correlação no python, utilizando os módulos pandas e matplotlib. Vamos utilizar o valor dos retornos diários de 2014 das ações da Vale (VALE5) em relação à Petrobras (PETR4), Bradesco (BBDC4), Itaú (ITUB4) e Banco do Brasil (BBAS3).
Primeiro, importamos as bibliotecas necessárias.
#Bibliotecas
import csv
import pandas as pd
import pandas.io.data
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
import matplotlib as mpl
Os valores diários das cotações estão em 5 arquivos .csv. Como temos colunas desnecessárias para nossa aplicação, vamos utilizar a função removeColuna() para selecionar, via data frame no pandas, apenas as colunas 1 e 6, que correspondem à data da cotação e ao valor, respectivamente. O parâmetro arquivo recebera no nome do .csv que contém os dados das ações. Também utilizamos os métodos .reader e .writer do módulo csv para ler o arquivo de entrada e escrever um novo arquivo de saída (analise.csv) que conterá apenas as informações que vamos utilizar.
Assim, chamamos a função criada para carregar as cotações da VALE5.
Seguindo com o código, vamos carregar o arquivo gerado em um data frame do pandas.
A variável headers nomeia as colunas e a função read.csv() carrega o arquivo analise.csv, com as datas como índice de cada registro (index_col='Date'). Em seguida, a variável close_px recebe apenas o atributo das informações de preço da ação (Adj Close).
Agora, vamos carregar as mesmas informações dos demais papéis. Como alternativa de código, poderíamos ter criado um vetor com os nomes de cada arquivo e utilizado um laço for para fazer o carregamento dos dados. Entretanto, vamos ainda deixar menos automatizado apenas para reforçar o entendimento de cada passo do nosso algorít
Agora, vamos atribuir cada informação como um atributo em um novo data frame dfCorrel que conterá o mesmo índice de registro do df anterior.
#Para remover colunas que não serão utilizadas
def removeColuna(arquivo):
arquivo = arquivo
with open(arquivo,"rb") as source:
rdr= csv.reader( source )
with open("analise.csv","wb") as result:
wtr= csv.writer( result )
for r in rdr:
wtr.writerow( (r[1], r[6]) )
return None
Assim, chamamos a função criada para carregar as cotações da VALE5.
removeColuna('vale5_cot.csv')
Seguindo com o código, vamos carregar o arquivo gerado em um data frame do pandas.
#Importando o CSV para o dataframe
headers = ['Date','Adj Close']
df = pd.read_csv('analise.csv', index_col='Date', parse_dates=True,names = headers)
#Carrega os precos de fechamento, dentro do periodo selecionado pelo usuario
close_px = df['Adj Close']
A variável headers nomeia as colunas e a função read.csv() carrega o arquivo analise.csv, com as datas como índice de cada registro (index_col='Date'). Em seguida, a variável close_px recebe apenas o atributo das informações de preço da ação (Adj Close).
Agora, vamos carregar as mesmas informações dos demais papéis. Como alternativa de código, poderíamos ter criado um vetor com os nomes de cada arquivo e utilizado um laço for para fazer o carregamento dos dados. Entretanto, vamos ainda deixar menos automatizado apenas para reforçar o entendimento de cada passo do nosso algorít
#Calculando a correlacao do papel com outras acoes
arquivo = 'petr4_cot.csv'
removeColuna(arquivo)
headers = ['Date','Adj Close']
dfPetr4 = pd.read_csv('analise.csv', index_col='Date', parse_dates=True,names = headers)
arquivo = 'itub4_cot.csv'
removeColuna(arquivo)
headers = ['Date','Adj Close']
dfItub4 = pd.read_csv('analise.csv', index_col='Date', parse_dates=True,names = headers)
arquivo = 'bbas3_cot.csv'
removeColuna(arquivo)
headers = ['Date','Adj Close']
dfBbas3 = pd.read_csv('analise.csv', index_col='Date', parse_dates=True,names = headers)
arquivo = 'bbdc4_cot.csv'
removeColuna(arquivo)
headers = ['Date','Adj Close']
dfBbdc4 = pd.read_csv('analise.csv', index_col='Date', parse_dates=True,names = headers)
Agora, vamos atribuir cada informação como um atributo em um novo data frame dfCorrel que conterá o mesmo índice de registro do df anterior.
dfCorrel = pd.DataFrame(index=df.index)
dfCorrel['VALE5'] = df['Adj Close']
dfCorrel['PETR4'] = dfPetr4.loc[:,'Adj Close']
dfCorrel['ITUB4'] = dfItub4.loc[:,'Adj Close']
dfCorrel['BBAS3'] = dfBbas3.loc[:,'Adj Close']
dfCorrel['BBDC4'] = dfBbdc4.loc[:,'Adj Close']
Por fim, calculamos as correlações entre os retornos de cada ativo (módulo pct_change() do pandas associado ao método .corr()) e armazenamos na variável corr.
#Calculo das correlacoes dos retornos e criação dos gráficos.
rets3 = dfCorrel[:].pct_change()
corr = rets3.corr()
plt.imshow(corr, cmap='hot', interpolation='none')
plt.colorbar()
plt.xticks(range(len(corr)), corr.columns)
plt.yticks(range(len(corr)), corr.columns);
plt.savefig("correl.png")
plt.show()
Nossa saída é o arquivo correl.png (mostrado abaixo) e, quanto mais clara a cor, mais forte é a correlação entre os retornos de cada ativo.
O código está no GitHub no arquivo matrizCorrel.py, bem como os arquivos com os dados das cotações.
Um abraço e até o próximo post!
Tá quebrado o link do git.
ResponderExcluir