diff --git a/openbb_terminal/portfolio/portfolio_optimization/optimizer_model.py b/openbb_terminal/portfolio/portfolio_optimization/optimizer_model.py index 74de6af47b5..afdc5ec13b1 100644 --- a/openbb_terminal/portfolio/portfolio_optimization/optimizer_model.py +++ b/openbb_terminal/portfolio/portfolio_optimization/optimizer_model.py @@ -302,14 +302,12 @@ def get_property_weights( prop = {} prop_sum = 0 for stock in symbols: - stock_prop = yf.Ticker(stock).info[s_property] - if stock_prop is None: - stock_prop = 0 + stock_prop = get_prop(symbol=stock, prop=s_property) prop[stock] = stock_prop prop_sum += stock_prop if prop_sum == 0: - console.print(f"No {s_property} was found on list of tickers provided", "\n") + console.print(f"No '{s_property}' was found on list of tickers provided", "\n") return None, None weights = {k: value * v / prop_sum for k, v in prop.items()} @@ -317,6 +315,48 @@ def get_property_weights( return weights, stock_returns +@log_start_end(log=logger) +def get_prop(symbol, prop) -> float: + """Get property from yfinance + + Parameters + ---------- + symbol : str + Stock ticker + prop : str + Property to get + + Returns + ------- + dict + Ticker info + """ + prop = yahoo_finance_model.fast_info_map.get(prop, prop) + + try: + info = yf.Ticker(symbol).info + except Exception as _: # noqa + info = None + + try: + fast_info = yf.Ticker(symbol).fast_info + except Exception as _: # noqa + fast_info = None + + info_dict = {} + if info: + info_dict.update(dict(info)) + if fast_info: + info_dict.update(dict(fast_info)) + + if info_dict: + value = info_dict.get(prop, 0.0) + if not value: + return 0.0 + return value + return 0.0 + + @log_start_end(log=logger) def get_mean_risk_portfolio( symbols: List[str], @@ -1365,6 +1405,9 @@ def get_black_litterman_portfolio( value=value, ) + if benchmark is None: + return None, stock_returns + factor = time_factor[freq.upper()] risk_free_rate = risk_free_rate / factor diff --git a/openbb_terminal/portfolio/portfolio_optimization/yahoo_finance_model.py b/openbb_terminal/portfolio/portfolio_optimization/yahoo_finance_model.py index e54fe7133f9..b8eefb379ea 100644 --- a/openbb_terminal/portfolio/portfolio_optimization/yahoo_finance_model.py +++ b/openbb_terminal/portfolio/portfolio_optimization/yahoo_finance_model.py @@ -19,9 +19,29 @@ logger = logging.getLogger(__name__) # pylint: disable=R0912, E1101 +fast_info_map = { + "previousClose": "previous_close", + "twoHundredDayAverage": "two_hundred_day_average", + "regularMarketDayHigh": "day_high", + "averageDailyVolume10Day": "ten_day_average_volume", + "regularMarketPreviousClose": "regular_market_previous_close", + "fiftyDayAverage": "fifty_day_average", + "open": "open", + "averageVolume10days": "ten_day_average_volume", + "regularMarketDayLow": "day_low", + "currency": "currency", + "marketCap": "market_cap", + "averageVolume": "three_month_average_volume", + "dayLow": "day_low", + "volume": "last_volume", + "fiftyTwoWeekHigh": "year_high", + "fiftyTwoWeekLow": "year_low", + "dayHigh": "day_high", + "regularMarketPrice": "last_price", +} + yf_info_choices = [ "previousClose", - "regularMarketOpen", "twoHundredDayAverage", "trailingAnnualDividendYield", "payoutRatio", @@ -30,7 +50,6 @@ yf_info_choices = [ "navPrice", "averageDailyVolume10Day", "totalAssets", - "regularMarketPreviousClose", "fiftyDayAverage", "trailingAnnualDividendRate", "open", @@ -47,11 +66,9 @@ yf_info_choices = [ "priceHint", "currency", "trailingPE", - "regularMarketVolume", "lastMarket", "maxSupply", "openInterest", - "marketCap", "volumeAllCurrencies", "strikePrice", "averageVolume",