Skip to content

Commit 6c4e7dc

Browse files
authored
Splits (#124)
1 parent 6c05495 commit 6c4e7dc

File tree

9 files changed

+132
-42
lines changed

9 files changed

+132
-42
lines changed

polygon/rest/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
from .aggs import AggsClient
22
from .trades import TradesClient
33
from .quotes import QuotesClient
4-
from .reference import MarketsClient, TickersClient
4+
from .reference import MarketsClient, TickersClient, SplitsClient
55

66

7-
class RESTClient(AggsClient, TradesClient, QuotesClient, MarketsClient, TickersClient):
7+
class RESTClient(
8+
AggsClient, TradesClient, QuotesClient, MarketsClient, TickersClient, SplitsClient
9+
):
810
pass

polygon/rest/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from .quotes import *
44
from .markets import *
55
from .tickers import *
6+
from .splits import *
67

78
from enum import Enum
89

@@ -11,6 +12,7 @@ class Sort(Enum):
1112
ASC = "asc"
1213
DESC = "desc"
1314

15+
1416
class Order(Enum):
1517
ASC = "asc"
1618
DESC = "desc"

polygon/rest/models/aggs.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from dataclasses import dataclass
22
from typing import Optional
33

4+
45
@dataclass
56
class Agg:
67
timestamp: int
@@ -15,12 +16,12 @@ class Agg:
1516
@staticmethod
1617
def from_dict(d):
1718
return Agg(
18-
timestamp=d["t"],
19-
open=d["o"],
20-
high=d["h"],
21-
low=d["l"],
22-
close=d["c"],
23-
volume=d["v"],
24-
vwap=d.get("vw", None),
25-
transactions=d.get("n", None)
19+
timestamp=d["t"],
20+
open=d["o"],
21+
high=d["h"],
22+
low=d["l"],
23+
close=d["c"],
24+
volume=d["v"],
25+
vwap=d.get("vw", None),
26+
transactions=d.get("n", None),
2627
)

polygon/rest/models/markets.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class MarketHoliday:
1616
def from_dict(d):
1717
return MarketHoliday(**d)
1818

19+
1920
@dataclass
2021
class MarketStatus:
2122
"MarketStatus contains data for the current trading status of the exchanges and overall financial markets."

polygon/rest/models/quotes.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class Quote:
2323
def from_dict(d):
2424
return Quote(**d)
2525

26+
2627
@dataclass
2728
class LastQuote:
2829
"LastQuote contains data for the most recent NBBO (Quote) tick for a given stock."
@@ -57,5 +58,5 @@ def from_dict(d):
5758
bid_price=d.get("p", None),
5859
bid_size=d.get("s", None),
5960
bid_exchange=d.get("x", None),
60-
tape=d.get("z", None)
61-
)
61+
tape=d.get("z", None),
62+
)

polygon/rest/models/splits.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from typing import Optional
2+
from dataclasses import dataclass
3+
4+
5+
@dataclass
6+
class Split:
7+
"Split contains data for a historical stock split, including the ticker symbol, the execution date, and the factors of the split ratio."
8+
execution_date: Optional[str] = None
9+
split_from: Optional[int] = None
10+
split_to: Optional[int] = None
11+
ticker: Optional[str] = None
12+
13+
@staticmethod
14+
def from_dict(d):
15+
return Split(**d)

polygon/rest/models/tickers.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,38 @@
22
from enum import Enum
33
from dataclasses import dataclass
44

5+
56
class Locale(Enum):
67
US = "us"
78
GLOBAL = "global"
89

10+
911
class Market(Enum):
1012
STOCKS = "stocks"
1113
CRYPTO = "crypto"
1214
FX = "fx"
1315

16+
1417
class AssetClass(Enum):
1518
STOCKS = "stocks"
1619
OPTIONS = "options"
1720
CRYPTO = "crypto"
1821
FX = "fx"
1922

23+
2024
@dataclass
2125
class Address:
2226
address1: Optional[str] = None
2327
city: Optional[str] = None
2428
state: Optional[str] = None
2529

30+
2631
@dataclass
2732
class Branding:
2833
icon_url: Optional[str] = None
2934
logo_url: Optional[str] = None
3035

36+
3137
@dataclass
3238
class Publisher:
3339
favicon_url: Optional[str] = None
@@ -57,6 +63,7 @@ class Ticker:
5763
def from_dict(d):
5864
return Ticker(**d)
5965

66+
6067
@dataclass
6168
class TickerDetails:
6269
"TickerDetails contains data for a specified ticker symbol."
@@ -89,6 +96,7 @@ class TickerDetails:
8996
def from_dict(d):
9097
return TickerDetails(**d)
9198

