terça-feira, 6 de janeiro de 2015

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.

 #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!


1 comentários: