def get_YahooFinancials(ticker, d1, d2, dividend=True): di = {'formatted_date': 'date', 'open': 'price', 'amount': 'dividend'} # (1) Get price data cn_price = ['formatted_date', 'open'] stock = YahooFinancials(ticker) price = stock.get_historical_price_data(d1, d2, 'daily')[ticker] price = pd.DataFrame(price['prices'])[cn_price] price = price.rename(columns=di).assign(ticker=ticker) price.date = pd.to_datetime(price.date) price = add_date_int(price) #.drop(columns=['day','date']) price = price.query('day == 1').reset_index(None, True).drop(columns='day') assert not (price.year + price.month / 100).duplicated().any() assert price.price.notnull().all() # (2) Get dividend data if dividend: cn_dividend = ['formatted_date', 'amount'] dividend = stock.get_daily_dividend_data(d1, d2)[ticker] dividend = pd.DataFrame(dividend)[cn_dividend] dividend.rename(columns=di, inplace=True) dividend.date = pd.to_datetime(dividend.date) dividend = add_date_int(dividend) dividend = dividend.groupby(['year', 'month']).dividend.sum().reset_index() price = price.merge(dividend, 'left', ['year', 'month']) # merge return price
def _get_dividends(self, symbols): start_date = '2019-01-15' d = datetime.datetime.today() end_date = d.strftime("%Y-%m-%d") yahoo_financials = YahooFinancials(symbols) logging.info( f"[_get_dividends] Getting dividends from Yahoo {start_date} to {end_date} for {symbols}" ) divs = yahoo_financials.get_daily_dividend_data(start_date, end_date) logging.info(f"[_get_dividends] Done") return divs
def _DownloadDividendsCSVFromYahooFinance(self, symbols: List[Text]) -> List[Optional[Text]]: csv_data = [] today = datetime.datetime.now().strftime("%Y-%m-%d") all_assets = YahooFinancials(symbols) all_dividends = all_assets.get_daily_dividend_data( start_date=config.DEFAULT_MIN_DATE, end_date=today) for symbol in symbols: dividends = all_dividends[symbol] if dividends is None: csv_data.append(None) continue lines = ['Date,Amount'] # Header for e in dividends: if e['amount'] is None: continue lines.append(f'{e["formatted_date"]},{e["amount"]}') lines.append('') # This will add a last line break. csv_data.append("\n".join(lines)) return csv_data
class TestModule(TestCase): def setUp(self): self.test_yf_stock_single = YahooFinancials('C') self.test_yf_stock_multi = YahooFinancials(stocks) self.test_yf_treasuries_single = YahooFinancials('^IRX') self.test_yf_treasuries_multi = YahooFinancials(us_treasuries) self.test_yf_currencies = YahooFinancials(currencies) # Fundamentals Test def test_yf_fundamentals(self): # Single stock test single_balance_sheet_data_qt = self.test_yf_stock_single.get_financial_stmts( 'quarterly', 'balance') single_income_statement_data_qt = self.test_yf_stock_single.get_financial_stmts( 'quarterly', 'income') single_all_statement_data_qt = self.test_yf_stock_single.get_financial_stmts( 'quarterly', ['income', 'cash', 'balance']) # Multi stock test multi_balance_sheet_data_qt = self.test_yf_stock_multi.get_financial_stmts( 'quarterly', 'balance') multi_income_statement_data_qt = self.test_yf_stock_multi.get_financial_stmts( 'quarterly', 'income') multi_all_statement_data_qt = self.test_yf_stock_multi.get_financial_stmts( 'quarterly', ['income', 'cash', 'balance']) # Single stock check result = check_fundamental(single_balance_sheet_data_qt, 'bal') self.assertEqual(result, True) result = check_fundamental(single_income_statement_data_qt, 'inc') self.assertEqual(result, True) result = check_fundamental(single_all_statement_data_qt, 'all') self.assertEqual(result, True) # Multi stock check result = check_fundamental(multi_balance_sheet_data_qt, 'bal') self.assertEqual(result, True) result = check_fundamental(multi_income_statement_data_qt, 'inc') self.assertEqual(result, True) result = check_fundamental(multi_all_statement_data_qt, 'all') self.assertEqual(result, True) # Historical Price Test def test_yf_historical_price(self): single_stock_prices = self.test_yf_stock_single.get_historical_price_data( '2015-01-15', '2017-10-15', 'weekly') expect_dict = { 'high': 49.099998474121094, 'volume': 125737200, 'formatted_date': '2015-01-12', 'low': 46.599998474121094, 'adjclose': 45.35684585571289, 'date': 1421038800, 'close': 47.61000061035156, 'open': 48.959999084472656 } self.assertDictEqual(single_stock_prices['C']['prices'][0], expect_dict) # Historical Stock Daily Dividend Test def test_yf_dividend_price(self): single_stock_dividend = self.test_yf_stock_single.get_daily_dividend_data( '1986-09-15', '1987-09-15') expect_dict = { "C": [{ "date": 533313000, "formatted_date": "1986-11-25", "amount": 0.02999 }, { "date": 541348200, "formatted_date": "1987-02-26", "amount": 0.02999 }, { "date": 544714200, "formatted_date": "1987-04-06", "amount": 0.332 }, { "date": 549120600, "formatted_date": "1987-05-27", "amount": 0.02999 }, { "date": 552576600, "formatted_date": "1987-07-06", "amount": 0.332 }, { "date": 557501400, "formatted_date": "1987-09-01", "amount": 0.02999 }] } self.assertDictEqual(single_stock_dividend, expect_dict) # Extra Module Methods Test def test_yf_module_methods(self): # Stocks if isinstance(self.test_yf_stock_single.get_current_price(), float): self.assertEqual(True, True) else: self.assertEqual(False, True) if isinstance(self.test_yf_stock_single.get_net_income(), int): self.assertEqual(True, True) else: self.assertEqual(False, True) # Treasuries if isinstance(self.test_yf_treasuries_single.get_current_price(), float): self.assertEqual(True, True) else: self.assertEqual(False, True)
import datetime from yahoofinancials import YahooFinancials shares = YahooFinancials("2318.HK") data = shares.get_daily_dividend_data("2018-01-01", "2018-12-31") print(data)