99+
92100
@dataclass
93101
class TickerNews:
94102
"TickerDetails contains data for news articles relating to a stock ticker symbol."
@@ -108,6 +116,7 @@ class TickerNews:
108116
def from_dict(d):
109117
return TickerNews(**d)
110118

119+
111120
@dataclass
112121
class TickerTypes:
113122
"TickerTypes contains data for ticker types."

polygon/rest/quotes.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def list_quotes(
1717
sort: Optional[Union[str, Sort]] = None,
1818
order: Optional[Union[str, Order]] = None,
1919
params: Optional[Dict[str, Any]] = None,
20-
raw: bool = False
20+
raw: bool = False,
2121
) -> Union[List[Quote], HTTPResponse]:
2222
"""
2323
Get quotes for a ticker symbol in a given time range.
@@ -34,7 +34,6 @@ def list_quotes(
3434
:param params: Any additional query params
3535
:param raw: Return HTTPResponse object instead of results object
3636
:return: List of quotes
37-
:rtype: List[Quote]
3837
"""
3938
url = f"/v3/quotes/{ticker}"
4039

@@ -44,12 +43,9 @@ def list_quotes(
4443
raw=raw,
4544
deserializer=Quote.from_dict,
4645
)
47-
46+
4847
def get_last_quote(
49-
self,
50-
ticker: str,
51-
params: Optional[Dict[str, Any]] = None,
52-
raw: bool = False
48+
self, ticker: str, params: Optional[Dict[str, Any]] = None, raw: bool = False
5349
) -> Union[LastQuote, HTTPResponse]:
5450
"""
5551
Get the most recent NBBO (Quote) tick for a given stock.
@@ -58,10 +54,9 @@ def get_last_quote(
5854
:param params: Any additional query params
5955
:param raw: Return HTTPResponse object instead of results object
6056
:return: Last Quote
61-
:rtype: LastQuote
6257
"""
6358
url = f"/v2/last/nbbo/{ticker}"
6459

65-
return self._get(path=url, params=params, deserializer=LastQuote.from_dict, raw=raw)
66-
67-
60+
return self._get(
61+
path=url, params=params, deserializer=LastQuote.from_dict, raw=raw
62+
)

polygon/rest/reference.py

Lines changed: 83 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,54 @@
11
from .base import BaseClient
22
from typing import Optional, Any, Dict, List, Union, Iterator
3-
from .models import MarketHoliday, MarketStatus, Ticker, TickerDetails, TickerNews, TickerTypes, Sort, Order, AssetClass, Locale
3+
from .models import (
4+
MarketHoliday,
5+
MarketStatus,
6+
Ticker,
7+
TickerDetails,
8+
TickerNews,
9+
TickerTypes,
10+
Sort,
11+
Order,
12+
AssetClass,
13+
Locale,
14+
Split,
15+
)
416
from urllib3 import HTTPResponse
517

618
# https://polygon.io/docs/stocks
719
class MarketsClient(BaseClient):
820
def list_market_holidays(
9-
self,
10-
params: Optional[Dict[str, Any]] = None,
11-
raw: bool = False
21+
self, params: Optional[Dict[str, Any]] = None, raw: bool = False
1222
) -> Union[List[MarketHoliday], HTTPResponse]:
1323
"""
1424
Get upcoming market holidays and their open/close times.
1525
1626
:param params: Any additional query params
1727
:param raw: Return HTTPResponse object instead of results object
1828
:return: List of quotes
19-
:rtype: List[Quote]
2029
"""
2130
url = "/v1/marketstatus/upcoming"
2231

23-
return self._get(path=url, params=params, deserializer=MarketHoliday.from_dict, raw=raw)
32+
return self._get(
33+
path=url, params=params, deserializer=MarketHoliday.from_dict, raw=raw
34+
)
2435

2536
def get_market_status(
26-
self,
27-
params: Optional[Dict[str, Any]] = None,
28-
raw: bool = False
37+
self, params: Optional[Dict[str, Any]] = None, raw: bool = False
2938
) -> Union[MarketStatus, HTTPResponse]:
3039
"""
3140
Get the current trading status of the exchanges and overall financial markets.
3241
3342
:param params: Any additional query params
3443
:param raw: Return HTTPResponse object instead of results object
3544
:return: List of quotes
36-
:rtype: List[Quote]
3745
"""
3846
url = "/v1/marketstatus/now"
3947

40-
return self._get(path=url, params=params, deserializer=MarketStatus.from_dict, raw=raw)
48+
return self._get(
49+
path=url, params=params, deserializer=MarketStatus.from_dict, raw=raw
50+
)
51+
4152

