def test_upsert_new_ebit(self): current_date = "2019-03-30" stock_uri = "ab_inbev-Aktie" ebit = "0.32" lev_02_score = "1" db.upsert_item( table=cst.TABLE_LEVERMANN, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], database=cst.TEST_DATABASE, current_date=current_date, stock_uri=stock_uri, lev_02_val=ebit, lev_02_sco=lev_02_score, ) self.assertEqual( ebit, str( db.get_item( table=cst.TABLE_LEVERMANN, column=cst.COLUMN_LEV02_VALUE, condition=[cst.COLUMN_DATE, "2019-03-30"], database=cst.TEST_DATABASE, )), )
def write_stock_estimates_data_to_db(): stock_list = db.get_list(table=cst.TABLE_STOCKS, columns=cst.COLUMN_URI) file_list = [ cst.PATH_STOCK_ESTIMATES + stock[:-6] + cst.HTML_EXTENSION for stock in stock_list ] for file in file_list: stock_uri = file.split("/")[-1][:-5] + "-Aktie" stock_estimate_soup = scrap.get_soup_code_from_file(file) if stock_estimate_soup is None: logger.warning( "Write Stock Estimate Data to DB: Soup is None for %s" % str(file)) continue try: eps_0, eps_p1 = parse.get_result_per_share_current_and_next_year( stock_estimate_soup) db.upsert_item( table=cst.TABLE_COMPANY_DATA, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], current_date=date.get_current_date(), stock_uri=stock_uri, eps_0=eps_0, eps_p1=eps_p1) except: logger.exception( "Write Stock Estimate Data to DB: Exception for stock: %s" % stock_uri)
def test_upsert_new_kgv5(self): current_date = "2019-03-30" stock_uri = "ab_inbev-Aktie" kgv5 = "24.91" lev_04_score = "-1" db.upsert_item( table=cst.TABLE_LEVERMANN, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], database=cst.TEST_DATABASE, current_date=current_date, stock_uri=stock_uri, lev_04_val=kgv5, lev_04_sco=lev_04_score, ) self.assertEqual( kgv5, str( db.get_item( table=cst.TABLE_LEVERMANN, column=cst.COLUMN_LEV04_VALUE, condition=[cst.COLUMN_DATE, "2019-03-30"], database=cst.TEST_DATABASE, )), )
def write_stock_last_quarterly_figures_date_to_db(): stock_list = db.get_list(table=cst.TABLE_STOCKS, columns=cst.COLUMN_URI) file_list = [ cst.PATH_STOCK_DATES + stock[:-6] + cst.HTML_EXTENSION for stock in stock_list ] for file in file_list: stock_uri = file.split("/")[-1][:-5] + "-Aktie" stock_targets_soup = scrap.get_soup_code_from_file(file) if stock_targets_soup is None: logger.warning( "Write Stock Quaterlyfigures Data to DB: Soup is None for %s" % str(file)) continue try: last_figures_date = parse.get_last_quarterly_figures_date( stock_targets_soup) if last_figures_date is None: continue else: # db.write_single_stock_dates_data_to_db(stock_uri, last_figures_date) db.upsert_item( table=cst.TABLE_STOCK_DATES, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], current_date=last_figures_date, quarterly="Quarterly/Yearly", ) except: logger.exception( "Write Stock Quaterly Data to DB: Exception for stock: %s" % stock_uri)
def write_stock_targets_data_to_db(): stock_list = db.get_list(table=cst.TABLE_STOCKS, columns=cst.COLUMN_URI) file_list = [ cst.PATH_STOCK_TARGETS + stock[:-6] + cst.HTML_EXTENSION for stock in stock_list ] for file in file_list: stock_uri = file.split("/")[-1][:-5] + "-Aktie" stock_targets_soup = scrap.get_soup_code_from_file(file) if stock_targets_soup is None: logger.warning( "Write Stock Targets Data to DB: Soup is None for %s" % str(file)) continue try: buy, hold, sell = parse.get_analyst_ratings(stock_targets_soup) db.upsert_item( table=cst.TABLE_COMPANY_DATA, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], current_date=date.get_current_date(), stock_uri=stock_uri, analyst_buy=buy, analyst_hold=hold, analyst_sell=sell, ) except: logger.exception( "Write Stock Targets Data to DB: Exception for stock: %s" % stock_uri)
def test_upsert_existing_single_balance_data_to_db(self): current_date = "2019-03-09" stock_uri = "ab_inbev-Aktie" equity_capital = 121541.00 earnings_at = 3702.48 operative_result = 14520.88 db.upsert_item( table=cst.TABLE_COMPANY_DATA, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], database=cst.TEST_DATABASE, current_date=current_date, stock_uri=stock_uri, equity_capital=equity_capital, earnings_after_tax=earnings_at, operative_result=operative_result, ) self.assertEqual( "3702.48", str( db.get_item( table=cst.TABLE_COMPANY_DATA, column=cst.COLUMN_EARNINGS_AT, condition=[cst.COLUMN_EQUITY_CAPITAL, 121541.00], database=cst.TEST_DATABASE, )), )
def test_upsert_existing_roe(self): current_date = "2019-03-23" stock_uri = "ab_inbev-Aktie" return_on_equity = "0.08" lev_01_score = "-1" db.upsert_item( table=cst.TABLE_LEVERMANN, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], database=cst.TEST_DATABASE, current_date=current_date, stock_uri=stock_uri, lev_01_val=return_on_equity, lev_01_sco=lev_01_score, ) self.assertEqual( return_on_equity, str( db.get_item( table=cst.TABLE_LEVERMANN, column=cst.COLUMN_LEV01_VALUE, condition=[cst.COLUMN_DATE, "2019-03-23"], database=cst.TEST_DATABASE, )), )
def write_stock_balance_data_to_db(): stock_list = db.get_list(table=cst.TABLE_STOCKS, columns=cst.COLUMN_URI) file_list = [ cst.PATH_STOCK_BALANCE + stock[:-6] + cst.HTML_EXTENSION for stock in stock_list ] for file in file_list: stock_uri = file.split("/")[-1][:-5] + "-Aktie" stock_balance_soup = scrap.get_soup_code_from_file(file) if stock_balance_soup is None: logger.warning( "Write Stock Balance Data to DB: Soup is None for %s" % str(file)) continue if not parse.is_data_available(stock_balance_soup): logger.warning( "Write Stock Balance Data to DB: No Data Available for %s" % str(file)) continue try: earnings_after_tax = parse.get_current_value_of_attribute( stock_balance_soup, cst.TEXT_RESULT_AFTER_TAX) operative_result = parse.get_current_value_of_attribute( stock_balance_soup, cst.TEXT_OPERATIVE_RESULT) sales_revenue = parse.get_current_value_of_attribute( stock_balance_soup, cst.TEXT_SALES_REVENUE) balance = parse.get_current_value_of_attribute( stock_balance_soup, cst.TEXT_BALANCE) equity_capital = parse.get_current_value_of_attribute( stock_balance_soup, cst.TEXT_EQUITY_CAPITAL) eps_m3, eps_m2, eps_m1 = parse.get_result_per_share_last_three_years( stock_balance_soup) db.upsert_item( table=cst.TABLE_COMPANY_DATA, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], current_date=date.get_current_date(), stock_uri=stock_uri, equity_capital=equity_capital, earnings_after_tax=earnings_after_tax, operative_result=operative_result, sales_revenue=sales_revenue, balance=balance, eps_m3=eps_m3, eps_m2=eps_m2, eps_m1=eps_m1) except: logger.exception( "Write Stock Balance Data to DB: Exception for stock: %s" % stock_uri) continue
def levermann_03(): stock_list = db.get_list(table=cst.TABLE_STOCKS, columns=cst.COLUMN_URI) for stock in stock_list: # equity_capital = db.get_equity_capital(stock) equity_capital = db.get_item( table=cst.TABLE_COMPANY_DATA, column=cst.COLUMN_EQUITY_CAPITAL, condition=[cst.COLUMN_STOCK_URI, stock], order=[cst.COLUMN_DATE, cst.DESC], ) # balance = db.get_balance(stock) balance = db.get_item( table=cst.TABLE_COMPANY_DATA, column=cst.COLUMN_BALANCE, condition=[cst.COLUMN_STOCK_URI, stock], order=[cst.COLUMN_DATE, cst.DESC], ) if equity_capital is None or balance is None or balance == 0: logger.info( "Calculate Lev03: Equity Capital or Balance is None or 0 for stock: %s" % stock) continue equity_ratio = round(equity_capital / balance, 2) if db.check_is_financial_company(stock): if equity_ratio > 0.10: lev_03_score = 1 elif equity_ratio < 0.05: lev_03_score = -1 else: lev_03_score = 0 else: if equity_ratio > 0.25: lev_03_score = 1 elif equity_ratio < 0.15: lev_03_score = -1 else: lev_03_score = 0 # db.save_equity_ratio_to_db(stock, equity_ratio, lev_03_score) db.upsert_item( table=cst.TABLE_LEVERMANN, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], current_date=date.get_current_date(), stock_uri=stock, lev_03_val=equity_ratio, lev_03_sco=lev_03_score, )
def levermann_02(): stock_list = db.get_list(table=cst.TABLE_STOCKS, columns=cst.COLUMN_URI) for stock in stock_list: # operative_result = db.get_operative_result(stock) operative_result = db.get_item( table=cst.TABLE_COMPANY_DATA, column=cst.COLUMN_OPERATIVE_RESULT, condition=[cst.COLUMN_STOCK_URI, stock], order=[cst.COLUMN_DATE, cst.DESC], ) # sales_revenue = db.get_sales_revenue(stock) sales_revenue = db.get_item( table=cst.TABLE_COMPANY_DATA, column=cst.COLUMN_SALES_REVENUE, condition=[cst.COLUMN_STOCK_URI, stock], order=[cst.COLUMN_DATE, cst.DESC], ) if operative_result is None or sales_revenue is None or sales_revenue == 0: logger.info( "Calculate Lev02: Operative Result or Sales Revenue is None for stock: %s" % stock) continue ebit = round(operative_result / sales_revenue, 2) if db.check_is_financial_company(stock): logger.info("Calculate Lev02: %s is financial Stock" % stock) ebit = 0 lev_02_score = 0 else: if ebit > 0.12: lev_02_score = 1 elif ebit < 0.06: lev_02_score = -1 else: lev_02_score = 0 # db.save_ebit_to_db(stock, ebit, lev_02_score) db.upsert_item( table=cst.TABLE_LEVERMANN, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], current_date=date.get_current_date(), stock_uri=stock, lev_02_val=ebit, lev_02_sco=lev_02_score, )
def levermann_06(): stock_list = db.get_list(table=cst.TABLE_STOCKS, columns=cst.COLUMN_URI) for stock in stock_list: ratings = db.get_analyst_ratings(stock) if ratings is None: logger.info("Calculate Lev06: Rating is None for stock: %s" % stock) continue rating_count = sum(ratings) if rating_count == 0: logger.info("Calculate Lev06: Zero Rating for stock: %s" % stock) rating = 0 lev_06_score = 0 else: rating = (1 * ratings[0] + 2 * ratings[1] + 3 * ratings[2]) / rating_count is_small_cap = db.is_small_cap(stock) if is_small_cap and 0 < rating_count <= 5 and 1.0 <= rating <= 1.5: lev_06_score = 1 elif is_small_cap and 0 < rating_count <= 5 and 1.5 < rating < 2.5: lev_06_score = 0 elif is_small_cap and 0 < rating_count <= 5 and 2.5 <= rating <= 3.0: lev_06_score = -1 elif 1.0 <= rating <= 1.5: lev_06_score = -1 elif 1.5 < rating < 2.5: lev_06_score = 0 elif 2.5 <= rating <= 3.0: lev_06_score = 1 else: lev_06_score = 5 # db.save_rating_to_db(stock, round(rating, 2), lev_06_score) db.upsert_item( table=cst.TABLE_LEVERMANN, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], current_date=date.get_current_date(), stock_uri=stock, lev_06_val=round(rating, 2), lev_06_sco=lev_06_score, )
def test_upsert_new_targets(self): current_date = "2019-03-09" stock_uri = "ab_inbev-Aktie" buy, hold, sell = 7, 1, 0 db.upsert_item( table=cst.TABLE_COMPANY_DATA, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], stock_uri=stock_uri, current_date=current_date, analyst_buy=buy, analyst_hold=hold, analyst_sell=sell, database=cst.TEST_DATABASE, ) self.assertEqual( buy, db.get_item( table=cst.TABLE_COMPANY_DATA, column=cst.COLUMN_ANALYST_BUY, condition=[cst.COLUMN_DATE, "2019-03-09"], database=cst.TEST_DATABASE, ), ) self.assertEqual( hold, db.get_item( table=cst.TABLE_COMPANY_DATA, column=cst.COLUMN_ANALYST_HOLD, condition=[cst.COLUMN_DATE, "2019-03-09"], database=cst.TEST_DATABASE, ), ) self.assertEqual( sell, db.get_item( table=cst.TABLE_COMPANY_DATA, column=cst.COLUMN_ANALYST_SELL, condition=[cst.COLUMN_DATE, "2019-03-09"], database=cst.TEST_DATABASE, ), )
def levermann_01(): stock_list = db.get_list(table=cst.TABLE_STOCKS, columns=cst.COLUMN_URI) for stock in stock_list: # earnings_before_tax = db.get_earnings_after_tax(stock) earnings_before_tax = db.get_item( table=cst.TABLE_COMPANY_DATA, column=cst.COLUMN_EARNINGS_AT, condition=[cst.COLUMN_STOCK_URI, stock], order=[cst.COLUMN_DATE, cst.DESC], ) # equity_capital = db.get_equity_capital(stock) equity_capital = db.get_item( table=cst.TABLE_COMPANY_DATA, column=cst.COLUMN_EQUITY_CAPITAL, condition=[cst.COLUMN_STOCK_URI, stock], order=[cst.COLUMN_DATE, cst.DESC], ) if earnings_before_tax is None or equity_capital is None or equity_capital == 0: logger.info( "Calculate Lev01: Earnings before Tax or Equity Capital is None for stock: %s" % stock) continue return_on_equity = round(earnings_before_tax / equity_capital, 2) if return_on_equity > 0.2: lev_01_score = 1 elif return_on_equity < 0.1: lev_01_score = -1 else: lev_01_score = 0 # db.save_roe_to_db(stock, return_on_equity, lev_01_score) db.upsert_item( table=cst.TABLE_LEVERMANN, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], current_date=date.get_current_date(), stock_uri=stock, lev_01_val=return_on_equity, lev_01_sco=lev_01_score, )
def write_stock_overview_data_to_db(): stock_list = db.get_list(table=cst.TABLE_STOCKS, columns=cst.COLUMN_URI) file_list = [ cst.PATH_STOCK_OVERVIEW + stock + cst.HTML_EXTENSION for stock in stock_list ] for file in file_list: stock_uri = file.split("/")[-1][:-5] stock_overview_soup = scrap.get_soup_code_from_file(file) if stock_overview_soup is None: logger.warning( "Write Stock Overview Data to DB: Stock Overview Soup is None for %s" % str(file)) continue market_cap = parse.get_market_cap(stock_overview_soup) if market_cap is None: logger.warning( "Write Stock Overview Data to DB: Market Cap is None for %s" % str(file)) market_cap = -1.00 stock_indices = str(parse.get_listed_indizes(stock_overview_soup)) stock_sectors = str(parse.get_sectors(stock_overview_soup)) market_place = parse.get_market_place(stock_overview_soup) db.upsert_item(table=cst.TABLE_COMPANY_DATA, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], stock_uri=stock_uri, market_cap=market_cap, current_date=date.get_current_date(), stock_indices=stock_indices, stock_sectors=stock_sectors) db.update_item(table=cst.TABLE_STOCKS, primary_keys=cst.COLUMN_URI, uri=stock_uri, market_place=market_place) stock_history_list = parse.get_historic_stock_prices_from_overview( stock_overview_soup) if stock_history_list is not None: db.write_stock_overview_history_to_db(stock_history_list, stock_uri)
def test_upsert_new_single_balance_data_to_db(self): current_date = "2019-03-23" stock_uri = "coca-cola-Aktie" earnings_at = 6434.00 operative_result = 9652.00 sales_revenue = 31697.00 balance = 83216.00 equity_capital = 19058.00 eps_m3 = 1.51 eps_m2 = 0.29 eps_m1 = 1.51 db.upsert_item( table=cst.TABLE_COMPANY_DATA, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], database=cst.TEST_DATABASE, current_date=current_date, stock_uri=stock_uri, earnings_after_tax=earnings_at, operative_result=operative_result, sales_revenue=sales_revenue, balance=balance, equity_capital=equity_capital, eps_m3=eps_m3, eps_m2=eps_m2, eps_m1=eps_m1, ) self.assertEqual( "1.51", str( db.get_item( table=cst.TABLE_COMPANY_DATA, column=cst.COLUMN_EPS_M3, condition=[cst.COLUMN_STOCK_URI, "coca-cola-Aktie"], database=cst.TEST_DATABASE, )), )
def test_upsert_existing_single_overview_data_to_db(self): stock_uri = "bechtle-Aktie" market_cap = "3230.00" current_date = "2019-03-16" stock_indices = ["TecDAX", "MDAX", "Prime All Share"] stock_sectors = [ "IT-Dienstleister", "IT-Beratung Hardware", "Dienstleistungen", "Internethandel (B2B, B2C)", "Informationstechnologie", ] db.upsert_item( table=cst.TABLE_COMPANY_DATA, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], database=cst.TEST_DATABASE, stock_uri=stock_uri, market_cap=market_cap, current_date=current_date, stock_indices=str(stock_indices), stock_sectors=str(stock_sectors), ) asserted_data = ["['TecDAX', 'MDAX', 'Prime All Share']"] self.assertEqual( asserted_data, db.get_list( table=cst.TABLE_COMPANY_DATA, columns=cst.COLUMN_INDICES, condition=[cst.COLUMN_STOCK_URI, "bechtle-Aktie"], database=cst.TEST_DATABASE, ), )
def levermann_04_05(): stock_list = db.get_list(table=cst.TABLE_STOCKS, columns=cst.COLUMN_URI) for stock in stock_list: # current_stock_price = db.get_latest_stock_price(stock) current_stock_price = db.get_item( table=cst.TABLE_STOCKS_HISTORIES, column=cst.COLUMN_CLOSING_VALUE, condition=[cst.COLUMN_STOCK_URI, stock], order=[cst.COLUMN_DATE, cst.DESC], ) eps = db.get_latest_eps(stock) if current_stock_price is None or eps is None: logger.info("Calculate Lev04/05: Current Stockprice is None: %s" % stock) continue if eps is None: logger.info("Calculate Lev04/05: EPS is None for stock: %s" % stock) continue if None in eps: logger.info("Calculate Lev04/05: Any Nones in EPS for stock: %s" % stock) continue eps_0 = eps[3] kgv5 = float(current_stock_price) / (sum(eps) / 5) if sum(eps) != 0 else 9999.99 kgv5 = 9999.99 if kgv5 > 9999.99 else kgv5 kgv0 = float(current_stock_price) / eps_0 if eps_0 != 0 else 14 kgv0 = 9999.99 if kgv0 > 9999.99 else kgv0 if 0 < kgv5 < 12: lev_04_score = 1 elif 12 < kgv5 < 16: lev_04_score = 0 elif kgv5 <= 0 or kgv5 >= 16: lev_04_score = -1 else: lev_04_score = 0 # db.save_kgv5_to_db(stock, round(kgv5, 2), lev_04_score) db.upsert_item( table=cst.TABLE_LEVERMANN, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], current_date=date.get_current_date(), stock_uri=stock, lev_04_val=round(kgv5, 2), lev_04_sco=lev_04_score, ) if 0 < kgv0 < 12: lev_05_score = 1 elif 12 < kgv0 < 16: lev_05_score = 0 elif kgv0 <= 0 or kgv0 >= 16: lev_05_score = -1 else: lev_05_score = 0 # db.save_kgv0_to_db(stock, round(kgv0, 2), lev_05_score) db.upsert_item( table=cst.TABLE_LEVERMANN, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], current_date=date.get_current_date(), stock_uri=stock, lev_05_val=round(kgv0, 2), lev_05_sco=lev_05_score, )
def test_upsert_new_single_overview_data_to_db(self): current_date = "2019-03-23" stock_uri = "coca-cola-Aktie" market_cap = "171390.00" stock_indices = [ "Dow Jones", "S&P 500", "S&P 100", "NYSE US 100", "IGPA", "BX Swiss - USA", ] stock_sectors = '["Getränke / Tabak"]' db.upsert_item( table=cst.TABLE_COMPANY_DATA, primary_keys=[cst.COLUMN_STOCK_URI, cst.COLUMN_DATE], database=cst.TEST_DATABASE, stock_uri=stock_uri, market_cap=market_cap, current_date=current_date, stock_indices=str(stock_indices), stock_sectors=str(stock_sectors), ) asserted_company_data_content_after = [ [ "3i-Aktie", '["FTSE 100", "FTSE Allshare"]', '["Finanzdienstleister"]' ], [ "ab_inbev-Aktie", '["EURO STOXX 50", "STOXX 50", "BEL 20", "EURONEXT 100", "EURO STOXX", "Next CAC 70", "BX Swiss - EMEA"]', '["Getränke / Tabak"]', ], [ "ab_inbev-Aktie", '["STOXX 50", "EURO STOXX 50", "BEL 20", "EURONEXT 100", "EURO STOXX", "Next CAC 70", "BX Swiss - EMEA"]', '["Getränke / Tabak"]', ], [ "bechtle-Aktie", '["TecDAX", "MDAX", "Prime All Share", "LMDAX", "Technology All Share", "HDAX", "LTecDAX", "CDAX", "MDAX Kursindex", "TecDAX Kursindex", "BX Swiss - EMEA", "DAXglobal Sarasin Sustainability Germany Index EUR", "QIX Deutschland", "DAXglobal Sarasin Sustainability Germany", "Schatten-Index-SDAX", "Schatten-Index-TecDAX"]', '["IT-Dienstleister", "IT-Beratung Hardware", "Dienstleistungen", "Internethandel (B2B, B2C)", "Informationstechnologie"]', ], [ "cellcom_israel-Aktie", '["TA-100"]', '["Telekommunikation", "Mobilkommunikation", "Netzbetreiber (Carrier)", "IT-Dienstleister"]', ], [ "coca-cola-Aktie", "['Dow Jones', 'S&P 500', 'S&P 100', 'NYSE US 100', 'IGPA', 'BX Swiss - USA']", '["Getränke / Tabak"]', ], ] self.assertEqual( asserted_company_data_content_after, db.get_list( table=cst.TABLE_COMPANY_DATA, columns=[ cst.COLUMN_STOCK_URI, cst.COLUMN_INDICES, cst.COLUMN_SECTORS ], database=cst.TEST_DATABASE, ), )