diff --git a/polygon/rest/__init__.py b/polygon/rest/__init__.py index 46f2b98f..77f198ca 100644 --- a/polygon/rest/__init__.py +++ b/polygon/rest/__init__.py @@ -1,5 +1,8 @@ from .aggs import AggsClient from .futures import FuturesClient +from .benzinga import BenzingaClient +from .economy import EconomyClient +from .tmx import TmxClient from .trades import TradesClient from .quotes import QuotesClient from .snapshot import SnapshotClient @@ -25,6 +28,9 @@ class RESTClient( AggsClient, FuturesClient, + BenzingaClient, + EconomyClient, + TmxClient, TradesClient, QuotesClient, SnapshotClient, diff --git a/polygon/rest/benzinga.py b/polygon/rest/benzinga.py new file mode 100644 index 00000000..e0e5cf03 --- /dev/null +++ b/polygon/rest/benzinga.py @@ -0,0 +1,438 @@ +from typing import Optional, Any, Dict, List, Union, Iterator +from urllib3 import HTTPResponse +from datetime import datetime, date + +from .base import BaseClient +from .models.benzinga import ( + BenzingaAnalystInsight, + BenzingaAnalyst, + BenzingaConsensusRating, + BenzingaEarning, + BenzingaFirm, + BenzingaGuidance, + BenzingaNews, + BenzingaRating, +) +from .models.common import Sort +from .models.request import RequestOptionBuilder + + +class BenzingaClient(BaseClient): + """ + Client for the Benzinga REST Endpoints + (aligned with the paths from /benzinga/v1/...) + """ + + def list_benzinga_analyst_insights( + self, + date: Optional[Union[str, date]] = None, + date_any_of: Optional[str] = None, + date_gt: Optional[Union[str, date]] = None, + date_gte: Optional[Union[str, date]] = None, + date_lt: Optional[Union[str, date]] = None, + date_lte: Optional[Union[str, date]] = None, + ticker: Optional[str] = None, + ticker_any_of: Optional[str] = None, + ticker_gt: Optional[str] = None, + ticker_gte: Optional[str] = None, + ticker_lt: Optional[str] = None, + ticker_lte: Optional[str] = None, + last_updated: Optional[str] = None, + last_updated_any_of: Optional[str] = None, + last_updated_gt: Optional[str] = None, + last_updated_gte: Optional[str] = None, + last_updated_lt: Optional[str] = None, + last_updated_lte: Optional[str] = None, + firm: Optional[str] = None, + firm_any_of: Optional[str] = None, + firm_gt: Optional[str] = None, + firm_gte: Optional[str] = None, + firm_lt: Optional[str] = None, + firm_lte: Optional[str] = None, + rating_action: Optional[str] = None, + rating_action_any_of: Optional[str] = None, + rating_action_gt: Optional[str] = None, + rating_action_gte: Optional[str] = None, + rating_action_lt: Optional[str] = None, + rating_action_lte: Optional[str] = None, + benzinga_firm_id: Optional[str] = None, + benzinga_firm_id_any_of: Optional[str] = None, + benzinga_firm_id_gt: Optional[str] = None, + benzinga_firm_id_gte: Optional[str] = None, + benzinga_firm_id_lt: Optional[str] = None, + benzinga_firm_id_lte: Optional[str] = None, + benzinga_rating_id: Optional[str] = None, + benzinga_rating_id_any_of: Optional[str] = None, + benzinga_rating_id_gt: Optional[str] = None, + benzinga_rating_id_gte: Optional[str] = None, + benzinga_rating_id_lt: Optional[str] = None, + benzinga_rating_id_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[BenzingaAnalystInsight], HTTPResponse]: + """ + Endpoint: GET /benzinga/v1/analyst-insights + """ + url = "/benzinga/v1/analyst-insights" + return self._paginate( + path=url, + params=self._get_params(self.list_benzinga_analyst_insights, locals()), + raw=raw, + deserializer=BenzingaAnalystInsight.from_dict, + options=options, + ) + + def list_benzinga_analysts( + self, + benzinga_id: Optional[str] = None, + benzinga_id_any_of: Optional[str] = None, + benzinga_id_gt: Optional[str] = None, + benzinga_id_gte: Optional[str] = None, + benzinga_id_lt: Optional[str] = None, + benzinga_id_lte: Optional[str] = None, + benzinga_firm_id: Optional[str] = None, + benzinga_firm_id_any_of: Optional[str] = None, + benzinga_firm_id_gt: Optional[str] = None, + benzinga_firm_id_gte: Optional[str] = None, + benzinga_firm_id_lt: Optional[str] = None, + benzinga_firm_id_lte: Optional[str] = None, + firm_name: Optional[str] = None, + firm_name_any_of: Optional[str] = None, + firm_name_gt: Optional[str] = None, + firm_name_gte: Optional[str] = None, + firm_name_lt: Optional[str] = None, + firm_name_lte: Optional[str] = None, + full_name: Optional[str] = None, + full_name_any_of: Optional[str] = None, + full_name_gt: Optional[str] = None, + full_name_gte: Optional[str] = None, + full_name_lt: Optional[str] = None, + full_name_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[BenzingaAnalyst], HTTPResponse]: + """ + Endpoint: GET /benzinga/v1/analysts + """ + url = "/benzinga/v1/analysts" + return self._paginate( + path=url, + params=self._get_params(self.list_benzinga_analysts, locals()), + raw=raw, + deserializer=BenzingaAnalyst.from_dict, + options=options, + ) + + def list_benzinga_consensus_ratings( + self, + ticker: str, + date: Optional[Union[str, date]] = None, + date_gt: Optional[Union[str, date]] = None, + date_gte: Optional[Union[str, date]] = None, + date_lt: Optional[Union[str, date]] = None, + date_lte: Optional[Union[str, date]] = None, + limit: Optional[int] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[BenzingaConsensusRating], HTTPResponse]: + """ + Endpoint: GET /benzinga/v1/consensus-ratings/{ticker} + """ + url = f"/benzinga/v1/consensus-ratings/{ticker}" + return self._paginate( + path=url, + params=self._get_params(self.list_benzinga_consensus_ratings, locals()), + raw=raw, + deserializer=BenzingaConsensusRating.from_dict, + options=options, + ) + + def list_benzinga_earnings( + self, + date: Optional[Union[str, date]] = None, + date_any_of: Optional[str] = None, + date_gt: Optional[Union[str, date]] = None, + date_gte: Optional[Union[str, date]] = None, + date_lt: Optional[Union[str, date]] = None, + date_lte: Optional[Union[str, date]] = None, + ticker: Optional[str] = None, + ticker_any_of: Optional[str] = None, + ticker_gt: Optional[str] = None, + ticker_gte: Optional[str] = None, + ticker_lt: Optional[str] = None, + ticker_lte: Optional[str] = None, + importance: Optional[int] = None, + importance_any_of: Optional[str] = None, + importance_gt: Optional[int] = None, + importance_gte: Optional[int] = None, + importance_lt: Optional[int] = None, + importance_lte: Optional[int] = None, + last_updated: Optional[str] = None, + last_updated_any_of: Optional[str] = None, + last_updated_gt: Optional[str] = None, + last_updated_gte: Optional[str] = None, + last_updated_lt: Optional[str] = None, + last_updated_lte: Optional[str] = None, + date_status: Optional[str] = None, + date_status_any_of: Optional[str] = None, + date_status_gt: Optional[str] = None, + date_status_gte: Optional[str] = None, + date_status_lt: Optional[str] = None, + date_status_lte: Optional[str] = None, + eps_surprise_percent: Optional[float] = None, + eps_surprise_percent_any_of: Optional[str] = None, + eps_surprise_percent_gt: Optional[float] = None, + eps_surprise_percent_gte: Optional[float] = None, + eps_surprise_percent_lt: Optional[float] = None, + eps_surprise_percent_lte: Optional[float] = None, + revenue_surprise_percent: Optional[float] = None, + revenue_surprise_percent_any_of: Optional[str] = None, + revenue_surprise_percent_gt: Optional[float] = None, + revenue_surprise_percent_gte: Optional[float] = None, + revenue_surprise_percent_lt: Optional[float] = None, + revenue_surprise_percent_lte: Optional[float] = None, + fiscal_year: Optional[int] = None, + fiscal_year_any_of: Optional[str] = None, + fiscal_year_gt: Optional[int] = None, + fiscal_year_gte: Optional[int] = None, + fiscal_year_lt: Optional[int] = None, + fiscal_year_lte: Optional[int] = None, + fiscal_period: Optional[str] = None, + fiscal_period_any_of: Optional[str] = None, + fiscal_period_gt: Optional[str] = None, + fiscal_period_gte: Optional[str] = None, + fiscal_period_lt: Optional[str] = None, + fiscal_period_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[BenzingaEarning], HTTPResponse]: + """ + Endpoint: GET /benzinga/v1/earnings + """ + url = "/benzinga/v1/earnings" + return self._paginate( + path=url, + params=self._get_params(self.list_benzinga_earnings, locals()), + raw=raw, + deserializer=BenzingaEarning.from_dict, + options=options, + ) + + def list_benzinga_firms( + self, + benzinga_id: Optional[str] = None, + benzinga_id_any_of: Optional[str] = None, + benzinga_id_gt: Optional[str] = None, + benzinga_id_gte: Optional[str] = None, + benzinga_id_lt: Optional[str] = None, + benzinga_id_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[BenzingaFirm], HTTPResponse]: + """ + Endpoint: GET /benzinga/v1/firms + """ + url = "/benzinga/v1/firms" + return self._paginate( + path=url, + params=self._get_params(self.list_benzinga_firms, locals()), + raw=raw, + deserializer=BenzingaFirm.from_dict, + options=options, + ) + + def list_benzinga_guidance( + self, + date: Optional[Union[str, date]] = None, + date_any_of: Optional[str] = None, + date_gt: Optional[Union[str, date]] = None, + date_gte: Optional[Union[str, date]] = None, + date_lt: Optional[Union[str, date]] = None, + date_lte: Optional[Union[str, date]] = None, + ticker: Optional[str] = None, + ticker_any_of: Optional[str] = None, + ticker_gt: Optional[str] = None, + ticker_gte: Optional[str] = None, + ticker_lt: Optional[str] = None, + ticker_lte: Optional[str] = None, + positioning: Optional[str] = None, + positioning_any_of: Optional[str] = None, + positioning_gt: Optional[str] = None, + positioning_gte: Optional[str] = None, + positioning_lt: Optional[str] = None, + positioning_lte: Optional[str] = None, + importance: Optional[int] = None, + importance_any_of: Optional[str] = None, + importance_gt: Optional[int] = None, + importance_gte: Optional[int] = None, + importance_lt: Optional[int] = None, + importance_lte: Optional[int] = None, + last_updated: Optional[str] = None, + last_updated_any_of: Optional[str] = None, + last_updated_gt: Optional[str] = None, + last_updated_gte: Optional[str] = None, + last_updated_lt: Optional[str] = None, + last_updated_lte: Optional[str] = None, + fiscal_year: Optional[int] = None, + fiscal_year_any_of: Optional[str] = None, + fiscal_year_gt: Optional[int] = None, + fiscal_year_gte: Optional[int] = None, + fiscal_year_lt: Optional[int] = None, + fiscal_year_lte: Optional[int] = None, + fiscal_period: Optional[str] = None, + fiscal_period_any_of: Optional[str] = None, + fiscal_period_gt: Optional[str] = None, + fiscal_period_gte: Optional[str] = None, + fiscal_period_lt: Optional[str] = None, + fiscal_period_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[BenzingaGuidance], HTTPResponse]: + """ + Endpoint: GET /benzinga/v1/guidance + """ + url = "/benzinga/v1/guidance" + return self._paginate( + path=url, + params=self._get_params(self.list_benzinga_guidance, locals()), + raw=raw, + deserializer=BenzingaGuidance.from_dict, + options=options, + ) + + def list_benzinga_news( + self, + published: Optional[str] = None, + published_any_of: Optional[str] = None, + published_gt: Optional[str] = None, + published_gte: Optional[str] = None, + published_lt: Optional[str] = None, + published_lte: Optional[str] = None, + last_updated: Optional[str] = None, + last_updated_any_of: Optional[str] = None, + last_updated_gt: Optional[str] = None, + last_updated_gte: Optional[str] = None, + last_updated_lt: Optional[str] = None, + last_updated_lte: Optional[str] = None, + tickers: Optional[str] = None, + tickers_all_of: Optional[str] = None, + tickers_any_of: Optional[str] = None, + channels: Optional[str] = None, + channels_all_of: Optional[str] = None, + channels_any_of: Optional[str] = None, + tags: Optional[str] = None, + tags_all_of: Optional[str] = None, + tags_any_of: Optional[str] = None, + author: Optional[str] = None, + author_any_of: Optional[str] = None, + author_gt: Optional[str] = None, + author_gte: Optional[str] = None, + author_lt: Optional[str] = None, + author_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[BenzingaNews], HTTPResponse]: + """ + Endpoint: GET /benzinga/v1/news + """ + url = "/benzinga/v1/news" + return self._paginate( + path=url, + params=self._get_params(self.list_benzinga_news, locals()), + raw=raw, + deserializer=BenzingaNews.from_dict, + options=options, + ) + + def list_benzinga_ratings( + self, + date: Optional[Union[str, date]] = None, + date_any_of: Optional[str] = None, + date_gt: Optional[Union[str, date]] = None, + date_gte: Optional[Union[str, date]] = None, + date_lt: Optional[Union[str, date]] = None, + date_lte: Optional[Union[str, date]] = None, + ticker: Optional[str] = None, + ticker_any_of: Optional[str] = None, + ticker_gt: Optional[str] = None, + ticker_gte: Optional[str] = None, + ticker_lt: Optional[str] = None, + ticker_lte: Optional[str] = None, + importance: Optional[int] = None, + importance_any_of: Optional[str] = None, + importance_gt: Optional[int] = None, + importance_gte: Optional[int] = None, + importance_lt: Optional[int] = None, + importance_lte: Optional[int] = None, + last_updated: Optional[str] = None, + last_updated_any_of: Optional[str] = None, + last_updated_gt: Optional[str] = None, + last_updated_gte: Optional[str] = None, + last_updated_lt: Optional[str] = None, + last_updated_lte: Optional[str] = None, + rating_action: Optional[str] = None, + rating_action_any_of: Optional[str] = None, + rating_action_gt: Optional[str] = None, + rating_action_gte: Optional[str] = None, + rating_action_lt: Optional[str] = None, + rating_action_lte: Optional[str] = None, + price_target_action: Optional[str] = None, + price_target_action_any_of: Optional[str] = None, + price_target_action_gt: Optional[str] = None, + price_target_action_gte: Optional[str] = None, + price_target_action_lt: Optional[str] = None, + price_target_action_lte: Optional[str] = None, + benzinga_id: Optional[str] = None, + benzinga_id_any_of: Optional[str] = None, + benzinga_id_gt: Optional[str] = None, + benzinga_id_gte: Optional[str] = None, + benzinga_id_lt: Optional[str] = None, + benzinga_id_lte: Optional[str] = None, + benzinga_analyst_id: Optional[str] = None, + benzinga_analyst_id_any_of: Optional[str] = None, + benzinga_analyst_id_gt: Optional[str] = None, + benzinga_analyst_id_gte: Optional[str] = None, + benzinga_analyst_id_lt: Optional[str] = None, + benzinga_analyst_id_lte: Optional[str] = None, + benzinga_firm_id: Optional[str] = None, + benzinga_firm_id_any_of: Optional[str] = None, + benzinga_firm_id_gt: Optional[str] = None, + benzinga_firm_id_gte: Optional[str] = None, + benzinga_firm_id_lt: Optional[str] = None, + benzinga_firm_id_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[BenzingaRating], HTTPResponse]: + """ + Endpoint: GET /benzinga/v1/ratings + """ + url = "/benzinga/v1/ratings" + return self._paginate( + path=url, + params=self._get_params(self.list_benzinga_ratings, locals()), + raw=raw, + deserializer=BenzingaRating.from_dict, + options=options, + ) diff --git a/polygon/rest/economy.py b/polygon/rest/economy.py new file mode 100644 index 00000000..f92afad5 --- /dev/null +++ b/polygon/rest/economy.py @@ -0,0 +1,87 @@ +from typing import Optional, Any, Dict, List, Union, Iterator +from urllib3 import HTTPResponse +from datetime import datetime, date + +from .base import BaseClient +from .models.economy import ( + FedInflation, + TreasuryYield, +) +from .models.common import Sort, Order +from .models.request import RequestOptionBuilder + + +class EconomyClient(BaseClient): + """ + Client for the Fed REST Endpoints + (aligned with the paths from /fed/v1/...) + """ + + def list_treasury_yields( + self, + date: Optional[str] = None, + date_any_of: Optional[str] = None, + date_gt: Optional[str] = None, + date_gte: Optional[str] = None, + date_lt: Optional[str] = None, + date_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + order: Optional[Union[str, Order]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[List[TreasuryYield], HTTPResponse]: + """ + Retrieve treasury yield data. + + :param date: Calendar date of the yield observation (YYYY-MM-DD). + :param date_any_of: Filter equal to any of the values. + :param date_gt: Filter for dates greater than the provided date. + :param date_gte: Filter for dates greater than or equal to the provided date. + :param date_lt: Filter for dates less than the provided date. + :param date_lte: Filter for dates less than or equal to the provided date. + :param limit: Limit the number of results returned. Default 100, max 50000. + :param sort: Field to sort by (e.g., "date"). Default "date". + :param order: Order results based on the sort field ("asc" or "desc"). Default "desc". + :param params: Additional query parameters. + :param raw: Return raw HTTPResponse object if True, else return List[TreasuryYield]. + :param options: RequestOptionBuilder for additional headers or params. + :return: A list of TreasuryYield objects or HTTPResponse if raw=True. + """ + url = "/fed/v1/treasury-yields" + + return self._paginate( + path=url, + params=self._get_params(self.list_treasury_yields, locals()), + deserializer=TreasuryYield.from_dict, + raw=raw, + result_key="results", + options=options, + ) + + def list_inflation( + self, + date: Optional[Union[str, date]] = None, + date_any_of: Optional[str] = None, + date_gt: Optional[Union[str, date]] = None, + date_gte: Optional[Union[str, date]] = None, + date_lt: Optional[Union[str, date]] = None, + date_lte: Optional[Union[str, date]] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[FedInflation], HTTPResponse]: + """ + Endpoint: GET /fed/v1/inflation + """ + url = "/fed/v1/inflation" + return self._paginate( + path=url, + params=self._get_params(self.list_inflation, locals()), + raw=raw, + deserializer=FedInflation.from_dict, + options=options, + ) diff --git a/polygon/rest/futures.py b/polygon/rest/futures.py index 6de7669a..f651a405 100644 --- a/polygon/rest/futures.py +++ b/polygon/rest/futures.py @@ -113,7 +113,7 @@ def list_futures_products( name: Optional[str] = None, name_search: Optional[str] = None, as_of: Optional[Union[str, date]] = None, - market_identifier_code: Optional[str] = None, + trading_venue: Optional[str] = None, sector: Optional[str] = None, sub_sector: Optional[str] = None, asset_class: Optional[str] = None, @@ -233,7 +233,7 @@ def list_futures_trades( def list_futures_schedules( self, session_end_date: Optional[str] = None, - market_identifier_code: Optional[str] = None, + trading_venue: Optional[str] = None, limit: Optional[int] = None, sort: Optional[Union[str, Sort]] = None, params: Optional[Dict[str, Any]] = None, diff --git a/polygon/rest/models/benzinga.py b/polygon/rest/models/benzinga.py new file mode 100644 index 00000000..87287f2e --- /dev/null +++ b/polygon/rest/models/benzinga.py @@ -0,0 +1,324 @@ +from typing import Optional, List +from ...modelclass import modelclass + + +@modelclass +class BenzingaAnalystInsight: + benzinga_firm_id: Optional[str] = None + benzinga_id: Optional[str] = None + benzinga_rating_id: Optional[str] = None + company_name: Optional[str] = None + date: Optional[str] = None + firm: Optional[str] = None + insight: Optional[str] = None + last_updated: Optional[str] = None + price_target: Optional[float] = None + rating: Optional[str] = None + rating_action: Optional[str] = None + ticker: Optional[str] = None + + @staticmethod + def from_dict(d): + return BenzingaAnalystInsight( + benzinga_firm_id=d.get("benzinga_firm_id"), + benzinga_id=d.get("benzinga_id"), + benzinga_rating_id=d.get("benzinga_rating_id"), + company_name=d.get("company_name"), + date=d.get("date"), + firm=d.get("firm"), + insight=d.get("insight"), + last_updated=d.get("last_updated"), + price_target=d.get("price_target"), + rating=d.get("rating"), + rating_action=d.get("rating_action"), + ticker=d.get("ticker"), + ) + + +@modelclass +class BenzingaAnalyst: + benzinga_firm_id: Optional[str] = None + benzinga_id: Optional[str] = None + firm_name: Optional[str] = None + full_name: Optional[str] = None + last_updated: Optional[str] = None + overall_avg_return: Optional[float] = None + overall_avg_return_percentile: Optional[float] = None + overall_success_rate: Optional[float] = None + smart_score: Optional[float] = None + total_ratings: Optional[float] = None + total_ratings_percentile: Optional[float] = None + + @staticmethod + def from_dict(d): + return BenzingaAnalyst( + benzinga_firm_id=d.get("benzinga_firm_id"), + benzinga_id=d.get("benzinga_id"), + firm_name=d.get("firm_name"), + full_name=d.get("full_name"), + last_updated=d.get("last_updated"), + overall_avg_return=d.get("overall_avg_return"), + overall_avg_return_percentile=d.get("overall_avg_return_percentile"), + overall_success_rate=d.get("overall_success_rate"), + smart_score=d.get("smart_score"), + total_ratings=d.get("total_ratings"), + total_ratings_percentile=d.get("total_ratings_percentile"), + ) + + +@modelclass +class BenzingaConsensusRating: + buy_ratings: Optional[int] = None + consensus_price_target: Optional[float] = None + consensus_rating: Optional[str] = None + consensus_rating_value: Optional[float] = None + high_price_target: Optional[float] = None + hold_ratings: Optional[int] = None + low_price_target: Optional[float] = None + price_target_contributors: Optional[int] = None + ratings_contributors: Optional[int] = None + sell_ratings: Optional[int] = None + strong_buy_ratings: Optional[int] = None + strong_sell_ratings: Optional[int] = None + ticker: Optional[str] = None + + @staticmethod + def from_dict(d): + return BenzingaConsensusRating( + buy_ratings=d.get("buy_ratings"), + consensus_price_target=d.get("consensus_price_target"), + consensus_rating=d.get("consensus_rating"), + consensus_rating_value=d.get("consensus_rating_value"), + high_price_target=d.get("high_price_target"), + hold_ratings=d.get("hold_ratings"), + low_price_target=d.get("low_price_target"), + price_target_contributors=d.get("price_target_contributors"), + ratings_contributors=d.get("ratings_contributors"), + sell_ratings=d.get("sell_ratings"), + strong_buy_ratings=d.get("strong_buy_ratings"), + strong_sell_ratings=d.get("strong_sell_ratings"), + ticker=d.get("ticker"), + ) + + +@modelclass +class BenzingaEarning: + actual_eps: Optional[float] = None + actual_revenue: Optional[float] = None + benzinga_id: Optional[str] = None + company_name: Optional[str] = None + currency: Optional[str] = None + date: Optional[str] = None + date_status: Optional[str] = None + eps_method: Optional[str] = None + eps_surprise: Optional[float] = None + eps_surprise_percent: Optional[float] = None + estimated_eps: Optional[float] = None + estimated_revenue: Optional[float] = None + fiscal_period: Optional[str] = None + fiscal_year: Optional[int] = None + importance: Optional[int] = None + last_updated: Optional[str] = None + notes: Optional[str] = None + previous_eps: Optional[float] = None + previous_revenue: Optional[float] = None + revenue_method: Optional[str] = None + revenue_surprise: Optional[float] = None + revenue_surprise_percent: Optional[float] = None + ticker: Optional[str] = None + time: Optional[str] = None + + @staticmethod + def from_dict(d): + return BenzingaEarning( + actual_eps=d.get("actual_eps"), + actual_revenue=d.get("actual_revenue"), + benzinga_id=d.get("benzinga_id"), + company_name=d.get("company_name"), + currency=d.get("currency"), + date=d.get("date"), + date_status=d.get("date_status"), + eps_method=d.get("eps_method"), + eps_surprise=d.get("eps_surprise"), + eps_surprise_percent=d.get("eps_surprise_percent"), + estimated_eps=d.get("estimated_eps"), + estimated_revenue=d.get("estimated_revenue"), + fiscal_period=d.get("fiscal_period"), + fiscal_year=d.get("fiscal_year"), + importance=d.get("importance"), + last_updated=d.get("last_updated"), + notes=d.get("notes"), + previous_eps=d.get("previous_eps"), + previous_revenue=d.get("previous_revenue"), + revenue_method=d.get("revenue_method"), + revenue_surprise=d.get("revenue_surprise"), + revenue_surprise_percent=d.get("revenue_surprise_percent"), + ticker=d.get("ticker"), + time=d.get("time"), + ) + + +@modelclass +class BenzingaFirm: + benzinga_id: Optional[str] = None + currency: Optional[str] = None + last_updated: Optional[str] = None + name: Optional[str] = None + + @staticmethod + def from_dict(d): + return BenzingaFirm( + benzinga_id=d.get("benzinga_id"), + currency=d.get("currency"), + last_updated=d.get("last_updated"), + name=d.get("name"), + ) + + +@modelclass +class BenzingaGuidance: + benzinga_id: Optional[str] = None + company_name: Optional[str] = None + currency: Optional[str] = None + date: Optional[str] = None + eps_method: Optional[str] = None + estimated_eps_guidance: Optional[float] = None + estimated_revenue_guidance: Optional[float] = None + fiscal_period: Optional[str] = None + fiscal_year: Optional[int] = None + importance: Optional[int] = None + last_updated: Optional[str] = None + max_eps_guidance: Optional[float] = None + max_revenue_guidance: Optional[float] = None + min_eps_guidance: Optional[float] = None + min_revenue_guidance: Optional[float] = None + notes: Optional[str] = None + positioning: Optional[str] = None + previous_max_eps_guidance: Optional[float] = None + previous_max_revenue_guidance: Optional[float] = None + previous_min_eps_guidance: Optional[float] = None + previous_min_revenue_guidance: Optional[float] = None + release_type: Optional[str] = None + revenue_method: Optional[str] = None + ticker: Optional[str] = None + time: Optional[str] = None + + @staticmethod + def from_dict(d): + return BenzingaGuidance( + benzinga_id=d.get("benzinga_id"), + company_name=d.get("company_name"), + currency=d.get("currency"), + date=d.get("date"), + eps_method=d.get("eps_method"), + estimated_eps_guidance=d.get("estimated_eps_guidance"), + estimated_revenue_guidance=d.get("estimated_revenue_guidance"), + fiscal_period=d.get("fiscal_period"), + fiscal_year=d.get("fiscal_year"), + importance=d.get("importance"), + last_updated=d.get("last_updated"), + max_eps_guidance=d.get("max_eps_guidance"), + max_revenue_guidance=d.get("max_revenue_guidance"), + min_eps_guidance=d.get("min_eps_guidance"), + min_revenue_guidance=d.get("min_revenue_guidance"), + notes=d.get("notes"), + positioning=d.get("positioning"), + previous_max_eps_guidance=d.get("previous_max_eps_guidance"), + previous_max_revenue_guidance=d.get("previous_max_revenue_guidance"), + previous_min_eps_guidance=d.get("previous_min_eps_guidance"), + previous_min_revenue_guidance=d.get("previous_min_revenue_guidance"), + release_type=d.get("release_type"), + revenue_method=d.get("revenue_method"), + ticker=d.get("ticker"), + time=d.get("time"), + ) + + +@modelclass +class BenzingaNews: + author: Optional[str] = None + benzinga_id: Optional[int] = None + body: Optional[str] = None + channels: Optional[List[str]] = None + images: Optional[List[str]] = None + last_updated: Optional[str] = None + published: Optional[str] = None + tags: Optional[List[str]] = None + teaser: Optional[str] = None + tickers: Optional[List[str]] = None + title: Optional[str] = None + url: Optional[str] = None + + @staticmethod + def from_dict(d): + return BenzingaNews( + author=d.get("author"), + benzinga_id=d.get("benzinga_id"), + body=d.get("body"), + channels=d.get("channels", []), + images=d.get("images", []), + last_updated=d.get("last_updated"), + published=d.get("published"), + tags=d.get("tags", []), + teaser=d.get("teaser"), + tickers=d.get("tickers", []), + title=d.get("title"), + url=d.get("url"), + ) + + +@modelclass +class BenzingaRating: + adjusted_price_target: Optional[float] = None + analyst: Optional[str] = None + benzinga_analyst_id: Optional[str] = None + benzinga_calendar_url: Optional[str] = None + benzinga_firm_id: Optional[str] = None + benzinga_id: Optional[str] = None + benzinga_news_url: Optional[str] = None + company_name: Optional[str] = None + currency: Optional[str] = None + date: Optional[str] = None + firm: Optional[str] = None + importance: Optional[int] = None + last_updated: Optional[str] = None + notes: Optional[str] = None + previous_adjusted_price_target: Optional[float] = None + previous_price_target: Optional[float] = None + previous_rating: Optional[str] = None + price_percent_change: Optional[float] = None + price_target: Optional[float] = None + price_target_action: Optional[str] = None + rating: Optional[str] = None + rating_action: Optional[str] = None + ticker: Optional[str] = None + time: Optional[str] = None + + @staticmethod + def from_dict(d): + return BenzingaRating( + adjusted_price_target=d.get("adjusted_price_target"), + analyst=d.get("analyst"), + benzinga_analyst_id=d.get("benzinga_analyst_id"), + benzinga_calendar_url=d.get("benzinga_calendar_url"), + benzinga_firm_id=d.get("benzinga_firm_id"), + benzinga_id=d.get("benzinga_id"), + benzinga_news_url=d.get("benzinga_news_url"), + company_name=d.get("company_name"), + currency=d.get("currency"), + date=d.get("date"), + firm=d.get("firm"), + importance=d.get("importance"), + last_updated=d.get("last_updated"), + notes=d.get("notes"), + previous_adjusted_price_target=d.get("previous_adjusted_price_target"), + previous_price_target=d.get("previous_price_target"), + previous_rating=d.get("previous_rating"), + price_percent_change=d.get("price_percent_change"), + price_target=d.get("price_target"), + price_target_action=d.get("price_target_action"), + rating=d.get("rating"), + rating_action=d.get("rating_action"), + ticker=d.get("ticker"), + time=d.get("time"), + ) diff --git a/polygon/rest/models/economy.py b/polygon/rest/models/economy.py new file mode 100644 index 00000000..8793462a --- /dev/null +++ b/polygon/rest/models/economy.py @@ -0,0 +1,62 @@ +from typing import Optional +from ...modelclass import modelclass + + +@modelclass +class TreasuryYield: + """ + Treasury yield data for a specific date. + """ + + date: Optional[str] = None + yield_1_month: Optional[float] = None + yield_3_month: Optional[float] = None + yield_6_month: Optional[float] = None + yield_1_year: Optional[float] = None + yield_2_year: Optional[float] = None + yield_3_year: Optional[float] = None + yield_5_year: Optional[float] = None + yield_7_year: Optional[float] = None + yield_10_year: Optional[float] = None + yield_20_year: Optional[float] = None + yield_30_year: Optional[float] = None + + @staticmethod + def from_dict(d): + return TreasuryYield( + date=d.get("date"), + yield_1_month=d.get("yield_1_month"), + yield_3_month=d.get("yield_3_month"), + yield_6_month=d.get("yield_6_month"), + yield_1_year=d.get("yield_1_year"), + yield_2_year=d.get("yield_2_year"), + yield_3_year=d.get("yield_3_year"), + yield_5_year=d.get("yield_5_year"), + yield_7_year=d.get("yield_7_year"), + yield_10_year=d.get("yield_10_year"), + yield_20_year=d.get("yield_20_year"), + yield_30_year=d.get("yield_30_year"), + ) + + +@modelclass +class FedInflation: + cpi: Optional[float] = None + cpi_core: Optional[float] = None + cpi_year_over_year: Optional[float] = None + date: Optional[str] = None + pce: Optional[float] = None + pce_core: Optional[float] = None + pce_spending: Optional[float] = None + + @staticmethod + def from_dict(d): + return FedInflation( + cpi=d.get("cpi"), + cpi_core=d.get("cpi_core"), + cpi_year_over_year=d.get("cpi_year_over_year"), + date=d.get("date"), + pce=d.get("pce"), + pce_core=d.get("pce_core"), + pce_spending=d.get("pce_spending"), + ) diff --git a/polygon/rest/models/tickers.py b/polygon/rest/models/tickers.py index 76cb6f6f..e065826f 100644 --- a/polygon/rest/models/tickers.py +++ b/polygon/rest/models/tickers.py @@ -375,40 +375,3 @@ def from_dict(d): ticker=d.get("ticker"), total_volume=d.get("total_volume"), ) - - -@modelclass -class TreasuryYield: - """ - Treasury yield data for a specific date. - """ - - date: Optional[str] = None - yield_1_month: Optional[float] = None - yield_3_month: Optional[float] = None - yield_6_month: Optional[float] = None - yield_1_year: Optional[float] = None - yield_2_year: Optional[float] = None - yield_3_year: Optional[float] = None - yield_5_year: Optional[float] = None - yield_7_year: Optional[float] = None - yield_10_year: Optional[float] = None - yield_20_year: Optional[float] = None - yield_30_year: Optional[float] = None - - @staticmethod - def from_dict(d): - return TreasuryYield( - date=d.get("date"), - yield_1_month=d.get("yield_1_month"), - yield_3_month=d.get("yield_3_month"), - yield_6_month=d.get("yield_6_month"), - yield_1_year=d.get("yield_1_year"), - yield_2_year=d.get("yield_2_year"), - yield_3_year=d.get("yield_3_year"), - yield_5_year=d.get("yield_5_year"), - yield_7_year=d.get("yield_7_year"), - yield_10_year=d.get("yield_10_year"), - yield_20_year=d.get("yield_20_year"), - yield_30_year=d.get("yield_30_year"), - ) diff --git a/polygon/rest/models/tmx.py b/polygon/rest/models/tmx.py new file mode 100644 index 00000000..a42bd6b0 --- /dev/null +++ b/polygon/rest/models/tmx.py @@ -0,0 +1,33 @@ +from typing import Optional +from ...modelclass import modelclass + + +@modelclass +class TmxCorporateEvent: + company_name: Optional[str] = None + date: Optional[str] = None + isin: Optional[str] = None + name: Optional[str] = None + status: Optional[str] = None + ticker: Optional[str] = None + tmx_company_id: Optional[int] = None + tmx_record_id: Optional[str] = None + trading_venue: Optional[str] = None + type: Optional[str] = None + url: Optional[str] = None + + @staticmethod + def from_dict(d): + return TmxCorporateEvent( + company_name=d.get("company_name"), + date=d.get("date"), + isin=d.get("isin"), + name=d.get("name"), + status=d.get("status"), + ticker=d.get("ticker"), + tmx_company_id=d.get("tmx_company_id"), + tmx_record_id=d.get("tmx_record_id"), + trading_venue=d.get("trading_venue"), + type=d.get("type"), + url=d.get("url"), + ) diff --git a/polygon/rest/reference.py b/polygon/rest/reference.py index e1695cb2..e45ee744 100644 --- a/polygon/rest/reference.py +++ b/polygon/rest/reference.py @@ -24,7 +24,6 @@ OptionsContract, ShortInterest, ShortVolume, - TreasuryYield, ) from urllib3 import HTTPResponse from datetime import date @@ -696,44 +695,3 @@ def list_short_volume( result_key="results", options=options, ) - - def list_treasury_yields( - self, - date: Optional[str] = None, - date_gt: Optional[str] = None, - date_gte: Optional[str] = None, - date_lt: Optional[str] = None, - date_lte: Optional[str] = None, - limit: Optional[int] = None, - sort: Optional[Union[str, Sort]] = None, - order: Optional[Union[str, Order]] = None, - params: Optional[Dict[str, Any]] = None, - raw: bool = False, - options: Optional[RequestOptionBuilder] = None, - ) -> Union[List[TreasuryYield], HTTPResponse]: - """ - Retrieve treasury yield data. - - :param date: Calendar date of the yield observation (YYYY-MM-DD). - :param date_gt: Filter for dates greater than the provided date. - :param date_gte: Filter for dates greater than or equal to the provided date. - :param date_lt: Filter for dates less than the provided date. - :param date_lte: Filter for dates less than or equal to the provided date. - :param limit: Limit the number of results returned. Default 100, max 50000. - :param sort: Field to sort by (e.g., "date"). Default "date". - :param order: Order results based on the sort field ("asc" or "desc"). Default "desc". - :param params: Additional query parameters. - :param raw: Return raw HTTPResponse object if True, else return List[TreasuryYield]. - :param options: RequestOptionBuilder for additional headers or params. - :return: A list of TreasuryYield objects or HTTPResponse if raw=True. - """ - url = "/fed/v1/treasury-yields" - - return self._paginate( - path=url, - params=self._get_params(self.list_treasury_yields, locals()), - deserializer=TreasuryYield.from_dict, - raw=raw, - result_key="results", - options=options, - ) diff --git a/polygon/rest/tmx.py b/polygon/rest/tmx.py new file mode 100644 index 00000000..dd5687cd --- /dev/null +++ b/polygon/rest/tmx.py @@ -0,0 +1,85 @@ +from typing import Optional, Any, Dict, List, Union, Iterator +from urllib3 import HTTPResponse +from datetime import datetime, date + +from .base import BaseClient +from .models.tmx import ( + TmxCorporateEvent, +) +from .models.common import Sort +from .models.request import RequestOptionBuilder + + +class TmxClient(BaseClient): + """ + Client for the TMX REST Endpoints + (aligned with the paths from /tmx/v1/...) + """ + + def list_tmx_corporate_events( + self, + date: Optional[Union[str, date]] = None, + date_any_of: Optional[str] = None, + date_gt: Optional[Union[str, date]] = None, + date_gte: Optional[Union[str, date]] = None, + date_lt: Optional[Union[str, date]] = None, + date_lte: Optional[Union[str, date]] = None, + type: Optional[str] = None, + type_any_of: Optional[str] = None, + type_gt: Optional[str] = None, + type_gte: Optional[str] = None, + type_lt: Optional[str] = None, + type_lte: Optional[str] = None, + status: Optional[str] = None, + status_any_of: Optional[str] = None, + status_gt: Optional[str] = None, + status_gte: Optional[str] = None, + status_lt: Optional[str] = None, + status_lte: Optional[str] = None, + ticker: Optional[str] = None, + ticker_any_of: Optional[str] = None, + ticker_gt: Optional[str] = None, + ticker_gte: Optional[str] = None, + ticker_lt: Optional[str] = None, + ticker_lte: Optional[str] = None, + isin: Optional[str] = None, + isin_any_of: Optional[str] = None, + isin_gt: Optional[str] = None, + isin_gte: Optional[str] = None, + isin_lt: Optional[str] = None, + isin_lte: Optional[str] = None, + trading_venue: Optional[str] = None, + trading_venue_any_of: Optional[str] = None, + trading_venue_gt: Optional[str] = None, + trading_venue_gte: Optional[str] = None, + trading_venue_lt: Optional[str] = None, + trading_venue_lte: Optional[str] = None, + tmx_company_id: Optional[int] = None, + tmx_company_id_any_of: Optional[str] = None, + tmx_company_id_gt: Optional[int] = None, + tmx_company_id_gte: Optional[int] = None, + tmx_company_id_lt: Optional[int] = None, + tmx_company_id_lte: Optional[int] = None, + tmx_record_id: Optional[str] = None, + tmx_record_id_any_of: Optional[str] = None, + tmx_record_id_gt: Optional[str] = None, + tmx_record_id_gte: Optional[str] = None, + tmx_record_id_lt: Optional[str] = None, + tmx_record_id_lte: Optional[str] = None, + limit: Optional[int] = None, + sort: Optional[Union[str, Sort]] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + options: Optional[RequestOptionBuilder] = None, + ) -> Union[Iterator[TmxCorporateEvent], HTTPResponse]: + """ + Endpoint: GET /tmx/v1/corporate-events + """ + url = "/tmx/v1/corporate-events" + return self._paginate( + path=url, + params=self._get_params(self.list_tmx_corporate_events, locals()), + raw=raw, + deserializer=TmxCorporateEvent.from_dict, + options=options, + )