4253
class TickersClient(BaseClient):
4354
def list_tickers(
@@ -65,7 +76,7 @@ def list_tickers(
6576
Query all ticker symbols which are supported by Polygon.io. This API currently includes Stocks/Equities, Crypto, and Forex.
6677
6778
:param ticker: Specify a ticker symbol. Defaults to empty string which queries all tickers.
68-
:param ticker_lt: Timestamp less than
79+
:param ticker_lt: Ticker less than
6980
:param ticker_lte: Ticker less than or equal to
7081
:param ticker_gt: Ticker greater than
7182
:param ticker_gte: Ticker greater than or equal to
@@ -83,7 +94,6 @@ def list_tickers(
8394
:param params: Any additional query params
8495
:param raw: Return raw object instead of results object
8596
:return: List of tickers
86-
:rtype: List[Ticker]
8797
"""
8898
url = "/v3/reference/tickers"
8999

@@ -109,11 +119,12 @@ def get_ticker_details(
109119
:param params: Any additional query params
110120
:param raw: Return raw object instead of results object
111121
:return: Ticker Details V3
112-
:rtype: TickerDetail
113122
"""
114123
url = f"/v3/reference/tickers/{ticker}"
115124

116-
return self._get(path=url, params=params, deserializer=TickerDetails.from_dict, raw=raw)
125+
return self._get(
126+
path=url, params=params, deserializer=TickerDetails.from_dict, raw=raw
127+
)
117128

118129
def get_ticker_news(
119130
self,
@@ -141,11 +152,12 @@ def get_ticker_news(
141152
:param params: Any additional query params
142153
:param raw: Return raw object instead of results object
143154
:return: Ticker News
144-
:rtype: TickerNews
145155
"""
146156
url = "/v2/reference/news"
147157

148-
return self._get(path=url, params=params, deserializer=TickerNews.from_dict, raw=raw)
158+
return self._get(
159+
path=url, params=params, deserializer=TickerNews.from_dict, raw=raw
160+
)
149161

150162
def get_ticker_types(
151163
self,
@@ -162,8 +174,60 @@ def get_ticker_types(
162174
:param params: Any additional query params
163175
:param raw: Return raw object instead of results object
164176
:return: Ticker Types
165-
:rtype: TickerTypes
166177
"""
167178
url = "/v3/reference/tickers/types"
168179

169-
return self._get(path=url, params=params, deserializer=TickerTypes.from_dict, raw=raw)
180+
return self._get(
181+
path=url, params=params, deserializer=TickerTypes.from_dict, raw=raw
182+
)
183+
184+
185+
class SplitsClient(BaseClient):
186+
def list_splits(
187+
self,
188+
ticker: Optional[str] = None,
189+
ticker_lt: Optional[str] = None,
190+
ticker_lte: Optional[str] = None,
191+
ticker_gt: Optional[str] = None,
192+
ticker_gte: Optional[str] = None,
193+
execution_date: Optional[str] = None,
194+
execution_lt: Optional[str] = None,
195+
execution_lte: Optional[str] = None,
196+
execution_gt: Optional[str] = None,
197+
execution_gte: Optional[str] = None,
198+
reverse_split: Optional[bool] = None,
199+
limit: Optional[int] = None,
200+
sort: Optional[Union[str, Sort]] = None,
201+
order: Optional[Union[str, Order]] = None,
202+
params: Optional[Dict[str, Any]] = None,
203+
raw: bool = False,
204+
) -> Union[Iterator[Split], HTTPResponse]:
205+
"""
206+
Get a list of historical stock splits, including the ticker symbol, the execution date, and the factors of the split ratio.
207+
208+
:param ticker: Return the stock splits that contain this ticker.
209+
:param ticker_lt: Ticker less than
210+
:param ticker_lte: Ticker less than or equal to
211+
:param ticker_gt: Ticker greater than
212+
:param ticker_gte: Ticker greater than or equal to
213+
:param execution_date: Query by execution date with the format YYYY-MM-DD.
214+
:param execution_date_lt: Execution date less than
215+
:param execution_date_lte: Execution date less than or equal to
216+
:param execution_date_gt: Execution date greater than
217+
:param execution_date_gte: Execution date greater than or equal to
218+
:param reverse_split: Query for reverse stock splits. A split ratio where split_from is greater than split_to represents a reverse split. By default this filter is not used.
219+
:param limit: Limit the number of results returned, default is 10 and max is 1000.
220+
:param sort: Sort field used for ordering.
221+
:param order: Order results based on the sort field.
222+
:param params: Any additional query params
223+
:param raw: Return raw object instead of results object
224+
:return: List of splits
225+
"""
226+
url = "/v3/reference/splits"
227+
228+
return self._paginate(
229+
path=url,
230+
params=self._get_params(self.list_splits, locals()),
231+
raw=raw,
232+
deserializer=Split.from_dict,
233+
)

0 commit comments

Comments
 (0)