Data Reader in Python

Asked

Viewed 385 times

-1

Hello to the python community.

I am a student of economics and beginner in python.

I’m developing a code to pursue return on stock purchase, buy and hold. However, I have a problem with the search in the yahoo Finance API, the idea of the code is to be able to input several shares purchased on different dates, but what happens is that when I extract the information the dataframe comes with only one initial date (the most recent date)not with the dates added in each input. For example: When I enter the values of the shares and the purchase date, for example ITUB4.SA 12-03-2019 and ITSA4.SA 23-12-2019, when running for in to download the closing data of the shares, he considers the date 23-12-2019 for the two actions and not separate dates for each action. My problem, I believe, is in fact. I apologize for the rudimentary way of writing the code. I accept tips that can improve code.

Follows the code:

import numpy as np
from pandas_datareader import data as wb
import matplotlib.pyplot as plt
import pandas as pd
from datetime import date

#Criar input de quantas loop for precisa rodar
n = int(input('Quantas ações você tem em sua carteira?'))

#cria o dicionario das acoes 
acoes_dictionary = {}

#Roda o loop for dos input das acoes e salva no dicionario
for x in range(n):    
    new_key = input('Digite o código da sua ação')
    new_date = input('Digite a data de compra da sua ação ')
    acoes_dictionary[new_key] = new_date

#cria uma lista a partir das keys(código) das ações
cod_acoes = list(acoes_dictionary.keys())

#Cria uma lista a partir dos values(data de compra) das ações
date_acoes = list(acoes_dictionary.values())

#Cria um data framde para salvar a busca da internet das acoes
df = pd.DataFrame()

#Busca o fechamento as ações no yahoo finance
for i,j in zip(cod_acoes,date_acoes):
    df[i,j] = wb.DataReader(i, data_source='yahoo', start =j)['Adj Close']

print(df)```

  • Hello John, missed to explain the problem better. The problem is in yahoo-Finance? What would you like to do? Join the data that returns from yahoo-Finance with the ones you enter manually? I ask you to explain better the problem that needs to be solved

  • Thanks for the return, I think the problem is in : for i,j in zip(cod_acoes,date_acoes): df[i,j] = Wb.Datareader(i, data_source='yahoo', start=j). Possibly in this j, because what happens, if I type for example ITUB4.SA 12-03-2019 and ITSA4.SA 23.12.2019. When in search on the Reader date, it considers only the 23.12.2019 date for the two stocks and not the date of each one.

1 answer

0

I managed to solve my problem, I will leave the open source here in case someone wants to use, I will put in integer:

import numpy as np
from pandas_datareader import data as wb
import matplotlib.pyplot as plt
import pandas as pd
from datetime import date

#Criar input de quantas loop for precisa rodar
n = int(input('Quantas ações você tem em sua carteira?'))

#cria o dicionario das acoes 
acoes_dictionary = {}

#Cria a lista de pesos
pesos=[]

#Roda o loop for dos input das acoes e salva no dicionario
for x in range(n):
    new_value = input('Digite o código da sua ação')
    new_key = input('Digite a data de compra da sua ação ')
    acoes_dictionary[new_key] = new_value
    pesos.append(input('Qual o peso da ação em sua carteira?'))

#Cria uma lista a partir dos values(data de compra) das ações
date_acoes = list(acoes_dictionary.keys())

#cria uma lista a partir das keys(código) das ações
cod_acoes = list(acoes_dictionary.values())

#Cria uma lista a partir dos dados das listas acima
list_acoes = list(zip(cod_acoes,date_acoes))

#Cria um Data Frame novo
data= pd.DataFrame()

#Cria uma função que busca as informações i e j no yahoo finance
def get_data(i,j):
    return data.append((wb.DataReader(i, data_source='yahoo',start=j)['Adj Close']))

#Cria um data framde para salvar a busca da internet das acoes
df = pd.DataFrame()

#Busca o fechamento as ações no yahoo finance
for i,j in zip(cod_acoes,date_acoes):
    df =  df.append(get_data(i,j))

#Faz a transposta da matriz    
df = df.T

#Renomeia as colunas
df.columns = [cod_acoes] 

#Cria a lista que vai ficar os valores do retorno
lista_retorno = []

#Cria uma lista de pesos nova
pesos_2 = []

#Cria um loop for para percorrer os items na lista de pesos e salvar como um item
for x in pesos:
    item = x

    #Cria um loop for para percorrer os itens y que estão na lista ['%']
    for y in ['%']:
        #substitui na variavel item os valores dentro da lista ['%'] por ''
        item = item.replace(y, "")
    #Salva esse resultado na lista pesos_2    
    pesos_2.append(item)

#Cria a lista pesos_3
pesos_3=[]

#Cria um loop for para percorrer cada item dentro da lista pesos_2, transforma em float e divide por 100
for x in pesos_2:
    x = float(x)
    x = x/100
    #Salva o resultado na lista peso_3
    pesos_3.append(x)

#Divide o valor de t pelo valor de t-1 e subtrai 1, acha o retorno diario
returns=(df/df.shift(1))-1

#Soma os retornos diários
total_returns = returns.sum()

#Transforma a lista pesos_3 em um vetor
pesos_3 = np.array(pesos_3)

#multiplica os retornos pelo peso
np.dot(total_returns,pesos_3)

#Salva a matriz df de modo que o primeiro item seja o numero, pois como a quantidade de dias não são iguais precisa
#ler o gráfico do mais recente indo para o mais velho
df_grafico = df.iloc[::-1]

#Plota o gráfico
(df_grafico/df_grafico.iloc[0]).plot(figsize=(15,6))
plt.show()

#printa o retorno do portifolio
pfolio_1='O retorno da sua carteira é de '+ str(round(np.dot(total_returns,pesos_3),5)*100)+'%'
print(pfolio_1)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.