De forma que se possa tomar as melhores decisões de investimento, realiza-se cálculos numéricos complexos de forma que possamos mitigar o risco ou maximizar o retorno. E para caso não queiramos utilizar métodos numéricos? Podemos utilizar nosso conhecimento subjetivo para tomar as decisões. Apesar de complicado para a mente humana, é possível criarmos uma inteligência que segue uma lógica qualitativa e pode auxiliar na criação de uma estratégia de investimento. No post de hoje, mostramos como podemos obter isso através do lógica fuzzy no Python.
O objetivo do uso da lógica fuzzy aqui será de traduzir o que os números dizem por meio de palavras, utilizando uma lógica e um aditivo. Iremos utilizar como exemplo o preço e o volume de negociações da ITUB4. A transformação da lógica pode ser obtida como:
SE (preço ~ barato) E (volume ~ baixo) ENTÃO (decisão ~ comprar)
SE (preço ~ barato) E (volume ~ alto) ENTÃO (decisão ~ comprar)
SE (preço ~ ideal) E (volume ~ baixo) ENTÃO (decisão ~ comprar)
SE (preço ~ ideal) E (volume ~ ideal) ENTÃO (decisão ~ manter)
SE (preço ~ ideal) E (volume ~ alto) ENTÃO (decisão ~ vender)
SE (preço ~ caro) E (volume ~ alto) ENTÃO (decisão ~ vender)
Através dessa lógica, podemos construir uma estratégia de investimento em um dado horizonte de tempo. Para isso, utilizaremos algumas biblioteca a nosso favor.
O primeiro passo será obter os dados do preço de fechamento e do volume do ativo. Utilizamos como janela o período entre 2021 e março de 2022. Como queremos construir uma lógica de subjetiva de baixo, ideal e alto, devemos entender através dos dados, calculandos o valores médios, o desvio padrão, os valores mínimos e máximos, bem como os quintis de 25% e 75%.
Definido os valores, montamos a lógica.
Construímos a função de pertinência (que nos auxiliará na construção dos pontos de decisão de compra, venda e manter). Aqui selecionamos o espaço dos dados.
Veja que em alguns pontos utilizamos a criação na "mão" (para as decisões e vol) ao invés dos valores dos quantis da média, isto por conta da quantidade de memória utilizada pelo código. Como forma de exemplificar, utilizamos dados não tão próximos da realidade.
Com o código abaixo, realizamos a fuzzificação da nossa lógica, construídos os pontos das regras da estratégia.
Com as regras em mãos, o que devemos é iterar em cada ponto de tempo a decisão baseada na lógica construída.
Com o código acima, obtemos os pontos de cada decisão criado pela estratégia salvo no objeto dec_fuzzy.
Por fim, visualizamos o gráfico com os pontos de cada decisão da estratégia. A infelicidade aqui está que visualmente é possível ver que há somente pontos de compra, o que pode ser irreal, devido ao fato de que utilizamos uma aproximação da distribuição do dados por conta de gargalos computacionais.
Caetano, M. A. L. (2021). Python e mercado financeiro: Programação para estudantes, investidores e analistas. Brasil: Editora Blucher.
Veja mais sobre nossos cursos aplicado para R e Python!
Nossos cursos oferecem o conhecimento necessário para que você possa adentrar no mundo da Análise de dados e consiga por em prática os seus códigos. Veja todos nossos cursos de Data Science aqui.
Migrando do Excel para R e Python
Todos sabemos que boa parte do armazenamento e do uso dados viveu (ou ainda vive) dentro de planilhas eletrônicas, principalmente pelo Excel. Não podemos deixar de negar todos os pontos benéficos do uso dessas planilhas, seja pela simplicidade ou pela facilidade de aprender a utilizar uma. Por outro lado, sabemos das dificuldades que o uso do Excel podem impor, comparado com as linguagens de programação R e Python, principalmente para a área de limpeza de dados, análise exploratória de grandes bases de dados e modelagem. Neste post, iremos mostrar aos usuários do Excel pontos em comuns com R e Python e também o que se pode alcançar a mais com essas linguagens.
Excel e Análise de dados
O Excel, por historicamente estar relacionado com o uso de dados, consequentemente leva aos seus usuários como intuitivamente a utilizar e compreender como trabalhar com dados: é possível ordenar, filtrar, agrupar, juntar dados, calcular suas medidas estatísticas e criar gráficos. Este é um conhecimento útil para análise de dados, porém, haverá momentos em que o usuário ficará preso em pouca variedade de técnicas, além de que se for realizar um passo adiante nessas técnicas irá encontrar dificuldades (no qual será o ponto que R e Python irão preencher).
Para começar nossas comparações e estudos, iremos pegar como exemplo um dataset (um conjunto de dados) com suas colunas (variáveis) e observações (linhas). Cada observação de uma coluna é indexada a outra observação de outra coluna. Importante dizer que uma coluna deve ser homogênea, isto é, possuir o mesmo tipo de dado. A grosso modo, existem dois tipos: categórico e quantitativo (que se dividem em mais tipos).
Veja um exemplo de dataset no Excel:
A partir das variáveis que encontram no dataset, o usuários do Excel poderiam ter uma variedade de recursos e funções para analisá-lo: medidas de tendência central (média, moda, mediana), medidas de dispersão (variância e desvio padrão), ordenamento e agrupamento de categoria, entre outras diversas possibilidades.
R para Análise de dados e Tidyverse
No R, começamos na forma em que podemos manipular os dados, por mais que estejamos lidando aqui com um dataset que está estruturado, é útil para que possamos realizar cálculos e tirar variáveis/observações que não é de nosso interesse. Para isso, iremos apresentar o mundo do Tidyverse, que envolve uma família de pacotes do R, utilizado para manipular dados. As funções mais comuns do Tidyverse são:
select() - seleciona as colunas de interesse;
mutate() - cria novas colunas baseado nas colunas já existentes;
rename() - renomeia as colunas de interesse;
arrange() - ordena as colunas de formas crescente ou decrescente;
filter() - seleciona as linhas com base em uma condição;
group_by() - agrupa as linhas (normalmente dados categóricos) das colunas de interesse;
summarize() - agrega os valores de cada grupo (útil para realizar cálculos agrupados);
left_join() - junta dois datasets que possuem uma mesma coluna correspondente.
Com o dataset (que no R e Python chamaremos de DataFrame) iris (que vem em conjunto do pacote Tidyverse no R), podemos fazer alguns exemplos, utilizando o Tidyverse para manipulação de dados. O primeiro passo será carregar o pacote (caso não tenha, instale com install.packages('tidyverse')). A função head() permite que possamos dar uma olhada nos dados antes de começar. Entendido os dados, podemos selecionar as colunas de interesse, com a função select(), veja que no primeiro argumento deve ser inserido o DataFrame que queremos utilizar e no segundo argumento a coluna deste DataFrame. Além de selecionar pelo nome, podemos selecionar pelo número da ordem da coluna no DataFrame. No exemplo, selecionamos as colunas de 1 até 3, utilizando 1:3.
Para realizar o caminho contrário, isto é, retirar colunas de um DataFrame, utilizamos a mesma função, porém, com o símbolo de negação ! do R, que a grosso modo, significa realizar o contrário.
Para realizar mudanças nas colunas, utilizamos a função mutate(), seguindo o mesmo processo da função anterior, utilizando como primeiro argumento o DataFrame que queremos, por outro lado, como queremos criar uma nova coluna, devemos mudar um pouco a sintaxe, criando um nome para a nova coluna e mudando os valores que queremos com uma função ou cálculo. No exemplo, utilizamos toupper() para que todos as letras da colunas Species sejam maiúsculas.
Para renomear a coluna, utilizamos rename(), orientando o novo nome ao nome atual da coluna. Mudado de Sepal.Length para sepal_length.
A função arrange() irá permitir que a coluna Species fique em ordem crescente. Essa função também reconhece variáveis quantitativas, ordenando números por ordem crescente ou descrecente.
O filter(), como dito, permite filtrar as linhas de acordo com critérios escolhidos. No primeiro uso, colocamos como condição que apenas as observações do DataFrame que possuem Sepal.Width maior que 3.6 apareçam. No segundo uso, colocamos como condição que apenas as Species de nome setosa estivessem no DataFrame. E por último, mostramos como podemos colocar mais de uma condição misturando as duas condições anteriores utilizando o &.
Para agrupar os dados, utilizamos a função group_by, porém, não é tão útil utiliza-la sozinha, visto que precisamos realizar uma chamada de um cálculo ou mudanças nas observações para que tenha efeito. Para isso, o summarize() é uma ótima combinação, permitindo que seja feito operações nas colunas de acordo com o grupo selecionado pelo group_by(). No exemplo, calculamos a média de Sepal.Width para cada Species. Veja também que utilizamos o símbolo %>%, uma função do Tidyverse que nos ajuda a utilizar mais de uma função em sequencia.
Por fim, podemos juntar DataFrames diferentes (ou iguais no caso) para que possamos manipula-los em conjunto. O segredo é que ambos os DataFrames devem possuem pelo menos uma coluna em comum, de forma que elas tenham uma relação entre si. No exemplo, utilizamos a função left_join para juntar o DataFrame iris da esquerda com o da direito, de acordo com a coluna Species.
Python para Análise de dados e pandas
O Python, assim como o R como Tidyverse, também possui uma biblioteca extremamente importante para facilitar a análise de dados, que é o pandas, uma biblioteca que oferece um ferramental gigantesco não só para criar e utilizar DataFrames, como também para manipula-los. Nos exemplos, também iremos mostrar os mesmos resultados que obtivemos com o R e o Tidyverse, porém utilizando o pandas do Python.
O primeiro passo será carregar a biblioteca pandas no Python e também o DataFrame iris, que neste caso, utilizamos um arquivo .csv em conjunto com a função do pandas read_csv().
Utilizando a função head(), verificamos o nosso Dataframe para que possamos trabalhar. O primeiro passo será como selecionar colunas no Python, que segue apenas chamando o nosso DataFrame iris e através de dois colchete, selecionarmos os nomes das colunas queremos. Caso utilizarmos apenas um colchete, será retornado um objeto do tipo Series, e não DataFrame, o que não nos é útil no momento.
Para o caminho contrário, usamos drop() para que a coluna de interesse seja excluída do DataFrame. Veja que utilizamos o argumentos axis, isso porque queremos dropar colunas e não linhas.
Para criar novas colunas, seguimos o mesmo raciocínio de colchetes para selecionar colunas, porém utilizamos operadores matemáticos para realizar o procedimento. Veja que no exemplo somamos duas colunas selecionando-as com apenas um colchete (o suficiente para selecionar os valores).
Para ordenar as colunas, utilizamos a função sort_values(), especificando a coluna de interesse com o argumento by. O raciocinio desta função é o mesmo que o do Tidyverse.
Para realizar filtros, o raciocínio segue o mesmo para selecionar colunas, a diferença é que utilizamos o operador lógico para realizar o filtro. O porém aqui é que o que é retornado é na realidade um vetor de True e False dos valores que preencheram a condição exigida. A solução é utilizar o objeto do filtro dentro de um colchete do DataFrame para selecionar as observações do DataFrame.
Em relação ao agrupamento, utilizamos a função groupby() para selecionar a coluna de interesse. Logo em seguinda, utilizamos a função mean() para obter a média de todas as colunas agrupadas por Species.
E por fim, para juntarmos DataFrames, utilizamos a função merge(), que permite juntar DataFrames que possuem colunas em comum. Na função, o argumento on nos permite especificar qual coluna será essa. O argumento how especificar qual coluna será a base.
Vimos neste post as principais funções do R e Python que se assemelham com aquelas utilizadas no Excel para análise de dados. Existe ainda um enorme mundo a ser percorrer em ambas as linguagens, tanto na parte Estatística, de Visualização e também por Modelagem. Aqui na Análise Macro realizamos post diários sobre ambas as linguagens, ensinando desde o básico até o avançado. Para compreender ainda mais ambas as linguagens, nossos Cursos de R e Python aplicados a Ciências de Dados, Economia e Finanças pode lhe ajudar mais ainda.
Quer aprender mais sobre R e Python?
Abrimos hoje, 22/3, as inscrições com 30% de desconto para as Turmas de Outono dos nossos Cursos Aplicados de R e Python. As vagas com esse desconto são limitadas aos primeiros inscritos. Haverá vagas para 25 Cursos Livres e 3 Formações. As turmas de Outono terão início no dia 04/04 e contarão com Cursos de Introdução à Programação em R ou Python, de modo que não é necessário nenhum conhecimento prévio nas linguagens. Para todos os detalhes sobre as Turmas de Outono, entre neste link e garanta sua vaga!
A biblioteca pandas pode ser considerada a mais importante dentro do mundo da análise de dados para o Python. É a ferramenta principal para construção de estrutura, manipulação e limpeza de dados, sendo também utilizada com bibliotecas de processamento numérico e construção de gráficos. No post de hoje, iremos realizar uma breve introdução a esta biblioteca.
O ponto chave do pandas está na estrutura de dados no qual a biblioteca permite criar e manipular, são elas: Series e DataFrame.
Series é um objeto array unidimensional (tal qual o array criado com o Numpy) possuindo um índice (rótulos das observações). O DataFrame é considerado como um conjunto de dados retangulares ou dados tabulares, no qual cada coluna tem um tipo de dado, representados por um índice de colunas e um índice para cada observação (linha).
Para importar a biblioteca, iremos utilizar a seguinte convenção:
Como dito, o objeto Series é um array unidimensional associado a um rótulo de dados chamado índice (ou index). Podemos criar uma Series a partir do seguinte código.
series_obj = pd.Series([4, 5, 6, 3])
series_obj
Veja que para cada valor há um número representando a ordem das observações. É possível criar os valores dos índice.
series_obj2= pd.Series([4, 7, 8, -2], index = ['a', 'b', 'c', 'd'])
series_obj2
Assim como um array do Numpy, é possível realizar cálculos com o objeto séries, seja através de funções, multiplicação escalar ou mesmo filtragens. A ordem do índice não se altera. Veja também que pela filtragem é possível escolher através do rótulo da observação.
# Calcula a média da Series
series_obj2.mean()
# Multiplica a array por 2
series_obj2 * 2
# Seleciona o valor no qual o índice é representado por 'a'
series_obj2['a']
Como dissemos, o DataFrame representa uma tabela de dados retangulares contendo uma coleção de colunas, preenchidas de uma série de observações, sejam elas numéricas, strings, booleans, etc. Possui também dois índices, sendo uma para as observações e outra para as colunas. Podemos dizer que é uma coleção de lista, dicionários ou arrays unidimensionais.
Vamos construir um DataFrame a partir de um conjunto de dicionários.
data_raw = {'cursos' : ['machine learning', 'econometria', 'séries', 'visualização'],
'carga_horaria' : [90, 60, 90, 40],
'desconto' : [True, False, True, False]}
data = pd.DataFrame(data_raw)
É possível também, a partir do pandas, importar dados de outros lugares. O mais comum é importar arquivos .csv. Vemos um exemplo abaixo, importando um dataset de treino de um conjunto de dados sobre preços de casas na Califórnia contidos no Google Colab.
california_houses = pd.read_csv('/content/sample_data/california_housing_train.csv')
Quando recebemos esse conjunto de dados, o interessante é explorá-lo para obter uma noção de seu conteúdo. Podemos utilizar diversos métodos para isso.
# Retorna as primeiras linhas do DataFrame
california_houses.head()
# Exibe as informações sobre o DataFrame
california_houses.info()
# Sumariza as estatísticas
california_houses.describe()
Também é possível retirar os números dos índices e os nomes das colunas
# Retira as colunas
california_houses.columns
# Números dos índices
california_houses.index
Nesse post realizamos uma breve introdução aos pandas, há ainda uma série de outras possibilidades de manipulação e cálculos que podemos realizar, tais como filtragens mais avançadas dos DataFrames, agregação e junção com condições, além de aprender métodos para preparar um Dataframe para visualização e modelagem.
Como analogia, podemos dizer que a biblioteca pandas pode ser considerada como um canivete suíço, com uma variedade de ferramentas, ficando a cargo do usuário qual utilizar, podendo em muitas vezes ser vasto o tempo necessário de aprendizagem. Apesar disso, os cursos da Análise Macro facilitam este problema, com uma série de aulas teóricas e práticas com o Python, facilitando a vida de quem quer aprender mais sobre Análise de Dados.