Skip to content

Commit

Permalink
Add 'quoteType'. Improve handling tickers without trading
Browse files Browse the repository at this point in the history
  • Loading branch information
ValueRaider committed Jan 30, 2023
1 parent da8c490 commit 9afa315
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 20 deletions.
10 changes: 6 additions & 4 deletions tests/ticker.py
Original file line number Diff line number Diff line change
Expand Up @@ -703,18 +703,20 @@ def test_fast_info(self):
fast_info_keys = sorted(list(fast_info_keys))

key_rename_map = {}
key_rename_map["currency"] = "currency"
key_rename_map["quote_type"] = "quoteType"
key_rename_map["timezone"] = "exchangeTimezoneName"

key_rename_map["last_price"] = ["currentPrice", "regularMarketPrice"]
key_rename_map["open"] = ["open", "regularMarketOpen"]
key_rename_map["day_high"] = ["dayHigh", "regularMarketDayHigh"]
key_rename_map["day_low"] = ["dayLow", "regularMarketDayLow"]
key_rename_map["previous_close"] = ["previousClose"]
key_rename_map["regular_market_previous_close"] = ["regularMarketPreviousClose"]

# preMarketPrice

key_rename_map["fifty_day_average"] = "fiftyDayAverage"
key_rename_map["two_hundred_day_average"] = "twoHundredDayAverage"
key_rename_map["year_change"] = "52WeekChange"
key_rename_map["year_change"] = ["52WeekChange", "fiftyTwoWeekChange"]
key_rename_map["year_high"] = "fiftyTwoWeekHigh"
key_rename_map["year_low"] = "fiftyTwoWeekLow"

Expand All @@ -724,7 +726,6 @@ def test_fast_info(self):

key_rename_map["market_cap"] = "marketCap"
key_rename_map["shares"] = "sharesOutstanding"
key_rename_map["timezone"] = "exchangeTimezoneName"

for k in list(key_rename_map.keys()):
if '_' in k:
Expand All @@ -737,6 +738,7 @@ def test_fast_info(self):

# Loose tolerance for averages, no idea why don't match info[]. Is info wrong?
custom_tolerances = {}
custom_tolerances["year_change"] = 1.0
# custom_tolerances["ten_day_average_volume"] = 1e-3
custom_tolerances["ten_day_average_volume"] = 1e-1
# custom_tolerances["three_month_average_volume"] = 1e-2
Expand Down
55 changes: 42 additions & 13 deletions yfinance/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ def __init__(self, tickerBaseObject):
self._md = None

self._currency = None
self._quote_type = None
self._exchange = None
self._timezone = None

Expand Down Expand Up @@ -88,19 +89,19 @@ def __init__(self, tickerBaseObject):
# attrs = utils.attributes(self)
# self.keys = attrs.keys()
# utils.attributes is calling each method, bad! Have to hardcode
orig_keys = ["currency", "exchange", "timezone"]
orig_keys += ["shares", "market_cap"]
orig_keys += ["last_price", "previous_close", "open", "day_high", "day_low"]
orig_keys += ["regular_market_previous_close"]
orig_keys += ["last_volume"]
orig_keys += ["fifty_day_average", "two_hundred_day_average", "ten_day_average_volume", "three_month_average_volume"]
orig_keys += ["year_high", "year_low", "year_change"]
_properties = ["currency", "quote_type", "exchange", "timezone"]
_properties += ["shares", "market_cap"]
_properties += ["last_price", "previous_close", "open", "day_high", "day_low"]
_properties += ["regular_market_previous_close"]
_properties += ["last_volume"]
_properties += ["fifty_day_average", "two_hundred_day_average", "ten_day_average_volume", "three_month_average_volume"]
_properties += ["year_high", "year_low", "year_change"]

# Because released before fixing key case, need to officially support
# camel-case but also secretly support snake-case
base_keys = [k for k in orig_keys if not '_' in k]
base_keys = [k for k in _properties if not '_' in k]

sc_keys = [k for k in orig_keys if '_' in k]
sc_keys = [k for k in _properties if '_' in k]

self._sc_to_cc_key = {k:utils.snake_case_2_camelCase(k) for k in sc_keys}
self._cc_to_sc_key = {v:k for k,v in self._sc_to_cc_key.items()}
Expand Down Expand Up @@ -145,7 +146,7 @@ def toJSON(self, indent=4):

