Чтобы получить данные для моей диссертации, мне нужно несколько финансовых отчетов (таких как Tot Asset, Tot Доход, Net Income et c) приблизительно для 60 - 70 компаний.
Теперь мне удалось написать код для извлечения из Yahoo финансов данных для одной компании, но мне нужен надежный способ (возможно, серия циклов), чтобы быстро получить данные для других 59 компаний.
Далее, код
import pandas as pd
from bs4 import BeautifulSoup
import urllib.request as ur
В индексе у нас есть тикеры компании, из которой мы хотим получить данные
index = 'MMM'
url_is = 'https://finance.yahoo.com/quote/' + index + '/financials?p=' + index
url_bs = 'https://finance.yahoo.com/quote/' + index +'/balance-sheet?p=' + index
url_cf = 'https://finance.yahoo.com/quote/' + index + '/cash-flow?p=' + index
Это для чтения URL из Yahoo Finance (Отчет о прибылях и убытках, Баланс и последний отчетный поток sh)
read_is = ur.urlopen(url_is).read()
soup_is = BeautifulSoup(read_is,'lxml')
read_bs = ur.urlopen(url_bs).read()
soup_bs = BeautifulSoup(read_bs,'lxml')
read_cf = ur.urlopen(url_cf).read()
soup_cf = BeautifulSoup(read_cf,'lxml')
Это построение DataFrame для отчета о прибылях и убытках
ls = []
for l in soup_is.find_all("div"):
ls.append(l.string)
ls2= list(filter(None,ls))
ls3 = ls2[12:]
ls4 = list(zip(*[iter(ls3)]*6))
Income_stmod = pd.DataFrame(ls4[0:])
Income_st = Income_stmod.drop([3,4,5], axis=1)
Это создание DataFrame для баланса
ms = []
for m in soup_bs.find_all("div"):
ms.append(m.string)
ms2= list(filter(None,ms))
ms3 = ms2[12:]
ms4 = list(zip(*[iter(ms3)]*5))
Balance_shmod = pd.DataFrame(ms4[0:])
Balance_sh = Balance_shmod.drop([3,4], axis=1)
Это построение DataFrame для Ca sh Flow
ns = []
for n in soup_cf.find_all("div"):
ns.append(n.string)
ns2= list(filter(None,ns))
ns3 = ns2[12:]
ns4 = list(zip(*[iter(ns3)]*6))
Cash_flowmod = pd.DataFrame(ns4[0:])
Cash_flow = Cash_flowmod.drop([3,4,5], axis=1)
Это выбор только тех строк, которые мне интересны
TA = Balance_sh.loc[Balance_sh[0] == 'Total Assets']
DEBT = Balance_sh.loc[Balance_sh[0] == 'Total Liabilities']
EBIT = Income_st.loc[Income_st[0] == 'Operating Income or Loss']
REVENUE = Income_st.loc[Income_st[0] == 'Total Revenue']
CASH = Cash_flow.loc[Cash_flow[0] == 'Cash at end of period' ]
frames = [TA, DEBT, EBIT, REVENUE, CASH]
result = pd.concat(frames)
Как я уже говорил, у вас есть идеи о том, как применить этот метод для, скажем, AAPL (Apple) и AMZN (Amazon)
, я думал начать как это, но я не уверен, как продолжить.
index = ['AAPL', 'AMZN']
my_list = []
for company in index:
url_is = 'https://finance.yahoo.com/quote/' + company + '/financials?p=' + company
my_list.append(url_is)
Если вы с мог бы помочь мне с этим, я был бы невероятно благодарен, потому что я буду избегать тратить часы на ввод данных