Skip to content

Commit 6fc3341

Browse files
committed
Add futures beta support
1 parent 4ed1624 commit 6fc3341

File tree

4 files changed

+679
-0
lines changed

4 files changed

+679
-0
lines changed

polygon/rest/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from .aggs import AggsClient
2+
from .futures import FuturesClient
23
from .trades import TradesClient
34
from .quotes import QuotesClient
45
from .snapshot import SnapshotClient
@@ -23,6 +24,7 @@
2324

2425
class RESTClient(
2526
AggsClient,
27+
FuturesClient,
2628
TradesClient,
2729
QuotesClient,
2830
SnapshotClient,

polygon/rest/futures.py

Lines changed: 338 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,338 @@
1+
from typing import Optional, Any, Dict, List, Union, Iterator
2+
from urllib3 import HTTPResponse
3+
from datetime import datetime, date
4+
5+
from .base import BaseClient
6+
from .models.futures import (
7+
FuturesAgg,
8+
FuturesContract,
9+
FuturesProduct,
10+
FuturesQuote,
11+
FuturesTrade,
12+
FuturesSchedule,
13+
)
14+
from .models.common import Sort, Order
15+
from .models.request import RequestOptionBuilder
16+
17+
18+
class FuturesClient(BaseClient):
19+
"""
20+
Client for the Futures REST Endpoints
21+
(aligned with the paths from /futures/vX/...)
22+
"""
23+
24+
def list_futures_aggregates(
25+
self,
26+
ticker: str,
27+
resolution: str,
28+
window_start: Optional[str] = None,
29+
window_start_lt: Optional[str] = None,
30+
window_start_lte: Optional[str] = None,
31+
window_start_gt: Optional[str] = None,
32+
window_start_gte: Optional[str] = None,
33+
limit: Optional[int] = None,
34+
order: Optional[Union[str, Order]] = None,
35+
sort: Optional[Union[str, Sort]] = None,
36+
params: Optional[Dict[str, Any]] = None,
37+
raw: bool = False,
38+
options: Optional[RequestOptionBuilder] = None,
39+
) -> Union[Iterator[FuturesAgg], HTTPResponse]:
40+
"""
41+
Endpoint: GET /futures/vX/aggs/{ticker}
42+
43+
Get aggregates for a futures contract in a given time range.
44+
This endpoint returns data that includes:
45+
- open, close, high, low
46+
- volume, dollar_volume, etc.
47+
If `next_url` is present, it will be paginated.
48+
"""
49+
url = f"/futures/vX/aggs/{ticker}"
50+
return self._paginate(
51+
path=url,
52+
params=self._get_params(self.list_aggregates, locals()),
53+
raw=raw,
54+
deserializer=FuturesAgg.from_dict,
55+
options=options,
56+
)
57+
58+
def list_futures_contracts(
59+
self,
60+
product_code: Optional[str] = None,
61+
first_trade_date: Optional[Union[str, date]] = None,
62+
last_trade_date: Optional[Union[str, date]] = None,
63+
as_of: Optional[Union[str, date]] = None,
64+
active: Optional[str] = None,
65+
type: Optional[str] = None,
66+
limit: Optional[int] = None,
67+
order: Optional[Union[str, Order]] = None,
68+
sort: Optional[Union[str, Sort]] = None,
69+
params: Optional[Dict[str, Any]] = None,
70+
raw: bool = False,
71+
options: Optional[RequestOptionBuilder] = None,
72+
) -> Union[Iterator[FuturesContract], HTTPResponse]:
73+
"""
74+
Endpoint: GET /futures/vX/contracts
75+
76+
The Contracts endpoint returns a paginated list of futures contracts.
77+
"""
78+
url = "/futures/vX/contracts"
79+
return self._paginate(
80+
path=url,
81+
params=self._get_params(self.list_contracts, locals()),
82+
raw=raw,
83+
deserializer=FuturesContract.from_dict,
84+
options=options,
85+
)
86+
87+
def get_futures_contract_details(
88+
self,
89+
ticker: str,
90+
as_of: Optional[Union[str, date]] = None,
91+
params: Optional[Dict[str, Any]] = None,
92+
raw: bool = False,
93+
options: Optional[RequestOptionBuilder] = None,
94+
) -> Union[FuturesContract, HTTPResponse]:
95+
"""
96+
Endpoint: GET /futures/vX/contracts/{ticker}
97+
98+
Returns details for a single contract at a specified point in time.
99+
(No next_url in the response -> just a single get).
100+
"""
101+
url = f"/futures/vX/contracts/{ticker}"
102+
return self._get(
103+
path=url,
104+
params=self._get_params(self.get_contract_details, locals()),
105+
deserializer=FuturesContract.from_dict,
106+
raw=raw,
107+
result_key="results",
108+
options=options,
109+
)
110+
111+
def list_futures_products(
112+
self,
113+
name: Optional[str] = None,
114+
name_search: Optional[str] = None,
115+
as_of: Optional[Union[str, date]] = None,
116+
market_identifier_code: Optional[str] = None,
117+
sector: Optional[str] = None,
118+
sub_sector: Optional[str] = None,
119+
asset_class: Optional[str] = None,
120+
asset_sub_class: Optional[str] = None,
121+
type: Optional[str] = None,
122+
limit: Optional[int] = None,
123+
order: Optional[Union[str, Order]] = None,
124+
sort: Optional[Union[str, Sort]] = None,
125+
params: Optional[Dict[str, Any]] = None,
126+
raw: bool = False,
127+
options: Optional[RequestOptionBuilder] = None,
128+
) -> Union[Iterator[FuturesProduct], HTTPResponse]:
129+
"""
130+
Endpoint: GET /futures/vX/products
131+
132+
Returns a list of futures products (including combos).
133+
"""
134+
url = "/futures/vX/products"
135+
return self._paginate(
136+
path=url,
137+
params=self._get_params(self.list_products, locals()),
138+
raw=raw,
139+
deserializer=FuturesProduct.from_dict,
140+
options=options,
141+
)
142+
143+
def get_futures_product_details(
144+
self,
145+
product_code: str,
146+
type: Optional[str] = None,
147+
as_of: Optional[Union[str, date]] = None,
148+
params: Optional[Dict[str, Any]] = None,
149+
raw: bool = False,
150+
options: Optional[RequestOptionBuilder] = None,
151+
) -> Union[FuturesProduct, HTTPResponse]:
152+
"""
153+
Endpoint: GET /futures/vX/products/{product_code}
154+
155+
Returns the details for a single product as it was at a specific day.
156+
(No next_url -> single get).
157+
"""
158+
url = f"/futures/vX/products/{product_code}"
159+
return self._get(
160+
path=url,
161+
params=self._get_params(self.get_product_details, locals()),
162+
deserializer=FuturesProduct.from_dict,
163+
raw=raw,
164+
result_key="results",
165+
options=options,
166+
)
167+
168+
def list_futures_quotes(
169+
self,
170+
ticker: str,
171+
timestamp: Optional[str] = None,
172+
timestamp_lt: Optional[str] = None,
173+
timestamp_lte: Optional[str] = None,
174+
timestamp_gt: Optional[str] = None,
175+
timestamp_gte: Optional[str] = None,
176+
session_end_date: Optional[str] = None,
177+
session_end_date_lt: Optional[str] = None,
178+
session_end_date_lte: Optional[str] = None,
179+
session_end_date_gt: Optional[str] = None,
180+
session_end_date_gte: Optional[str] = None,
181+
limit: Optional[int] = None,
182+
order: Optional[Union[str, Order]] = None,
183+
sort: Optional[Union[str, Sort]] = None,
184+
params: Optional[Dict[str, Any]] = None,
185+
raw: bool = False,
186+
options: Optional[RequestOptionBuilder] = None,
187+
) -> Union[Iterator[FuturesQuote], HTTPResponse]:
188+
"""
189+
Endpoint: GET /futures/vX/quotes/{ticker}
190+
191+
Get quotes for a contract in a given time range (paginated).
192+
"""
193+
url = f"/futures/vX/quotes/{ticker}"
194+
return self._paginate(
195+
path=url,
196+
params=self._get_params(self.list_quotes, locals()),
197+
raw=raw,
198+
deserializer=FuturesQuote.from_dict,
199+
options=options,
200+
)
201+
202+
def list_futures_trades(
203+
self,
204+
ticker: str,
205+
timestamp: Optional[str] = None,
206+
timestamp_lt: Optional[str] = None,
207+
timestamp_lte: Optional[str] = None,
208+
timestamp_gt: Optional[str] = None,
209+
timestamp_gte: Optional[str] = None,
210+
session_end_date: Optional[str] = None,
211+
session_end_date_lt: Optional[str] = None,
212+
session_end_date_lte: Optional[str] = None,
213+
session_end_date_gt: Optional[str] = None,
214+
session_end_date_gte: Optional[str] = None,
215+
limit: Optional[int] = None,
216+
order: Optional[Union[str, Order]] = None,
217+
sort: Optional[Union[str, Sort]] = None,
218+
params: Optional[Dict[str, Any]] = None,
219+
raw: bool = False,
220+
options: Optional[RequestOptionBuilder] = None,
221+
) -> Union[Iterator[FuturesTrade], HTTPResponse]:
222+
"""
223+
Endpoint: GET /futures/vX/trades/{ticker}
224+
225+
Get trades for a contract in a given time range (paginated).
226+
"""
227+
url = f"/futures/vX/trades/{ticker}"
228+
return self._paginate(
229+
path=url,
230+
params=self._get_params(self.list_trades, locals()),
231+
raw=raw,
232+
deserializer=FuturesTrade.from_dict,
233+
options=options,
234+
)
235+
236+
def list_futures_schedules(
237+
self,
238+
session_end_date: Optional[str] = None,
239+
market_identifier_code: Optional[str] = None,
240+
limit: Optional[int] = None,
241+
order: Optional[Union[str, Order]] = None,
242+
sort: Optional[Union[str, Sort]] = None,
243+
params: Optional[Dict[str, Any]] = None,
244+
raw: bool = False,
245+
options: Optional[RequestOptionBuilder] = None,
246+
) -> Union[Iterator[FuturesSchedule], HTTPResponse]:
247+
"""
248+
Endpoint: GET /futures/vX/schedules
249+
250+
Returns a list of trading schedules for multiple futures products on a specific date.
251+
If `next_url` is present, this is paginated.
252+
"""
253+
url = "/futures/vX/schedules"
254+
return self._paginate(
255+
path=url,
256+
params=self._get_params(self.list_schedules, locals()),
257+
raw=raw,
258+
deserializer=FuturesSchedule.from_dict,
259+
options=options,
260+
)
261+
262+
def list_futures_schedules_by_product_code(
263+
self,
264+
product_code: str,
265+
session_end_date: Optional[str] = None,
266+
session_end_date_lt: Optional[str] = None,
267+
session_end_date_lte: Optional[str] = None,
268+
session_end_date_gt: Optional[str] = None,
269+
session_end_date_gte: Optional[str] = None,
270+
limit: Optional[int] = None,
271+
order: Optional[Union[str, Order]] = None,
272+
sort: Optional[Union[str, Sort]] = None,
273+
params: Optional[Dict[str, Any]] = None,
274+
raw: bool = False,
275+
options: Optional[RequestOptionBuilder] = None,
276+
) -> Union[Iterator[FuturesSchedule], HTTPResponse]:
277+
"""
278+
Endpoint: GET /futures/vX/schedules/{product_code}
279+
280+
Returns schedule data for a single product across (potentially) many trading dates.
281+
"""
282+
url = f"/futures/vX/schedules/{product_code}"
283+
return self._paginate(
284+
path=url,
285+
params=self._get_params(self.list_schedules_by_product_code, locals()),
286+
raw=raw,
287+
deserializer=FuturesSchedule.from_dict,
288+
options=options,
289+
)
290+
291+
def list_futures_market_statuses(
292+
self,
293+
product_code_any_of: Optional[str] = None,
294+
product_code: Optional[str] = None,
295+
limit: Optional[int] = None,
296+
order: Optional[Union[str, Order]] = None,
297+
sort: Optional[Union[str, Sort]] = None,
298+
params: Optional[Dict[str, Any]] = None,
299+
raw: bool = False,
300+
options: Optional[RequestOptionBuilder] = None,
301+
) -> Union[Iterator[FuturesMarketStatus], HTTPResponse]:
302+
url = "/futures/vX/market-status"
303+
return self._paginate(
304+
path=url,
305+
params=self._get_params(self.list_market_statuses, locals()),
306+
raw=raw,
307+
deserializer=FuturesMarketStatus.from_dict,
308+
options=options,
309+
)
310+
311+
def get_futures_snapshot(
312+
self,
313+
ticker: Optional[str] = None,
314+
ticker_any_of: Optional[str] = None,
315+
ticker_gt: Optional[str] = None,
316+
ticker_gte: Optional[str] = None,
317+
ticker_lt: Optional[str] = None,
318+
ticker_lte: Optional[str] = None,
319+
product_code: Optional[str] = None,
320+
product_code_any_of: Optional[str] = None,
321+
product_code_gt: Optional[str] = None,
322+
product_code_gte: Optional[str] = None,
323+
product_code_lt: Optional[str] = None,
324+
product_code_lte: Optional[str] = None,
325+
limit: Optional[int] = None,
326+
sort: Optional[Union[str, Sort]] = None,
327+
params: Optional[Dict[str, Any]] = None,
328+
raw: bool = False,
329+
options: Optional[RequestOptionBuilder] = None,
330+
) -> Union[Iterator[FuturesSnapshot], HTTPResponse]:
331+
url = "/futures/vX/snapshot"
332+
return self._paginate(
333+
path=url,
334+
params=self._get_params(self.get_snapshot, locals()),
335+
raw=raw,
336+
deserializer=FuturesSnapshot.from_dict,
337+
options=options,
338+
)

polygon/rest/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from .dividends import *
66
from .exchanges import *
77
from .financials import *
8+
from .futures import *
89
from .indicators import *
910
from .markets import *
1011
from .quotes import *

0 commit comments

Comments
 (0)