Skip to content

Adds IPOs, Short Interest/Volume, and Treasury Yields #875

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 23, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions examples/rest/economy-treasury_yields.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from polygon import RESTClient

# docs
# https://staging.polygon.io/docs/rest/economy/treasury-yields

# client = RESTClient("XXXXXX") # hardcoded api_key is used
client = RESTClient() # POLYGON_API_KEY environment variable is used

yields = []
for date in client.vx.list_treasury_yields():
yields.append(date)

print(yields)
2 changes: 1 addition & 1 deletion examples/rest/stocks-ipos.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from polygon import RESTClient

# docs
# https://polygon.io/docs/stocks/get_vx_reference_ipos
# https://polygon.io/docs/rest/stocks/corporate-actions/ipos

# client = RESTClient("XXXXXX") # hardcoded api_key is used
client = RESTClient() # POLYGON_API_KEY environment variable is used
Expand Down
13 changes: 13 additions & 0 deletions examples/rest/stocks-short_interest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from polygon import RESTClient

# docs
# https://polygon.io/docs/rest/stocks/fundamentals/short-interest

# client = RESTClient("XXXXXX") # hardcoded api_key is used
client = RESTClient() # POLYGON_API_KEY environment variable is used

items = []
for item in client.vx.list_short_interest(ticker="RDDT"):
items.append(item)

print(items)
13 changes: 13 additions & 0 deletions examples/rest/stocks-short_volume.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from polygon import RESTClient

# docs
# https://polygon.io/docs/rest/stocks/fundamentals/short-volume

# client = RESTClient("XXXXXX") # hardcoded api_key is used
client = RESTClient() # POLYGON_API_KEY environment variable is used

items = []
for item in client.vx.list_short_volume(ticker="RDDT"):
items.append(item)

print(items)
112 changes: 107 additions & 5 deletions polygon/rest/models/tickers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from typing import Optional, List

from ...modelclass import modelclass


Expand Down Expand Up @@ -255,10 +254,6 @@ def from_dict(d):
return TickerChangeResults(**d)


from typing import Optional
from ...modelclass import modelclass


@modelclass
class IPOListing:
"""
Expand Down Expand Up @@ -310,3 +305,110 @@ def from_dict(d):
total_offer_size=d.get("total_offer_size"),
us_code=d.get("us_code"),
)


@modelclass
class ShortInterest:
"""
Short Interest data for a specific identifier.
"""

avg_daily_volume: Optional[int] = None
days_to_cover: Optional[float] = None
settlement_date: Optional[str] = None
short_interest: Optional[int] = None
ticker: Optional[str] = None

@staticmethod
def from_dict(d):
return ShortInterest(
avg_daily_volume=d.get("avg_daily_volume"),
days_to_cover=d.get("days_to_cover"),
settlement_date=d.get("settlement_date"),
short_interest=d.get("short_interest"),
ticker=d.get("ticker"),
)


@modelclass
class ShortVolume:
"""
Short Volume data for a specific identifier on a given date.
"""

adf_short_volume: Optional[int] = None
adf_short_volume_exempt: Optional[int] = None
date: Optional[str] = None
exempt_volume: Optional[int] = None
nasdaq_carteret_short_volume: Optional[int] = None
nasdaq_carteret_short_volume_exempt: Optional[int] = None
nasdaq_chicago_short_volume: Optional[int] = None
nasdaq_chicago_short_volume_exempt: Optional[int] = None
non_exempt_volume: Optional[int] = None
nyse_short_volume: Optional[int] = None
nyse_short_volume_exempt: Optional[int] = None
short_volume: Optional[int] = None
short_volume_ratio: Optional[float] = None
ticker: Optional[str] = None
total_volume: Optional[int] = None

@staticmethod
def from_dict(d):
return ShortVolume(
adf_short_volume=d.get("adf_short_volume"),
adf_short_volume_exempt=d.get("adf_short_volume_exempt"),
date=d.get("date"),
exempt_volume=d.get("exempt_volume"),
nasdaq_carteret_short_volume=d.get("nasdaq_carteret_short_volume"),
nasdaq_carteret_short_volume_exempt=d.get(
"nasdaq_carteret_short_volume_exempt"
),
nasdaq_chicago_short_volume=d.get("nasdaq_chicago_short_volume"),
nasdaq_chicago_short_volume_exempt=d.get(
"nasdaq_chicago_short_volume_exempt"
),
non_exempt_volume=d.get("non_exempt_volume"),
nyse_short_volume=d.get("nyse_short_volume"),
nyse_short_volume_exempt=d.get("nyse_short_volume_exempt"),
short_volume=d.get("short_volume"),
short_volume_ratio=d.get("short_volume_ratio"),
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"),
)
183 changes: 181 additions & 2 deletions polygon/rest/vX.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
from .base import BaseClient
from typing import Optional, Any, Dict, List, Union, Iterator
from .models import StockFinancial, IPOListing, Timeframe, Sort, Order
from .models import (
StockFinancial,
IPOListing,
ShortInterest,
ShortVolume,
TreasuryYield,
Timeframe,
Sort,
Order,
)
from urllib3 import HTTPResponse
from datetime import datetime, date

from .models.request import RequestOptionBuilder


Expand Down Expand Up @@ -77,6 +85,10 @@ def list_ipos(
us_code: Optional[str] = None,
isin: Optional[str] = None,
listing_date: Optional[str] = None,
listing_date_lt: Optional[str] = None,
listing_date_lte: Optional[str] = None,
listing_date_gt: Optional[str] = None,
listing_date_gte: Optional[str] = None,
ipo_status: Optional[str] = None,
limit: Optional[int] = None,
sort: Optional[Union[str, Sort]] = None,
Expand Down Expand Up @@ -111,3 +123,170 @@ def list_ipos(
result_key="results",
options=options,
)

def list_short_interest(
self,
ticker: Optional[str] = None,
days_to_cover: Optional[str] = None,
days_to_cover_lt: Optional[str] = None,
days_to_cover_lte: Optional[str] = None,
days_to_cover_gt: Optional[str] = None,
days_to_cover_gte: Optional[str] = None,
settlement_date: Optional[str] = None,
settlement_date_lt: Optional[str] = None,
settlement_date_lte: Optional[str] = None,
settlement_date_gt: Optional[str] = None,
settlement_date_gte: Optional[str] = None,
avg_daily_volume: Optional[str] = None,
avg_daily_volume_lt: Optional[str] = None,
avg_daily_volume_lte: Optional[str] = None,
avg_daily_volume_gt: Optional[str] = None,
avg_daily_volume_gte: 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[ShortInterest], HTTPResponse]:
"""
Retrieve short interest data for stocks.

