def __init__(self, symbol): # TODO gestire il caso in cui il simbolo è sbagliato ticker = Ticker(symbol) self.symbol = symbol self.name = ticker.quote_type[symbol]['longName'] self.currency = ticker.financial_data[symbol]['financialCurrency'] self.exchange = ticker.quote_type[symbol]['exchange'] self.industry = ticker.asset_profile[symbol]['industry'] self.sector = ticker.asset_profile[symbol]['sector'] self.current_price = ticker.financial_data[symbol]['currentPrice'] if 'dividendRate' in ticker.summary_detail[symbol]: self.dividend_rate = ticker.summary_detail[symbol]['dividendRate'] else: self.dividend_rate = 0 self.eps = ticker.key_stats[symbol]['trailingEps'] self.roe = ticker.financial_data[symbol]['returnOnEquity'] # Calcolo del growth rate sulla base della crescita dei dividendi degli ultimi 5 anni e del core growth stimato self.dividends = ticker.cash_flow()['CashDividendsPaid'] self.dividend_perc_growth = self.dividends.pct_change().dropna().mean() # TODO calcolare il core gorwth,per ora usiamo la media dei dividendi negli ultimi 5 anni self.core_growth = self.dividend_perc_growth #! da correggere quando si inserirà il core growth, non tiene conto di rendimenti superiori al 10% i = (self.core_growth * 100).round() if i > 10: i = 10 req_return = _hurdle_return[i] self.buy_value = (self.dividend_rate / (req_return - self.core_growth)) self.actual_return = (self.dividend_rate / self.current_price) + self.core_growth
def get(self): s = Ticker(self.stock.symbol, timeout=15) # all numbers convert to million df = s.cash_flow(frequency="q") if "unavailable" in df or "error" in df: logger.error("{}: {}".format(self.stock.symbol, df)) return # DB doesn't like NaN df = df.where(pd.notnull(df), 0) mapping = { "beginning_cash": "BeginningCashPosition", "ending_cash": "EndCashPosition", "free_cash_flow": "FreeCashFlow", "investing_cash_flow": "InvestingCashFlow", "net_income": "NetIncome", "operating_cash_flow": "OperatingCashFlow", "da": "DepreciationAndAmortization", "capex": "CapitalExpenditure", "from_continuing_financing_activity": "CashFlowFromContinuingFinancingActivities", "change_in_working_capital": "ChangeInWorkingCapital", "stock_based_compensation": "StockBasedCompensation", "change_in_cash_supplemental_as_reported": "ChangeInCashSupplementalAsReported", "sale_of_investment": "SaleOfInvestment", "purchase_of_investment": "PurchaseOfInvestment", "common_stock_issuance": "CommonStockIssuance", "repurchase_of_capital_stock": "RepurchaseOfCapitalStock", "change_in_inventory": "ChangeInInventory", "dividend_paid": "CashDividendsPaid", "change_in_account_payable": "ChangeInAccountPayable", "change_in_account_receivable": "ChangesInAccountReceivables", "purchase_of_business": "PurchaseOfBusiness", "net_other_financing_charges": "NetOtherFinancingCharges", "net_other_investing_changes": "NetOtherInvestingChanges", } # enumerate data frame for row in df.itertuples(index=False): i, created = CashFlow.objects.get_or_create( stock=self.stock, on=row.asOfDate.date() ) for key, val in mapping.items(): try: tmp = float(getattr(row, val)) except AttributeError: tmp = 0 # if tmp is a large number, it's unlikely a rate, # eg. tax rate, thus convert it to B. if abs(tmp) > M: tmp = tmp / B # set value setattr(i, key, tmp) i.save()
def fetch(self, dataset: AnyStr, ticker: Ticker, **kwargs): if dataset == "income_statement": output = ticker.income_statement(frequency=kwargs.get("period"), trailing=False) elif dataset == "cash_flow": output = ticker.cash_flow(frequency=kwargs.get("period"), trailing=False) elif dataset == "balance_sheet": output = ticker.balance_sheet(frequency=kwargs.get("period"), trailing=False) else: return DataFrame() if type(output) == DataFrame: return output else: self.logger.warning(output) return DataFrame()
df_stocks = pd.read_csv(r"/Users/matthew/Documents/UNI/Coding/Stock.csv") df_stocks.columns = ["Stocks"] stocklist = df_stocks["Stocks"].values.tolist() tickers = Ticker(stocklist) # Key Stats Data keystats = tickers.key_stats esg_scores = tickers.summary_detail # Storing the income statement data into a dataframe df_balance = tickers.balance_sheet().transpose() df_income = tickers.income_statement().transpose() df_cashflow = tickers.cash_flow().transpose() df_keystats = pd.DataFrame.from_dict(keystats) df_summary = pd.DataFrame(tickers.summary_detail) # Defining all the empty directories all_stat_income = {} all_stat_balance = {} all_stat_cashflow = {} all_stat_keystat = {} all_stat_summary = {} # All the data directories stats_income = ["asOfDate", "EBIT", "NetIncome", "NetIncomeCommonStockholders"] stats_balance = ["asOfDate", "CurrentAssets", "CurrentLiabilities", "NetPPE","StockholdersEquity","TotalDebt"]
def calcIntVal(self): outst_shrs_list = [] Eps_1to5y_list = [] discount_rate_list = [] last_close_list = [] intrisic_per_share_list = [] for tick in self.ticks: #### Retrieve Stock #### stock_yq = Ticker(tick) stock_fv = fv.get_stock(tick) #### Cash Flow #### cash_fl = stock_yq.cash_flow(frequency="a") op_cash = cash_fl.tail(1).loc[:, "OperatingCashFlow"] #### Balance Sheet #### bal_sheet = stock_yq.balance_sheet(frequency="q") if "TotalDebt" in bal_sheet: total_debt = bal_sheet.tail(1).loc[:, "TotalDebt"] else: total_debt = 0 cash_short_term_investment = bal_sheet.tail( 1).loc[:, "CashCashEquivalentsAndShortTermInvestments"] #### Growth Rate #### try: Eps_1to5y = float(stock_fv["EPS next 5Y"].strip(' \t\n\r%')) except ValueError: Eps_1to5y = 0 if Eps_1to5y >= 15: Eps_6to10y = 15 else: Eps_6to10y = Eps_1to5y #### Last Close #### last_close = stock_yq.price[tick]["regularMarketPrice"] #### Outstanding Shares ### outst_shrs = self.text_to_num(stock_fv["Shs Outstand"]) #### Discount Rate #### try: beta = float(stock_fv["Beta"]) except ValueError: beta = 0 risk_free_rate = 0.64 mrkt_risk_prem = 5 discount_rate = round(risk_free_rate + beta * mrkt_risk_prem, 1) #### Present Value of 10 year Cash Flows #### PV_10y_CF_li = [] for x in range(10): if x == 0: Op_cash_flow_proj = op_cash * (1 + (Eps_1to5y / 100)) elif x > 5: Op_cash_flow_proj = op_cash * (1 + (Eps_6to10y / 100)) else: Op_cash_flow_proj = Op_cash_flow_proj * (1 + (Eps_1to5y / 100)) if x == 0: discount_factor = (1 / (1 + discount_rate / 100)) else: discount_factor = (discount_factor / (1 + discount_rate / 100)) Op_cash_flow_proj_discounted = Op_cash_flow_proj * discount_factor PV_10y_CF_li.append(Op_cash_flow_proj_discounted) PV_10y_CF = sum(PV_10y_CF_li) #### Intrinsic Value before cash/debt #### if outst_shrs != 0: intrisic_bfr_cash_dbt = round(PV_10y_CF / outst_shrs, 2) else: intrisic_bfr_cash_dbt = 0 #### Less Debt per Share #### if outst_shrs != 0: less_dbt_per_shr = round(total_debt / outst_shrs, 2) else: less_dbt_per_shr = 0 #### Plus (+) Cash Per Share #### if outst_shrs != 0: plus_cash_per_shr = round( cash_short_term_investment / outst_shrs, 2) else: plus_cash_per_shr = 0 #### Final Intrinsic Value Per Share #### intrisic_per_share = intrisic_bfr_cash_dbt - less_dbt_per_shr + plus_cash_per_shr #### Discount/Premium #### #discount_premium = (last_close - intrisic_per_share)/intrisic_per_share outst_shrs_list.append(self.num_to_text(outst_shrs)) Eps_1to5y_list.append(Eps_1to5y) discount_rate_list.append(discount_rate) last_close_list.append(last_close) intrisic_per_share_list.append( round(intrisic_per_share.get(tick), 2)) data = { 'symbol': self.ticks, 'outst_shrs': outst_shrs_list, 'Eps_1to5y': Eps_1to5y_list, 'discount_rate': discount_rate_list, 'last_close': last_close_list, 'intrisic_per_share': intrisic_per_share_list } df = pd.DataFrame.from_dict(data) return df