Как создать базу данных финансовых данных из YahooFinance для экспорта в Excel (для нескольких компаний) - PullRequest
0 голосов
/ 01 апреля 2020

Чтобы получить данные для моей диссертации, мне нужно несколько финансовых отчетов (таких как 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)

Если вы с мог бы помочь мне с этим, я был бы невероятно благодарен, потому что я буду избегать тратить часы на ввод данных

1 Ответ

1 голос
/ 02 апреля 2020

Попробуйте yahooquery .

Чтобы получить финансовые данные для всех ваших символов, просто сделайте следующее:

from yahooquery import Ticker

ticker_list = ['AAPL', 'MSFT', 'V']
tickers = Ticker(ticker_list)

После инициализации класса Ticker с вашим список символов, используйте следующие методы, чтобы получить CA sh поток, отчет о прибылях и убытках и баланс. Каждый метод принимает частотный аргумент «a» или «q» для годового и квартального (по умолчанию «a»), и каждый из них возвращает pandas DataFrame.

cash_flow = tickers.cash_flow()
income_statement = tickers.income_statement()
balance_sheet = tickers.balance_sheet()    
...