:param ticker: Filter by the primary ticker symbol.
:param days_to_cover: Filter by the days to cover value.
:param days_to_cover_lt: Filter for days to cover dates less than the provided date.
:param days_to_cover_lte: Filter for days to cover dates less than or equal to the provided date.
:param days_to_cover_gt: Filter for days to cover dates greater than the provided date.
:param days_to_cover_gte: Filter for days to cover dates greater than or equal to the provided date.
:param settlement_date: Filter by settlement date (YYYY-MM-DD).
:param settlement_date_lt: Filter for settlement dates less than the provided date.
:param settlement_date_lte: Filter for settlement dates less than or equal to the provided date.
:param settlement_date_gt: Filter for settlement dates greater than the provided date.
:param settlement_date_gte: Filter for settlement dates greater than or equal to the provided date.
:param avg_daily_volume: Filter by average daily volume.
:param avg_daily_volume_lt: Filter for average daily volume dates less than the provided date.
:param avg_daily_volume_lte: Filter for average daily volume dates less than or equal to the provided date.
:param avg_daily_volume_gt: Filter for average daily volume dates greater than the provided date.
:param avg_daily_volume_gte: Filter for average daily volume dates greater than or equal to the provided date.
:param limit: Limit the number of results returned. Default 10, max 50000.
:param sort: Field to sort by (e.g., "ticker").
: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[ShortInterest].
:param options: RequestOptionBuilder for additional headers or params.
:return: A list of ShortInterest objects or HTTPResponse if raw=True.
"""
url = "/stocks/vX/short-interest"

return self._paginate(
path=url,
params=self._get_params(self.list_short_interest, locals()),
deserializer=ShortInterest.from_dict,
raw=raw,
result_key="results",
options=options,
)

def list_short_volume(
self,
ticker: Optional[str] = None,
date: Optional[str] = None,
date_lt: Optional[str] = None,
date_lte: Optional[str] = None,
date_gt: Optional[str] = None,
date_gte: Optional[str] = None,
short_volume_ratio: Optional[str] = None,
short_volume_ratio_lt: Optional[str] = None,
short_volume_ratio_lte: Optional[str] = None,
short_volume_ratio_gt: Optional[str] = None,
short_volume_ratio_gte: Optional[str] = None,
total_volume: Optional[str] = None,
total_volume_lt: Optional[str] = None,
total_volume_lte: Optional[str] = None,
total_volume_gt: Optional[str] = None,
total_volume_gte: 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[ShortVolume], HTTPResponse]:
"""
Retrieve short volume data for stocks.

:param ticker: Filter by the primary ticker symbol.
:param date: Filter by the date of trade activity (YYYY-MM-DD).
: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 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 short_volume_ratio: Filter by short volume ratio.
:param short_volume_ratio_lt: Filter for short volume ratio less than the provided date.
:param short_volume_ratio_lte: Filter for short volume ratio less than or equal to the provided date.
:param short_volume_ratio_gt: Filter for short volume ratio greater than the provided date.
:param short_volume_ratio_gte: Filter for short volume ratio greater than or equal to the provided date.
:param total_volume: Filter by total volume.
:param total_volume_lt: Filter for total volume less than the provided date.
:param total_volume_lte: Filter for total volume less than or equal to the provided date.
:param total_volume_gt: Filter for total volume greater than the provided date.
:param total_volume_gte: Filter for total volume greater than or equal to the provided date.
:param limit: Limit the number of results returned. Default 10, max 50000.
:param sort: Field to sort by (e.g., "ticker").
: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[ShortVolume].
:param options: RequestOptionBuilder for additional headers or params.
:return: A list of ShortVolume objects or HTTPResponse if raw=True.
"""
url = "/stocks/vX/short-volume"

return self._paginate(
path=url,
params=self._get_params(self.list_short_volume, locals()),
deserializer=ShortVolume.from_dict,
raw=raw,
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/vX/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,
)