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()
示例#3
0
    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()
示例#4
0
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"]
示例#5
0
    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