diff --git a/polygon/rest/__init__.py b/polygon/rest/__init__.py index 3bc193dd..849443f1 100644 --- a/polygon/rest/__init__.py +++ b/polygon/rest/__init__.py @@ -1,8 +1,8 @@ from .aggs import AggsClient from .trades import TradesClient from .quotes import QuotesClient -from .reference import MarketsClient +from .reference import MarketsClient, TickersClient -class RESTClient(AggsClient, TradesClient, QuotesClient, MarketsClient): +class RESTClient(AggsClient, TradesClient, QuotesClient, MarketsClient, TickersClient): pass diff --git a/polygon/rest/models/__init__.py b/polygon/rest/models/__init__.py index c86fb398..13bc71ea 100644 --- a/polygon/rest/models/__init__.py +++ b/polygon/rest/models/__init__.py @@ -2,6 +2,7 @@ from .trades import * from .quotes import * from .markets import * +from .tickers import * from enum import Enum @@ -10,7 +11,6 @@ class Sort(Enum): ASC = "asc" DESC = "desc" - class Order(Enum): ASC = "asc" DESC = "desc" diff --git a/polygon/rest/models/tickers.py b/polygon/rest/models/tickers.py new file mode 100644 index 00000000..105a8a30 --- /dev/null +++ b/polygon/rest/models/tickers.py @@ -0,0 +1,121 @@ +from typing import Optional, List +from enum import Enum +from dataclasses import dataclass + +class Locale(Enum): + US = "us" + GLOBAL = "global" + +class Market(Enum): + STOCKS = "stocks" + CRYPTO = "crypto" + FX = "fx" + +class AssetClass(Enum): + STOCKS = "stocks" + OPTIONS = "options" + CRYPTO = "crypto" + FX = "fx" + +@dataclass +class Address: + address1: Optional[str] = None + city: Optional[str] = None + state: Optional[str] = None + +@dataclass +class Branding: + icon_url: Optional[str] = None + logo_url: Optional[str] = None + +@dataclass +class Publisher: + favicon_url: Optional[str] = None + homepage_url: Optional[str] = None + logo_url: Optional[str] = None + name: Optional[str] = None + + +@dataclass +class Ticker: + "Ticker contains data for a specified ticker symbol." + active: Optional[bool] = None + cik: Optional[str] = None + composite_figi: Optional[str] = None + currency_name: Optional[str] = None + delisted_utc: Optional[str] = None + last_updated_utc: Optional[str] = None + locale: Optional[Locale] = None + market: Optional[Market] = None + name: Optional[str] = None + primary_exchange: Optional[str] = None + share_class_figi: Optional[str] = None + ticker: Optional[str] = None + type: Optional[str] = None + + @staticmethod + def from_dict(d): + return Ticker(**d) + +@dataclass +class TickerDetails: + "TickerDetails contains data for a specified ticker symbol." + active: Optional[bool] = None + address: Optional[Address] = None + branding: Optional[Branding] = None + cik: Optional[str] = None + composite_figi: Optional[str] = None + currency_name: Optional[str] = None + delisted_utc: Optional[str] = None + description: Optional[str] = None + homepage_url: Optional[str] = None + list_date: Optional[str] = None + locale: Optional[Locale] = None + market: Optional[Market] = None + market_cap: Optional[float] = None + name: Optional[str] = None + phone_number: Optional[str] = None + primary_exchange: Optional[str] = None + share_class_figi: Optional[str] = None + share_class_shares_outstanding: Optional[int] = None + sic_code: Optional[str] = None + sic_description: Optional[str] = None + ticker: Optional[str] = None + total_employees: Optional[int] = None + type: Optional[str] = None + weighted_shares_outstanding: Optional[int] = None + + @staticmethod + def from_dict(d): + return TickerDetails(**d) + +@dataclass +class TickerNews: + "TickerDetails contains data for news articles relating to a stock ticker symbol." + amp_url: Optional[str] = None + article_url: Optional[str] = None + author: Optional[str] = None + description: Optional[str] = None + id: Optional[str] = None + image_url: Optional[str] = None + keywords: Optional[List[str]] = None + published_utc: Optional[str] = None + publisher: Optional[Publisher] = None + tickers: Optional[List[str]] = None + title: Optional[str] = None + + @staticmethod + def from_dict(d): + return TickerNews(**d) + +@dataclass +class TickerTypes: + "TickerTypes contains data for ticker types." + asset_class: Optional[AssetClass] = None + code: Optional[str] = None + description: Optional[str] = None + locale: Optional[Locale] = None + + @staticmethod + def from_dict(d): + return TickerNews(**d) diff --git a/polygon/rest/reference.py b/polygon/rest/reference.py index 10a6702f..bfe5899f 100644 --- a/polygon/rest/reference.py +++ b/polygon/rest/reference.py @@ -1,6 +1,6 @@ from .base import BaseClient -from typing import Optional, Any, Dict, List, Union -from .models import MarketHoliday, MarketStatus +from typing import Optional, Any, Dict, List, Union, Iterator +from .models import MarketHoliday, MarketStatus, Ticker, TickerDetails, TickerNews, TickerTypes, Sort, Order, AssetClass, Locale from urllib3 import HTTPResponse # https://polygon.io/docs/stocks @@ -37,4 +37,133 @@ def get_market_status( """ url = "/v1/marketstatus/now" - return self._get(path=url, params=params, deserializer=MarketStatus.from_dict, raw=raw) \ No newline at end of file + return self._get(path=url, params=params, deserializer=MarketStatus.from_dict, raw=raw) + +class TickersClient(BaseClient): + def list_tickers( + self, + ticker: Optional[str] = None, + ticker_lt: Optional[str] = None, + ticker_lte: Optional[str] = None, + ticker_gt: Optional[str] = None, + ticker_gte: Optional[str] = None, + type: Optional[str] = None, + market: Optional[str] = None, + exchange: Optional[str] = None, + cusip: Optional[int] = None, + cik: Optional[int] = None, + date: Optional[str] = None, + active: Optional[bool] = None, + search: 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, + ) -> Union[Iterator[Ticker], HTTPResponse]: + """ + Query all ticker symbols which are supported by Polygon.io. This API currently includes Stocks/Equities, Crypto, and Forex. + + :param ticker: Specify a ticker symbol. Defaults to empty string which queries all tickers. + :param ticker_lt: Timestamp less than + :param ticker_lte: Ticker less than or equal to + :param ticker_gt: Ticker greater than + :param ticker_gte: Ticker greater than or equal to + :param type: Specify the type of the tickers. Find the types that we support via our Ticker Types API. Defaults to empty string which queries all types. + :param market: Filter by market type. By default all markets are included. + :param exchange: Specify the primary exchange of the asset in the ISO code format. Find more information about the ISO codes at the ISO org website. Defaults to empty string which queries all exchanges. + :param cusip: Specify the CUSIP code of the asset you want to search for. Find more information about CUSIP codes at their website. Defaults to empty string which queries all CUSIPs. + :param cik: Specify the CIK of the asset you want to search for. Find more information about CIK codes at their website. Defaults to empty string which queries all CIKs. + :param date: Specify a point in time to retrieve tickers available on that date. Defaults to the most recent available date. + :param search: Search for terms within the ticker and/or company name. + :param active: Specify if the tickers returned should be actively traded on the queried date. Default is true. + :param limit: Limit the size of the response, default is 100 and max is 1000. + :param sort: The field to sort the results on. Default is ticker. If the search query parameter is present, sort is ignored and results are ordered by relevance. + :param order: The order to sort the results on. Default is asc (ascending). + :param params: Any additional query params + :param raw: Return raw object instead of results object + :return: List of tickers + :rtype: List[Ticker] + """ + url = "/v3/reference/tickers" + + return self._paginate( + path=url, + params=self._get_params(self.list_tickers, locals()), + raw=raw, + deserializer=Ticker.from_dict, + ) + + def get_ticker_details( + self, + ticker: Optional[str] = None, + date: Optional[str] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + ) -> Union[TickerDetails, HTTPResponse]: + """ + Get a single ticker supported by Polygon.io. This response will have detailed information about the ticker and the company behind it. + + :param ticker: The ticker symbol of the asset. + :param date: Specify a point in time to get information about the ticker available on that date. When retrieving information from SEC filings, we compare this date with the period of report date on the SEC filing. + :param params: Any additional query params + :param raw: Return raw object instead of results object + :return: Ticker Details V3 + :rtype: TickerDetail + """ + url = f"/v3/reference/tickers/{ticker}" + + return self._get(path=url, params=params, deserializer=TickerDetails.from_dict, raw=raw) + + def get_ticker_news( + self, + ticker: Optional[str] = None, + ticker_lt: Optional[str] = None, + ticker_lte: Optional[str] = None, + ticker_gt: Optional[str] = None, + ticker_gte: Optional[str] = None, + published_utc: Optional[str] = None, + published_utc_lt: Optional[str] = None, + published_utc_lte: Optional[str] = None, + published_utc_gt: Optional[str] = None, + published_utc_gte: Optional[str] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + ) -> Union[TickerDetails, HTTPResponse]: + """ + Get the most recent news articles relating to a stock ticker symbol, including a summary of the article and a link to the original source. + + :param ticker: Return results that contain this ticker. + :param published_utc: Return results published on, before, or after this date. + :param limit: Limit the number of results returned, default is 10 and max is 1000. + :param sort: Sort field used for ordering. + :param order: Order results based on the sort field. + :param params: Any additional query params + :param raw: Return raw object instead of results object + :return: Ticker News + :rtype: TickerNews + """ + url = "/v2/reference/news" + + return self._get(path=url, params=params, deserializer=TickerNews.from_dict, raw=raw) + + def get_ticker_types( + self, + asset_class: Optional[AssetClass] = None, + locale: Optional[Locale] = None, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + ) -> Union[TickerTypes, HTTPResponse]: + """ + List all ticker types that Polygon.io has. + + :param asset_class: Filter by asset class. + :param locale: Filter by locale. + :param params: Any additional query params + :param raw: Return raw object instead of results object + :return: Ticker Types + :rtype: TickerTypes + """ + url = "/v3/reference/tickers/types" + + return self._get(path=url, params=params, deserializer=TickerTypes.from_dict, raw=raw) \ No newline at end of file