def _get_1y_prices(self, fullDaysOnly=False):
if self._prices_1y is None:
self._prices_1y = self._tkr.history(period="380d", auto_adjust=False, debug=False)
self._prices_1y = self._tkr.history(period="380d", auto_adjust=False, debug=False, keepna=True)
self._md = self._tkr.get_history_metadata()
try:
ctp = self._md["currentTradingPeriod"]
Expand Down Expand Up @@ -221,6 +222,17 @@ def currency(self):
self._currency = md["currency"]
return self._currency

@property
def quote_type(self):
if self._quote_type is not None:
return self._quote_type

if self._tkr._history_metadata is None:
self._get_1y_prices()
md = self._tkr.get_history_metadata()
self._quote_type = md["instrumentType"]
return self._quote_type

@property
def exchange(self):
if self._exchange is not None:
Expand Down Expand Up @@ -261,6 +273,8 @@ def last_price(self):
self._last_price = self._get_exchange_metadata()["regularMarketPrice"]
else:
self._last_price = float(prices["Close"].iloc[-1])
if _np.isnan(self._last_price):
self._last_price = self._get_exchange_metadata()["regularMarketPrice"]
return self._last_price

@property
Expand Down Expand Up @@ -306,23 +320,38 @@ def open(self):
if self._open is not None:
return self._open
prices = self._get_1y_prices()
self._open = None if prices.empty else float(prices["Open"].iloc[-1])
if prices.empty:
self._open = None
else:
self._open = float(prices["Open"].iloc[-1])
if _np.isnan(self._open):
self._open = None
return self._open

@property
def day_high(self):
if self._day_high is not None:
return self._day_high
prices = self._get_1y_prices()
self._day_high = None if prices.empty else float(prices["High"].iloc[-1])
if prices.empty:
self._day_high = None
else:
self._day_high = float(prices["High"].iloc[-1])
if _np.isnan(self._day_high):
self._day_high = None
return self._day_high

@property
def day_low(self):
if self._day_low is not None:
return self._day_low
prices = self._get_1y_prices()
self._day_low = None if prices.empty else float(prices["Low"].iloc[-1])
if prices.empty:
self._day_low = None
else:
self._day_low = float(prices["Low"].iloc[-1])
if _np.isnan(self._day_low):
self._day_low = None
return self._day_low

@property
Expand Down
7 changes: 4 additions & 3 deletions yfinance/scrapers/quote.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@
from yfinance.data import TickerData


info_retired_keys_price = {"currentPrice", "dayHigh", "dayLow", "open", "previousClose", "volume"}
info_retired_keys_price = {"currentPrice", "dayHigh", "dayLow", "open", "previousClose", "volume", "volume24Hr"}
info_retired_keys_price.update({"regularMarket"+s for s in ["DayHigh", "DayLow", "Open", "PreviousClose", "Price", "Volume"]})
info_retired_keys_price.update({"fiftyTwoWeekLow", "fiftyTwoWeekHigh", "fiftyTwoWeekChange", "fiftyDayAverage", "twoHundredDayAverage"})
info_retired_keys_price.update({"fiftyTwoWeekLow", "fiftyTwoWeekHigh", "fiftyTwoWeekChange", "52WeekChange", "fiftyDayAverage", "twoHundredDayAverage"})
info_retired_keys_price.update({"averageDailyVolume10Day", "averageVolume10days", "averageVolume"})
info_retired_keys_exchange = {"currency", "exchange", "exchangeTimezoneName", "exchangeTimezoneShortName"}
info_retired_keys_marketCap = {"marketCap"}
info_retired_keys_symbol = {"symbol"}
info_retired_keys = info_retired_keys_price | info_retired_keys_exchange | info_retired_keys_marketCap | info_retired_keys_symbol
info_retired_keys_misc = {"quoteType"}
info_retired_keys = info_retired_keys_price | info_retired_keys_exchange | info_retired_keys_marketCap | info_retired_keys_symbol | info_retired_keys_misc


PRUNE_INFO = True
Expand Down

0 comments on commit 9afa315

Please sign in to comment.