Compare commits

...

4 Commits

Author SHA1 Message Date
ValueRaider
91666197c6 Fix Market.summary 2024-12-21 12:46:43 +00:00
ValueRaider
63698c56c3 Improve Market.status formatting 2024-12-21 12:36:18 +00:00
ValueRaider
05d744773f Remove unused raise_errors 2024-12-20 18:51:40 +00:00
ValueRaider
48bdfa06c8 Proof-of-concept Market class 2024-12-20 18:47:10 +00:00
3 changed files with 89 additions and 2 deletions

View File

@@ -28,6 +28,7 @@ from .utils import enable_debug_mode
from .cache import set_tz_cache_location
from .domain.sector import Sector
from .domain.industry import Industry
from .domain.market import Market
from .screener.screener import Screener
from .screener.screener_query import EquityQuery
@@ -38,4 +39,4 @@ import warnings
warnings.filterwarnings('default', category=DeprecationWarning, module='^yfinance')
__all__ = ['download', 'Search', 'Ticker', 'Tickers', 'enable_debug_mode', 'set_tz_cache_location', 'Sector',
'Industry', 'EquityQuery', 'Screener']
'Industry', 'EquityQuery', 'Screener', 'Market']

View File

@@ -1,5 +1,6 @@
# domain/__init__.py
from .sector import Sector
from .industry import Industry
from .market import Market
__all__ = ['Sector', 'Industry']
__all__ = ['Sector', 'Industry', 'Market']

85
yfinance/domain/market.py Normal file
View File

@@ -0,0 +1,85 @@
from ..data import YfData
from ..data import utils
from ..const import _QUERY1_URL_
# from .domain import Domain
import pandas as pd
class Market():
def __init__(self, market:'str', session=None, proxy=None, timeout=30):
self.market = market
self.session = session
self.proxy = proxy
self.timeout = timeout
self._data = YfData(session=self.session)
self._logger = utils.get_yf_logger()
self._status = None
self._summary = None
def _fetch_json(self, url, params):
data = self._data.cache_get(url=url, params=params, proxy=self.proxy, timeout=self.timeout)
if data is None or "Will be right back" in data.text:
raise RuntimeError("*** YAHOO! FINANCE IS CURRENTLY DOWN! ***\n"
"Our engineers are working quickly to resolve "
"the issue. Thank you for your patience.")
try:
return data.json()
except _json.JSONDecodeError:
self._logger.error(f"{self.market}: Failed to retrieve market data and recieved faulty data.")
return {}
@property
def status(self):
if self._status is not None:
return self._status
url = f"{_QUERY1_URL_}/v6/finance/markettime"
params = {
"formatted": True,
"key": "finance",
"lang": "en-GB",
"market": self.market
}
self._status = self._fetch_json(url, params)
try:
# Unpack
self._status = self._status['finance']['marketTimes'][0]['marketTime'][0]
self._status['timezone'] = self._status['timezone'][0]
del self._status['time'] # redundant
except:
pass
try:
# Localise
tz = self._status['timezone']['$text']
open2 = pd.Timestamp(self._status['open']).tz_convert(tz)
close2 = pd.Timestamp(self._status['close']).tz_convert(tz)
self._status['open'] = open2
self._status['close'] = close2
except:
pass
return self._status
@property
def summary(self):
if self._summary is not None:
return self._summary
url = f"{_QUERY1_URL_}/v6/finance/quote/marketSummary"
fields = ["shortName", "regularMarketPrice", "regularMarketChange", "regularMarketChangePercent"]
params = {
"fields": ",".join(fields),
"formatted": False,
"lang": "en-US",
"market": self.market
}
self._summary = self._fetch_json(url, params)
try:
self._summary = self._summary['marketSummaryResponse']['result']
self._summary = {x['exchange']:x for x in self._summary}
except:
pass
return self._summary